f726558510
Refactor the most performance critical subroutines in Circulation.pm to take objects instead of unblessed ones to reduce unnecessary unblessings and generally clean up the code. To test: 1) Ensure the following tests all pass: t/db_dependent/Circulation.t t/db_dependent/Circulation/CalcDateDue.t t/db_dependent/Circulation/CheckIfIssuedToPatron.t t/db_dependent/Circulation/GetPendingOnSiteCheckouts.t t/db_dependent/Circulation/GetTopIssues.t t/db_dependent/Circulation/IsItemIssued.t t/db_dependent/Circulation/MarkIssueReturned.t t/db_dependent/Circulation/ReturnClaims.t t/db_dependent/Circulation/Returns.t t/db_dependent/Circulation/SwitchOnSiteCheckouts.t t/db_dependent/Circulation/TooMany.t t/db_dependent/Circulation/dateexpiry.t t/db_dependent/Circulation/issue.t t/db_dependent/Circulation/maxsuspensiondays.t t/db_dependent/Circulation/transferbook.t t/db_dependent/Circulation_holdsqueue.t t/db_dependent/DecreaseLoanHighHolds.t t/db_dependent/Holds/DisallowHoldIfItemsAvailable.t t/db_dependent/Holds/RevertWaitingStatus.t t/db_dependent/ILSDI_Services.t t/db_dependent/Illrequests.t t/db_dependent/Koha/Account/Line.t t/db_dependent/Koha/Biblio.t t/db_dependent/Koha/Items.t t/db_dependent/Koha/Object.t t/db_dependent/Koha/Patrons.t t/db_dependent/Koha/Pseudonymization.t t/db_dependent/Koha/Template/Plugin/CirculationRules.t t/db_dependent/Letters/TemplateToolkit.t t/db_dependent/Members/GetAllIssues.t t/db_dependent/Members/IssueSlip.t t/db_dependent/Patron/Borrower_Discharge.t t/db_dependent/Patron/Borrower_PrevCheckout.t t/db_dependent/SIP/ILS.t t/db_dependent/Holds.t t/db_dependent/Holds/LocalHoldsPriority.t t/db_dependent/Holds/HoldFulfillmentPolicy.t t/db_dependent/Holds/HoldItemtypeLimit.t t/db_dependent/Reserves/GetReserveFee.t t/db_dependent/api/v1/return_claims.t t/db_dependent/api/v1/biblios.t t/db_dependent/api/v1/checkouts.t t/db_dependent/Reserves.t t/db_dependent/HoldsQueue.t t/db_dependent/selenium/regressions.t t/db_dependent/Koha/Plugins/Circulation_hooks.t t/db_dependent/Koha/Plugins/Recall_hooks.t t/db_dependent/Koha/Recalls.t t/db_dependent/Koha/Recall.t t/db_dependent/Circulation/_CalculateAndUpdateFine.t Sponsored-by: Gothenburg University Library Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org> Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
162 lines
5 KiB
Perl
Executable file
162 lines
5 KiB
Perl
Executable file
use Modern::Perl;
|
|
use Test::More tests => 4;
|
|
|
|
use MARC::Record;
|
|
use MARC::Field;
|
|
use C4::Context;
|
|
|
|
use C4::Circulation qw( AddIssue AddReturn );
|
|
use C4::Biblio qw( AddBiblio );
|
|
use Koha::Database;
|
|
use Koha::DateUtils qw( dt_from_string output_pref );
|
|
use Koha::Patron::Debarments qw( DelDebarment );
|
|
use Koha::Patrons;
|
|
|
|
use t::lib::TestBuilder;
|
|
use t::lib::Mocks;
|
|
|
|
my $schema = Koha::Database->schema;
|
|
$schema->storage->txn_begin;
|
|
my $builder = t::lib::TestBuilder->new;
|
|
my $dbh = C4::Context->dbh;
|
|
|
|
my $branchcode = $builder->build({ source => 'Branch' })->{branchcode};
|
|
my $itemtype = $builder->build({ source => 'Itemtype' })->{itemtype};
|
|
my $patron_category = $builder->build({ source => 'Category' });
|
|
|
|
t::lib::Mocks::mock_userenv({ branchcode => $branchcode });
|
|
|
|
# Test without maxsuspensiondays set
|
|
Koha::CirculationRules->search->delete;
|
|
Koha::CirculationRules->set_rules(
|
|
{
|
|
categorycode => undef,
|
|
itemtype => undef,
|
|
branchcode => undef,
|
|
rules => {
|
|
firstremind => 0,
|
|
finedays => 2,
|
|
lengthunit => 'days',
|
|
suspension_chargeperiod => 1,
|
|
}
|
|
}
|
|
);
|
|
|
|
my $patron = Koha::Patron->new({
|
|
firstname => 'my firstname',
|
|
surname => 'my surname',
|
|
categorycode => $patron_category->{categorycode},
|
|
branchcode => $branchcode,
|
|
})->store;
|
|
|
|
my $record = MARC::Record->new();
|
|
$record->append_fields(
|
|
MARC::Field->new('100', ' ', ' ', a => 'My author'),
|
|
MARC::Field->new('245', ' ', ' ', a => 'My title'),
|
|
);
|
|
|
|
my $barcode = 'bc_maxsuspensiondays';
|
|
my ($biblionumber, $biblioitemnumber) = AddBiblio($record, '');
|
|
my $itemnumber = Koha::Item->new({
|
|
biblionumber => $biblionumber,
|
|
homebranch => $branchcode,
|
|
holdingbranch => $branchcode,
|
|
barcode => $barcode,
|
|
itype => $itemtype
|
|
})->store->itemnumber;
|
|
|
|
# clear any holidays to avoid throwing off the suspension day
|
|
# calculations
|
|
$dbh->do('DELETE FROM special_holidays');
|
|
$dbh->do('DELETE FROM repeatable_holidays');
|
|
|
|
my $daysago20 = dt_from_string->add_duration(DateTime::Duration->new(days => -20));
|
|
my $daysafter40 = dt_from_string->add_duration(DateTime::Duration->new(days => 40));
|
|
|
|
AddIssue( $patron, $barcode, $daysago20 );
|
|
AddReturn( $barcode, $branchcode );
|
|
my $debarments = $patron->restrictions;
|
|
my $THE_debarment = $debarments->next;
|
|
is(
|
|
$THE_debarment->expiration,
|
|
output_pref({ dt => $daysafter40, dateformat => 'iso', dateonly => 1 }),
|
|
'calculate suspension with no maximum set'
|
|
);
|
|
DelDebarment( $THE_debarment->borrower_debarment_id );
|
|
|
|
# Test with maxsuspensiondays = 10 days
|
|
Koha::CirculationRules->set_rules(
|
|
{
|
|
categorycode => undef,
|
|
itemtype => undef,
|
|
branchcode => undef,
|
|
rules => {
|
|
maxsuspensiondays => 10,
|
|
}
|
|
}
|
|
);
|
|
|
|
my $daysafter10 = dt_from_string->add_duration(DateTime::Duration->new(days => 10));
|
|
AddIssue( $patron, $barcode, $daysago20 );
|
|
AddReturn( $barcode, $branchcode );
|
|
$debarments = $patron->restrictions;
|
|
$THE_debarment = $debarments->next;
|
|
is(
|
|
$THE_debarment->expiration,
|
|
output_pref({ dt => $daysafter10, dateformat => 'iso', dateonly => 1 }),
|
|
'calculate suspension with a maximum set'
|
|
);
|
|
DelDebarment( $THE_debarment->borrower_debarment_id );
|
|
|
|
subtest "suspension_chargeperiod" => sub {
|
|
Koha::CirculationRules->set_rules(
|
|
{
|
|
categorycode => undef,
|
|
itemtype => undef,
|
|
branchcode => undef,
|
|
rules => {
|
|
firstremind => 0,
|
|
finedays => 7,
|
|
lengthunit => 'days',
|
|
suspension_chargeperiod => 15,
|
|
maxsuspensiondays => 333,
|
|
}
|
|
}
|
|
);
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my $item = $builder->build_sample_item;
|
|
|
|
my $last_year = dt_from_string->clone->subtract( years => 1 );
|
|
my $today = dt_from_string;
|
|
my $new_debar_dt = C4::Circulation::_calculate_new_debar_dt( $patron, $item, $last_year, $today );
|
|
is( $new_debar_dt->truncate( to => 'day' ),
|
|
$today->clone->add( days => 365 / 15 * 7 )->truncate( to => 'day' ) );
|
|
|
|
};
|
|
|
|
subtest "maxsuspensiondays" => sub {
|
|
Koha::CirculationRules->set_rules(
|
|
{
|
|
categorycode => undef,
|
|
itemtype => undef,
|
|
branchcode => undef,
|
|
rules => {
|
|
firstremind => 0,
|
|
finedays => 15,
|
|
lengthunit => 'days',
|
|
suspension_chargeperiod => 7,
|
|
maxsuspensiondays => 333,
|
|
}
|
|
}
|
|
);
|
|
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
|
|
my $item = $builder->build_sample_item;
|
|
|
|
my $last_year = dt_from_string->clone->subtract( years => 1 );
|
|
my $today = dt_from_string;
|
|
my $new_debar_dt = C4::Circulation::_calculate_new_debar_dt( $patron, $item, $last_year, $today );
|
|
is( $new_debar_dt->truncate( to => 'day' ),
|
|
$today->clone->add( days => 333 )->truncate( to => 'day' ) );
|
|
};
|
|
|
|
$schema->storage->txn_rollback;
|