From d8b74328f53ca5d06d3cbd3b46fe2ed41c2a664d Mon Sep 17 00:00:00 2001 From: Olli-Antti Kivilahti Date: Mon, 20 Oct 2014 15:37:17 +0300 Subject: [PATCH] Bug 13113 - Prevent juvenile/children from reserving ageRestricted material There is no reason for underage borrowers to reserve ageRestricted material and then be denied it's check-out due to ageRestriction. This patch prevents reserving material for borrowers not suitably aged. # # # # # # # A PRIORI # # # # # # # BOTH THE STAFF CLIENT AND THE OPAC 1. Find a Record with Items, update the MARC Subfield 521a to "PEGI 16". 2. Get a Borrower who is younger than 16 years. 3. Place a hold for the underage Borrower for the ageRestricted Record. 4. You can reserve an ageRestricted Record with ease. STAFF CLIENT ONLY 5. Check-in an Item from the ageRestricted Record and catch the reservation. 6. Check-out the ageRestricted Item for this underage Borrower. 7. You get a notification about being unable to check-out due to age restriction. How lame is that for a 12 year old? # # # # # # # # # A POSTERIORI # # # # # # # # # STAFF CLIENT 1. Find a Record with Items, update the MARC Subfield 521a to "PEGI 16". 2. Get a Borrower who is younger than 16 years. 3. Check-out an ageRestricted Item for this underage Borrower. 4. You get a notification about having the maximum amount of reserves. 5. Place a hold for the underage Borrower for the ageRestricted Record. 6. You get a notification, that placing a hold on ageRestricted material is forbidden. Includes Unit tests. --- C4/Reserves.pm | 8 ++++++-- t/db_dependent/Reserves.t | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/C4/Reserves.pm b/C4/Reserves.pm index 7a075a4..97990ac 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -486,12 +486,16 @@ sub CanItemBeReserved{ # we retrieve borrowers and items informations # # item->{itype} will come for biblioitems if necessery my $item = GetItem($itemnumber); + my $biblioData = C4::Biblio::GetBiblioData( $item->{biblionumber} ); + my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber); # If an item is damaged and we don't allow holds on damaged items, we can stop right here return 0 if ( $item->{damaged} && !C4::Context->preference('AllowHoldsOnDamagedItems') ); - my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber); - + #Check for the age restriction + my ($ageRestriction, $daysToAgeRestriction) = C4::Circulation::GetAgeRestriction( $biblioData->{agerestriction}, $borrower ); + return 0 if $daysToAgeRestriction && $daysToAgeRestriction > 0; + my $controlbranch = C4::Context->preference('ReservesControlBranch'); my $itemtypefield = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype"; diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t index 3ee2832..0bc763b 100755 --- a/t/db_dependent/Reserves.t +++ b/t/db_dependent/Reserves.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 50; +use Test::More tests => 53; use MARC::Record; use DateTime::Duration; @@ -471,6 +471,41 @@ is($cancancel, 0, 'Reserve in waiting status cant be canceled'); # End of tests for bug 12876 + #### +####### Testing Bug 13113 - Prevent juvenile/children from reserving ageRestricted material >>> + #### + +#Make the borrower too young for our Biblio, the Biblio has been ageRestricted during initialization +C4::Context->set_preference( 'AgeRestrictionMarker', 'FSK|PEGI|Age|K' ); + +#Reserving an not-agerestricted Biblio by a Borrower with no dateofbirth is tested previously. + +#Set the ageRestriction for the Biblio +my $record = GetMarcBiblio( $bibnum ); +my ( $ageres_tagid, $ageres_subfieldid ) = GetMarcFromKohaField( "biblioitems.agerestriction", '' ); +$record->append_fields( MARC::Field->new($ageres_tagid, '', '', $ageres_subfieldid => 'PEGI 16') ); +C4::Biblio::ModBiblio( $record, $bibnum, '' ); + +is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 1, "Reserving an ageRestricted Biblio without a borrower dateofbirth succeeds" ); + +#Set the dateofbirth for the Borrower making him "too young". +my $now = DateTime->now(); +my $duration_15years = DateTime::Duration->new(years => 15); +my $past15yearsAgo = DateTime->now()->subtract_duration($duration_15years); +C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $past15yearsAgo->ymd() ); + +is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 0, "Reserving a 'PEGI 16' Biblio by a 15 year old borrower fails"); + +#Set the dateofbirth for the Borrower making him "too old". +my $duration_30years = DateTime::Duration->new(years => 30); +my $past30yearsAgo = DateTime->now()->subtract_duration($duration_30years); +C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $past30yearsAgo->ymd() ); + +is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 1, "Reserving a 'PEGI 16' Biblio by a 30 year old borrower succeeds"); + #### +####### EO Bug 13113 <<< + #### + $dbh->rollback; sub count_hold_print_messages { -- 1.7.9.5