# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1335, USA.
qq|WHERE (o.quotation = ?) |;
push(@values, $quotation);
qq|WHERE (o.quotation = ?) |;
push(@values, $quotation);
+ my ($self, $myconfig, $form) = @_;
+ $main::lxdebug->enter_sub();
+
+ my $rc = SL::DB->client->with_transaction(\&_save, $self, $myconfig, $form);
+
+ $::lxdebug->leave_sub;
+
+ return $rc;
+}
+
+sub _save {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
my $restricter = SL::HTML::Restrict->create;
my ($query, @values, $sth, $null);
my $restricter = SL::HTML::Restrict->create;
my ($query, @values, $sth, $null);
- foreach (qw(orderitems invoice)) {
- if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"}) {
+ # assume we have a new workflow if we link from invoice or order to quotation
+ # unluckily orderitems are used for quotation and orders - therefore one more
+ # check to be sure NOT to link from order to quotation
+ foreach (qw(orderitems)) {
+ if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"}
+ && $form->{type} !~ 'quotation') {
$form->{convert_from_oe_ids} =~ s/^\s+//;
$form->{convert_from_oe_ids} =~ s/\s+$//;
my @convert_from_oe_ids = split m/\s+/, $form->{convert_from_oe_ids};
delete $form->{convert_from_oe_ids};
$form->{convert_from_oe_ids} =~ s/^\s+//;
$form->{convert_from_oe_ids} =~ s/\s+$//;
my @convert_from_oe_ids = split m/\s+/, $form->{convert_from_oe_ids};
delete $form->{convert_from_oe_ids};
- @{ $form->{convert_from_oe_ids} } = @convert_from_oe_ids;
- foreach (qw(ar oe)) {
- if (!$form->{useasnew} && $form->{"convert_from_${_}_ids"}) {
- RecordLinks->create_links('dbh' => $dbh,
- 'mode' => 'ids',
- 'from_table' => $_,
- 'from_ids' => $form->{"convert_from_${_}_ids"},
- 'to_table' => 'oe',
- 'to_id' => $form->{id},
- );
- delete $form->{"convert_from_${_}_ids"};
- }
+ if (!$form->{useasnew} && scalar @convert_from_oe_ids) {
+ RecordLinks->create_links('dbh' => $dbh,
+ 'mode' => 'ids',
+ 'from_table' => 'oe',
+ 'from_ids' => \@convert_from_oe_ids,
+ 'to_table' => 'oe',
+ 'to_id' => $form->{id},
+ );
$self->_close_quotations_rfqs('dbh' => $dbh,
'from_id' => \@convert_from_oe_ids,
$self->_close_quotations_rfqs('dbh' => $dbh,
'from_id' => \@convert_from_oe_ids,
$self->save_periodic_invoices_config(dbh => $dbh,
oe_id => $form->{id},
config_yaml => $form->{periodic_invoices_config})
$self->save_periodic_invoices_config(dbh => $dbh,
oe_id => $form->{id},
config_yaml => $form->{periodic_invoices_config})
return if 'HASH' ne ref $config;
my $obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $params{oe_id})
return if 'HASH' ne ref $config;
my $obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $params{oe_id})
if ($config_obj) {
my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity order_value_periodicity start_date_as_date end_date_as_date first_billing_date_as_date extend_automatically_by ar_chart_id
print printer_id copies direct_debit send_email email_recipient_contact_id email_recipient_address email_sender email_subject email_body) };
if ($config_obj) {
my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity order_value_periodicity start_date_as_date end_date_as_date first_billing_date_as_date extend_automatically_by ar_chart_id
print printer_id copies direct_debit send_email email_recipient_contact_id email_recipient_address email_sender email_subject email_body) };
- do_statement($form, $sth, $query, conv_i($params{to_id}));
+ my $query = qq|SELECT quotation FROM oe WHERE id = ?|;
+ my $sth = prepare_query($form, $dbh, $query);
- foreach my $from_id (@{ $params{from_id} }) {
- $from_id = conv_i($from_id);
- do_statement($form, $sth, $query, $from_id);
- ($quotation) = $sth->fetchrow_array();
- push @close_ids, $from_id if ($quotation);
- }
+ foreach my $from_id (@{ $params{from_id} }) {
+ $from_id = conv_i($from_id);
+ do_statement($form, $sth, $query, $from_id);
+ ($quotation) = $sth->fetchrow_array();
+ push @close_ids, $from_id if ($quotation);
+ }
- if (scalar @close_ids) {
- $query = qq|UPDATE oe SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar @close_ids) . qq|)|;
- do_query($form, $dbh, $query, @close_ids);
- $dbh->commit() unless ($params{dbh});
- }
+ if (scalar @close_ids) {
+ $query = qq|UPDATE oe SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar @close_ids) . qq|)|;
+ do_query($form, $dbh, $query, @close_ids);
+ }
+ 1;
+ }) or do { die SL::DB->client->error };
my ($query, $query_add, @values, @ids, $sth);
my ($query, $query_add, @values, @ids, $sth);
$form->{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo;
$form->{transdate} = DateTime->today_local->to_kivitendo;
}
$form->{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo;
$form->{transdate} = DateTime->today_local->to_kivitendo;
}
$sth = prepare_execute_query($form, $dbh, $query, $form->{id});
$ref = $sth->fetchrow_hashref("NAME_lc");
$sth = prepare_execute_query($form, $dbh, $query, $form->{id});
$ref = $sth->fetchrow_hashref("NAME_lc");
c2.accno AS income_accno, c2.new_chart_id AS income_new_chart, date($transdate) - c2.valid_from as income_valid,
c3.accno AS expense_accno, c3.new_chart_id AS expense_new_chart, date($transdate) - c3.valid_from as expense_valid,
oe.ordnumber AS ordnumber_oe, oe.transdate AS transdate_oe, oe.cusordnumber AS cusordnumber_oe,
c2.accno AS income_accno, c2.new_chart_id AS income_new_chart, date($transdate) - c2.valid_from as income_valid,
c3.accno AS expense_accno, c3.new_chart_id AS expense_new_chart, date($transdate) - c3.valid_from as expense_valid,
oe.ordnumber AS ordnumber_oe, oe.transdate AS transdate_oe, oe.cusordnumber AS cusordnumber_oe,
- p.partnumber, p.assembly, p.listprice, o.description, o.qty,
- o.sellprice, o.parts_id AS id, o.unit, o.discount, p.notes AS partnotes, p.inventory_accno_id AS part_inventory_accno_id,
+ p.partnumber, p.part_type, p.listprice, o.description, o.qty,
+ p.classification_id,
+ o.sellprice, o.parts_id AS id, o.unit, o.discount, p.notes AS partnotes, p.part_type,
o.reqdate, o.project_id, o.serialnumber, o.ship, o.lastcost,
o.ordnumber, o.transdate, o.cusordnumber, o.subtotal, o.longdescription,
o.price_factor_id, o.price_factor, o.marge_price_factor, o.active_price_source, o.active_discount_source,
o.reqdate, o.project_id, o.serialnumber, o.ship, o.lastcost,
o.ordnumber, o.transdate, o.cusordnumber, o.subtotal, o.longdescription,
o.price_factor_id, o.price_factor, o.marge_price_factor, o.active_price_source, o.active_discount_source,
# in collective order, copy global ordnumber, transdate, cusordnumber into item scope
# unless already present there
# in collective order, copy global ordnumber, transdate, cusordnumber into item scope
# unless already present there
# so that they can be sorted in later
my %prepared_template_arrays = IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form);
my @prepared_arrays = keys %prepared_template_arrays;
# so that they can be sorted in later
my %prepared_template_arrays = IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form);
my @prepared_arrays = keys %prepared_template_arrays;
push @{ $form->{TEMPLATE_ARRAYS}->{discount_nofmt} }, ($discount != 0) ? $discount * -1 : '';
push @{ $form->{TEMPLATE_ARRAYS}->{p_discount} }, $form->{"discount_$i"};
push @{ $form->{TEMPLATE_ARRAYS}->{discount_nofmt} }, ($discount != 0) ? $discount * -1 : '';
push @{ $form->{TEMPLATE_ARRAYS}->{p_discount} }, $form->{"discount_$i"};
+ if ( $prepared_template_arrays{separate}[$i - 1] ) {
+ my $pabbr = $prepared_template_arrays{separate}[$i - 1];
+ if ( ! $form->{"separate_${pabbr}_subtotal"} ) {
+ push @separate_totals , "separate_${pabbr}_subtotal";
+ $form->{"separate_${pabbr}_subtotal"} = 0;
+ }
+ $form->{"separate_${pabbr}_subtotal"} += $linetotal;
+ } else {
+ $form->{non_separate_subtotal} += $linetotal;
+ }
+
$form->{ordtotal} += $linetotal;
$form->{nodiscount_total} += $nodiscount_linetotal;
$form->{discount_total} += $discount;
$form->{ordtotal} += $linetotal;
$form->{nodiscount_total} += $nodiscount_linetotal;
$form->{discount_total} += $discount;
$tax_rate = $taxrate * 100;
push(@{ $form->{TEMPLATE_ARRAYS}->{tax_rate} }, qq|$tax_rate|);
$tax_rate = $taxrate * 100;
push(@{ $form->{TEMPLATE_ARRAYS}->{tax_rate} }, qq|$tax_rate|);
- $form->{ordtotal} = ($form->{taxincluded}) ? $form->{ordtotal} : $form->{ordtotal} + $tax;
+ my $grossamount = ($form->{taxincluded}) ? $form->{ordtotal} : $form->{ordtotal} + $tax;
+ $form->{ordtotal} = $form->round_amount( $grossamount, 2, 1);
+ $form->{rounding} = $form->round_amount(
+ $form->{ordtotal} - $form->round_amount($grossamount, 2),
+ 2
+ );
- if ($form->{type} =~ /_quotation/) {
- $form->set_payment_options($myconfig, $form->{quodate});
- } else {
- $form->set_payment_options($myconfig, $form->{orddate});
- }
+ $form->set_payment_options($myconfig, $form->{$form->{type} =~ /_quotation/ ? 'quodate' : 'orddate'}, $form->{type});
$form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef);
$form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
$form->{order} = SL::DB::Manager::Order->find_by(id => $form->{id}) if $form->{id};
$form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef);
$form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
$form->{order} = SL::DB::Manager::Order->find_by(id => $form->{id}) if $form->{id};
-sub project_description {
- $main::lxdebug->enter_sub();
-
- my ($self, $dbh, $id) = @_;
-
- my $query = qq|SELECT description FROM project WHERE id = ?|;
- my ($value) = selectrow_query($main::form, $dbh, $query, $id);
-
- $main::lxdebug->leave_sub();
-
- return $value;
-}
-