X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FBankTransaction.pm;h=06302bb01a622c2f52587cbb9020e493fd025dd9;hb=2ef19c818a05b2baa2552ae5b4edbcc16bcfc986;hp=511c15f07be462bc1ce86a07bafa224f345d02d8;hpb=ce4ec1a8be52421b7b3fed991ec9539523e482a3;p=kivitendo-erp.git diff --git a/SL/DB/BankTransaction.pm b/SL/DB/BankTransaction.pm index 511c15f07..06302bb01 100644 --- a/SL/DB/BankTransaction.pm +++ b/SL/DB/BankTransaction.pm @@ -42,6 +42,7 @@ sub linked_invoices { foreach my $record_link (@{ $record_links }) { push @linked_invoices, SL::DB::Manager::Invoice->find_by(id => $record_link->to_id)->invnumber if $record_link->to_table eq 'ar'; push @linked_invoices, SL::DB::Manager::PurchaseInvoice->find_by(id => $record_link->to_id)->invnumber if $record_link->to_table eq 'ap'; + push @linked_invoices, SL::DB::Manager::GLTransaction->find_by(id => $record_link->to_id)->reference if $record_link->to_table eq 'gl'; } return [ @linked_invoices ]; @@ -69,8 +70,10 @@ sub get_agreement_with_invoice { depositor_matches => 2, exact_amount => 4, exact_open_amount => 4, - invnumber_in_purpose => 2, - own_invnumber_in_purpose => 5, + invoice_in_purpose => 2, + own_invoice_in_purpose => 5, + invnumber_in_purpose => 1, + own_invnumber_in_purpose => 4, # overpayment => -1, # either other invoice is more likely, or several invoices paid at once payment_before_invoice => -2, payment_within_30_days => 1, @@ -109,18 +112,27 @@ sub get_agreement_with_invoice { $invoice->{datediff} = $datediff; # compare amount - if (abs(abs($invoice->amount) - abs($self->amount)) < 0.01) { + if (abs(abs($invoice->amount) - abs($self->amount)) < 0.01 && + $::form->format_amount(\%::myconfig,abs($invoice->amount),2) eq + $::form->format_amount(\%::myconfig,abs($self->amount),2) + ) { $agreement += $points{exact_amount}; $rule_matches .= 'exact_amount(' . $points{'exact_amount'} . ') '; } # compare open amount, preventing double points when open amount = invoice amount - if ( $invoice->amount != $invoice->open_amount && abs(abs($invoice->open_amount) - abs($self->amount)) < 0.01) { + if ( $invoice->amount != $invoice->open_amount && abs(abs($invoice->open_amount) - abs($self->amount)) < 0.01 && + $::form->format_amount(\%::myconfig,abs($invoice->amount_less_skonto),2) eq + $::form->format_amount(\%::myconfig,abs($self->amount),2) + ) { $agreement += $points{exact_open_amount}; $rule_matches .= 'exact_open_amount(' . $points{'exact_open_amount'} . ') '; } - if ( $invoice->skonto_date && abs(abs($invoice->amount_less_skonto) - abs($self->amount)) < 0.01) { + if ( $invoice->skonto_date && abs(abs($invoice->amount_less_skonto) - abs($self->amount)) < 0.01 && + $::form->format_amount(\%::myconfig,abs($invoice->amount_less_skonto),2) eq + $::form->format_amount(\%::myconfig,abs($self->amount),2) + ) { $agreement += $points{skonto_exact_amount}; $rule_matches .= 'skonto_exact_amount(' . $points{'skonto_exact_amount'} . ') '; $invoice->{skonto_type} = 'with_skonto_pt'; @@ -132,11 +144,21 @@ sub get_agreement_with_invoice { my $squashed_purpose = $self->purpose; $squashed_purpose =~ s/ //g; if (length($invnumber) > 4 && $squashed_purpose =~ /$invnumber/ && $invoice->is_sales){ - $agreement += $points{own_invnumber_in_purpose}; - $rule_matches .= 'own_invnumber_in_purpose(' . $points{'own_invnumber_in_purpose'} . ') '; + $agreement += $points{own_invoice_in_purpose}; + $rule_matches .= 'own_invoice_in_purpose(' . $points{'own_invoice_in_purpose'} . ') '; } elsif (length($invnumber) > 3 && $squashed_purpose =~ /$invnumber/ ) { - $agreement += $points{invnumber_in_purpose}; - $rule_matches .= 'invnumber_in_purpose(' . $points{'invnumber_in_purpose'} . ') '; + $agreement += $points{invoice_in_purpose}; + $rule_matches .= 'invoice_in_purpose(' . $points{'invoice_in_purpose'} . ') '; + } else { + # only check number part of invoice number + $invnumber =~ s/[A-Za-z_]+//g; + if (length($invnumber) > 4 && $squashed_purpose =~ /$invnumber/ && $invoice->is_sales){ + $agreement += $points{own_invnumber_in_purpose}; + $rule_matches .= 'own_invnumber_in_purpose(' . $points{'own_invnumber_in_purpose'} . ') '; + } elsif (length($invnumber) > 3 && $squashed_purpose =~ /$invnumber/ ) { + $agreement += $points{invnumber_in_purpose}; + $rule_matches .= 'invnumber_in_purpose(' . $points{'invnumber_in_purpose'} . ') '; + } } #check sign @@ -307,6 +329,16 @@ Example: my $invoice = SL::DB::Manager::Invoice->find_by(invnumber => '198'); my ($agreement,rule_matches) = $bt->get_agreement_with_invoice($invoice); +=item C + +Returns an array of record names (invoice number or gl reference) +which are linked for this bank transaction. + +Returns an empty array ref if no links are found. +Usage: + croak("No linked records at all") unless @{ $bt->linked_invoices() }; + + =back =head1 AUTHOR