use Koha::Database;
use Koha::Items;
+use Koha::Account::Offsets;
use base qw(Koha::Object);
return Koha::Item->_new_from_dbic( $rs );
}
+=head3 void
+
+$payment_accountline->void();
+
+=cut
+
+sub void {
+ my ($self) = @_;
+
+ # Make sure it is a payment we are voiding
+ return unless $self->accounttype =~ /^Pay/;
+
+ my @account_offsets =
+ Koha::Account::Offsets->search( { credit_id => $self->id, type => 'Payment' } );
+
+ foreach my $account_offset (@account_offsets) {
+ my $fee_paid = Koha::Account::Lines->find( $account_offset->debit_id );
+
+ next unless $fee_paid;
+
+ my $amount_paid = $account_offset->amount * -1; # amount paid is stored as a negative amount
+ my $new_amount = $fee_paid->amountoutstanding + $amount_paid;
+ $fee_paid->amountoutstanding($new_amount);
+ $fee_paid->store();
+
+ Koha::Account::Offset->new(
+ {
+ credit_id => $self->id,
+ debit_id => $fee_paid->id,
+ amount => $amount_paid,
+ type => 'Void Payment',
+ }
+ )->store();
+ }
+
+ $self->set(
+ {
+ accounttype => 'VOID',
+ amountoutstanding => 0,
+ amount => 0,
+ }
+ );
+ $self->store();
+}
+
=head3 _type
=cut
[% CASE 'Pay00' %]Payment, thanks (cash via SIP2)
[% CASE 'Pay01' %]Payment, thanks (VISA via SIP2)
[% CASE 'Pay02' %]Payment, thanks (credit card via SIP2)
+ [% CASE 'VOID' %]Payment, Voided
[% CASE 'N' %]New card
[% CASE 'F' %]Fine
[% CASE 'A' %]Account management fee
[% IF ( reverse_col) %]
[% IF ( account.payment ) %]
<a href="boraccount.pl?action=reverse&accountlines_id=[% account.accountlines_id %]&borrowernumber=[% account.borrowernumber %]" class="btn btn-default btn-xs"><i class="fa fa-undo"></i> Reverse</a>
+ <a href="boraccount.pl?action=void&accountlines_id=[% account.accountlines_id %]&borrowernumber=[% account.borrowernumber %]" class="btn btn-default btn-xs"><i class="fa fa-ban"></i> Void</a>
[% ELSE %][% SET footerjs = 1 %]
[% END %]
}
);
-my $borrowernumber=$input->param('borrowernumber');
+my $borrowernumber = $input->param('borrowernumber');
my $action = $input->param('action') || '';
my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in";
if ( $action eq 'reverse' ) {
ReversePayment( scalar $input->param('accountlines_id') );
}
+elsif ( $action eq 'void' ) {
+ my $payment_id = scalar $input->param('accountlines_id');
+ my $payment = Koha::Account::Lines->find( $payment_id );
+ $payment->void();
+}
if ( $patron->is_child ) {
my $patron_categories = Koha::Patron::Categories->search_limited({ category_type => 'A' }, {order_by => ['categorycode']});
use Modern::Perl;
-use Test::More tests => 25;
+use Test::More tests => 26;
use Test::MockModule;
use Test::Warn;
is( Koha::Account::Lines->count({ borrowernumber => $patron->id }), 2 + 2, "The 2 + 2 account lines still exists, the last 2 have been deleted ok" );
};
+subtest "Koha::Account::Line::void tests" => sub {
+
+ plan tests => 12;
+
+ # Create a borrower
+ my $categorycode = $builder->build({ source => 'Category' })->{ categorycode };
+ my $branchcode = $builder->build({ source => 'Branch' })->{ branchcode };
+
+ my $borrower = Koha::Patron->new( {
+ cardnumber => 'dariahall',
+ surname => 'Hall',
+ firstname => 'Daria',
+ } );
+ $borrower->categorycode( $categorycode );
+ $borrower->branchcode( $branchcode );
+ $borrower->store;
+
+ my $account = Koha::Account->new({ patron_id => $borrower->id });
+
+ my $line1 = Koha::Account::Line->new({ borrowernumber => $borrower->borrowernumber, amount => 10, amountoutstanding => 10 })->store();
+ my $line2 = Koha::Account::Line->new({ borrowernumber => $borrower->borrowernumber, amount => 20, amountoutstanding => 20 })->store();
+
+ is( $account->balance(), 30, "Account balance is 30" );
+ is( $line1->amountoutstanding, 10, 'First fee has amount outstanding of 10' );
+ is( $line2->amountoutstanding, 20, 'Second fee has amount outstanding of 20' );
+
+ my $id = $account->pay(
+ {
+ lines => [$line1, $line2],
+ amount => 30,
+ }
+ );
+ my $account_payment = Koha::Account::Lines->find( $id );
+
+ is( $account->balance(), 0, "Account balance is 0" );
+
+ $line1->_result->discard_changes();
+ $line2->_result->discard_changes();
+ is( $line1->amountoutstanding, '0.000000', 'First fee has amount outstanding of 0' );
+ is( $line2->amountoutstanding, '0.000000', 'Second fee has amount outstanding of 0' );
+
+ $account_payment->void();
+
+ is( $account->balance(), 30, "Account balance is again 30" );
+
+ $account_payment->_result->discard_changes();
+ $line1->_result->discard_changes();
+ $line2->_result->discard_changes();
+
+ is( $account_payment->accounttype, 'VOID', 'Voided payment accounttype is VOID' );
+ is( $account_payment->amount, '0.000000', 'Voided payment amount is 0' );
+ is( $account_payment->amountoutstanding, '0.000000', 'Voided payment amount outstanding is 0' );
+
+ is( $line1->amountoutstanding, '10.000000', 'First fee again has amount outstanding of 10' );
+ is( $line2->amountoutstanding, '20.000000', 'Second fee again has amount outstanding of 20' );
+};
+
1;