From: Moritz Bunkus Date: Wed, 6 Jun 2007 13:45:19 +0000 (+0000) Subject: Die Funktion "Zahlung buchen" bei Kreditorenrechnungen komplett umgeschrieben. Sie... X-Git-Tag: release-2.4.3^2~186 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=1118dab96d2c42e872c9782b4374709d52b20653;p=kivitendo-erp.git Die Funktion "Zahlung buchen" bei Kreditorenrechnungen komplett umgeschrieben. Sie verlässt sich nun nicht mehr auf die aktuellen Daten in $form, um die alten Einträge in acc_trans zu löschen, sondern lädt den vorherigen Stand aus der Datenbank, entfernt darauf basierend die Einträge in acc_trans und lässt AP->post_transaction() selber die Zahlungen eintragen. Zusätzlich den Button "Storno" in der Buttonleiste weiter nach rechts verschoben, sodass wie überall der "Erneuern"-Button der Standardbutton ist. --- diff --git a/SL/AP.pm b/SL/AP.pm index a3b7d1e26..0f2e8ee07 100644 --- a/SL/AP.pm +++ b/SL/AP.pm @@ -35,14 +35,15 @@ package AP; 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) = @_; # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig); my ($null, $taxrate, $amount); my $exchangerate = 0; @@ -157,100 +158,102 @@ sub post_transaction { # amount for total AP $form->{payables} = $form->{invtotal}; - my ($query, $sth); - - # if we have an id delete old records - if ($form->{id}) { - - # delete detail records - $query = qq|DELETE FROM acc_trans WHERE trans_id = ?|; - do_query($form, $dbh, $query, $form->{id}); - - } else { - my $uid = rand() . time; - - $uid .= $form->{login}; - - $uid = substr($uid, 2, 75); - - $query = - qq|INSERT INTO ap (invnumber, employee_id) | . - qq|VALUES (?, (SELECT e.id FROM employee e WHERE e.login = ?))|; - do_query($form, $dbh, $query, $uid, $form->{login}); - - $query = qq|SELECT a.id FROM ap a - WHERE a.invnumber = ?|; - ($form->{id}) = selectrow_query($form, $dbh, $query, $uid); - } - - $form->{invnumber} = $form->{id} unless $form->{invnumber}; - $form->{datepaid} = $form->{transdate} unless ($form->{datepaid}); my $datepaid = ($form->{invpaid} != 0) ? $form->{datepaid} : undef; - $query = qq|UPDATE ap SET - invnumber = ?, transdate = ?, ordnumber = ?, vendor_id = ?, taxincluded = ?, - amount = ?, duedate = ?, paid = ?, datepaid = ?, netamount = ?, - curr = ?, notes = ?, department_id = ?, storno = ?, storno_id = ? - WHERE id = ?|; - my @values = ($form->{invnumber}, conv_date($form->{transdate}), - $form->{ordnumber}, conv_i($form->{vendor_id}), - $form->{taxincluded} ? 't' : 'f', $form->{invtotal}, - conv_date($form->{duedate}), $form->{invpaid}, - conv_date($datepaid), $form->{netamount}, - $form->{currency}, $form->{notes}, - conv_i($form->{department_id}), $form->{storno}, - $form->{storno_id}, $form->{id}); - do_query($form, $dbh, $query, @values); - # update exchangerate if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, 0, $form->{exchangerate}); } - # add individual transactions - for $i (1 .. $form->{rowcount}) { - if ($form->{"amount_$i"} != 0) { - my $project_id; - $project_id = conv_i($form->{"project_id_$i"}); - $taxkey = $form->{AP_amounts}{"amount_$i"}{taxkey}; + my ($query, $sth); + + if (!$payments_only) { + # if we have an id delete old records + if ($form->{id}) { + + # delete detail records + $query = qq|DELETE FROM acc_trans WHERE trans_id = ?|; + do_query($form, $dbh, $query, $form->{id}); + + } else { + my $uid = rand() . time; + + $uid .= $form->{login}; + + $uid = substr($uid, 2, 75); - # insert detail records in acc_trans $query = - qq|INSERT INTO acc_trans | . - qq| (trans_id, chart_id, amount, transdate, project_id, taxkey)| . - qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq| ?, ?, ?, ?)|; - @values = ($form->{id}, $form->{AP_amounts}{"amount_$i"}, - $form->{"amount_$i"}, conv_date($form->{transdate}), - $project_id, $taxkey); - do_query($form, $dbh, $query, @values); + qq|INSERT INTO ap (invnumber, employee_id) | . + qq|VALUES (?, (SELECT e.id FROM employee e WHERE e.login = ?))|; + do_query($form, $dbh, $query, $uid, $form->{login}); + + $query = qq|SELECT a.id FROM ap a + WHERE a.invnumber = ?|; + ($form->{id}) = selectrow_query($form, $dbh, $query, $uid); + } + + $form->{invnumber} = $form->{id} unless $form->{invnumber}; + + $query = qq|UPDATE ap SET + invnumber = ?, transdate = ?, ordnumber = ?, vendor_id = ?, taxincluded = ?, + amount = ?, duedate = ?, paid = ?, datepaid = ?, netamount = ?, + curr = ?, notes = ?, department_id = ?, storno = ?, storno_id = ? + WHERE id = ?|; + my @values = ($form->{invnumber}, conv_date($form->{transdate}), + $form->{ordnumber}, conv_i($form->{vendor_id}), + $form->{taxincluded} ? 't' : 'f', $form->{invtotal}, + conv_date($form->{duedate}), $form->{invpaid}, + conv_date($datepaid), $form->{netamount}, + $form->{currency}, $form->{notes}, + conv_i($form->{department_id}), $form->{storno}, + $form->{storno_id}, $form->{id}); + do_query($form, $dbh, $query, @values); + + # add individual transactions + for $i (1 .. $form->{rowcount}) { + if ($form->{"amount_$i"} != 0) { + my $project_id; + $project_id = conv_i($form->{"project_id_$i"}); + $taxkey = $form->{AP_amounts}{"amount_$i"}{taxkey}; - if ($form->{"tax_$i"} != 0) { # insert detail records in acc_trans $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, | . - qq| project_id, taxkey) | . + qq|INSERT INTO acc_trans | . + qq| (trans_id, chart_id, amount, transdate, project_id, taxkey)| . qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . qq| ?, ?, ?, ?)|; - @values = ($form->{id}, $form->{AP_amounts}{"tax_$i"}, - $form->{"tax_$i"}, conv_date($form->{transdate}), + @values = ($form->{id}, $form->{AP_amounts}{"amount_$i"}, + $form->{"amount_$i"}, conv_date($form->{transdate}), $project_id, $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, | . + qq| project_id, taxkey) | . + qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . + qq| ?, ?, ?, ?)|; + @values = ($form->{id}, $form->{AP_amounts}{"tax_$i"}, + $form->{"tax_$i"}, conv_date($form->{transdate}), + $project_id, $taxkey); + do_query($form, $dbh, $query, @values); + } + + } } - } - # add payables - $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = ($form->{id}, $form->{AP_amounts}{payables}, $form->{payables}, - conv_date($form->{transdate}), $form->{AP_amounts}{payables}); - do_query($form, $dbh, $query, @values); + # add payables + $query = + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) | . + qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, | . + qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; + @values = ($form->{id}, $form->{AP_amounts}{payables}, $form->{payables}, + conv_date($form->{transdate}), $form->{AP_amounts}{payables}); + do_query($form, $dbh, $query, @values); + } # if there is no amount but a payment record a payable if ($form->{amount} == 0 && $form->{invtotal} == 0) { @@ -356,8 +359,16 @@ sub post_transaction { } } - my $rc = $dbh->commit; - $dbh->disconnect; + if ($payments_only) { + $query = qq|UPDATE ap SET paid = ? WHERE id = ?|; + do_query($form, $dbh, $query, $form->{invpaid}, conv_i($form->{id})); + } + + my $rc = 1; + if (!$provided_dbh) { + $dbh->commit(); + $dbh->disconnect(); + } $main::lxdebug->leave_sub(); @@ -406,7 +417,7 @@ sub ap_transactions { qq|LEFT JOIN employee e ON (a.employee_id = e.id) | . qq|LEFT JOIN project pr ON (a.globalproject_id = pr.id) |; - my $where = qq| WHERE storno != true |; + my $where = qq| WHERE COALESCE(storno, false) != true |; my @values; if ($form->{vendor_id}) { @@ -508,6 +519,44 @@ sub get_transdate { $main::lxdebug->leave_sub(); } +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 '%AP_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 = 'AP') OR (c.link LIKE '%:AP') OR (c.link LIKE 'AP:%')) + 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(); @@ -517,152 +566,181 @@ 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}) { - $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 (@values, $query); + # 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+$|^AP_paid_\d+$|^paidaccounts$'; + map { $payments{$_} = $form->{$_} } grep m/$payments_re/, keys %{ $form }; - my ($accno_ap) = split(/--/, $form->{APselected}); + # 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 }; - # record payments and offsetting AP - for my $i (1 .. $form->{paidaccounts}) { + # Retrieve the invoice from the database. + $form->create_links('AP', $myconfig, 'vendor', $dbh); - if ($form->{"paid_$i"} != 0) { - my ($accno) = split /--/, $form->{"AP_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'); + # Set up the content of $form in the way that AR::post_transaction() expects. - $form->{"exchangerate_$i"} = - ($exchangerate) - ? $exchangerate - : $form->parse_amount($myconfig, $form->{"exchangerate_$i"}); - } + $self->setup_form($form); - # record AP - $amount = - $form->round_amount($form->{"paid_$i"} * $form->{"exchangerate"}, - 2) * -1; + ($form->{defaultcurrency}) = selectrow_query($form, $dbh, qq|SELECT curr FROM defaults|); + $form->{defaultcurrency} = (split m/:/, $form->{defaultcurrency})[0]; - $query = - qq|DELETE FROM acc_trans | . - qq|WHERE trans_id = ? | . - qq| AND chart_id = (SELECT c.id FROM chart c WHERE c.accno = ?) | . - qq| AND amount = ? AND transdate = ?|; - @values = ($form->{id}, $accno_ap, $amount, - conv_date($form->{"datepaid_$i"})); - 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, project_id, taxkey) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?))|; - @values = ($form->{id}, $accno_ap, $amount, - conv_date($form->{"datepaid_$i"}), - conv_i($form->{"paid_project_id_$i"}), $accno_ap); - do_query($form, $dbh, $query, @values); + # Get the AP accno. + $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 = 'AP') OR (c.link LIKE '%:AP') OR (c.link LIKE 'AP:%')) + ORDER BY at.oid + LIMIT 1|; - $query = - qq|DELETE FROM acc_trans | . - qq|WHERE trans_id = ? | . - qq| AND chart_id = (SELECT c.id FROM chart c WHERE c.accno = ?) | . - qq| AND amount = ? AND transdate = ? AND source = ? AND memo = ?|; - @values = ($form->{id}, $accno, $form->{"paid_$i"}, - conv_date($form->{"datepaid_$i"}), $form->{"source_$i"}, - $form->{"memo_$i"}); - do_query($form, $dbh, $query, @values); + ($form->{APselected}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{id})); - $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 = ($form->{id}, $accno, $form->{"paid_$i"}, - $form->{"datepaid_$i"}, - $form->{"source_$i"}, $form->{"memo_$i"}, - conv_i($form->{"paid_project_id_$i"}), $accno); - do_query($form, $dbh, $query, @values); + # Post the new payments. + $self->post_transaction($myconfig, $form, $dbh, 1); - # 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; + restore_form($old_form); + + my $rc = $dbh->commit(); + $dbh->disconnect(); + + $main::lxdebug->leave_sub(); + + return $rc; +} + +sub setup_form { + $main::lxdebug->enter_sub(); + + my ($self, $form) = @_; + + my ($exchangerate, $i, $j, $k, $key, $akey, $ref, $index, $taxamount, $totalamount); + + # forex + $form->{forex} = $form->{exchangerate}; + $exchangerate = ($form->{exchangerate}) ? $form->{exchangerate} : 1; + + foreach $key (keys %{ $form->{AP_links} }) { + foreach $ref (@{ $form->{AP_links}{$key} }) { + if ($key eq "AP_paid") { + $form->{"select$key"} .= "\n"; } else { - $form->{fx}{ $form->{fxloss_accno} }{ $form->{"datepaid_$i"} } += - $amount; + $form->{"select$key"} .= "\n"; } + } - $diff = 0; + $form->{$key} = $form->{"select$key"}; - # update exchange rate - if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { - $form->update_exchangerate($dbh, $form->{currency}, - $form->{"datepaid_$i"}, - $form->{"exchangerate_$i"}, 0); + # 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 "AP_paid") { + $j++; + $form->{"AP_paid_$j"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + $form->{"paid_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{amount}; + $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->{"exchangerate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; + $form->{"forex_$j"} = $form->{"exchangerate_$i"}; + $form->{"AP_paid_$j"} = $form->{acc_trans}{$key}->[$i-1]->{accno}; + $form->{"paid_project_id_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{project_id}; + $form->{paidaccounts}++; + + } else { + $akey = $key; + $akey =~ s/AP_//; + + if (($key eq "AP_tax") || ($key eq "AR_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}"}; + } 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} * -1; + $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}++; + $form->{"${akey}_$i"} *= -1; + $totalamount += $form->{"${akey}_$i"}; + $form->{taxrate} = $form->{acc_trans}{$key}->[$i - 1]->{rate}; + + $form->{"projectnumber_$k"} = "$form->{acc_trans}{$key}->[$i-1]->{projectnumber}"; + $form->{"oldprojectnumber_$k"} = $form->{"projectnumber_$k"}; + $form->{"project_id_$k"} = "$form->{acc_trans}{$key}->[$i-1]->{project_id}"; + } + + $form->{"${key}_$k"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + + my $q_description = quotemeta($form->{acc_trans}{$key}->[$i-1]->{description}); + $form->{"select${key}"} =~ + m/\n"; - } else { - $form->{"select$key"} .= - "\n"; - } - } - - $form->{$key} = $form->{"select$key"}; - - # if there is a value we have an old entry - my $j = 0; - my $k = 0; - - for $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { - - if ($key eq "AP_paid") { - $j++; - $form->{"AP_paid_$j"} = - "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; - $form->{"paid_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{amount}; - $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->{"exchangerate_$i"} = - $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; - $form->{"AP_paid_$j"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}"; - $form->{"paid_project_id_$j"} = $form->{acc_trans}{$key}->[$i - 1]->{project_id}; - $form->{paidaccounts}++; - } else { - - $akey = $key; - $akey =~ s/AP_//; - - if (($key eq "AP_tax") || ($key eq "AR_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}"}; - } 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} * -1; - $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}++; - $form->{"${akey}_$i"} *= -1; - $totalamount += $form->{"${akey}_$i"}; - $form->{taxrate} = $form->{acc_trans}{$key}->[$i - 1]->{rate}; - $form->{"oldprojectnumber_$k"} = $form->{"projectnumber_$k"} = - "$form->{acc_trans}{$key}->[$i-1]->{projectnumber}"; - $form->{"project_id_$k"} = - "$form->{acc_trans}{$key}->[$i-1]->{project_id}"; - } - $form->{"${key}_$k"} = - "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; - my $q_description = quotemeta($form->{acc_trans}{$key}->[$i-1]->{description}); - $form->{"select${key}"} =~ - /