X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAR.pm;h=410ac99aa113180df77268af5b677d6a822d8d6c;hb=f36eb9fca78c4940b486b7dafa4ab636cdaf99cd;hp=ed3bfb8a478691e16b35fefd5a1437fc34390349;hpb=4c23c4787a182219447ec7aa1206b7b6288eb26a;p=kivitendo-erp.git diff --git a/SL/AR.pm b/SL/AR.pm index ed3bfb8a4..410ac99aa 100644 --- a/SL/AR.pm +++ b/SL/AR.pm @@ -36,11 +36,12 @@ package AR; use Data::Dumper; use SL::DBUtils; +use SL::MoreCommon; sub post_transaction { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form) = @_; + my ($self, $myconfig, $form, $provided_dbh, $payments_only) = @_; my ($query, $sth, $null, $taxrate, $amount, $tax); my $exchangerate = 0; @@ -48,7 +49,7 @@ sub post_transaction { my @values; - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig); # set exchangerate $form->{exchangerate} = ($form->{currency} eq $form->{defaultcurrency}) ? 1 : @@ -82,7 +83,7 @@ sub post_transaction { $query = qq|SELECT c.accno, t.taxkey, t.rate FROM tax t LEFT JOIN chart c ON (c.id = t.chart_id) WHERE t.id = ? ORDER BY c.accno|; ($form->{AR_amounts}{"tax_$i"}, $form->{"taxkey_$i"}, $form->{"taxrate_$i"}) = selectrow_query($form, $dbh, $query, $form->{"tax_id_$i"}); - $form->{AR_amounts}{"tax_$i"}{taxkey} = $form->{"taxkey_$i"}; + $form->{AR_amounts}{"tax_$i"}{taxkey} = $form->{"taxkey_$i"}; $form->{AR_amounts}{"amounts_$i"}{taxkey} = $form->{"taxkey_$i"}; if ($form->{taxincluded} *= 1) { @@ -118,16 +119,19 @@ sub post_transaction { $form->get_employee($dbh) unless $form->{employee_id}; # if we have an id delete old records else make one - if ($form->{id}) { - # delete detail records - $query = qq|DELETE FROM acc_trans WHERE trans_id = ?|; - do_query($form, $dbh, $query, $form->{id}); - } else { - $query = qq|SELECT nextval('glid')|; - ($form->{id}) = selectrow_query($form, $dbh, $query); - $query = qq|INSERT INTO ar (id, invnumber, employee_id) VALUES (?, 'dummy', ?)|; - do_query($form, $dbh, $query, $form->{id}, $form->{employee_id}); - $form->{invnumber} = $form->update_defaults($myconfig, "invnumber", $dbh) unless $form->{invnumber}; + if (!$payments_only) { + if ($form->{id}) { + # delete detail records + $query = qq|DELETE FROM acc_trans WHERE trans_id = ?|; + do_query($form, $dbh, $query, $form->{id}); + + } else { + $query = qq|SELECT nextval('glid')|; + ($form->{id}) = selectrow_query($form, $dbh, $query); + $query = qq|INSERT INTO ar (id, invnumber, employee_id) VALUES (?, 'dummy', ?)|; + do_query($form, $dbh, $query, $form->{id}, $form->{employee_id}); + $form->{invnumber} = $form->update_defaults($myconfig, "invnumber", $dbh) unless $form->{invnumber}; + } } # update department @@ -138,18 +142,6 @@ sub post_transaction { $form->{datepaid} ||= $form->{transdate} ; my $datepaid = ($form->{paid} != 0) ? $form->{datepaid} : undef; - $query = - qq|UPDATE ar set - invnumber = ?, ordnumber = ?, transdate = ?, customer_id = ?, - taxincluded = ?, amount = ?, duedate = ?, paid = ?, datepaid = ?, - netamount = ?, curr = ?, notes = ?, department_id = ?, - employee_id = ? - WHERE id = ?|; - my @values = ($form->{invnumber}, $form->{ordnumber}, conv_date($form->{transdate}), conv_i($form->{customer_id}), $form->{taxincluded} ? 't' : 'f', $form->{amount}, - conv_date($form->{duedate}), $form->{paid}, conv_date($datepaid), $form->{netamount}, $form->{currency}, $form->{notes}, conv_i($form->{department_id}), - conv_i($form->{employee_id}), conv_i($form->{id})); - do_query($form, $dbh, $query, @values); - # amount for AR account $form->{receivables} = $form->round_amount($form->{amount}, 2) * -1; @@ -157,34 +149,47 @@ sub post_transaction { $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, $form->{exchangerate}, 0) if ($form->{currency} ne $form->{defaultcurrency}) && $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, 'buy'); + if (!$payments_only) { + $query = + qq|UPDATE ar set + invnumber = ?, ordnumber = ?, transdate = ?, customer_id = ?, + taxincluded = ?, amount = ?, duedate = ?, paid = ?, datepaid = ?, + netamount = ?, curr = ?, notes = ?, department_id = ?, + employee_id = ?, storno = ?, storno_id = ? + WHERE id = ?|; + my @values = ($form->{invnumber}, $form->{ordnumber}, conv_date($form->{transdate}), conv_i($form->{customer_id}), $form->{taxincluded} ? 't' : 'f', $form->{amount}, + conv_date($form->{duedate}), $form->{paid}, conv_date($datepaid), $form->{netamount}, $form->{currency}, $form->{notes}, conv_i($form->{department_id}), + conv_i($form->{employee_id}), $form->{storno} ? 't' : 'f', $form->{storno_id}, conv_i($form->{id})); + do_query($form, $dbh, $query, @values); + + # add individual transactions for AR, amount and taxes + for $i (1 .. $form->{rowcount}) { + if ($form->{"amount_$i"} != 0) { + my $project_id = conv_i($form->{"project_id_$i"}); + $taxkey = $form->{AR_amounts}{"amounts_$i"}{taxkey}; - # add individual transactions for AR, amount and taxes - for $i (1 .. $form->{rowcount}) { - if ($form->{"amount_$i"} != 0) { - my $project_id = conv_i($form->{"project_id_$i"}); - $taxkey = $form->{AR_amounts}{"amounts_$i"}{taxkey}; - - # insert detail records in acc_trans - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) - VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?)|; - @values = (conv_i($form->{id}), conv_i($form->{AR_amounts}{"amount_$i"}), conv_i($form->{"amount_$i"}), conv_date($form->{transdate}), $project_id, conv_i($taxkey)); - do_query($form, $dbh, $query, @values); - - if ($form->{"tax_$i"} != 0) { # insert detail records in acc_trans $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?)|; - @values = (conv_i($form->{id}), conv_i($form->{AR_amounts}{"tax_$i"}), conv_i($form->{"tax_$i"}), conv_date($form->{transdate}), $project_id, conv_i($taxkey)); + @values = (conv_i($form->{id}), conv_i($form->{AR_amounts}{"amount_$i"}), conv_i($form->{"amount_$i"}), conv_date($form->{transdate}), $project_id, conv_i($taxkey)); do_query($form, $dbh, $query, @values); + + if ($form->{"tax_$i"} != 0) { + # insert detail records in acc_trans + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) + VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?)|; + @values = (conv_i($form->{id}), conv_i($form->{AR_amounts}{"tax_$i"}), conv_i($form->{"tax_$i"}), conv_date($form->{transdate}), $project_id, conv_i($taxkey)); + do_query($form, $dbh, $query, @values); + } } } - } - # add recievables - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) - VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = (conv_i($form->{id}), $form->{AR_amounts}{receivables}, conv_i($form->{receivables}), conv_date($form->{transdate}), $form->{AR_amounts}{receivables}); - do_query($form, $dbh, $query, @values); + # add recievables + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) + VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?))|; + @values = (conv_i($form->{id}), $form->{AR_amounts}{receivables}, conv_i($form->{receivables}), conv_date($form->{transdate}), $form->{AR_amounts}{receivables}); + do_query($form, $dbh, $query, @values); + } # add paid transactions for my $i (1 .. $form->{paidaccounts}) { @@ -207,14 +212,13 @@ sub post_transaction { # receivables amount $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate}, 2); - if ($form->{receivables} != 0) { + if ($amount != 0) { # add receivable $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?))|; @values = (conv_i($form->{id}), $form->{AR}{receivables}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $form->{AR}{receivables}); do_query($form, $dbh, $query, @values); } - $form->{receivables} = $amount; if ($form->{"paid_$i"} != 0) { my $project_id = conv_i($form->{"paid_project_id_$i"}); @@ -253,12 +257,54 @@ sub post_transaction { } } - my $rc = $dbh->commit; - $dbh->disconnect; + my $rc = 1; + if (!$provided_dbh) { + $rc = $dbh->commit(); + $dbh->disconnect(); + } $main::lxdebug->leave_sub() and return $rc; } +sub _delete_payments { + $main::lxdebug->enter_sub(); + + my ($self, $form, $dbh) = @_; + + my @delete_oids; + + # Delete old payment entries from acc_trans. + my $query = + qq|SELECT oid + FROM acc_trans + WHERE (trans_id = ?) AND fx_transaction + + UNION + + SELECT at.oid + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (trans_id = ?) AND (c.link LIKE '%AR_paid%')|; + push @delete_oids, selectall_array_query($form, $dbh, $query, conv_i($form->{id}), conv_i($form->{id})); + + $query = + qq|SELECT at.oid + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (trans_id = ?) + AND ((c.link = 'AR') OR (c.link LIKE '%:AR') OR (c.link LIKE 'AR:%')) + ORDER BY at.oid + OFFSET 1|; + push @delete_oids, selectall_array_query($form, $dbh, $query, conv_i($form->{id})); + + if (@delete_oids) { + $query = qq|DELETE FROM acc_trans WHERE oid IN (| . join(", ", @delete_oids) . qq|)|; + do_query($form, $dbh, $query); + } + + $main::lxdebug->leave_sub(); +} + sub post_payment { $main::lxdebug->enter_sub(); @@ -267,155 +313,55 @@ sub post_payment { # connect to database, turn off autocommit my $dbh = $form->dbconnect_noauto($myconfig); - $form->{datepaid} = $form->{transdate}; + my (%payments, $old_form, $row, $item, $query, %keep_vars); - # total payments, don't move we need it here - for my $i (1 .. $form->{paidaccounts}) { - if ($form->{type} eq "credit_note") { - $form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"}) * -1; - } else { - $form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"}); - } - $form->{paid} += $form->{"paid_$i"}; - $form->{datepaid} = $form->{"datepaid_$i"} if ($form->{"datepaid_$i"}); - } + $old_form = save_form(); - $form->{exchangerate} = - $form->get_exchangerate($dbh, $form->{currency}, $form->{transdate}, - "buy"); + # Delete all entries in acc_trans from prior payments. + $self->_delete_payments($form, $dbh); - my $accno_ar = $form->{ARselected}; + # Save the new payments the user made before cleaning up $form. + my $payments_re = '^datepaid_\d+$|^memo_\d+$|^source_\d+$|^exchangerate_\d+$|^paid_\d+$|^paid_project_id_\d+$|^AR_paid_\d+$|^paidaccounts$'; + map { $payments{$_} = $form->{$_} } grep m/$payments_re/, keys %{ $form }; - # record payments and offsetting AR - for my $i (1 .. $form->{paidaccounts}) { + # Clean up $form so that old content won't tamper the results. + %keep_vars = map { $_, 1 } qw(login password id); + map { delete $form->{$_} unless $keep_vars{$_} } keys %{ $form }; - if ($form->{"paid_$i"} != 0) { - my $project_id = conv_i($form->{"paid_project_id_$i"}); + # Retrieve the invoice from the database. + $form->create_links('AR', $myconfig, 'customer', $dbh); - my ($accno) = split /--/, $form->{"AR_paid_$i"}; - $form->{"datepaid_$i"} = $form->{transdate} - unless ($form->{"datepaid_$i"}); - $form->{datepaid} = $form->{"datepaid_$i"}; + # Restore the payment options from the user input. + map { $form->{$_} = $payments{$_} } keys %payments; - $exchangerate = 0; - if (($form->{currency} eq $form->{defaultcurrency}) || ($form->{defaultcurrency} eq "")) { - $form->{"exchangerate_$i"} = 1; - } else { - $exchangerate = - $form->check_exchangerate($myconfig, $form->{currency}, - $form->{"datepaid_$i"}, 'buy'); - - $form->{"exchangerate_$i"} = - ($exchangerate) - ? $exchangerate - : $form->parse_amount($myconfig, $form->{"exchangerate_$i"}); - } + # Set up the content of $form in the way that AR::post_transaction() expects. - # record AR - $amount = - $form->round_amount($form->{"paid_$i"} * $form->{"exchangerate"}, - 2); - - - $query = - qq|DELETE FROM acc_trans | . - qq|WHERE trans_id = ? AND amount = ? AND transdate = ? AND | . - qq| chart_id = (SELECT c.id FROM chart c WHERE c.accno = ?)|; - @values = (conv_i($form->{id}), $amount, - conv_date($form->{"datepaid_$i"}), $accno_ar); - do_query($form, $dbh, $query, @values); - - $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = (conv_i($form->{id}), $accno_ar, conv_i($amount), - conv_date($form->{"datepaid_$i"}), $project_id, $accno_ar); - do_query($form, $dbh, $query, @values); - - # record payment - $form->{"paid_$i"} *= -1; - - $query = - qq|DELETE FROM acc_trans | . - qq|WHERE trans_id = ? AND | . - qq| chart_id = (SELECT c.id FROM chart c WHERE c.accno = ?) AND | . - qq| amount = ? AND transdate = ? AND source = ? AND memo = ?|; - @values = (conv_i($form->{id}), $accno, conv_i($form->{"paid_$i"}), - conv_date($form->{"datepaid_$i"}), - $form->{"source_$i"}, $form->{"memo_$i"}); - do_query($form, $dbh, $query, @values); - - $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, source, memo, project_id, taxkey) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = (conv_i($form->{id}), $accno, conv_i($form->{"paid_$i"}), - conv_date($form->{"datepaid_$i"}), - $form->{"source_$i"}, $form->{"memo_$i"}, $project_id, $accno); - do_query($form, $dbh, $query, @values); - - # gain/loss - $amount = - $form->{"paid_$i"} * $form->{exchangerate} - $form->{"paid_$i"} * - $form->{"exchangerate_$i"}; - if ($amount > 0) { - $form->{fx}{ $form->{fxgain_accno} }{ $form->{"datepaid_$i"} } += - $amount; - } else { - $form->{fx}{ $form->{fxloss_accno} }{ $form->{"datepaid_$i"} } += - $amount; - } + $self->setup_form($form); - # update exchange rate - if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { - $form->update_exchangerate($dbh, $form->{currency}, - $form->{"datepaid_$i"}, - $form->{"exchangerate_$i"}, 0); - } - } - } + ($form->{defaultcurrency}) = selectrow_query($form, $dbh, qq|SELECT curr FROM defaults|); + $form->{defaultcurrency} = (split m/:/, $form->{defaultcurrency})[0]; - # record exchange rate differences and gains/losses - foreach my $accno (keys %{ $form->{fx} }) { - foreach my $transdate (keys %{ $form->{fx}{$accno} }) { - if ( - ($form->{fx}{$accno}{$transdate} = - $form->round_amount($form->{fx}{$accno}{$transdate}, 2) - ) != 0 - ) { - $query = - qq|DELETE FROM acc_trans | . - qq|WHERE trans_id = ? AND | . - qq| chart_id = (SELECT c.id FROM chart c WHERE c.accno = ?) AND | . - qq| amount = ? AND transdate = ? AND cleared = 'f' AND fx_transaction = 't'|; - @values = (conv_i($form->{id}), $accno, - conv_i($form->{fx}{$accno}{$transdate}), - conv_date($transdate)); - do_query($form, $dbh, $query, @values); + $form->{exchangerate} = $form->format_amount($myconfig, $form->{exchangerate}); - $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, cleared, fx_transaction, project_id, taxkey) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 'f', 't', ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = (conv_i($form->{id}), $accno, - $form->{fx}{$accno}{$transdate}, - conv_date($transdate), $project_id, - $form->{fx}{$accno}{$transdate}); - do_query($form, $dbh, $query, @values); - } - } - } - my $datepaid = ($form->{paid}) ? $form->{datepaid} : "NULL"; + # Get the AR accno (which is normally done by Form::create_links()). + $query = + qq|SELECT c.accno + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (trans_id = ?) + AND ((c.link = 'AR') OR (c.link LIKE '%:AR') OR (c.link LIKE 'AR:%')) + ORDER BY at.oid + LIMIT 1|; - # save AR record - my $query = - qq|UPDATE ar set paid = ?, datepaid = ? WHERE id = ?|; - @values = (conv_i($form->{paid}), conv_date($datepaid), conv_i($form->{id})); - do_query($form, $dbh, $query, @values); + ($form->{ARselected}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{id})); - my $rc = $dbh->commit; - $dbh->disconnect; + # Post the new payments. + $self->post_transaction($myconfig, $form, $dbh, 1); + + restore_form($old_form); + + my $rc = $dbh->commit(); + $dbh->disconnect(); $main::lxdebug->leave_sub(); @@ -460,6 +406,7 @@ sub ar_transactions { qq| a.duedate, a.netamount, a.amount, a.paid, | . qq| a.invoice, a.datepaid, a.terms, a.notes, a.shipvia, | . qq| a.shippingpoint, a.storno, a.globalproject_id, | . + qq| a.transaction_description, | . qq| pr.projectnumber AS globalprojectnumber, | . qq| c.name, | . qq| e.name AS employee | . @@ -481,7 +428,7 @@ sub ar_transactions { $where .= " AND a.department_id = ?"; push(@values, $department_id); } - foreach my $column (qw(invnumber ordnumber notes)) { + foreach my $column (qw(invnumber ordnumber notes transaction_description)) { if ($form->{$column}) { $where .= " AND a.$column ILIKE ?"; push(@values, $form->like($form->{$column})); @@ -557,5 +504,107 @@ sub get_transdate { $main::lxdebug->leave_sub(); } +sub setup_form { + $main::lxdebug->enter_sub(); + + my ($self, $form) = @_; + + my ($exchangerate, $key, $akey, $i, $j, $k, $index, $taxamount, $totaltax, $taxrate, $diff); + + # forex + $form->{forex} = $form->{exchangerate}; + $exchangerate = $form->{exchangerate} ? $form->{exchangerate} : 1; + + foreach $key (keys %{ $form->{AR_links} }) { + # if there is a value we have an old entry + $j = 0; + $k = 0; + + for $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { + if ($key eq "AR_paid") { + $j++; + $form->{"AR_paid_$j"} = $form->{acc_trans}{$key}->[$i-1]->{accno}; + + # reverse paid + $form->{"paid_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{amount} * -1; + $form->{"datepaid_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{transdate}; + $form->{"source_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{source}; + $form->{"memo_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{memo}; + $form->{"forex_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; + $form->{"exchangerate_$i"} = $form->{"forex_$j"}; + $form->{"paid_project_id_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{project_id}; + $form->{paidaccounts}++; + + } else { + + $akey = $key; + $akey =~ s/AR_//; + + if ($key eq "AR_tax" || $key eq "AP_tax") { + $form->{"${key}_$form->{acc_trans}{$key}->[$i-1]->{accno}"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"} = $form->round_amount($form->{acc_trans}{$key}->[$i - 1]->{amount} / $exchangerate, 2); + + if ($form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"} > 0) { + $totaltax += $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"}; + $taxrate += $form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"}; + + } else { + $totalwithholding += $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"}; + $withholdingrate += $form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"}; + } + + $index = $form->{acc_trans}{$key}->[$i - 1]->{index}; + $form->{"tax_$index"} = $form->{acc_trans}{$key}->[$i - 1]->{amount}; + $totaltax += $form->{"tax_$index"}; + + } else { + $k++; + $form->{"${akey}_$k"} = $form->round_amount($form->{acc_trans}{$key}->[$i - 1]->{amount} / $exchangerate, 2); + + if ($akey eq 'amount') { + $form->{rowcount}++; + $totalamount += $form->{"${akey}_$i"}; + + $form->{"oldprojectnumber_$k"} = $form->{acc_trans}{$key}->[$i-1]->{projectnumber}; + $form->{"projectnumber_$k"} = $form->{acc_trans}{$key}->[$i-1]->{projectnumber}; + $form->{taxrate} = $form->{acc_trans}{$key}->[$i - 1]->{rate}; + $form->{"project_id_$k"} = $form->{acc_trans}{$key}->[$i-1]->{project_id}; + } + + $form->{"${key}_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + + if ($akey eq "AR") { + $form->{ARselected} = $form->{acc_trans}{$key}->[$i-1]->{accno}; + + } elsif ($akey eq "amount") { + $form->{"${key}_$k"} = $form->{acc_trans}{$key}->[$i-1]->{accno} . "--" . $form->{acc_trans}{$key}->[$i-1]->{id}; + $form->{"taxchart_$k"} = $form->{acc_trans}{$key}->[$i-1]->{id} . "--" . $form->{acc_trans}{$key}->[$i-1]->{rate}; + } + } + } + } + } + + $form->{taxincluded} = $taxincluded if ($form->{id}); + $form->{paidaccounts} = 1 if not defined $form->{paidaccounts}; + + if ($form->{taxincluded} && $form->{taxrate} && $totalamount) { + + # add tax to amounts and invtotal + for $i (1 .. $form->{rowcount}) { + $taxamount = ($totaltax + $totalwithholding) * $form->{"amount_$i"} / $totalamount; + $tax = $form->round_amount($taxamount, 2); + $diff += ($taxamount - $tax); + $form->{"amount_$i"} += $form->{"tax_$i"}; + } + $form->{amount_1} += $form->round_amount($diff, 2); + } + + $taxamount = $form->round_amount($taxamount, 2); + $form->{tax} = $taxamount; + + $form->{invtotal} = $totalamount + $totaltax; +} + 1;