From f5c7295b374f962fe459436af08c3baf9eb3f0ed Mon Sep 17 00:00:00 2001
From: Olli-Antti Kivilahti <olli-antti.kivilahti@jns.fi>
Date: Mon, 20 Oct 2014 15:37:17 +0300
Subject: [PATCH] Bug 13113 - Prevent juvenile/children from reserving
 ageRestricted material
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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.

Followed test plan. Patch behaves as expected. (Note: Propagating error messages to template will be handled in Bug 13116 or 11999)

Signed-off-by: Marc VĂ©ron <veron@veron.ch>
---
 C4/Reserves.pm            |    8 ++++++--
 t/db_dependent/Reserves.t |   34 +++++++++++++++++++++++++++++++++-
 2 files changed, 39 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..e5d3bb4 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,38 @@ 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 >>>
+       ####
+
+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();
+C4::Members::SetAge( $borrower, '0015-00-00' );
+C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
+
+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".
+C4::Members::SetAge( $borrower, '0030-00-00' );
+C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
+
+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.10.4