Bugzilla – Attachment 22847 Details for
Bug 6837
When AllowOnShelfHolds is OFF then holds on records with available items should not be possible
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch to resolve AllowOnShelfHolds conflict on available items.
0001-Bug-6837-When-AllowOnShelfHolds-is-OFF-then-holds-on.patch (text/plain), 11.79 KB, created by
Barry Cannon
on 2013-11-08 19:05:53 UTC
(
hide
)
Description:
Patch to resolve AllowOnShelfHolds conflict on available items.
Filename:
MIME Type:
Creator:
Barry Cannon
Created:
2013-11-08 19:05:53 UTC
Size:
11.79 KB
patch
obsolete
>From 5d8b950f5e6da977b81d17acdc4d4edfcf2059f7 Mon Sep 17 00:00:00 2001 >From: Barry Cannon <barry@oslo.ie> >Date: Fri, 8 Nov 2013 18:46:32 +0000 >Subject: [PATCH] Bug 6837 When AllowOnShelfHolds is OFF then holds on > records with available items should not be possible > >Although AllowOnShelfHolds does, under certain cirmcumstances restrict items from having holds >placed on them there are certain conditions that cause OPAC to still display an available Hold >when it shouldn't. Eg. It there are two items, one is on the self and one is Checked Out. >This patch adds a new SystemPreference 'PreventOPACHoldsAnyAvailableItem' which will enforce >the restriction of placing a hold when any item is on the shelf. >--- > C4/Reserves.pm | 66 ++++++++++++++++++++ > installer/data/mysql/sysprefs.sql | 1 + > installer/data/mysql/updatedatabase.pl | 6 ++ > .../en/modules/admin/preferences/circulation.pref | 7 +++ > .../prog/en/includes/opac-detail-sidebar.inc | 12 ++-- > .../opac-tmpl/prog/en/modules/opac-results.tt | 10 +-- > opac/opac-detail.pl | 9 ++- > opac/opac-search.pl | 9 ++- > 8 files changed, 109 insertions(+), 11 deletions(-) > >diff --git a/C4/Reserves.pm b/C4/Reserves.pm >index d1bca25..46bc6e0 100644 >--- a/C4/Reserves.pm >+++ b/C4/Reserves.pm >@@ -133,6 +133,7 @@ BEGIN { > &SuspendAll > > &GetReservesControlBranch >+ &PreventOPACHoldsAnyAvailableItem > ); > @EXPORT_OK = qw( MergeHolds ); > } >@@ -2214,6 +2215,71 @@ sub GetReservesControlBranch { > return $branchcode; > } > >+ >+=head2 PreventOPACHoldsAnyAvailableItem >+Checks if an item is available to have a hold placed on it from the OPAC only. >+Specifically relates to items currently on the shelf (without a datedue). >+If 'AllowOnShelfHolds' syspref is allowed then this will always return false i.e >+PreventOPACHoldsAnyAvailableItem will not prevent OPAC holds. >+ >+Is controlled by the 'PreventOPACHoldsAnyAvailableItem' system preference. >+ >+The system preference has 2 states: >+ >+* off: Not in effect. Allowing of hold will be determined elsewhere in the system. >+* on: Each bibnumber will be checked for attached items. Each item is checked for >+its availability. The only status that prevents a hold is when an item is on the >+shelf and available. All other status should be ignored. >+ >+Returns true when any item attached to the bib is on the shelf and available >+ >+=cut >+ >+sub PreventOPACHoldsAnyAvailableItem { >+ my $biblionumber = shift; >+ >+ if ( C4::Context->preference('AllowOnShelfHolds') or not C4::Context->preference('PreventOPACHoldsAnyAvailableItem') ) { >+ return 0; # we shouldn't be in here >+ } >+ >+ my @items = GetItemsInfo( $biblionumber ); >+ my $prevent_hold = 0; >+ my $dbh = C4::Context->dbh; >+ my $notforloan_query; >+ if (C4::Context->preference('item-level_itypes')) { >+ $notforloan_query = "SELECT itemtypes.notforloan >+ FROM items >+ JOIN itemtypes ON (itemtypes.itemtype = items.itype) >+ WHERE itemnumber = ?"; >+ } else { >+ $notforloan_query = "SELECT itemtypes.notforloan >+ FROM items >+ JOIN biblioitems USING (biblioitemnumber) >+ JOIN itemtypes USING (itemtype) >+ WHERE itemnumber = ?"; >+ } >+ my $sth = $dbh->prepare($notforloan_query); >+ foreach my $item (@items) { >+ $sth->execute( $item->{itemnumber} ); >+ my $notforloan_itemtype = 0; >+ if (my ($notforloan) = $sth->fetchrow_array) { >+ $notforloan_itemtype = 1 if $notforloan; >+ } >+ >+ if ( not $item->{datedue} ) { >+ if ($item->{itemlost} >+ or ( $item->{notforloan} > 0 ) >+ or ( $item->{damaged} and not C4::Context->preference('AllowHoldsOnDamagedItems') ) >+ or $item->{wthdrawn} >+ or $notforloan_itemtype) { >+ next; >+ } >+ else {$prevent_hold++} >+ } >+ } >+ return $prevent_hold; >+} >+ > =head1 AUTHOR > > Koha Development Team <http://koha-community.org/> >diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql >index 72eead2..0fda5d5 100644 >--- a/installer/data/mysql/sysprefs.sql >+++ b/installer/data/mysql/sysprefs.sql >@@ -301,6 +301,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('Persona','0','','Use Mozilla Persona for login','YesNo'), > ('PrefillItem','0','','When a new item is added, should it be prefilled with last created item values?','YesNo'), > ('previousIssuesDefaultSortOrder','asc','asc|desc','Specify the sort order of Previous Issues on the circulation page','Choice'), >+('PreventOPACHoldsAnyAvailableItem,'0',NULL,'Define how OPAC users can place holds on items that are checked in (on the self),'Choice'), > ('printcirculationslips','1','','If ON, enable printing circulation receipts','YesNo'), > ('PrintNoticesMaxLines','0','','If greater than 0, sets the maximum number of lines an overdue notice will print. If the number of items is greater than this number, the notice will end with a warning asking the borrower to check their online account for a full list of overdue items.','Integer'), > ('QueryAutoTruncate','1',NULL,'If ON, query truncation is enabled by default','YesNo'), >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 6162bc5..3ed8a5f 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -7743,6 +7743,12 @@ if(CheckVersion($DBversion)) { > SetVersion($DBversion); > } > >+$DBversion = "3.13.00.XXX"; >+ if ( CheckVersion($DBversion) ) { >+ $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('PreventOPACHoldsAnyAvailableItem', '0', 'Define how OPAC users can place holds on items that are checked in (on the self)', NULL ,'Choice')"); >+ print "Upgrade to $DBversion done (Bug 6837: Enchances AllowOnShelfHolds SystemPref, give more granular control over OPAC holds )\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 9ae9c44..2827f93 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,13 @@ Circulation: > no: "Don't allow" > - hold requests to be placed on items that are not checked out. > - >+ - pref: PreventOPACHoldsAnyAvailableItem >+ type: choice >+ choices: >+ yes: Prevent >+ no: Do not explicitly prevent >+ - holds to be placed when ANY item is on the shelf. (Preference is ignored if AllowOnShelfHolds is ON) >+ - > - pref: AllowHoldDateInFuture > choices: > yes: Allow >diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/prog/en/includes/opac-detail-sidebar.inc >index 0f16f3a..4a6a573 100644 >--- a/koha-tmpl/opac-tmpl/prog/en/includes/opac-detail-sidebar.inc >+++ b/koha-tmpl/opac-tmpl/prog/en/includes/opac-detail-sidebar.inc >@@ -2,12 +2,14 @@ > [% UNLESS ( norequests ) %] > [% IF ( opacuserlogin ) %] > [% IF ( RequestOnOpac ) %] >- [% IF ( AllowOnShelfHolds ) %] >- <li><a class="reserve" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% biblionumber %]">Place hold</a></li> >- [% ELSE %] >- [% IF ( ItemsIssued ) %] >+ [% UNLESS (PreventOPACHoldsAnyAvailableItem) %] >+ [% IF ( AllowOnShelfHolds ) %] > <li><a class="reserve" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% biblionumber %]">Place hold</a></li> >- [% END %] >+ [% ELSE %] >+ [% IF ( ItemsIssued ) %] >+ <li><a class="reserve" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% biblionumber %]">Place hold</a></li> >+ [% END %] >+ [% END %] > [% END %] > [% END %] > [% END %] >diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tt >index 9235b2b..3b0d3db 100644 >--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tt >+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tt >@@ -667,11 +667,13 @@ $(document).ready(function(){ > [% IF ( RequestOnOpac ) %] > [% UNLESS ( SEARCH_RESULT.norequests ) %] > [% IF ( opacuserlogin ) %] >- [% IF ( AllowOnShelfHolds ) %] >- <a class="hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% SEARCH_RESULT.biblionumber %]">Place hold</a><!-- add back when available 0 holds in queue--> >- [% ELSE %] >- [% IF ( SEARCH_RESULT.itemsissued ) %] >+ [% UNLESS SEARCH_RESULT.prevent_holds %] >+ [% IF ( AllowOnShelfHolds ) %] > <a class="hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% SEARCH_RESULT.biblionumber %]">Place hold</a><!-- add back when available 0 holds in queue--> >+ [% ELSE %] >+ [% IF ( SEARCH_RESULT.itemsissued ) %] >+ <a class="hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% SEARCH_RESULT.biblionumber %]">Place hold</a><!-- add back when available 0 holds in queue--> >+ [% END %] > [% END %] > [% END %] > [% END %] >diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl >index 41de4fd..8829400 100755 >--- a/opac/opac-detail.pl >+++ b/opac/opac-detail.pl >@@ -401,9 +401,16 @@ if ($session->param('busc')) { > } > > >+# Check if we can place a hold on this bib where there is an item out but others available >+my $prevent_holds = 0; >+if ( C4::Context->preference('PreventOPACHoldsAnyAvailableItem') && not C4::Context->preference('AllowOnShelfHolds') ) { >+ $prevent_holds = PreventOPACHoldsAnyAvailableItem( $biblionumber ); >+ print "HOLDS: $prevent_holds<br />"; >+} > >+$template->param( 'PreventOPACHoldsAnyAvailableItem' => $prevent_holds ); > $template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') ); >-$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); >+$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ) if not $prevent_holds; > > > >diff --git a/opac/opac-search.pl b/opac/opac-search.pl >index 2854da6..1fffbdb 100755 >--- a/opac/opac-search.pl >+++ b/opac/opac-search.pl >@@ -52,7 +52,7 @@ use C4::Branch; # GetBranches > use C4::SocialData; > use C4::Ratings; > use C4::External::OverDrive; >- >+use C4::Reserves; > use POSIX qw(ceil floor strftime); > use URI::Escape; > use JSON qw/decode_json encode_json/; >@@ -675,6 +675,13 @@ for (my $i=0;$i<@servers;$i++) { > my $j = 0; > foreach (@newresults) { > my $bibnum = ($_->{biblionumber})?$_->{biblionumber}:0; >+ my $prevent_holds = 0; >+ if ( C4::Context->preference('PreventOPACHoldsAnyAvailableItem') && not C4::Context->preference('AllowOnShelfHolds') ) { >+ $prevent_holds = PreventOPACHoldsAnyAvailableItem($bibnum) if $bibnum; >+ } >+ if ( $prevent_holds ) { >+ $_->{prevent_holds} =1; >+ } > $pasarParams .= $bibnum . ','; > $j++; > last if ($j == $results_per_page); >-- >1.7.10.4 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 6837
:
5285
|
22847
|
23002
|
23003
|
23162