From 780cda46a26c5b2473685a55376f1b029a93b46c Mon Sep 17 00:00:00 2001 From: Henri-Damien LAURENT Date: Mon, 24 Aug 2009 22:10:22 +0200 Subject: [PATCH] UpdateDataBase for smart-rules modification Members.pm : Adding IsMemberBlocked Circulation.pm : Using IsMemberBlocked in order to implement finedays Signed-off-by: Galen Charlton --- C4/Circulation.pm | 14 ++-- C4/Members.pm | 67 +++++++++++++++++++ ...it_to_define_fine_days_in_issuing_rules.pl | 22 ++++++ 3 files changed, 99 insertions(+), 4 deletions(-) create mode 100755 installer/data/mysql/atomicupdate/0001-bug_2929-permit_to_define_fine_days_in_issuing_rules.pl diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 7f2bfeb18d..98f324cac8 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -532,7 +532,6 @@ sub itemissues { $data->{'date_due'} = ($data->{'wthdrawn'} eq '1') ? 'Cancelled' : 'Available'; } - $sth2->finish; # Find the last 3 people who borrowed this item. $sth2 = $dbh->prepare( @@ -552,12 +551,10 @@ sub itemissues { } # if } # for - $sth2->finish; $results[$i] = $data; $i++; } - $sth->finish; return (@results); } @@ -731,7 +728,16 @@ sub CanBookBeIssued { } } - # + my ($blocktype, $count) = C4::Members::IsMemberBlocked($borrower->{'borrowernumber'}); + if($blocktype == -1){ + ## remaining overdue documents + $issuingimpossible{USERBLOCKEDREMAINING} = $count; + }elsif($blocktype == 1){ + ## blocked because of overdue return + $issuingimpossible{USERBLOCKEDOVERDUE} = $count; + } + +# # JB34 CHECKS IF BORROWERS DONT HAVE ISSUE TOO MANY BOOKS # my $toomany = TooMany( $borrower, $item->{biblionumber}, $item ); diff --git a/C4/Members.pm b/C4/Members.pm index 9ce2001342..7e0854c335 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -63,6 +63,7 @@ BEGIN { &PutPatronImage &RmPatronImage + &IsMemberBlocked &GetMemberAccountRecords &GetBorNotifyAcctRecord @@ -511,6 +512,72 @@ LEFT JOIN categories on borrowers.categorycode=categories.categorycode return undef; } +=head2 IsMemberBlocked + +=over 4 + +my $blocked = IsMemberBlocked( $borrowernumber ); + +return the status, and the number of day or documents, depends his punishment + +return : +-1 if the user have overdue returns +1 if the user is punished X days +0 if the user is authorised to loan + +=back + +=cut + +sub IsMemberBlocked { + my $borrowernumber = shift; + my $dbh = C4::Context->dbh; + # if he have late issues + my $sth = $dbh->prepare( + "SELECT COUNT(*) as latedocs + FROM issues + WHERE borrowernumber = ? + AND date_due < now()" + ); + $sth->execute($borrowernumber); + my $latedocs = $sth->fetchrow_hashref->{'latedocs'}; + + return (-1, $latedocs) if $latedocs > 0; + + my $strsth=qq{ + SELECT + ADDDATE(returndate, finedays * DATEDIFF(returndate,date_due) ) AS blockingdate, + DATEDIFF(ADDDATE(returndate, finedays * DATEDIFF(returndate,date_due)),NOW()) AS blockedcount + FROM old_issues + }; + # or if he must wait to loan + if(C4::Context->preference("item-level_itypes")){ + $strsth.= + qq{ LEFT JOIN items ON (items.itemnumber=old_issues.itemnumber) + LEFT JOIN issuingrules ON (issuingrules.itemtype=items.itype)} + }else{ + $strsth .= + qq{ LEFT JOIN items ON (items.itemnumber=old_issues.itemnumber) + LEFT JOIN biblioitems ON (biblioitems.biblioitemnumber=items.biblioitemnumber) + LEFT JOIN issuingrules ON (issuingrules.itemtype=biblioitems.itemtype) }; + } + $strsth.= + qq{ WHERE finedays IS NOT NULL + AND date_due < returndate + AND borrowernumber = ? + ORDER BY blockingdate DESC, blockedcount DESC + LIMIT 1}; + $sth=$dbh->prepare($strsth); + $sth->execute($borrowernumber); + my $row = $sth->fetchrow_hashref; + my $blockeddate = $row->{'blockeddate'}; + my $blockedcount = $row->{'blockedcount'}; + + return (1, $blockedcount) if $blockedcount > 0; + + return 0 +} + =head2 GetMemberIssuesAndFines ($overdue_count, $issue_count, $total_fines) = &GetMemberIssuesAndFines($borrowernumber); diff --git a/installer/data/mysql/atomicupdate/0001-bug_2929-permit_to_define_fine_days_in_issuing_rules.pl b/installer/data/mysql/atomicupdate/0001-bug_2929-permit_to_define_fine_days_in_issuing_rules.pl new file mode 100755 index 0000000000..dfe3b6b09c --- /dev/null +++ b/installer/data/mysql/atomicupdate/0001-bug_2929-permit_to_define_fine_days_in_issuing_rules.pl @@ -0,0 +1,22 @@ +#! /usr/bin/perl +use strict; +use warnings; +use C4::Context; +my $dbh=C4::Context->dbh; +$dbh->do("ALTER TABLE issuingrules ADD + COLUMN `finedays` int(11) default NULL AFTER `fine`, + COLUMN `renewalsallowed` smallint(6) default NULL, + COLUMN `reservesallowed` smallint(6) default NULL, + "); +$sth = $dbh->prepare("SELECT itemtype, renewalsallowed FROM itemtypes"); +$sth->execute(); + +my $sthupd = $dbh->prepare("UPDATE issuingrules SET renewalsallowed = ? WHERE itemtype = ?"); + +while(my $row = $sth->fetchrow_hashref){ + $sthupd->execute($row->{renewalsallowed}, $row->{itemtype}); +} + +$dbh->do('ALTER TABLE itemtypes DROP COLUMN `renewalsallowed`;'); + +print "Upgrade done (Adding finedays renewalsallowed, and reservesallowed fields in issuingrules table)\n"; -- 2.39.2