From ea3e8cf7e45a5c1fcc73b54db80f159921eaaca7 Mon Sep 17 00:00:00 2001 From: Marc Veron Date: Fri, 8 Jun 2012 09:56:39 +0200 Subject: [PATCH] BUG 7621 [ENH] Circulation: Match age restriction of title with borrower's age without using categories Content-Type: text/plain; charset="utf-8" Test scenario: 1) Make sure that you have a column 'agerestriction' in table biblioitems. This will be handled by updatedatabase.pl. If you want to insert the column using mysql, you can do: ALTER TABLE biblioitems ADD COLUMN 'agerestriction' VARCHAR(255) DEFAULT NULL AFTER 'cn_sort' 2) In the staff client, go to Home . Administration . Koha to MARC mapping and choose biblioitems + OK. In the field list, the field 'agerestriction' should show up. Edit it and map the field e.g. to 521a 3) Go to Home . Administration . System preferences and edit Circulation: AgeRestrictionMarker (add eg.: FSK|PEGI|Age) and AgeRestrictionOverride (Prevent or Don't prevent) 4) Create a young patron account e.g. with age < 16 5) Create or edit a biblio with e.g. the value FSK 16 in the field 521a (same field as mapped above) 6) Try to check out to young patron 7) Chckout should be blocked or issue a warning with override (depending on AgeRestrictionOverride) --- C4/Biblio.pm | 11 ++- C4/Circulation.pm | 64 +++++++++++++++++++- installer/data/mysql/sysprefs.sql | 2 + installer/data/mysql/updatedatabase.pl | 12 ++++ .../en/modules/admin/preferences/circulation.pref | 9 +++ .../prog/en/modules/circ/circulation.tt | 8 +++ 6 files changed, 101 insertions(+), 5 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 2aa17d5..bb460a2 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -3316,7 +3316,8 @@ sub _koha_modify_biblioitem_nonmarc { cn_item = ?, cn_suffix = ?, cn_sort = ?, - totalissues = ? + totalissues = ?, + agerestriction = ? where biblioitemnumber = ? "; my $sth = $dbh->prepare($query); @@ -3328,7 +3329,7 @@ sub _koha_modify_biblioitem_nonmarc { $biblioitem->{'pages'}, $biblioitem->{'bnotes'}, $biblioitem->{'size'}, $biblioitem->{'place'}, $biblioitem->{'lccn'}, $biblioitem->{'url'}, $biblioitem->{'biblioitems.cn_source'}, $biblioitem->{'cn_class'}, $biblioitem->{'cn_item'}, $biblioitem->{'cn_suffix'}, $cn_sort, $biblioitem->{'totalissues'}, - $biblioitem->{'biblioitemnumber'} + $biblioitem->{'agerestriction'}, $biblioitem->{'biblioitemnumber'} ); if ( $dbh->errstr ) { $error .= "ERROR in _koha_modify_biblioitem_nonmarc $query" . $dbh->errstr; @@ -3379,7 +3380,8 @@ sub _koha_add_biblioitem { cn_item = ?, cn_suffix = ?, cn_sort = ?, - totalissues = ? + totalissues = ?, + agerestriction = ? "; my $sth = $dbh->prepare($query); $sth->execute( @@ -3390,7 +3392,8 @@ sub _koha_add_biblioitem { $biblioitem->{'pages'}, $biblioitem->{'bnotes'}, $biblioitem->{'size'}, $biblioitem->{'place'}, $biblioitem->{'lccn'}, $biblioitem->{'marc'}, $biblioitem->{'url'}, $biblioitem->{'biblioitems.cn_source'}, $biblioitem->{'cn_class'}, $biblioitem->{'cn_item'}, $biblioitem->{'cn_suffix'}, $cn_sort, - $biblioitem->{'totalissues'} + + $biblioitem->{'totalissues'}, $biblioitem->{'agerestriction'} ); my $bibitemnum = $dbh->{'mysql_insertid'}; diff --git a/C4/Circulation.pm b/C4/Circulation.pm index c26de76..0bfa80f 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -42,7 +42,15 @@ use Data::Dumper; use Koha::DateUtils; use Koha::Calendar; use Carp; - +use Date::Calc qw( + Today + Today_and_Now + Add_Delta_YM + Add_Delta_DHMS + Date_to_Days + Day_of_Week + Add_Delta_Days +); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); BEGIN { @@ -927,6 +935,60 @@ sub CanBookBeIssued { } } } + + # + # CHECK AGE RESTRICTION + # + + # get $marker from preferences. Could be something like "FSK|PEGI|Alter|Age:" + my $marker = C4::Context->preference('AgeRestrictionMarker' ); + + if ($marker) + { + # Split $value to something like FSK 16 or PEGI 6 + my @marker = split /\|/, $marker; + my @values = split ' ', $biblioitem->{'agerestriction'} ; + + # Search first occurence of one of the markers + my $index = 0; + my $take = -1; + for my $value (@values) { + $index ++; + if (grep {uc($_) eq $value} @marker) { + $take = $index; + last; + } + } + # Index points to the next value + my $restrictionyear = 0; + if (($take <= $#values) && ($take >= 0)){ + $restrictionyear += @values[$take]; + } + + if ($restrictionyear > 0) { + if ( $borrower->{'dateofbirth'} ) { + my @alloweddate = split /-/,$borrower->{'dateofbirth'} ; + @alloweddate[0] += $restrictionyear; + #Prevent runime eror on leap year (invalid date) + if ((@alloweddate[1] == 02) && (@alloweddate[2] == 29)) { + @alloweddate[2] = 28; + } + + my $td = Date_to_Days(Today); + my $ad = Date_to_Days(@alloweddate); + + if ( Date_to_Days(Today) < Date_to_Days(@alloweddate) -1 ) { + if (C4::Context->preference('AgeRestrictionOverride ' )) { + $issuingimpossible{AGE_RESTRICTION} = "$restrictionyear"; + } + else { + $needsconfirmation{AGE_RESTRICTION} = "$restrictionyear"; + } + } + } + } + } + return ( \%issuingimpossible, \%needsconfirmation ); } diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 2ffe2df..c09e92e 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -365,3 +365,5 @@ INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ( INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacBrowseResults','1','Disable/enable browsing and paging search results from the OPAC detail page.',NULL,'YesNo'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('SvcMaxReportRows','10','Maximum number of rows to return via the report web service.',NULL,'Integer'); INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ReservesControlBranch','PatronLibrary','ItemHomeLibrary|PatronLibrary','Branch checked for members reservations rights','Choice'); +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionMarker','','Markers for age restriction indication, e.g. FSK|PEGI|Age|',NULL,'free'); +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionOverride',0,'Do not prevent patrons from checking out an item whose age restriction would apply.',NULL,'YesNo'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index dbbdee3..cac7d35 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -5308,6 +5308,18 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion ($DBversion); } +$DBversion = "XXXX"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + # biblioitems changes + $dbh->do("ALTER TABLE 'biblioitems' ADD COLUMN 'agerestriction' VARCHAR(255) DEFAULT NULL AFTER 'cn_sort'"); + # preferences changes + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionMarker','','Markers for age restriction indication, e.g. FSK|PEGI|Age|',NULL,'free')"); + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionOverride',0,'Do not prevent patrons from checking out an item whose age restriction would apply.',NULL,'YesNo')"); + + print "Upgrade to $DBversion done (Add colum agerestriction to bilioitems, add system preferences AgeRestrictionMarker and AgeRestrictionOverride)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 49012fd..470d80e 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -208,6 +208,15 @@ Circulation: no: "Prevent" - patrons from checking out an item whose rental charge would take them over the limit. - + - pref: AgeRestrictionMarker + - "E.g. FSK|PEGI|Age| (No white space near |). Entry in MARC field (e.g. 521a) as defined for agerestriction in Koha to MARC mapping. Values e.g. FSK|PEGI|Age| . Entry e.g. in 521a like FSK 12 or PEGI 12 would then mean: Borrower must be 12 years old. (Empty: Do not apply age restriction.)" + - + - pref: AgeRestrictionOverride + choices: + yes: Prevent + no: "Don't prevent" + - patrons from checking out an item whose age restriction would apply. + - - Prevent patrons from checking out books if they have more than - pref: noissuescharge class: integer diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt index 1bceb0c..3cc33ce 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -241,6 +241,10 @@ function refocus(calendar) {

Please confirm checkout