X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FIS.pm;h=e9e9144d41523beb09389987cba01e9118988649;hb=f24cf1f5ab8428ced545a382d0f0179ae6f40a81;hp=894a8aea7ea3cb2cfad3a75574cd36edd6bbec92;hpb=ca247333e470aefad12228a8a17c7d76bc598c74;p=kivitendo-erp.git diff --git a/SL/IS.pm b/SL/IS.pm index 894a8aea7..e9e9144d4 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -171,7 +171,7 @@ sub invoice_details { 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); @@ -442,9 +442,9 @@ sub invoice_details { my $sortorder = ""; if ($form->{groupitems}) { $sortorder = - qq|ORDER BY pg.partsgroup, a.id|; + qq|ORDER BY pg.partsgroup, a.position|; } else { - $sortorder = qq|ORDER BY a.id|; + $sortorder = qq|ORDER BY a.position|; } my $query = @@ -505,28 +505,25 @@ sub invoice_details { 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}) { @@ -1454,7 +1451,7 @@ sub transfer_out { 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; @@ -1464,26 +1461,56 @@ sub transfer_out { 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); @@ -2087,7 +2114,7 @@ sub _retrieve_invoice { # 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 @@ -2110,7 +2137,8 @@ sub _retrieve_invoice { 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} "; } @@ -2412,7 +2440,7 @@ sub retrieve_item { # 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 @@ -2441,6 +2469,7 @@ sub retrieve_item { $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} "; }