Kyle M Hall
f86816220e
Right now, Koha only charges fines at the end of a given charge period. For example, let us assume a circulation rule has a charge period of one week ( 7 days ) and a fine of $5. This means that an item can be overdue for 6 days without accruing a fine. Koha should allow circulation rules to be configured to place the charge at the start of the end of the charge period so the library can decide when the fine should accrue. Test Plan: 1) Apply this patch 2) Run updatedatabase.pl 3) prove t/db_dependent/Circulation_Issuingrule.t 4) prove t/db_dependent/Circulation.t 5) prove t/db_dependent/Fines.t 6) Ensure you can still create/edit circulation rules Edit: I removed the DBIx changes after a couple minutes fighting with them. Will regenerate as usual in a RM followup / Tomas Signed-off-by: Daniel Grobani <dgrobani@samuelmerritt.edu> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
383 lines
12 KiB
Perl
383 lines
12 KiB
Perl
#!/usr/bin/perl
|
|
|
|
use Modern::Perl;
|
|
use C4::Context;
|
|
use C4::Branch;
|
|
use DateTime;
|
|
use Koha::DateUtils;
|
|
|
|
use Test::More tests => 9;
|
|
|
|
BEGIN {
|
|
use_ok('C4::Circulation');
|
|
}
|
|
can_ok(
|
|
'C4::Circulation',
|
|
qw(
|
|
GetHardDueDate
|
|
GetIssuingRule
|
|
GetLoanLength
|
|
)
|
|
);
|
|
|
|
#Start transaction
|
|
my $dbh = C4::Context->dbh;
|
|
$dbh->{RaiseError} = 1;
|
|
$dbh->{AutoCommit} = 0;
|
|
|
|
$dbh->do(q|DELETE FROM issues|);
|
|
$dbh->do(q|DELETE FROM items|);
|
|
$dbh->do(q|DELETE FROM borrowers|);
|
|
$dbh->do(q|DELETE FROM branches|);
|
|
$dbh->do(q|DELETE FROM categories|);
|
|
$dbh->do(q|DELETE FROM issuingrules|);
|
|
|
|
#Add sample datas
|
|
|
|
#Add branch and category
|
|
my $samplebranch1 = {
|
|
add => 1,
|
|
branchcode => 'SAB1',
|
|
branchname => 'Sample Branch',
|
|
branchaddress1 => 'sample adr1',
|
|
branchaddress2 => 'sample adr2',
|
|
branchaddress3 => 'sample adr3',
|
|
branchzip => 'sample zip',
|
|
branchcity => 'sample city',
|
|
branchstate => 'sample state',
|
|
branchcountry => 'sample country',
|
|
branchphone => 'sample phone',
|
|
branchfax => 'sample fax',
|
|
branchemail => 'sample email',
|
|
branchurl => 'sample url',
|
|
branchip => 'sample ip',
|
|
branchprinter => undef,
|
|
opac_info => 'sample opac',
|
|
};
|
|
my $samplebranch2 = {
|
|
add => 1,
|
|
branchcode => 'SAB2',
|
|
branchname => 'Sample Branch2',
|
|
branchaddress1 => 'sample adr1_2',
|
|
branchaddress2 => 'sample adr2_2',
|
|
branchaddress3 => 'sample adr3_2',
|
|
branchzip => 'sample zip2',
|
|
branchcity => 'sample city2',
|
|
branchstate => 'sample state2',
|
|
branchcountry => 'sample country2',
|
|
branchphone => 'sample phone2',
|
|
branchfax => 'sample fax2',
|
|
branchemail => 'sample email2',
|
|
branchurl => 'sample url2',
|
|
branchip => 'sample ip2',
|
|
branchprinter => undef,
|
|
opac_info => 'sample opac2',
|
|
};
|
|
ModBranch($samplebranch1);
|
|
ModBranch($samplebranch2);
|
|
|
|
my $samplecat = {
|
|
categorycode => 'CAT1',
|
|
description => 'Description1',
|
|
enrolmentperiod => 'Null',
|
|
enrolmentperioddate => 'Null',
|
|
dateofbirthrequired => 'Null',
|
|
finetype => 'Null',
|
|
bulk => 'Null',
|
|
enrolmentfee => 'Null',
|
|
overduenoticerequired => 'Null',
|
|
issuelimit => 'Null',
|
|
reservefee => 'Null',
|
|
hidelostitems => 0,
|
|
category_type => 'Null'
|
|
};
|
|
my $query =
|
|
"INSERT INTO categories (categorycode,description,enrolmentperiod,enrolmentperioddate,dateofbirthrequired ,finetype,bulk,enrolmentfee,overduenoticerequired,issuelimit ,reservefee ,hidelostitems ,category_type) VALUES( ?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
|
$dbh->do(
|
|
$query, {},
|
|
$samplecat->{categorycode}, $samplecat->{description},
|
|
$samplecat->{enrolmentperiod}, $samplecat->{enrolmentperioddate},
|
|
$samplecat->{dateofbirthrequired}, $samplecat->{finetype},
|
|
$samplecat->{bulk}, $samplecat->{enrolmentfee},
|
|
$samplecat->{overduenoticerequired}, $samplecat->{issuelimit},
|
|
$samplecat->{reservefee}, $samplecat->{hidelostitems},
|
|
$samplecat->{category_type}
|
|
);
|
|
|
|
#Begin Tests
|
|
|
|
#Test GetIssuingRule
|
|
my $sampleissuingrule1 = {
|
|
reservecharge => '0.000000',
|
|
chargename => 'Null',
|
|
restrictedtype => 0,
|
|
accountsent => 0,
|
|
maxissueqty => 5,
|
|
maxonsiteissueqty => 4,
|
|
finedays => 0,
|
|
lengthunit => 'Null',
|
|
renewalperiod => 5,
|
|
norenewalbefore => 6,
|
|
auto_renew => 0,
|
|
issuelength => 5,
|
|
chargeperiod => 0,
|
|
chargeperiod_charge_at => 0,
|
|
rentaldiscount => '2.000000',
|
|
reservesallowed => 0,
|
|
hardduedate => '2013-01-01',
|
|
branchcode => $samplebranch1->{branchcode},
|
|
fine => '0.000000',
|
|
hardduedatecompare => 5,
|
|
overduefinescap => '0.000000',
|
|
renewalsallowed => 0,
|
|
firstremind => 0,
|
|
itemtype => 'BOOK',
|
|
categorycode => $samplecat->{categorycode},
|
|
maxsuspensiondays => 0,
|
|
onshelfholds => 0,
|
|
opacitemholds => 'N',
|
|
};
|
|
my $sampleissuingrule2 = {
|
|
branchcode => $samplebranch2->{branchcode},
|
|
categorycode => $samplecat->{categorycode},
|
|
itemtype => 'BOOK',
|
|
maxissueqty => 2,
|
|
maxonsiteissueqty => 1,
|
|
renewalsallowed => 'Null',
|
|
renewalperiod => 2,
|
|
norenewalbefore => 7,
|
|
auto_renew => 0,
|
|
reservesallowed => 'Null',
|
|
issuelength => 2,
|
|
lengthunit => 'Null',
|
|
hardduedate => 2,
|
|
hardduedatecompare => 'Null',
|
|
fine => 'Null',
|
|
finedays => 'Null',
|
|
firstremind => 'Null',
|
|
chargeperiod => 'Null',
|
|
chargeperiod_charge_at => 0,
|
|
rentaldiscount => 2.00,
|
|
overduefinescap => 'Null',
|
|
accountsent => 'Null',
|
|
reservecharge => 'Null',
|
|
chargename => 'Null',
|
|
restrictedtype => 'Null',
|
|
maxsuspensiondays => 0,
|
|
onshelfholds => 1,
|
|
opacitemholds => 'Y',
|
|
};
|
|
my $sampleissuingrule3 = {
|
|
branchcode => $samplebranch1->{branchcode},
|
|
categorycode => $samplecat->{categorycode},
|
|
itemtype => 'DVD',
|
|
maxissueqty => 3,
|
|
maxonsiteissueqty => 2,
|
|
renewalsallowed => 'Null',
|
|
renewalperiod => 3,
|
|
norenewalbefore => 8,
|
|
auto_renew => 0,
|
|
reservesallowed => 'Null',
|
|
issuelength => 3,
|
|
lengthunit => 'Null',
|
|
hardduedate => 3,
|
|
hardduedatecompare => 'Null',
|
|
fine => 'Null',
|
|
finedays => 'Null',
|
|
firstremind => 'Null',
|
|
chargeperiod => 'Null',
|
|
chargeperiod_charge_at => 0,
|
|
rentaldiscount => 3.00,
|
|
overduefinescap => 'Null',
|
|
accountsent => 'Null',
|
|
reservecharge => 'Null',
|
|
chargename => 'Null',
|
|
restrictedtype => 'Null',
|
|
maxsuspensiondays => 0,
|
|
onshelfholds => 1,
|
|
opacitemholds => 'F',
|
|
};
|
|
|
|
$query = 'INSERT INTO issuingrules (
|
|
branchcode,
|
|
categorycode,
|
|
itemtype,
|
|
maxissueqty,
|
|
maxonsiteissueqty,
|
|
renewalsallowed,
|
|
renewalperiod,
|
|
norenewalbefore,
|
|
auto_renew,
|
|
reservesallowed,
|
|
issuelength,
|
|
lengthunit,
|
|
hardduedate,
|
|
hardduedatecompare,
|
|
fine,
|
|
finedays,
|
|
firstremind,
|
|
chargeperiod,
|
|
chargeperiod_charge_at,
|
|
rentaldiscount,
|
|
overduefinescap,
|
|
accountsent,
|
|
reservecharge,
|
|
chargename,
|
|
restrictedtype,
|
|
maxsuspensiondays
|
|
) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
|
|
my $sth = $dbh->prepare($query);
|
|
$sth->execute(
|
|
$sampleissuingrule1->{branchcode},
|
|
$sampleissuingrule1->{categorycode},
|
|
$sampleissuingrule1->{itemtype},
|
|
$sampleissuingrule1->{maxissueqty},
|
|
$sampleissuingrule1->{maxonsiteissueqty},
|
|
$sampleissuingrule1->{renewalsallowed},
|
|
$sampleissuingrule1->{renewalperiod},
|
|
$sampleissuingrule1->{norenewalbefore},
|
|
$sampleissuingrule1->{auto_renew},
|
|
$sampleissuingrule1->{reservesallowed},
|
|
$sampleissuingrule1->{issuelength},
|
|
$sampleissuingrule1->{lengthunit},
|
|
$sampleissuingrule1->{hardduedate},
|
|
$sampleissuingrule1->{hardduedatecompare},
|
|
$sampleissuingrule1->{fine},
|
|
$sampleissuingrule1->{finedays},
|
|
$sampleissuingrule1->{firstremind},
|
|
$sampleissuingrule1->{chargeperiod},
|
|
$sampleissuingrule1->{chargeperiod_charge_at},
|
|
$sampleissuingrule1->{rentaldiscount},
|
|
$sampleissuingrule1->{overduefinescap},
|
|
$sampleissuingrule1->{accountsent},
|
|
$sampleissuingrule1->{reservecharge},
|
|
$sampleissuingrule1->{chargename},
|
|
$sampleissuingrule1->{restrictedtype},
|
|
$sampleissuingrule1->{maxsuspensiondays},
|
|
);
|
|
$sth->execute(
|
|
$sampleissuingrule2->{branchcode},
|
|
$sampleissuingrule2->{categorycode},
|
|
$sampleissuingrule2->{itemtype},
|
|
$sampleissuingrule2->{maxissueqty},
|
|
$sampleissuingrule2->{maxonsiteissueqty},
|
|
$sampleissuingrule2->{renewalsallowed},
|
|
$sampleissuingrule2->{renewalperiod},
|
|
$sampleissuingrule2->{norenewalbefore},
|
|
$sampleissuingrule2->{auto_renew},
|
|
$sampleissuingrule2->{reservesallowed},
|
|
$sampleissuingrule2->{issuelength},
|
|
$sampleissuingrule2->{lengthunit},
|
|
$sampleissuingrule2->{hardduedate},
|
|
$sampleissuingrule2->{hardduedatecompare},
|
|
$sampleissuingrule2->{fine},
|
|
$sampleissuingrule2->{finedays},
|
|
$sampleissuingrule2->{firstremind},
|
|
$sampleissuingrule2->{chargeperiod},
|
|
$sampleissuingrule2->{chargeperiod_charge_at},
|
|
$sampleissuingrule2->{rentaldiscount},
|
|
$sampleissuingrule2->{overduefinescap},
|
|
$sampleissuingrule2->{accountsent},
|
|
$sampleissuingrule2->{reservecharge},
|
|
$sampleissuingrule2->{chargename},
|
|
$sampleissuingrule2->{restrictedtype},
|
|
$sampleissuingrule2->{maxsuspensiondays},
|
|
);
|
|
$sth->execute(
|
|
$sampleissuingrule3->{branchcode},
|
|
$sampleissuingrule3->{categorycode},
|
|
$sampleissuingrule3->{itemtype},
|
|
$sampleissuingrule3->{maxissueqty},
|
|
$sampleissuingrule3->{maxonsiteissueqty},
|
|
$sampleissuingrule3->{renewalsallowed},
|
|
$sampleissuingrule3->{renewalperiod},
|
|
$sampleissuingrule3->{norenewalbefore},
|
|
$sampleissuingrule3->{auto_renew},
|
|
$sampleissuingrule3->{reservesallowed},
|
|
$sampleissuingrule3->{issuelength},
|
|
$sampleissuingrule3->{lengthunit},
|
|
$sampleissuingrule3->{hardduedate},
|
|
$sampleissuingrule3->{hardduedatecompare},
|
|
$sampleissuingrule3->{fine},
|
|
$sampleissuingrule3->{finedays},
|
|
$sampleissuingrule3->{firstremind},
|
|
$sampleissuingrule3->{chargeperiod},
|
|
$sampleissuingrule3->{chargeperiod_charge_at},
|
|
$sampleissuingrule3->{rentaldiscount},
|
|
$sampleissuingrule3->{overduefinescap},
|
|
$sampleissuingrule3->{accountsent},
|
|
$sampleissuingrule3->{reservecharge},
|
|
$sampleissuingrule3->{chargename},
|
|
$sampleissuingrule3->{restrictedtype},
|
|
$sampleissuingrule3->{maxsuspensiondays},
|
|
);
|
|
|
|
is_deeply(
|
|
GetIssuingRule(
|
|
$samplecat->{categorycode},
|
|
'Book', $samplebranch1->{branchcode}
|
|
),
|
|
$sampleissuingrule1,
|
|
"GetIssuingCharge returns issuingrule1's informations"
|
|
);
|
|
|
|
#Test GetLoanLength
|
|
is_deeply(
|
|
C4::Circulation::GetLoanLength(
|
|
$samplecat->{categorycode},
|
|
'BOOK', $samplebranch1->{branchcode}
|
|
),
|
|
{ issuelength => 5, lengthunit => 'Null', renewalperiod => 5 },
|
|
"GetLoanLength"
|
|
);
|
|
is_deeply(
|
|
C4::Circulation::GetLoanLength(),
|
|
{
|
|
issuelength => 21,
|
|
renewalperiod => 21,
|
|
lengthunit => 'days',
|
|
},
|
|
"Without parameters, GetLoanLength returns hardcoded values"
|
|
);
|
|
is_deeply(
|
|
C4::Circulation::GetLoanLength( -1, -1 ),
|
|
{
|
|
issuelength => 21,
|
|
renewalperiod => 21,
|
|
lengthunit => 'days',
|
|
},
|
|
"With wrong parameters, GetLoanLength returns hardcoded values"
|
|
);
|
|
is_deeply(
|
|
C4::Circulation::GetLoanLength( $samplecat->{categorycode} ),
|
|
{
|
|
issuelength => 21,
|
|
renewalperiod => 21,
|
|
lengthunit => 'days',
|
|
},
|
|
"With only one parameter, GetLoanLength returns hardcoded values"
|
|
); #NOTE : is that really what is expected?
|
|
is_deeply(
|
|
C4::Circulation::GetLoanLength( $samplecat->{categorycode}, 'BOOK' ),
|
|
{
|
|
issuelength => 21,
|
|
renewalperiod => 21,
|
|
lengthunit => 'days',
|
|
},
|
|
"With only one parameter, GetLoanLength returns hardcoded values"
|
|
); #NOTE : is that really what is expected?
|
|
|
|
#Test GetHardDueDate
|
|
my @hardduedate = C4::Circulation::GetHardDueDate( $samplecat->{categorycode},
|
|
'BOOK', $samplebranch1->{branchcode} );
|
|
is_deeply(
|
|
\@hardduedate,
|
|
[
|
|
dt_from_string( $sampleissuingrule1->{hardduedate}, 'iso' ),
|
|
$sampleissuingrule1->{hardduedatecompare}
|
|
],
|
|
"GetHardDueDate returns the duedate and the duedatecompare"
|
|
);
|
|
|
|
#End transaction
|
|
$dbh->rollback;
|