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::GLTransaction->find_by(id => $record_link->to_id)->reference if $record_link->to_table eq 'gl';
+ 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 ];
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,
);
$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};
# 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};
}
#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'} . ') ';
}
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__
=item C<linked_invoices>
-Returns an array of record names (invoice number or gl reference)
+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.
croak("No linked records at all") unless @{ $bt->linked_invoices() };
+=item C<not_assigned_amount>
+
+Returns the not open amount of this bank transaction.
+Dies if the return amount is higher than the original amount.
+
+=item C<closed_period>
+
+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