X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAR.pm;h=65eb3f03ca68272a9717f8e5b4beed3d9aaa2c44;hb=e765448cae9f91754d3e93b377705f8533e0b842;hp=5edd4161a2e6f7a3cc4a591f7671d8c871ec9919;hpb=3578314fb94f63b04ee3bf34e91f1bed898fc434;p=kivitendo-erp.git diff --git a/SL/AR.pm b/SL/AR.pm index 5edd4161a..65eb3f03c 100644 --- a/SL/AR.pm +++ b/SL/AR.pm @@ -377,6 +377,150 @@ sub post_transaction { return $rc; } +sub post_payment { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form, $locale) = @_; + + # connect to database, turn off autocommit + my $dbh = $form->dbconnect_noauto($myconfig); + + $form->{datepaid} = $form->{invdate}; + + # 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"}); + } + + $form->{exchangerate} = + $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, + "buy"); + + # record payments and offsetting AR + for my $i (1 .. $form->{paidaccounts}) { + + if ($form->{"paid_$i"} != 0) { + my ($accno) = split /--/, $form->{"AR_paid_$i"}; + $form->{"datepaid_$i"} = $form->{invdate} + unless ($form->{"datepaid_$i"}); + $form->{datepaid} = $form->{"datepaid_$i"}; + + $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"}); + } + + # record AR + $amount = + $form->round_amount($form->{"paid_$i"} * $form->{"exchangerate"}, + 2); + + + $query = qq|DELETE FROM acc_trans WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c + WHERE c.accno = '$form->{AR}') AND amount=$amount AND transdate='$form->{"datepaid_$i"}'|; + $dbh->do($query) || $form->dberror($query); + + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, + transdate) + VALUES ($form->{id}, (SELECT c.id FROM chart c + WHERE c.accno = '$form->{AR}'), + $amount, '$form->{"datepaid_$i"}')|; + $dbh->do($query) || $form->dberror($query); + + + # record payment + $form->{"paid_$i"} *= -1; + + $query = qq|DELETE FROM acc_trans WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c + WHERE c.accno = '$accno') AND amount=$form->{"paid_$i"} AND transdate='$form->{"datepaid_$i"}' AND source='$form->{"source_$i"}' AND memo='$form->{"memo_$i"}'|; + $dbh->do($query) || $form->dberror($query); + + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, + source, memo) + VALUES ($form->{id}, (SELECT c.id FROM chart c + WHERE c.accno = '$accno'), + $form->{"paid_$i"}, '$form->{"datepaid_$i"}', + '$form->{"source_$i"}', '$form->{"memo_$i"}')|; + $dbh->do($query) || $form->dberror($query); + + + # 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; + } + + $diff = 0; + + # update exchange rate + if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { + $form->update_exchangerate($dbh, $form->{currency}, + $form->{"datepaid_$i"}, + $form->{"exchangerate_$i"}, 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 WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c + WHERE c.accno = '$accno') AND amount=$form->{fx}{$accno}{$transdate} AND transdate='$transdate' AND cleared='0' AND fx_transaction='1'|; + $dbh->do($query) || $form->dberror($query); + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, + transdate, cleared, fx_transaction) + VALUES ($form->{id}, + (SELECT c.id FROM chart c + WHERE c.accno = '$accno'), + $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|; + $dbh->do($query) || $form->dberror($query); + } + } + } + my $datepaid = ($form->{paid}) ? qq|'$form->{datepaid}'| : "NULL"; + + # save AR record + my $query = qq|UPDATE ar set + paid = $form->{paid}, + datepaid = $datepaid + WHERE id=$form->{id}|; + + $dbh->do($query) || $form->dberror($query); + + my $rc = $dbh->commit; + $dbh->disconnect; + + $main::lxdebug->leave_sub(); + + return $rc; +} + sub delete_transaction { $main::lxdebug->enter_sub();