X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAP.pm;h=5b4386e178fe6028ef5ed04bbb61acdb0f5a7414;hb=2fe6237c8b09d2f5a83145673c15be84bdfadf8a;hp=95b0d5208fa5d5d5bf2b70a3b5c3656c219672c2;hpb=a1f105327081e1bf4b139f531a158136d55b1f8c;p=kivitendo-erp.git diff --git a/SL/AP.pm b/SL/AP.pm index 95b0d5208..5b4386e17 100644 --- a/SL/AP.pm +++ b/SL/AP.pm @@ -25,7 +25,8 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1335, USA. #====================================================================== # # Accounts Payables database backend routines @@ -39,18 +40,28 @@ use SL::DBUtils; use SL::IO; use SL::MoreCommon; use SL::DB::Default; +use SL::DB::Draft; use SL::Util qw(trim); +use SL::DB; use Data::Dumper; use strict; sub post_transaction { + my ($self, $myconfig, $form, $provided_dbh, %params) = @_; $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $provided_dbh, $payments_only) = @_; - my $rc = 0; # return code auf false setzen - # connect to database - my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig); + my $rc = SL::DB->client->with_transaction(\&_post_transaction, $self, $myconfig, $form, $provided_dbh, %params); + + $::lxdebug->leave_sub; + return $rc; +} + +sub _post_transaction { + my ($self, $myconfig, $form, $provided_dbh, %params) = @_; + + my $payments_only = $params{payments_only}; + my $dbh = $provided_dbh || SL::DB->client->dbh; my ($null, $taxrate, $amount); my $exchangerate = 0; @@ -58,8 +69,6 @@ sub post_transaction { $form->{defaultcurrency} = $form->get_default_currency($myconfig); $form->{taxincluded} = 0 unless $form->{taxincluded}; - ($null, $form->{department_id}) = split(/--/, $form->{department}); - if ($form->{currency} eq $form->{defaultcurrency}) { $form->{exchangerate} = 1; } else { @@ -67,13 +76,8 @@ sub post_transaction { $form->{exchangerate} = $exchangerate || $form->parse_amount($myconfig, $form->{exchangerate}); } - for my $i (1 .. $form->{rowcount}) { - $form->{AP_amounts}{"amount_$i"} = - (split(/--/, $form->{"AP_amount_$i"}))[0]; - } - - ($form->{AP_amounts}{payables}) = split(/--/, $form->{APselected}); - ($form->{AP_payables}) = split(/--/, $form->{APselected}); + # get the charts selected + $form->{AP_amounts}{"amount_$_"} = $form->{"AP_amount_chart_id_$_"} for (1 .. $form->{rowcount}); # calculate the totals while calculating and reformatting the $amount_$i and $tax_$i ($form->{netamount},$form->{total_tax},$form->{invtotal}) = $form->calculate_arap('buy',$form->{taxincluded}, $form->{exchangerate}); @@ -161,13 +165,11 @@ sub post_transaction { $query = qq|INSERT INTO acc_trans | . qq| (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link)| . - qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq| ?, ?, ?, ?, ?,| . - qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; - @values = ($form->{id}, $form->{AP_amounts}{"amount_$i"}, + qq|VALUES (?, ?, ?, ?, ?, ?, ?, (SELECT c.link FROM chart c WHERE c.id = ?))|; + @values = ($form->{id}, $form->{"AP_amount_chart_id_$i"}, $form->{"amount_$i"}, conv_date($form->{transdate}), $project_id, $form->{"taxkey_$i"}, conv_i($form->{"tax_id_$i"}), - $form->{AP_amounts}{"amount_$i"}); + $form->{"AP_amount_chart_id_$i"}); do_query($form, $dbh, $query, @values); if ($form->{"tax_$i"} != 0) { @@ -191,19 +193,17 @@ sub post_transaction { # add payables $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id, chart_link) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?),| . + qq|VALUES (?, ?, ?, ?, | . + qq| (SELECT taxkey_id FROM chart WHERE id = ?),| . qq| (SELECT tax_id| . qq| FROM taxkeys| . - qq| WHERE chart_id= (SELECT id | . - qq| FROM chart| . - qq| WHERE accno = ?)| . + qq| WHERE chart_id = ?| . qq| AND startdate <= ?| . qq| ORDER BY startdate DESC LIMIT 1),| . - qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; - @values = ($form->{id}, $form->{AP_amounts}{payables}, $form->{payables}, - conv_date($form->{transdate}), $form->{AP_amounts}{payables}, $form->{AP_amounts}{payables}, conv_date($form->{transdate}), - $form->{AP_amounts}{payables}); + qq| (SELECT c.link FROM chart c WHERE c.id = ?))|; + @values = ($form->{id}, $form->{AP_chart_id}, $form->{payables}, + conv_date($form->{transdate}), $form->{AP_chart_id}, $form->{AP_chart_id}, conv_date($form->{transdate}), + $form->{AP_chart_id}); do_query($form, $dbh, $query, @values); } @@ -212,6 +212,8 @@ sub post_transaction { $form->{payables} = $form->{invpaid}; } + my %already_cleared = %{ $params{already_cleared} // {} }; + # add paid transactions for my $i (1 .. $form->{paidaccounts}) { @@ -245,23 +247,29 @@ sub post_transaction { $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate} * -1, 2); + + my $new_cleared = !$form->{"acc_trans_id_$i"} ? 'f' + : !$already_cleared{$form->{"acc_trans_id_$i"}} ? 'f' + : $already_cleared{$form->{"acc_trans_id_$i"}}->{amount} != $amount * -1 ? 'f' + : $already_cleared{$form->{"acc_trans_id_$i"}}->{accno} != $form->{"AP_paid_account_$i"} ? 'f' + : $already_cleared{$form->{"acc_trans_id_$i"}}->{cleared} ? 't' + : 'f'; + if ($form->{payables}) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, | . - qq| (SELECT taxkey_id FROM chart WHERE accno = ?),| . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, cleared, taxkey, tax_id, chart_link) | . + qq|VALUES (?, ?, ?, ?, ?, ?, | . + qq| (SELECT taxkey_id FROM chart WHERE id = ?),| . qq| (SELECT tax_id| . qq| FROM taxkeys| . - qq| WHERE chart_id= (SELECT id | . - qq| FROM chart| . - qq| WHERE accno = ?)| . + qq| WHERE chart_id = ?| . qq| AND startdate <= ?| . qq| ORDER BY startdate DESC LIMIT 1),| . - qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; - @values = ($form->{id}, $form->{AP_payables}, $amount, - conv_date($form->{"datepaid_$i"}), $project_id, - $form->{AP_payables}, $form->{AP_payables}, conv_date($form->{"datepaid_$i"}), - $form->{AP_payables}); + qq| (SELECT c.link FROM chart c WHERE c.id = ?))|; + @values = ($form->{id}, $form->{AP_chart_id}, $amount, + conv_date($form->{"datepaid_$i"}), $project_id, $new_cleared, + $form->{AP_chart_id}, $form->{AP_chart_id}, conv_date($form->{"datepaid_$i"}), + $form->{AP_chart_id}); do_query($form, $dbh, $query, @values); } $form->{payables} = $amount; @@ -269,8 +277,8 @@ sub post_transaction { # add payment my $gldate = (conv_date($form->{"gldate_$i"}))? conv_date($form->{"gldate_$i"}) : conv_date($form->current_date($myconfig)); $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, taxkey, tax_id, chart_link) | . - qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, ?, | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, cleared, taxkey, tax_id, chart_link) | . + qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, ?, ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?), | . qq| (SELECT tax_id| . qq| FROM taxkeys| . @@ -282,7 +290,7 @@ sub post_transaction { qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{"AP_paid_account_$i"}, $form->{"paid_$i"}, conv_date($form->{"datepaid_$i"}), $gldate, $form->{"source_$i"}, - $form->{"memo_$i"}, $project_id, $form->{"AP_paid_account_$i"}, + $form->{"memo_$i"}, $project_id, $new_cleared, $form->{"AP_paid_account_$i"}, $form->{"AP_paid_account_$i"}, conv_date($form->{"datepaid_$i"}), $form->{"AP_paid_account_$i"}); do_query($form, $dbh, $query, @values); @@ -366,36 +374,24 @@ sub post_transaction { IO->set_datepaid(table => 'ap', id => $form->{id}, dbh => $dbh); + if ($form->{draft_id}) { + SL::DB::Manager::Draft->delete_all(where => [ id => delete($form->{draft_id}) ]); + } + # safety check datev export if ($::instance_conf->get_datev_check_on_ap_transaction) { - my $transdate = $::form->{transdate} ? DateTime->from_lxoffice($::form->{transdate}) : undef; - $transdate ||= DateTime->today; - my $datev = SL::DATEV->new( - exporttype => DATEV_ET_BUCHUNGEN, - format => DATEV_FORMAT_KNE, dbh => $dbh, trans_id => $form->{id}, ); - - $datev->export; + $datev->generate_datev_data; if ($datev->errors) { - $dbh->rollback; die join "\n", $::locale->text('DATEV check returned errors:'), $datev->errors; } } - if (!$provided_dbh) { - $dbh->commit(); - $dbh->disconnect(); - } - - $rc = 1; # Den return-code auf true setzen, aber nur falls beim commit alles i.O. ist - - $main::lxdebug->leave_sub(); - - return $rc; + return 1; } sub delete_transaction { @@ -403,19 +399,15 @@ sub delete_transaction { my ($self, $myconfig, $form) = @_; - # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); - - # acc_trans entries are deleted by database triggers. - my $query = qq|DELETE FROM ap WHERE id = ?|; - do_query($form, $dbh, $query, $form->{id}); - - my $rc = $dbh->commit; - $dbh->disconnect; + SL::DB->client->with_transaction(sub { + my $query = qq|DELETE FROM ap WHERE id = ?|; + do_query($form, SL::DB->client->dbh, $query, $form->{id}); + 1; + }) or do { die SL::DB->client->error }; $main::lxdebug->leave_sub(); - return $rc; + return 1; } sub ap_transactions { @@ -458,10 +450,7 @@ sub ap_transactions { my @values; - if ($form->{vendor_id}) { - $where .= " AND a.vendor_id = ?"; - push(@values, $form->{vendor_id}); - } elsif ($form->{vendor}) { + if ($form->{vendor}) { $where .= " AND v.name ILIKE ?"; push(@values, like($form->{vendor})); } @@ -469,13 +458,9 @@ sub ap_transactions { $where .= " AND (cp.cp_name ILIKE ? OR cp.cp_givenname ILIKE ?)"; push(@values, (like($form->{"cp_name"}))x2); } - if ($form->{department}) { - # ähnlich wie commit 0bbfb33b6aa8e38bb6c81d1684ab7d08e5b5c5af abteilung - # wird so nicht mehr als zeichenkette zusammengebaut - # hätte zu ee9f9f9aa4c3b9d5d20ab10a45c12bcaa6aa78d0 auffallen können ;-) jan - #my ($null, $department_id) = split /--/, $form->{department}; + if ($form->{department_id}) { $where .= " AND a.department_id = ?"; - push(@values, $form->{department}); + push(@values, $form->{department_id}); } if ($form->{invnumber}) { $where .= " AND a.invnumber ILIKE ?"; @@ -572,7 +557,7 @@ sub get_transdate { my ($self, $myconfig, $form) = @_; # connect to database - my $dbh = $form->dbconnect($myconfig); + my $dbh = SL::DB->client->dbh; my $query = "SELECT COALESCE(" . @@ -581,8 +566,6 @@ sub get_transdate { " current_date)"; ($form->{transdate}) = $dbh->selectrow_array($query); - $dbh->disconnect; - $main::lxdebug->leave_sub(); } @@ -626,17 +609,33 @@ sub _delete_payments { } sub post_payment { + my ($self, $myconfig, $form, $locale) = @_; $main::lxdebug->enter_sub(); + my $rc = SL::DB->client->with_transaction(\&_post_payment, $self, $myconfig, $form, $locale); + + $::lxdebug->leave_sub; + return $rc; +} + +sub _post_payment { my ($self, $myconfig, $form, $locale) = @_; - # connect to database, turn off autocommit - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = SL::DB->client->dbh; my (%payments, $old_form, $row, $item, $query, %keep_vars); $old_form = save_form(); + $query = <{id}); + # Delete all entries in acc_trans from prior payments. if (SL::DB::Default->get->payments_changeable != 0) { $self->_delete_payments($form, $dbh); @@ -665,7 +664,7 @@ sub post_payment { # Get the AP accno. $query = - qq|SELECT c.accno + qq|SELECT c.id FROM acc_trans at LEFT JOIN chart c ON (at.chart_id = c.id) WHERE (trans_id = ?) @@ -673,19 +672,14 @@ sub post_payment { ORDER BY at.acc_trans_id LIMIT 1|; - ($form->{APselected}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{id})); + ($form->{AP_chart_id}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{id})); # Post the new payments. - $self->post_transaction($myconfig, $form, $dbh, 1); + $self->post_transaction($myconfig, $form, $dbh, payments_only => 1, already_cleared => \%already_cleared); restore_form($old_form); - my $rc = $dbh->commit(); - $dbh->disconnect(); - - $main::lxdebug->leave_sub(); - - return $rc; + return 1; } sub setup_form { @@ -771,26 +765,7 @@ sub setup_form { $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/