X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FBankTransaction.pm;h=b07cdf11f6ede506508ca1aafc2f20a520f1b12b;hb=549f187d3a2b1d15f96c4556714666ed954447bb;hp=eee6e000eeba9877a23d1433ae923e8a874bde25;hpb=a695cc30eec6422260f0e9a9b00bbc209649d212;p=kivitendo-erp.git diff --git a/SL/DB/BankTransaction.pm b/SL/DB/BankTransaction.pm index eee6e000e..b07cdf11f 100644 --- a/SL/DB/BankTransaction.pm +++ b/SL/DB/BankTransaction.pm @@ -40,8 +40,9 @@ sub linked_invoices { my $record_links = SL::DB::Manager::RecordLink->get_all(where => [ from_table => 'bank_transactions', from_id => $self->id ]); 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::Invoice->find_by(id => $record_link->to_id) if $record_link->to_table eq 'ar'; + push @linked_invoices, SL::DB::Manager::PurchaseInvoice->find_by(id => $record_link->to_id) if $record_link->to_table eq 'ap'; + push @linked_invoices, SL::DB::Manager::GLTransaction->find_by(id => $record_link->to_id) if $record_link->to_table eq 'gl'; } return [ @linked_invoices ]; @@ -78,7 +79,7 @@ sub get_agreement_with_invoice { payment_within_30_days => 1, remote_account_number => 3, skonto_exact_amount => 5, - wrong_sign => -1, + wrong_sign => -4, sepa_export_item => 5, batch_sepa_transaction => 20, ); @@ -98,13 +99,16 @@ sub get_agreement_with_invoice { $bank_code = $invoice->vendor->bank_code if ! $invoice->is_sales; $iban = $invoice->vendor->iban if ! $invoice->is_sales; $account_number = $invoice->vendor->account_number if ! $invoice->is_sales; - if ( $bank_code eq $self->remote_bank_code && $account_number eq $self->remote_account_number ) { - $agreement += $points{remote_account_number}; - $rule_matches .= 'remote_account_number(' . $points{'remote_account_number'} . ') '; - } - if ( $iban eq $self->remote_account_number ) { - $agreement += $points{remote_account_number}; - $rule_matches .= 'remote_account_number(' . $points{'remote_account_number'} . ') '; + + # check only valid remote_account_number (with some content) + if ($self->remote_account_number) { + if ($bank_code eq $self->remote_bank_code && $account_number eq $self->remote_account_number) { + $agreement += $points{remote_account_number}; + $rule_matches .= 'remote_account_number(' . $points{'remote_account_number'} . ') '; + } elsif ($iban eq $self->remote_account_number) { # elsif -> do not add twice + $agreement += $points{remote_account_number}; + $rule_matches .= 'remote_account_number(' . $points{'remote_account_number'} . ') '; + } } my $datediff = $self->transdate->{utc_rd_days} - $invoice->transdate->{utc_rd_days}; @@ -121,7 +125,7 @@ sub get_agreement_with_invoice { # 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 && - $::form->format_amount(\%::myconfig,abs($invoice->amount_less_skonto),2) eq + $::form->format_amount(\%::myconfig,abs($invoice->open_amount),2) eq $::form->format_amount(\%::myconfig,abs($self->amount),2) ) { $agreement += $points{exact_open_amount}; @@ -161,11 +165,13 @@ sub get_agreement_with_invoice { } #check sign - if ( $invoice->is_sales && $self->amount < 0 ) { + if (( $invoice->is_sales && $invoice->amount > 0 && $self->amount < 0 ) || + ( $invoice->is_sales && $invoice->amount < 0 && $self->amount > 0 ) ) { # sales credit note $agreement += $points{wrong_sign}; $rule_matches .= 'wrong_sign(' . $points{'wrong_sign'} . ') '; } - if ( ! $invoice->is_sales && $self->amount > 0 ) { + if (( !$invoice->is_sales && $invoice->amount > 0 && $self->amount > 0) || + ( !$invoice->is_sales && $invoice->amount < 0 && $self->amount < 0) ) { # purchase credit note $agreement += $points{wrong_sign}; $rule_matches .= 'wrong_sign(' . $points{'wrong_sign'} . ') '; } @@ -286,6 +292,30 @@ sub _check_string { return $match; }; + +sub not_assigned_amount { + my ($self) = @_; + + my $not_assigned_amount = $self->amount - $self->invoice_amount; + die ("undefined state") if (abs($not_assigned_amount) > abs($self->amount)); + + return $not_assigned_amount; + +} +sub closed_period { + my ($self) = @_; + + # check for closed period + croak t8('Illegal date') unless ref $self->valutadate eq 'DateTime'; + + + my $closedto = $::locale->parse_date_to_object($::instance_conf->get_closedto); + if ( ref $closedto && $self->valutadate < $closedto ) { + return 1; + } else { + return 0; + } +} 1; __END__ @@ -328,6 +358,26 @@ 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 objects (invoices, debit, credit or gl objects) +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() }; + + +=item C + +Returns the not open amount of this bank transaction. +Dies if the return amount is higher than the original amount. + +=item C + +Returns 1 if the bank transaction valutadate is in a closed period, 0 if the +valutadate of the bank transaction is not in a closed period. + =back =head1 AUTHOR