push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs };
push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs };
- my @tax_arrays = qw(taxbase tax taxdescription taxrate taxnumber);
+ my @tax_arrays = qw(taxbase tax taxdescription taxrate taxnumber tax_id);
my @payment_arrays = qw(payment paymentaccount paymentdate paymentsource paymentmemo);
push(@{ $form->{TEMPLATE_ARRAYS}->{taxrate} }, $form->format_amount($myconfig, $form->{"${item}_rate"} * 100));
push(@{ $form->{TEMPLATE_ARRAYS}->{taxrate_nofmt} }, $form->{"${item}_rate"} * 100);
push(@{ $form->{TEMPLATE_ARRAYS}->{taxnumber} }, $form->{"${item}_taxnumber"});
+ push(@{ $form->{TEMPLATE_ARRAYS}->{tax_id} }, $form->{"${item}_tax_id"});
- # taxnumber is used for grouping the amount of the various taxes
+ # taxnumber (= accno) is used for grouping the amounts of the various taxes and as a prefix in form
- # this code assumes that at most one tax entry can point to the same
+ # This code used to assume that at most one tax entry can point to the same
# chart_id, even though chart_id does not have a unique constraint!
- # this chart_id is then looked up via its accno, which is the key that is
+ # This chart_id was then looked up via its accno, which is the key that is
# used to group the different taxes by for a record
- # not every tax has a taxnumber (e.g. tax-free), but that is ok, because
- # then there would be no tax amount to assign it to
+ # As we now also store the tax_id we can use that to look up the tax
+ # instead, this is only done here to get the (translated) taxdescription.
- my $tax_objs = SL::DB::Manager::Tax->get_objects_from_sql(
- sql => 'SELECT * FROM tax WHERE chart_id = (SELECT id FROM chart WHERE accno = ?)',
- args => [ $form->{"${item}_taxnumber"} ]
- );
- my $tax_obj;
- if ( $tax_objs ) {
- $tax_obj = $tax_objs->[0];
+ if ( $form->{"${item}_tax_id"} ) {
+ my $tax_obj = SL::DB::Manager::Tax->find_by(id => $form->{"${item}_tax_id"}) or die "Can't find tax with id " . $form->{"${item}_tax_id"};
+ my $description = $tax_obj ? $tax_obj->translated_attribute('taxdescription', $form->{language_id}, 0) : '';
+ push(@{ $form->{TEMPLATE_ARRAYS}->{taxdescription} }, $description . q{ } . 100 * $form->{"${item}_rate"} . q{%});
}
- my $description = $tax_obj ? $tax_obj->translated_attribute('taxdescription', $form->{language_id}, 0) : '';
- push(@{ $form->{TEMPLATE_ARRAYS}->{taxdescription} }, $description . q{ } . 100 * $form->{"${item}_rate"} . q{%});
+
}
for my $i (1 .. $form->{paidaccounts}) {
my (@errors, @transfers);
- # do nothing, if transfer default is not requeseted at all
+ # do nothing, if transfer default is not requested at all
if (!$::instance_conf->get_transfer_default) {
$::lxdebug->leave_sub;
return \@errors;
foreach my $i (1 .. $form->{rowcount}) {
next if !$form->{"id_$i"};
- my ($err, $wh_id, $bin_id) = _determine_wh_and_bin($dbh, $::instance_conf,
- $form->{"id_$i"},
- $form->{"qty_$i"},
- $form->{"unit_$i"});
- if (!@{ $err } && $wh_id && $bin_id) {
- push @transfers, {
- 'parts_id' => $form->{"id_$i"},
- 'qty' => $form->{"qty_$i"},
- 'unit' => $form->{"unit_$i"},
- 'transfer_type' => 'shipped',
- 'src_warehouse_id' => $wh_id,
- 'src_bin_id' => $bin_id,
- 'project_id' => $form->{"project_id_$i"},
- 'invoice_id' => $form->{"invoice_id_$i"},
- 'comment' => $::locale->text("Default transfer invoice"),
- };
- }
+ my ($err, $qty, $wh_id, $bin_id, $chargenumber);
+
+ if ($::instance_conf->get_sales_serial_eq_charge && $form->{"serialnumber_$i"}) {
+ my @serials = split(" ", $form->{"serialnumber_$i"});
+ if (scalar @serials != $form->{"qty_$i"}) {
+ push @errors, $::locale->text("Cannot transfer #1 qty with #2 serial number(s)", $form->{"qty_$i"}, scalar @serials);
+ last;
+ }
+ foreach my $serial (@serials) {
+ ($qty, $wh_id, $bin_id, $chargenumber) = WH->get_wh_and_bin_for_charge(chargenumber => $serial);
+ if (!$qty) {
+ push @errors, $::locale->text("Not enough in stock for the serial number #1", $serial);
+ last;
+ }
+ push @transfers, {
+ 'parts_id' => $form->{"id_$i"},
+ 'qty' => 1,
+ 'unit' => $form->{"unit_$i"},
+ 'transfer_type' => 'shipped',
+ 'src_warehouse_id' => $wh_id,
+ 'src_bin_id' => $bin_id,
+ 'chargenumber' => $chargenumber,
+ 'project_id' => $form->{"project_id_$i"},
+ 'invoice_id' => $form->{"invoice_id_$i"},
+ 'comment' => $::locale->text("Default transfer invoice with charge number"),
+ };
+ }
+ $err = []; # error handling uses @errors direct
+ } else {
+ ($err, $wh_id, $bin_id) = _determine_wh_and_bin($dbh, $::instance_conf,
+ $form->{"id_$i"},
+ $form->{"qty_$i"},
+ $form->{"unit_$i"});
+ if (!@{ $err } && $wh_id && $bin_id) {
+ push @transfers, {
+ 'parts_id' => $form->{"id_$i"},
+ 'qty' => $form->{"qty_$i"},
+ 'unit' => $form->{"unit_$i"},
+ 'transfer_type' => 'shipped',
+ 'src_warehouse_id' => $wh_id,
+ 'src_bin_id' => $bin_id,
+ 'project_id' => $form->{"project_id_$i"},
+ 'invoice_id' => $form->{"invoice_id_$i"},
+ 'comment' => $::locale->text("Default transfer invoice"),
+ };
+ }
+ }
push @errors, @{ $err };
- }
+ } # end form rowcount
if (!@errors) {
WH->transfer(@transfers);
# get tax rates and description
my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno};
$query =
- qq|SELECT c.accno, t.taxdescription, t.rate, c.accno as taxnumber
+ qq|SELECT c.accno, t.taxdescription, t.rate, t.id as tax_id, c.accno as taxnumber
FROM tax t
LEFT JOIN chart c ON (c.id = t.chart_id)
WHERE t.id IN
if (!($form->{taxaccounts} =~ /\Q$ptr->{accno}\E/)) {
$form->{"$ptr->{accno}_rate"} = $ptr->{rate};
$form->{"$ptr->{accno}_description"} = $ptr->{taxdescription};
- $form->{"$ptr->{accno}_taxnumber"} = $ptr->{taxnumber};
+ $form->{"$ptr->{accno}_taxnumber"} = $ptr->{taxnumber}; # don't use this anymore
+ $form->{"$ptr->{accno}_tax_id"} = $ptr->{tax_id};
$form->{taxaccounts} .= "$ptr->{accno} ";
}
# get tax rates and description
my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno};
$query =
- qq|SELECT c.accno, t.taxdescription, t.rate, c.accno as taxnumber
+ qq|SELECT c.accno, t.taxdescription, t.id as tax_id, t.rate, c.accno as taxnumber
FROM tax t
LEFT JOIN chart c ON (c.id = t.chart_id)
WHERE t.id in
$form->{"$ptr->{accno}_rate"} = $ptr->{rate};
$form->{"$ptr->{accno}_description"} = $ptr->{taxdescription};
$form->{"$ptr->{accno}_taxnumber"} = $ptr->{taxnumber};
+ $form->{"$ptr->{accno}_tax_id"} = $ptr->{tax_id};
$form->{taxaccounts} .= "$ptr->{accno} ";
}