From 1097e23cccec6d393ae89c58415cad1380e11651 Mon Sep 17 00:00:00 2001 From: Mark Gavillet Date: Wed, 4 May 2011 12:41:41 +0100 Subject: [PATCH 1/6] Bug 7751 : Decrease loan period on checkout for items with high holds Content-Type: text/plain; charset="utf-8" --- C4/Circulation.pm | 63 ++++++++++++++++++++ installer/data/mysql/sysprefs.sql | 3 + .../prog/en/modules/circ/circulation.tt | 11 ++++ 3 files changed, 77 insertions(+), 0 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 9b523e3..3dc5d7a 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -931,9 +931,72 @@ sub CanBookBeIssued { } } } + + ## check for high holds decreasing loan period + if (C4::Context->preference("decreaseLoanHighHolds") == 1) + { + my ($reserved,$num,$duration,$returndate)=checkHighHolds($item,$borrower); + #print "reserved: $reserved\n".Dumper($num); + if ($num>=C4::Context->preference("decreaseLoanHighHoldsValue")) + { + $needsconfirmation{HIGHHOLDS} = 1; + $needsconfirmation{'num_holds'} = $num; + $needsconfirmation{'duration'} = $duration; + $needsconfirmation{'returndate'} = format_date($returndate); + } + } + return ( \%issuingimpossible, \%needsconfirmation, \%alerts ); } +=head2 CheckHighHolds + + used when syspref decreaseLoanHighHolds is active. Returns 1 or 0 to define whether the minimum value held in + decreaseLoanHighHoldsValue is exceeded, the total number of outstanding holds, the number of days the loan + has been decreased to (held in syspref decreaseLoanHighHoldsValue), and the new due date + +=cut + +sub checkHighHolds { + my ($item,$borrower) = @_; + my $biblio = GetBiblioFromItemNumber($item->{itemnumber}); + my $branch = _GetCircControlBranch($item,$borrower); + my $dbh = C4::Context->dbh; + my $sth; + $sth = $dbh->prepare("select count(borrowernumber) as num_holds from reserves where biblionumber=?"); + $sth->execute($item->{'biblionumber'}); + my $holds = $sth->fetchrow_array; + if ($holds>0) + { + my $issuedate = strftime( "%Y-%m-%d", localtime ); + my $startdate=C4::Dates->new( $issuedate, 'iso' ); + my $calendar = C4::Calendar->new( branchcode => $branch ); + + my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'}; + my $due = C4::Circulation::CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower ); + my $normaldue = sprintf("%04d-%02d-%02d",($due->{'dmy_arrayref'}[5]+1900),($due->{'dmy_arrayref'}[4]+1), + $due->{'dmy_arrayref'}[3]); + + my $datedue = $calendar->addDate($startdate, C4::Context->preference("decreaseLoanHighHoldsDuration")); + my $returndate = sprintf("%04d-%02d-%02d",($datedue->{'dmy_arrayref'}[5]+1900),($datedue->{'dmy_arrayref'}[4]+1), + $datedue->{'dmy_arrayref'}[3]); + + my $daysBetween = $calendar->daysBetween($datedue, $due); + if ($daysBetween>0) + { + return (1,$holds,C4::Context->preference("decreaseLoanHighHoldsDuration"),$returndate); + } + else + { + return (0,0,0,0); + } + } + else + { + return (0,0,0,0); + } +} + =head2 AddIssue &AddIssue($borrower, $barcode, [$datedue], [$cancelreserve], [$issuedate]) diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index c4060fe..46afb89 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -364,6 +364,9 @@ INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ( INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacStarRatings','all',NULL,'disable|all|details','Choice'); 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 ('decreaseLoanHighHolds', NULL, '', 'Decreases the loan period for items with number of holds above the threshold specified in decreaseLoanHighHoldsValue', 'YesNo'); +INSERT INTO `systempreferences` (`variable`,`value`,`options`,`explanation`,`type`) VALUES ('decreaseLoanHighHoldsValue', NULL, '', 'Specifies a threshold for the minimum number of holds needed to trigger a reduction in loan duration (used with decreaseLoanHighHolds)', 'Integer'); +INSERT INTO `systempreferences` (`variable`,`value`,`options`,`explanation`,`type`) VALUES ('decreaseLoanHighHoldsDuration', NULL, '', 'Specifies a number of days that a loan is reduced to when used in conjunction with decreaseLoanHighHolds', '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('IssueLostItem', 'alert', 'alert|confirm|nothing', 'Defines what should be done when an attempt is made to issue an item that has been marked as lost.', 'Choice'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('SuspendHoldsIntranet', '1', NULL , 'Allow holds to be suspended from the intranet.', 'YesNo'); 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 64ca686..9528a97 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -288,8 +288,19 @@ function refocus(calendar) { [% IF ( ITEM_LOST ) %]
  • This item has been lost with a status of "[% ITEM_LOST %]". Check out anyway?
  • [% END %] + +[% IF ( HIGHHOLDS ) %] +
  • High demand item. Loan period shortened to [% duration %] days (due [% returndate %]). Check out anyway?
  • +[% END %] +[% IF ( HIGHHOLDS ) %] + +[% END %]
    [% IF ( RESERVED ) %] -- 1.7.2.5 From bdb8fd3b3b182840ab8a688e7023c6b6f1bee123 Mon Sep 17 00:00:00 2001 From: Colin Campbell Date: Wed, 29 Jun 2011 17:25:49 +0100 Subject: [PATCH 2/6] Bug 7751 : HIGHHOLDS should be a single datastructure Content-Type: text/plain; charset="utf-8" Data returned with HIGHHOLDS was being returned on the same level as the flag so that it might be interpreted as further items requiring confirmation. Instead of HIGHHOLDS being returned as a flag return it as a data structure containing that data. Change template to reflect this Conflicts: C4/Circulation.pm --- C4/Circulation.pm | 9 +++++---- .../prog/en/modules/circ/circulation.tt | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 3dc5d7a..05517d8 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -939,10 +939,11 @@ sub CanBookBeIssued { #print "reserved: $reserved\n".Dumper($num); if ($num>=C4::Context->preference("decreaseLoanHighHoldsValue")) { - $needsconfirmation{HIGHHOLDS} = 1; - $needsconfirmation{'num_holds'} = $num; - $needsconfirmation{'duration'} = $duration; - $needsconfirmation{'returndate'} = format_date($returndate); + $needsconfirmation{HIGHHOLDS} = { + num_holds => $num, + duration => $duration, + returndate => format_date($returndate), + }; } } 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 9528a97..58c72cd 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -289,15 +289,15 @@ function refocus(calendar) {
  • This item has been lost with a status of "[% ITEM_LOST %]". Check out anyway?
  • [% END %] -[% IF ( HIGHHOLDS ) %] -
  • High demand item. Loan period shortened to [% duration %] days (due [% returndate %]). Check out anyway?
  • +[% IF HIGHHOLDS %] +
  • High demand item. Loan period shortened to [% HIGHHOLDS.duration %] days (due [% HIGHHOLDS.returndate %]). Check out anyway?
  • [% END %] -[% IF ( HIGHHOLDS ) %] +[% IF HIGHHOLDS %] [% END %] -- 1.7.2.5 From b3e0cf667d5608d235b5db20bb6110ed1972bcc0 Mon Sep 17 00:00:00 2001 From: Colin Campbell Date: Mon, 27 Jun 2011 12:15:50 +0100 Subject: [PATCH 3/6] Bug 7751 : Self Check should recognize Reduced Loan Periods Content-Type: text/plain; charset="utf-8" Staffs Reduced Loan feature returns the reduced due date as 'needs confirm' Self Check should apply it as due date when adding the issue Conflicts: C4/SIP/ILS/Transaction/Checkout.pm --- C4/SIP/ILS/Transaction/Checkout.pm | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/C4/SIP/ILS/Transaction/Checkout.pm b/C4/SIP/ILS/Transaction/Checkout.pm index d483e16..6cc3437 100644 --- a/C4/SIP/ILS/Transaction/Checkout.pm +++ b/C4/SIP/ILS/Transaction/Checkout.pm @@ -55,6 +55,7 @@ sub do_checkout { my $shelf = $self->{item}->hold_shelf; my $barcode = $self->{item}->id; my $patron_barcode = $self->{patron}->id; + my $overridden_duedate; # usually passed as undef to AddIssue $debug and warn "do_checkout: patron (" . $patron_barcode . ")"; my $borrower = $self->{patron}->getmemberdetails_object(); $debug and warn "do_checkout borrower: . " . Dumper $borrower; @@ -73,7 +74,7 @@ sub do_checkout { $noerror = 0; } } else { - foreach my $confirmation (keys %$needsconfirmation) { + foreach my $confirmation (keys %{$needsconfirmation}) { if ($confirmation eq 'RENEW_ISSUE'){ $self->screen_msg("Item already checked out to you: renewing item."); } elsif ($confirmation eq 'RESERVED' or $confirmation eq 'RESERVE_WAITING') { @@ -88,6 +89,9 @@ sub do_checkout { $self->screen_msg("Item already checked out to another patron. Please return item for check-in."); $noerror = 0; } elsif ($confirmation eq 'DEBT') { # don't do anything, it's the minor debt, and alarms fire elsewhere + } elsif ($confirmation eq 'HIGHHOLDS') { + $overridden_duedate = $needsconfirmation->{$confirmation}->{returndate}; + $self->screen_msg('Loan period reduced for high-demand item'); } else { $self->screen_msg($needsconfirmation->{$confirmation}); $noerror = 0; @@ -119,10 +123,10 @@ sub do_checkout { # TODO: adjust representation in $self->item } # can issue - $debug and warn "do_checkout: calling AddIssue(\$borrower,$barcode, undef, 0)\n" + $debug and warn "do_checkout: calling AddIssue(\$borrower,$barcode, $overridden_duedate, 0)\n" # . "w/ \$borrower: " . Dumper($borrower) . "w/ C4::Context->userenv: " . Dumper(C4::Context->userenv); - my $due_dt = AddIssue($borrower, $barcode, undef, 0); + my $due_dt = AddIssue($borrower, $barcode, $overridden_duedate, 0); if ($due_dt) { $self->{due} = $due_dt->clone(); } else { -- 1.7.2.5 From 31815f75c49c9889ece5e42c4aa16286bf74e2b1 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Mon, 28 May 2012 16:33:35 +0100 Subject: [PATCH 4/6] Bug 7751 : Added sysprefs to circulation.pref (removed from "Local use") Content-Type: text/plain; charset="utf-8" --- .../en/modules/admin/preferences/circulation.pref | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) 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 d2d11b4..76cc5dc 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 @@ -370,6 +370,22 @@ Circulation: yes: Allow no: "Don't allow" - holds to be suspended from the OPAC. + - + - pref: decreaseLoanHighHolds + choices: + yes: Enable + no: "Don't enable" + - the reduction of loan period for items with number of holds above the threshold specified in decreaseLoanHighHoldsValue + - + - A loan should be reduced by + - pref: decreaseLoanHighHoldsDuration + class: integer + - days, when decreaseLoanHighHoldsValue threshold is reached (if decreaseLoanHighHolds is enabled) + - + - A loan should be reduced by decreaseLoanHighHoldsDuration when + - pref: decreaseLoanHighHoldsValue + class: integer + - holds have been places (if decreaseLoanHighHolds is enables) Fines Policy: - - Calculate fines based on days overdue -- 1.7.2.5 From d8b8c56afedb142a4c5226293fae5fc8b9cb9119 Mon Sep 17 00:00:00 2001 From: Colin Campbell Date: Mon, 20 Jun 2011 17:02:49 +0100 Subject: [PATCH 5/6] Bug 7751 : Make Reduce Duedate aware of New Date formats Content-Type: text/plain; charset="utf-8" Signed-off-by: Martin Renvoize --- C4/Circulation.pm | 34 ++++++++++++++-------------------- 1 files changed, 14 insertions(+), 20 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 05517d8..4322255 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -931,7 +931,7 @@ sub CanBookBeIssued { } } } - + ## check for high holds decreasing loan period if (C4::Context->preference("decreaseLoanHighHolds") == 1) { @@ -942,7 +942,7 @@ sub CanBookBeIssued { $needsconfirmation{HIGHHOLDS} = { num_holds => $num, duration => $duration, - returndate => format_date($returndate), + returndate => output_pref($returndate), }; } } @@ -963,38 +963,32 @@ sub checkHighHolds { my $biblio = GetBiblioFromItemNumber($item->{itemnumber}); my $branch = _GetCircControlBranch($item,$borrower); my $dbh = C4::Context->dbh; - my $sth; - $sth = $dbh->prepare("select count(borrowernumber) as num_holds from reserves where biblionumber=?"); + my $sth = $dbh->prepare('select count(borrowernumber) as num_holds from reserves where biblionumber=?'); $sth->execute($item->{'biblionumber'}); - my $holds = $sth->fetchrow_array; - if ($holds>0) + my ($holds) = $sth->fetchrow_array; + if ($holds) { - my $issuedate = strftime( "%Y-%m-%d", localtime ); - my $startdate=C4::Dates->new( $issuedate, 'iso' ); - my $calendar = C4::Calendar->new( branchcode => $branch ); + my $issuedate = DateTime->new( time_zone => C4::Context->tz()); + # my $startdate=C4::Dates->new( $issuedate, 'iso' ); + my $calendar = Koha::Calendar->new( branchcode => $branch ); my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'}; - my $due = C4::Circulation::CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower ); - my $normaldue = sprintf("%04d-%02d-%02d",($due->{'dmy_arrayref'}[5]+1900),($due->{'dmy_arrayref'}[4]+1), - $due->{'dmy_arrayref'}[3]); + my $orig_due = C4::Circulation::CalcDateDue( $issuedate, $itype, $branch, $borrower ); - my $datedue = $calendar->addDate($startdate, C4::Context->preference("decreaseLoanHighHoldsDuration")); - my $returndate = sprintf("%04d-%02d-%02d",($datedue->{'dmy_arrayref'}[5]+1900),($datedue->{'dmy_arrayref'}[4]+1), - $datedue->{'dmy_arrayref'}[3]); + my $reduced_datedue = $calendar->addDate($issuedate, C4::Context->preference("decreaseLoanHighHoldsDuration")); - my $daysBetween = $calendar->daysBetween($datedue, $due); - if ($daysBetween>0) + if (DateTime->compare($reduced_datedue,$orig_due) == -1 ) { - return (1,$holds,C4::Context->preference("decreaseLoanHighHoldsDuration"),$returndate); + return (1,$holds,C4::Context->preference("decreaseLoanHighHoldsDuration"),$reduced_datedue); } else { - return (0,0,0,0); + return (0,0,0,undef); } } else { - return (0,0,0,0); + return (0,0,0,undef); } } -- 1.7.2.5 From d2dd127f33c350b1ec1a79abdefd10456de071dd Mon Sep 17 00:00:00 2001 From: Colin Campbell Date: Thu, 23 Jun 2011 12:10:51 +0100 Subject: [PATCH 6/6] Bug 7751 : Fix a couple of comparisons in C4::Circulation Content-Type: text/plain; charset="utf-8" Changed a string comparison called on an integer Deal with case where value is not set without runtime warnings This is dependent on bug 5549 Signed-off-by: Martin Renvoize --- C4/Circulation.pm | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 4322255..359b710 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -933,11 +933,12 @@ sub CanBookBeIssued { } ## check for high holds decreasing loan period - if (C4::Context->preference("decreaseLoanHighHolds") == 1) + my $decrease_loan = C4::Context->preference('decreaseLoanHighHolds'); + if ($decrease_loan && $decrease_loan == 1) { my ($reserved,$num,$duration,$returndate)=checkHighHolds($item,$borrower); #print "reserved: $reserved\n".Dumper($num); - if ($num>=C4::Context->preference("decreaseLoanHighHoldsValue")) + if ($num >= C4::Context->preference("decreaseLoanHighHoldsValue")) { $needsconfirmation{HIGHHOLDS} = { num_holds => $num, -- 1.7.2.5