X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/kivitendo-erp.git/blobdiff_plain/a05eead353b55ba228a5eec40f90c0f2c330092a..d9c9bc227fbf8518ff8d63428d181d479ed848d8:/SL/IS.pm diff --git a/SL/IS.pm b/SL/IS.pm index 2632a727d..8947fe9bc 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -34,6 +34,8 @@ package IS; +use List::Util qw(max); + use SL::AM; use SL::Common; use SL::DBUtils; @@ -154,23 +156,22 @@ sub invoice_details { $position = int($position); $position++; } - push(@{ $form->{runningnumber} }, $position); - push(@{ $form->{number} }, qq|$form->{"partnumber_$i"}|); - push(@{ $form->{serialnumber} }, qq|$form->{"serialnumber_$i"}|); - push(@{ $form->{bin} }, qq|$form->{"bin_$i"}|); - push(@{ $form->{"partnotes"} }, qq|$form->{"partnotes_$i"}|); - push(@{ $form->{description} }, qq|$form->{"description_$i"}|); - push(@{ $form->{longdescription} }, qq|$form->{"longdescription_$i"}|); - push(@{ $form->{qty} }, - $form->format_amount($myconfig, $form->{"qty_$i"})); - push(@{ $form->{unit} }, qq|$form->{"unit_$i"}|); - push(@{ $form->{deliverydate_oe} }, qq|$form->{"deliverydate_$i"}|); - - push(@{ $form->{sellprice} }, $form->{"sellprice_$i"}); - push(@{ $form->{ordnumber_oe} }, qq|$form->{"ordnumber_$i"}|); - push(@{ $form->{transdate_oe} }, qq|$form->{"transdate_$i"}|); - push(@{ $form->{invnumber} }, qq|$form->{"invnumber"}|); - push(@{ $form->{invdate} }, qq|$form->{"invdate"}|); + + push @{ $form->{runningnumber} }, $position; + push @{ $form->{number} }, $form->{"partnumber_$i"}; + push @{ $form->{serialnumber} }, $form->{"serialnumber_$i"}; + push @{ $form->{bin} }, $form->{"bin_$i"}; + push @{ $form->{"partnotes"} }, $form->{"partnotes_$i"}; + push @{ $form->{description} }, $form->{"description_$i"}; + push @{ $form->{longdescription} }, $form->{"longdescription_$i"}; + push @{ $form->{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"}); + push @{ $form->{unit} }, $form->{"unit_$i"}; + push @{ $form->{deliverydate_oe} }, $form->{"deliverydate_$i"}; + push @{ $form->{sellprice} }, $form->{"sellprice_$i"}; + push @{ $form->{ordnumber_oe} }, $form->{"ordnumber_$i"}; + push @{ $form->{transdate_oe} }, $form->{"transdate_$i"}; + push @{ $form->{invnumber} }, $form->{"invnumber"}; + push @{ $form->{invdate} }, $form->{"invdate"}; if ($form->{lizenzen}) { if ($form->{"licensenumber_$i"}) { @@ -188,75 +189,50 @@ sub invoice_details { # listprice push(@{ $form->{listprice} }, $form->{"listprice_$i"}); - my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); - my ($dec) = ($sellprice =~ /\.(\d+)/); - $dec = length $dec; - my $decimalplaces = ($dec > 2) ? $dec : 2; + my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); + my ($dec) = ($sellprice =~ /\.(\d+)/); + my $decimalplaces = max 2, length($dec); - my $i_discount = - $form->round_amount( - $sellprice * $form->parse_amount($myconfig, - $form->{"discount_$i"}) / 100, - $decimalplaces); - - my $discount = - $form->round_amount($form->{"qty_$i"} * $i_discount, $decimalplaces); + my $discount = $form->round_amount($form->{"qty_$i"} * $sellprice * $form->{"discount_$i"} / 100, $decimalplaces); + my $linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice * (100 - $form->{"discount_$i"}) / 100, 2); + my $nodiscount_linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice, 2); + $form->{"netprice_$i"} = $form->round_amount($form->{"qty_$i"} ? ($linetotal / $form->{"qty_$i"}) : 0, 2); - # keep a netprice as well, (sellprice - discount) - $form->{"netprice_$i"} = $sellprice - $i_discount; + push @{ $form->{netprice} }, ($form->{"netprice_$i"} != 0) ? $form->format_amount($myconfig, $form->{"netprice_$i"}, $decimalplaces) : ''; - push(@{ $form->{netprice} }, - ($form->{"netprice_$i"} != 0) - ? $form->format_amount( - $myconfig, $form->{"netprice_$i"}, - $decimalplaces - ) - : " "); + $linetotal = ($linetotal != 0) ? $linetotal : ''; - my $linetotal = - $form->round_amount($form->{"qty_$i"} * $form->{"netprice_$i"}, 2); + push @{ $form->{discount} }, ($discount != 0) ? $form->format_amount($myconfig, $discount * -1, $decimalplaces) : ''; + push @{ $form->{p_discount} }, $form->{"discount_$i"}; - my $nodiscount_linetotal = - $form->round_amount($form->{"qty_$i"} * $sellprice, 2); - - $discount = - ($discount != 0) - ? $form->format_amount($myconfig, $discount * -1, $decimalplaces) - : " "; - $linetotal = ($linetotal != 0) ? $linetotal : " "; + $form->{total} += $linetotal; + $form->{nodiscount_total} += $nodiscount_linetotal; + $form->{discount_total} += $discount; - push(@{ $form->{discount} }, $discount); - push(@{ $form->{p_discount} }, $form->{"discount_$i"}); - if (($form->{"discount_$i"} ne "") && ($form->{"discount_$i"} != 0)) { - $form->{discount_p} = $form->{"discount_$i"}; + if ($subtotal_header) { + $discount_subtotal += $linetotal; + $nodiscount_subtotal += $nodiscount_linetotal; } - $form->{total} += $linetotal; - $discount_subtotal += $linetotal; - $form->{nodiscount_total} += $nodiscount_linetotal; - $nodiscount_subtotal += $nodiscount_linetotal; - $form->{discount_total} += $form->parse_amount($myconfig, $discount); if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) { - $discount_subtotal = $form->format_amount($myconfig, $discount_subtotal, 2); - push(@{ $form->{discount_sub} }, $discount_subtotal); - $nodiscount_subtotal = $form->format_amount($myconfig, $nodiscount_subtotal, 2); - push(@{ $form->{nodiscount_sub} }, $nodiscount_subtotal); - $discount_subtotal = 0; + push @{ $form->{discount_sub} }, $form->format_amount($myconfig, $discount_subtotal, 2); + push @{ $form->{nodiscount_sub} }, $form->format_amount($myconfig, $nodiscount_subtotal, 2); + + $discount_subtotal = 0; $nodiscount_subtotal = 0; - $subtotal_header = 0; + $subtotal_header = 0; + } else { - push(@{ $form->{discount_sub} }, ""); - push(@{ $form->{nodiscount_sub} }, ""); + push @{ $form->{discount_sub} }, ""; + push @{ $form->{nodiscount_sub} }, ""; } - if ($linetotal == $netto_linetotal) { + if (!$form->{"discount_$i"}) { $nodiscount += $linetotal; } - push(@{ $form->{linetotal} }, - $form->format_amount($myconfig, $linetotal, 2)); - push(@{ $form->{nodiscount_linetotal} }, - $form->format_amount($myconfig, $nodiscount_linetotal, 2)); + push @{ $form->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2); + push @{ $form->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2); push(@{ $form->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}); @@ -376,19 +352,18 @@ sub invoice_details { else { $form->{subtotal} = $form->format_amount($myconfig, $form->{total}, 2); } - $yesdiscount = $form->{nodiscount_total} - $nodiscount; + $form->{nodiscount_subtotal} = $form->format_amount($myconfig, $form->{nodiscount_total}, 2); - $form->{discount_total} = $form->format_amount($myconfig, $form->{discount_total}, 2); - $form->{nodiscount} = $form->format_amount($myconfig, $nodiscount, 2); - $form->{yesdiscount} = $form->format_amount($myconfig, $yesdiscount, 2); + $form->{discount_total} = $form->format_amount($myconfig, $form->{discount_total}, 2); + $form->{nodiscount} = $form->format_amount($myconfig, $nodiscount, 2); + $form->{yesdiscount} = $form->format_amount($myconfig, $form->{nodiscount_total} - $nodiscount, 2); - $form->{invtotal} = - ($form->{taxincluded}) ? $form->{total} : $form->{total} + $tax; - $form->{total} = - $form->format_amount($myconfig, $form->{invtotal} - $form->{paid}, 2); + $form->{invtotal} = ($form->{taxincluded}) ? $form->{total} : $form->{total} + $tax; + $form->{total} = $form->format_amount($myconfig, $form->{invtotal} - $form->{paid}, 2); $form->{invtotal} = $form->format_amount($myconfig, $form->{invtotal}, 2); - $form->{paid} = $form->format_amount($myconfig, $form->{paid}, 2); + $form->{paid} = $form->format_amount($myconfig, $form->{paid}, 2); + $form->set_payment_options($myconfig, $form->{invdate}); $form->{username} = $myconfig->{name}; @@ -581,13 +556,12 @@ sub post_invoice { } $baseqty = $form->{"qty_$i"} * $basefactor; - # undo discount formatting - $form->{"discount_$i"} = - $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100; - my ($allocated, $taxrate) = (0, 0); my $taxamount; + # add tax rates + map { $taxrate += $form->{"${_}_rate"} } split(/ /, $form->{"taxaccounts_$i"}); + # keep entered selling price my $fxsellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); @@ -596,19 +570,14 @@ sub post_invoice { $dec = length $dec; my $decimalplaces = ($dec > 2) ? $dec : 2; - # deduct discount - my $discount = - $form->round_amount($fxsellprice * $form->{"discount_$i"}, - $decimalplaces); - $form->{"sellprice_$i"} = $fxsellprice - $discount; + # undo discount formatting + $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100; - # add tax rates - map({ $taxrate += $form->{"${_}_rate"} } split(/ /, - $form->{"taxaccounts_$i"})); + # deduct discount + $form->{"sellprice_$i"} = $fxsellprice * (1 - $form->{"discount_$i"}); # round linetotal to 2 decimal places - $linetotal = - $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); + $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); if ($form->{taxincluded}) { $taxamount = $linetotal * ($taxrate / (1 + $taxrate)); @@ -1376,8 +1345,7 @@ sub retrieve_invoice { map { $form->{$_} = $ref->{$_} } keys %{ $ref }; - $form->{exchangerate} = - $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, "buy"); + $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, "buy"); # get shipto $query = qq|SELECT * FROM shipto WHERE (trans_id = ?) AND (module = 'AR')|; @@ -1387,30 +1355,25 @@ sub retrieve_invoice { foreach my $vc (qw(customer vendor)) { next if !$form->{"delivery_${vc}_id"}; - ($form->{"delivery_${vc}_string"}) - = selectrow_query($form, $dbh, qq|SELECT name FROM customer WHERE id = ?|, $id); + ($form->{"delivery_${vc}_string"}) = selectrow_query($form, $dbh, qq|SELECT name FROM customer WHERE id = ?|, $id); } # get printed, emailed - $query = - qq|SELECT printed, emailed, spoolfile, formname - FROM status - WHERE trans_id = ?|; + $query = qq|SELECT printed, emailed, spoolfile, formname FROM status WHERE trans_id = ?|; $sth = prepare_execute_query($form, $dbh, $query, $id); while ($ref = $sth->fetchrow_hashref(NAME_lc)) { $form->{printed} .= "$ref->{formname} " if $ref->{printed}; $form->{emailed} .= "$ref->{formname} " if $ref->{emailed}; - $form->{queued} .= "$ref->{formname} $ref->{spoolfile} " - if $ref->{spoolfile}; + $form->{queued} .= "$ref->{formname} $ref->{spoolfile} " if $ref->{spoolfile}; } $sth->finish; map { $form->{$_} =~ s/ +$//g } qw(printed emailed queued); - my $transdate = - $form->{deliverydate} ? $dbh->quote($form->{deliverydate}) : - $form->{invdate} ? $dbh->quote($form->{invdate}) : - "current_date"; + my $transdate = $form->{deliverydate} ? $dbh->quote($form->{deliverydate}) + : $form->{invdate} ? $dbh->quote($form->{invdate}) + : "current_date"; + my $taxzone_id = $form->{taxzone_id} *= 1; $taxzone_id = 0 if (0 > $taxzone_id) || (3 < $taxzone_id); @@ -1418,29 +1381,14 @@ sub retrieve_invoice { # retrieve individual items $query = qq|SELECT - c1.accno AS inventory_accno, - c1.new_chart_id AS inventory_new_chart, - date($transdate) - c1.valid_from AS inventory_valid, - - 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, - - i.description, i.longdescription, i.qty, i.fxsellprice AS sellprice, - i.discount, i.parts_id AS id, i.unit, i.deliverydate, - i.project_id, i.serialnumber, i.id AS invoice_pos, i.pricegroup_id, - i.ordnumber, i.transdate, i.cusordnumber, i.subtotal, i.lastcost, + c1.accno AS inventory_accno, c1.new_chart_id AS inventory_new_chart, date($transdate) - c1.valid_from AS inventory_valid, + 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, - p.partnumber, p.assembly, p.bin, p.notes AS partnotes, - p.inventory_accno_id AS part_inventory_accno_id, p.formel, - - pr.projectnumber, - pg.partsgroup, - prg.pricegroup + i.description, i.longdescription, i.qty, i.fxsellprice AS sellprice, i.discount, i.parts_id AS id, i.unit, i.deliverydate, + i.project_id, i.serialnumber, i.id AS invoice_pos, i.pricegroup_id, i.ordnumber, i.transdate, i.cusordnumber, i.subtotal, i.lastcost, + p.partnumber, p.assembly, p.bin, p.notes AS partnotes, p.inventory_accno_id AS part_inventory_accno_id, p.formel, + pr.projectnumber, pg.partsgroup, prg.pricegroup FROM invoice i LEFT JOIN parts p ON (i.parts_id = p.id) @@ -1448,65 +1396,41 @@ sub retrieve_invoice { LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) LEFT JOIN pricegroup prg ON (i.pricegroup_id = prg.id) - LEFT JOIN chart c1 ON - ((SELECT inventory_accno_id - FROM buchungsgruppen - WHERE id = p.buchungsgruppen_id) = c1.id) - LEFT JOIN chart c2 ON - ((SELECT income_accno_id_${taxzone_id} - FROM buchungsgruppen - WHERE id=p.buchungsgruppen_id) = c2.id) - LEFT JOIN chart c3 ON - ((SELECT expense_accno_id_${taxzone_id} - FROM buchungsgruppen - WHERE id = p.buchungsgruppen_id) = c3.id) - - WHERE (i.trans_id = ?) - AND NOT (i.assemblyitem = '1') - ORDER BY i.id|; + LEFT JOIN chart c1 ON ((SELECT inventory_accno_id FROM buchungsgruppen WHERE id = p.buchungsgruppen_id) = c1.id) + LEFT JOIN chart c2 ON ((SELECT income_accno_id_${taxzone_id} FROM buchungsgruppen WHERE id = p.buchungsgruppen_id) = c2.id) + LEFT JOIN chart c3 ON ((SELECT expense_accno_id_${taxzone_id} FROM buchungsgruppen WHERE id = p.buchungsgruppen_id) = c3.id) + + WHERE (i.trans_id = ?) AND NOT (i.assemblyitem = '1') ORDER BY i.id|; $sth = prepare_execute_query($form, $dbh, $query, $id); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - if (!$ref->{"part_inventory_accno_id"}) { - map({ delete($ref->{$_}); } qw(inventory_accno inventory_new_chart inventory_valid)); - } + map({ delete($ref->{$_}); } qw(inventory_accno inventory_new_chart inventory_valid)) if !$ref->{"part_inventory_accno_id"}; delete($ref->{"part_inventory_accno_id"}); foreach my $type (qw(inventory income expense)) { while ($ref->{"${type}_new_chart"} && ($ref->{"${type}_valid"} >=0)) { - my $query = - qq|SELECT accno, new_chart_id, date($transdate) - valid_from - FROM chart - WHERE id = ?|; - ($ref->{"${type}_accno"}, - $ref->{"${type}_new_chart"}, - $ref->{"${type}_valid"}) - = selectrow_query($form, $dbh, $query, $ref->{"${type}_new_chart"}); + my $query = qq|SELECT accno, new_chart_id, date($transdate) - valid_from FROM chart WHERE id = ?|; + @$ref{ map $type.$_, qw(_accno _new_chart _valid) } = selectrow_query($form, $dbh, $query, $ref->{"${type}_new_chart"}); } } # get tax rates and description - my $accno_id = - ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno}; + my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno}; $query = - qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber - FROM tax t + qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber FROM tax t LEFT JOIN chart c ON (c.id = t.chart_id) WHERE t.id IN - (SELECT tk.tax_id - FROM taxkeys tk - WHERE tk.chart_id = (SELECT id FROM chart WHERE accno = ?) + (SELECT tk.tax_id FROM taxkeys tk + WHERE tk.chart_id = (SELECT id FROM chart WHERE accno = ?) AND startdate <= date($transdate) - ORDER BY startdate DESC - LIMIT 1) + ORDER BY startdate DESC LIMIT 1) ORDER BY c.accno|; my $stw = prepare_execute_query($form, $dbh, $query, $accno_id); $ref->{taxaccounts} = ""; my $i=0; while ($ptr = $stw->fetchrow_hashref(NAME_lc)) { - # if ($customertax{$ref->{accno}}) { if (($ptr->{accno} eq "") && ($ptr->{rate} == 0)) { $i++; $ptr->{accno} = $i; @@ -1523,12 +1447,8 @@ sub retrieve_invoice { } if ($form->{lizenzen}) { - $query = - qq|SELECT l.licensenumber, l.id AS licenseid - FROM license l, licenseinvoice li - WHERE l.id = li.license_id AND li.trans_id = ?|; - my ($licensenumber, $licenseid) - = selectrow_query($form, $dbh, $query, conv_i($ref->{invoice_pos})); + $query = qq|SELECT l.licensenumber, l.id AS licenseid FROM license l, licenseinvoice li WHERE l.id = li.license_id AND li.trans_id = ?|; + my ($licensenumber, $licenseid) = selectrow_query($form, $dbh, $query, conv_i($ref->{invoice_pos})); $ref->{lizenzen} = ""; }