Bug 18330: Handle date-time in Koha::Object->TO_JSON
[koha.git] / t / db_dependent / Accounts.t
index 230a1d7..51c094a 100644 (file)
 
 use Modern::Perl;
 
-use Test::More tests => 21;
+use Test::More tests => 23;
 use Test::MockModule;
 use Test::Warn;
 
 use t::lib::TestBuilder;
+use t::lib::Mocks;
 
+use Koha::Account;
 use Koha::Account::Lines;
 use Koha::Account::Line;
+use Koha::Account::Offsets;
 
 BEGIN {
     use_ok('C4::Accounts');
@@ -36,7 +39,6 @@ BEGIN {
 
 can_ok( 'C4::Accounts',
     qw(
-        makepayment
         getnextacctno
         chargelostitem
         manualinvoice
@@ -45,8 +47,6 @@ can_ok( 'C4::Accounts',
         getcredits
         getrefunds
         ReversePayment
-        recordpayment_selectaccts
-        WriteOffFee
         purge_zero_balance_fees )
 );
 
@@ -105,8 +105,8 @@ my @test_data = (
     { amount => -5    , days_ago => $days     , description =>'purge_zero_balance_fees should not delete fees with negative amout owed on threshold day'     , delete => 0 } ,
     { amount => -5    , days_ago => $days + 1 , description =>'purge_zero_balance_fees should not delete fees with negative amout owed after threshold day'  , delete => 0 }
 );
-
-my $borrower = Koha::Patron->new( { firstname => 'Test', surname => 'Patron', categorycode => 'PT', branchcode => $branchcode } )->store();
+my $categorycode = $builder->build({ source => 'Category' })->{categorycode};
+my $borrower = Koha::Patron->new( { firstname => 'Test', surname => 'Patron', categorycode => $categorycode, branchcode => $branchcode } )->store();
 
 for my $data ( @test_data ) {
     $sth->execute($borrower->borrowernumber, $data->{amount}, $data->{days_ago}, $data->{description});
@@ -304,9 +304,51 @@ subtest "Koha::Account::pay particular line tests" => sub {
     is( $line4->amountoutstanding, "4.000000", "Line 4 was not paid" );
 };
 
-subtest "makepayment() tests" => sub {
+subtest "Koha::Account::pay writeoff tests" => sub {
 
-    plan tests => 6;
+    plan tests => 5;
+
+    # Create a borrower
+    my $categorycode = $builder->build({ source => 'Category' })->{ categorycode };
+    my $branchcode   = $builder->build({ source => 'Branch' })->{ branchcode };
+
+    my $borrower = Koha::Patron->new( {
+        cardnumber => 'chelseahall',
+        surname => 'Hall',
+        firstname => 'Chelsea',
+    } );
+    $borrower->categorycode( $categorycode );
+    $borrower->branchcode( $branchcode );
+    $borrower->store;
+
+    my $account = Koha::Account->new({ patron_id => $borrower->id });
+
+    my $line = Koha::Account::Line->new({ borrowernumber => $borrower->borrowernumber, amountoutstanding => 42 })->store();
+
+    is( $account->balance(), "42.000000", "Account balance is 42" );
+
+    my $id = $account->pay(
+        {
+            lines  => [$line],
+            amount => 42,
+            type   => 'writeoff',
+        }
+    );
+
+    $line->_result->discard_changes();
+
+    is( $line->amountoutstanding, "0.000000", "Line was written off" );
+
+    my $writeoff = Koha::Account::Lines->find( $id );
+
+    is( $writeoff->accounttype, 'W', 'Type is correct' );
+    is( $writeoff->description, 'Writeoff', 'Description is correct' );
+    is( $writeoff->amount, '-42.000000', 'Amount is correct' );
+};
+
+subtest "More Koha::Account::pay tests" => sub {
+
+    plan tests => 8;
 
     # Create a borrower
     my $category   = $builder->build({ source => 'Category' })->{ categorycode };
@@ -331,13 +373,14 @@ subtest "makepayment() tests" => sub {
 
     is( $rs->count(), 1, 'Accountline created' );
 
+    my $account = Koha::Account->new( { patron_id => $borrowernumber } );
+    my $line = Koha::Account::Lines->find( $accountline->{ accountlines_id } );
     # make the full payment
-    makepayment(
-        $accountline->{ accountlines_id }, $borrowernumber,
-        $accountline->{ accountno },       $amount,
-        $borrowernumber, $branch, 'A payment note' );
+    $account->pay({ lines => [$line], amount => $amount, library_id => $branch, note => 'A payment note' });
 
-    # TODO: someone should write actual tests for makepayment()
+    my $offset = Koha::Account::Offsets->search({ debit_id => $accountline->{accountlines_id} })->next();
+    is( $offset->amount(), '-100.000000', 'Offset amount is -100.00' );
+    is( $offset->type(), 'Payment', 'Offset type is Payment' );
 
     my $stat = $schema->resultset('Statistic')->search({
         branch  => $branch,
@@ -358,7 +401,7 @@ subtest "makepayment() tests" => sub {
 
 subtest "Even more Koha::Account::pay tests" => sub {
 
-    plan tests => 6;
+    plan tests => 8;
 
     # Create a borrower
     my $category   = $builder->build({ source => 'Category' })->{ categorycode };
@@ -389,6 +432,10 @@ subtest "Even more Koha::Account::pay tests" => sub {
     # make the full payment
     $account->pay({ lines => [$line], amount => $partialamount, library_id => $branch, note => 'A payment note' });
 
+    my $offset = Koha::Account::Offsets->search( { debit_id => $accountline->{ accountlines_id } } )->next();
+    is( $offset->amount, '-60.000000', 'Offset amount is -60.00' );
+    is( $offset->type, 'Payment', 'Offset type is payment' );
+
     my $stat = $schema->resultset('Statistic')->search({
         branch  => $branch,
         type    => 'payment'
@@ -441,4 +488,143 @@ subtest 'balance' => sub {
     $patron->delete;
 };
 
+subtest "Koha::Account::chargelostitem tests" => sub {
+    plan tests => 32;
+
+    my $lostfine;
+    my $procfee;
+
+    my $itype_no_replace_no_fee = $builder->build({ source => 'Itemtype', value => {
+            rentalcharge => 0,
+            defaultreplacecost => undef,
+            processfee => undef,
+    }});
+    my $itype_replace_no_fee = $builder->build({ source => 'Itemtype', value => {
+            rentalcharge => 0,
+            defaultreplacecost => 16.32,
+            processfee => undef,
+    }});
+    my $itype_no_replace_fee = $builder->build({ source => 'Itemtype', value => {
+            rentalcharge => 0,
+            defaultreplacecost => undef,
+            processfee => 8.16,
+    }});
+    my $itype_replace_fee = $builder->build({ source => 'Itemtype', value => {
+            rentalcharge => 0,
+            defaultreplacecost => 4.08,
+            processfee => 2.04,
+    }});
+    my $cli_borrowernumber = $builder->build({ source => 'Borrower' })->{'borrowernumber'};
+    my $cli_itemnumber1 = $builder->build({ source => 'Item', value => { itype => $itype_no_replace_no_fee->{itemtype} } })->{'itemnumber'};
+    my $cli_itemnumber2 = $builder->build({ source => 'Item', value => { itype => $itype_replace_no_fee->{itemtype} } })->{'itemnumber'};
+    my $cli_itemnumber3 = $builder->build({ source => 'Item', value => { itype => $itype_no_replace_fee->{itemtype} } })->{'itemnumber'};
+    my $cli_itemnumber4 = $builder->build({ source => 'Item', value => { itype => $itype_replace_fee->{itemtype} } })->{'itemnumber'};
+    my $duck = Koha::Items->find({itemnumber=>$cli_itemnumber1});
+
+    t::lib::Mocks::mock_preference('item-level_itypes', '1');
+    t::lib::Mocks::mock_preference('useDefaultReplacementCost', '0');
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber1, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost or default when pref off");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber1, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'PF' });
+    ok( $lostfine->amount == 6.12, "Lost fine equals replacementcost when pref off and no default set");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    $lostfine->delete();
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber2, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost but default set when pref off");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber2, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'PF' });
+    ok( $lostfine->amount == 6.12 , "Lost fine equals replacementcost when pref off and default set");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    $lostfine->delete();
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber3, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost and no default set when pref off");
+    ok( $procfee->amount == 8.16,  "Processing fee if processing fee");
+    $procfee->delete();
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber3, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'PF' });
+    ok( $lostfine->amount == 6.12 , "Lost fine equals replacementcost when pref off and no default set");
+    ok( $procfee->amount == 8.16,  "Processing fee if processing fee");
+    $lostfine->delete();
+    $procfee->delete();
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber4, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost but default set when pref off");
+    ok( $procfee->amount == 2.04,  "Processing fee if processing fee");
+    $procfee->delete();
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber4, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'PF' });
+    ok( $lostfine->amount == 6.12 , "Lost fine equals replacementcost when pref off and default set");
+    ok( $procfee->amount == 2.04,  "Processing fee if processing fee");
+    $lostfine->delete();
+    $procfee->delete();
+
+    t::lib::Mocks::mock_preference('useDefaultReplacementCost', '1');
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber1, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost or default when pref on");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber1, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber1, accounttype => 'PF' });
+    is( $lostfine->amount, "6.120000", "Lost fine equals replacementcost when pref on and no default set");
+    ok( !$procfee,  "No processing fee if no processing fee");
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber2, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'PF' });
+    is( $lostfine->amount(), "16.320000", "Lost fine is default if no replacementcost but default set when pref on");
+    ok( !$procfee,  "No processing fee if no processing fee");
+    $lostfine->delete();
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber2, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber2, accounttype => 'PF' });
+    is( $lostfine->amount, "6.120000" , "Lost fine equals replacementcost when pref on and default set");
+    ok( !$procfee,  "No processing fee if no processing fee");
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber3, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'PF' });
+    ok( !$lostfine, "No lost fine if no replacementcost and default not set when pref on");
+    is( $procfee->amount, "8.160000",  "Processing fee if processing fee");
+    $procfee->delete();
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber3, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber3, accounttype => 'PF' });
+    is( $lostfine->amount, "6.120000", "Lost fine equals replacementcost when pref on and no default set");
+    is( $procfee->amount, "8.160000",  "Processing fee if processing fee");
+
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber4, 0, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'PF' });
+    is( $lostfine->amount, "4.080000", "Lost fine is default if no replacementcost but default set when pref on");
+    is( $procfee->amount, "2.040000",  "Processing fee if processing fee");
+    $lostfine->delete();
+    $procfee->delete();
+    C4::Accounts::chargelostitem( $cli_borrowernumber, $cli_itemnumber4, 6.12, "Perdedor");
+    $lostfine = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'L' });
+    $procfee  = Koha::Account::Lines->find({ borrowernumber => $cli_borrowernumber, itemnumber => $cli_itemnumber4, accounttype => 'PF' });
+    is( $lostfine->amount, "6.120000", "Lost fine equals replacementcost when pref on and default set");
+    is( $procfee->amount, "2.040000",  "Processing fee if processing fee");
+};
+
 1;