BankTransaction(closed_period) Prüft Valutadatum gegen closedto
authorJan Büren <jan@kivitendo.de>
Tue, 5 Mar 2019 12:36:19 +0000 (13:36 +0100)
committerJan Büren <jan@kivitendo.de>
Tue, 5 Mar 2019 12:36:19 +0000 (13:36 +0100)
Gibt 1 (wahr) zurück falls das Valutadatum der Bankbewegung
innerhalb einer geschloßenen Periode ist. Andernfalls 0.

POD, Test und 2 Stellen im Controller geändert.
Offen: Payment-Helper, der sollte allerdings nichts über den Zustand
der Bankbewegung wissen müssen ...

SL/Controller/BankTransaction.pm
SL/DB/BankTransaction.pm
t/bank/bank_transactions.t

index 655aebc..c7215b2 100644 (file)
@@ -561,6 +561,13 @@ sub save_single_bank_transaction {
 
   my $bank_transaction = $data{bank_transaction};
 
 
   my $bank_transaction = $data{bank_transaction};
 
+  if ($bank_transaction->closed_period) {
+    return {
+      %data,
+      result => 'error',
+      message => $::locale->text('Cannot post payment for a closed period!'),
+    };
+  }
   my (@warnings);
 
   my $worker = sub {
   my (@warnings);
 
   my $worker = sub {
@@ -729,13 +736,13 @@ sub action_unlink_bank_transaction {
 
   croak("No bank transaction ids") unless scalar @{ $::form->{ids}} > 0;
 
 
   croak("No bank transaction ids") unless scalar @{ $::form->{ids}} > 0;
 
-  my $closedto = $::locale->parse_date_to_object($::instance_conf->get_closedto);
   my $success_count;
 
   foreach my $bt_id (@{ $::form->{ids}} )  {
 
     my $bank_transaction = SL::DB::Manager::BankTransaction->find_by(id => $bt_id);
     croak("No valid bank transaction found") unless (ref($bank_transaction)  eq 'SL::DB::BankTransaction');
   my $success_count;
 
   foreach my $bt_id (@{ $::form->{ids}} )  {
 
     my $bank_transaction = SL::DB::Manager::BankTransaction->find_by(id => $bt_id);
     croak("No valid bank transaction found") unless (ref($bank_transaction)  eq 'SL::DB::BankTransaction');
+    croak t8('Cannot unlink payment for a closed period!') if $bank_transaction->closed_period;
 
     # everything in one transaction
     my $rez = $bank_transaction->db->with_transaction(sub {
 
     # everything in one transaction
     my $rez = $bank_transaction->db->with_transaction(sub {
@@ -747,15 +754,12 @@ sub action_unlink_bank_transaction {
       foreach my $acc_trans_id_entry (@{ SL::DB::Manager::BankTransactionAccTrans->get_all(where => [bank_transaction_id => $bt_id ] )}) {
 
         my $acc_trans = SL::DB::Manager::AccTransaction->get_all(where => [acc_trans_id => $acc_trans_id_entry->acc_trans_id]);
       foreach my $acc_trans_id_entry (@{ SL::DB::Manager::BankTransactionAccTrans->get_all(where => [bank_transaction_id => $bt_id ] )}) {
 
         my $acc_trans = SL::DB::Manager::AccTransaction->get_all(where => [acc_trans_id => $acc_trans_id_entry->acc_trans_id]);
-        # check closedto for acc trans entries
-        croak t8('Cannot unlink payment for a closed period!') if (ref $closedto && grep { $_->transdate < $closedto } @{ $acc_trans } );
 
         # save trans_id and type
         die "no type" unless ($acc_trans_id_entry->ar_id || $acc_trans_id_entry->ap_id || $acc_trans_id_entry->gl_id);
         $trans_ids{$acc_trans_id_entry->ar_id} = 'ar' if $acc_trans_id_entry->ar_id;
         $trans_ids{$acc_trans_id_entry->ap_id} = 'ap' if $acc_trans_id_entry->ap_id;
         $trans_ids{$acc_trans_id_entry->gl_id} = 'gl' if $acc_trans_id_entry->gl_id;
 
         # save trans_id and type
         die "no type" unless ($acc_trans_id_entry->ar_id || $acc_trans_id_entry->ap_id || $acc_trans_id_entry->gl_id);
         $trans_ids{$acc_trans_id_entry->ar_id} = 'ar' if $acc_trans_id_entry->ar_id;
         $trans_ids{$acc_trans_id_entry->ap_id} = 'ap' if $acc_trans_id_entry->ap_id;
         $trans_ids{$acc_trans_id_entry->gl_id} = 'gl' if $acc_trans_id_entry->gl_id;
-
         # 2. all good -> ready to delete acc_trans and bt_acc link
         $acc_trans_id_entry->delete;
         $_->delete for @{ $acc_trans };
         # 2. all good -> ready to delete acc_trans and bt_acc link
         $acc_trans_id_entry->delete;
         $_->delete for @{ $acc_trans };
index 9c5b560..e2ddede 100644 (file)
@@ -297,6 +297,20 @@ sub not_assigned_amount {
   return $not_assigned_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__
 1;
 
 __END__
@@ -354,6 +368,11 @@ Usage:
 Returns the not open amount of this bank transaction.
 Dies if the return amount is higher than the original 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
 =back
 
 =head1 AUTHOR
index 067270b..aaff649 100644 (file)
@@ -1,4 +1,4 @@
-use Test::More tests => 282;
+use Test::More tests => 290;
 
 use strict;
 
 
 use strict;
 
@@ -15,6 +15,7 @@ use SL::DB::BankTransactionAccTrans;
 use SL::DB::Buchungsgruppe;
 use SL::DB::Currency;
 use SL::DB::Customer;
 use SL::DB::Buchungsgruppe;
 use SL::DB::Currency;
 use SL::DB::Customer;
+use SL::DB::Default;
 use SL::DB::Vendor;
 use SL::DB::Invoice;
 use SL::DB::Unit;
 use SL::DB::Vendor;
 use SL::DB::Invoice;
 use SL::DB::Unit;
@@ -92,7 +93,6 @@ test_two_neg_ap_transaction();
 test_one_inv_and_two_invoices_with_skonto_exact();
 test_bt_error();
 test_full_workflow_ar_multiple_inv_skonto_reconciliate_and_undo();
 test_one_inv_and_two_invoices_with_skonto_exact();
 test_bt_error();
 test_full_workflow_ar_multiple_inv_skonto_reconciliate_and_undo();
-
 reset_state();
 test_sepa_export();
 
 reset_state();
 test_sepa_export();
 
@@ -101,6 +101,7 @@ test_bt_rule1();
 reset_state();
 test_two_banktransactions();
 # remove all created data at end of test
 reset_state();
 test_two_banktransactions();
 # remove all created data at end of test
+test_closedto();
 clear_up();
 
 done_testing();
 clear_up();
 
 done_testing();
@@ -1171,6 +1172,36 @@ sub test_two_banktransactions {
   # is(scalar(@$proposals)         , 1  , "$testname: one proposal");
 
 };
   # is(scalar(@$proposals)         , 1  , "$testname: one proposal");
 
 };
+sub test_closedto {
+
+  my $testname = 'closedto';
+
+  my $ar_transaction_1 = test_ar_transaction(invnumber => 'salesinv10000' , amount => 2912.00 );
+  my $bt1 = create_bank_transaction(record        => $ar_transaction_1,
+                                    amount        => $ar_transaction_1->amount,
+                                    purpose       => "Rechnung10000 beinahe",
+                                    bank_chart_id => $bank->id,
+                                  ) or die "Couldn't create bank_transaction";
+
+  $bt1->valutadate(DateTime->new(year => 2019, month => 12, day => 30));
+  $bt1->save();
+
+  is($bt1->closed_period, 0, "$testname undefined closedto");
+
+  my $defaults = SL::DB::Manager::Default->get_all(limit => 1)->[0];
+  $defaults->closedto(DateTime->new(year => 2019, month => 12, day => 30));
+  $defaults->save();
+  $::instance_conf->reload->data;
+  $bt1->load();
 
 
+  is($bt1->closed_period, 1, "$testname defined and same date closedto");
+
+  $bt1->valutadate(DateTime->new(year => 2019, month => 12, day => 31));
+  $bt1->save();
+  $bt1->load();
+
+  is($bt1->closed_period, 0, "$testname defined closedto and next date valuta");
+
+}
 
 1;
 
 1;