Bugzilla – Attachment 144076 Details for
Bug 24194
Add system preference to disable the use of expiration dates for holds
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 24194: Add ReserveExpiration system preference to disable expiration date options for reserves
Bug-24194-Add-ReserveExpiration-system-preference-.patch (text/plain), 36.35 KB, created by
Kyle M Hall (khall)
on 2022-11-18 16:56:05 UTC
(
hide
)
Description:
Bug 24194: Add ReserveExpiration system preference to disable expiration date options for reserves
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2022-11-18 16:56:05 UTC
Size:
36.35 KB
patch
obsolete
>From 7693a869a1c4ebf7ca1ed34507753a8209d8c882 Mon Sep 17 00:00:00 2001 >From: Aleisha Amohia <aleishaamohia@hotmail.com> >Date: Mon, 9 Dec 2019 04:33:42 +0000 >Subject: [PATCH] Bug 24194: Add ReserveExpiration system preference to disable > expiration date options for reserves > >To test: >1) Update database >2) Go to place a hold on any biblio in the staff intranet and confirm you can see the 'Hold expires on date' field. >3) In another tab, go to place a hold on any biblio in the OPAC and confirm you can see the 'Hold not needed after' field as an option. >4) In yet another tab, open the staff intranet and place a reserve for a user. Check it in and set the reserve as waiting. Notice that an expiration date has now been generated for this reserve. >5) Attempt to check out the item you reserved to some other borrower. Revert waiting status. Notice that the expiration date that was generated remains. >6) Go to Administration -> system preferences and set ReserveExpiration system preference to 'Disable' >7) Refresh the hold request page in the intranet. Confirm the expiration date field disappears. >8) Refresh the hold request page in the OPAC. Confirm the expiration date field disappears. >9) Place another reserve. Check it in and set the reserve as waiting. Notice that no expiration date was generated for this reserve. >10) Attempt to check out the item you reserved to some other borrower. Revert waiting status. The expiration date should remain null. >11) Confirm tests pass >t/db_dependent/Hold.t >t/db_dependent/Reserves.t >12) Go to Admin -> System preferences and search for ReserveExpiration. >Confirm related system preferences have a reference to ReserveExpiration >and the links all work >13) Text the cancel_expired_holds.pl cronjob and confirm it works with >ReserveExpiration enabled, and does nothing when disabled >14) Confirm all instances where hold expiration dates are set or >referenced are shown or hidden correctly, depending on >ReserveExpiration > >Pages in the staff interface: > >- Check out to a patron and check the holds tab >- View patron details and check the holds tab >- Patron hold history >- Patron details -> Print -> Print summary >- Place a hold on a title which already has at least one hold on it, > check the table of existing holds. >- Circulation -> Holds awaiting pickup > >Pages in the OPAC: > >- Log in to the OPAC as a patron with holds > - Your summary -> Holds tab > - Your holds history (OPACHoldsHistory must be enabled). > >Sponsored-by: Horowhenua Library Trust > >Signed-off-by: David Nind <david@davidnind.com> >--- > C4/ILSDI/Services.pm | 10 ++++- > C4/Reserves.pm | 4 +- > Koha/Club/Hold.pm | 2 +- > Koha/Hold.pm | 40 ++++++++++++------- > Koha/REST/V1/Clubs/Holds.pm | 2 +- > Koha/REST/V1/Holds.pm | 2 +- > circ/waitingreserves.pl | 4 +- > .../bug24194-add-ReserveExpiration-syspref.pl | 12 ++++++ > installer/data/mysql/mandatory/sysprefs.sql | 1 + > .../prog/en/includes/holds_table.inc | 6 ++- > .../prog/en/includes/waiting_holds.inc | 4 ++ > .../admin/preferences/circulation.pref | 14 +++++-- > .../prog/en/modules/circ/circulation.tt | 1 + > .../prog/en/modules/members/holdshistory.tt | 21 +++++++--- > .../en/modules/members/moremember-print.tt | 8 +++- > .../prog/en/modules/members/moremember.tt | 1 + > .../prog/en/modules/reserve/request.tt | 10 +++-- > koha-tmpl/intranet-tmpl/prog/js/holds.js | 5 ++- > .../bootstrap/en/includes/holds-table.inc | 32 ++++++++------- > .../bootstrap/en/modules/opac-holdshistory.tt | 16 +++++--- > .../bootstrap/en/modules/opac-reserve.tt | 2 + > misc/cronjobs/holds/cancel_expired_holds.pl | 4 +- > t/db_dependent/Hold.t | 37 ++++++++++++++++- > t/db_dependent/Reserves.t | 36 ++++++++++++++++- > 24 files changed, 210 insertions(+), 64 deletions(-) > create mode 100644 installer/data/mysql/atomicupdate/bug24194-add-ReserveExpiration-syspref.pl > >diff --git a/C4/ILSDI/Services.pm b/C4/ILSDI/Services.pm >index f6bf6bcc14..0439bcb079 100644 >--- a/C4/ILSDI/Services.pm >+++ b/C4/ILSDI/Services.pm >@@ -777,7 +777,10 @@ sub HoldTitle { > return { code => 'cannotBeTransferred' } unless $biblio->can_be_transferred({ to => $destination }); > > my $resdate = $cgi->param('start_date'); >- my $expdate = $cgi->param('expiry_date'); >+ my $expdate; >+ if ( C4::Context->preference('ReserveExpiration') and $cgi->param('expiry_date') ) { >+ $expdate = $cgi->param('expiry_date'); >+ } > > # Add the reserve > # $branch, $borrowernumber, $biblionumber, >@@ -872,7 +875,10 @@ sub HoldItem { > return { code => $canitembereserved } unless $canitembereserved eq 'OK'; > > my $resdate = $cgi->param('start_date'); >- my $expdate = $cgi->param('expiry_date'); >+ my $expdate; >+ if ( C4::Context->preference('ReserveExpiration') and $cgi->param('expiry_date') ) { >+ $expdate = $cgi->param('expiry_date'); >+ } > > # Add the reserve > my $priority = C4::Reserves::CalculatePriority($biblionumber); >diff --git a/C4/Reserves.pm b/C4/Reserves.pm >index 6ff7149edc..d720b434f9 100644 >--- a/C4/Reserves.pm >+++ b/C4/Reserves.pm >@@ -186,7 +186,7 @@ sub AddReserve { > my $biblionumber = $params->{biblionumber}; > my $priority = $params->{priority}; > my $resdate = $params->{reservation_date}; >- my $patron_expiration_date = $params->{expiration_date}; >+ my $patron_expiration_date = C4::Context->preference('ReserveExpiration') ? $params->{expiration_date} : undef; > my $notes = $params->{notes}; > my $title = $params->{title}; > my $checkitem = $params->{itemnumber}; >@@ -2171,7 +2171,7 @@ sub RevertWaitingStatus { > priority => 1, > found => undef, > waitingdate => undef, >- expirationdate => $hold->patron_expiration_date, >+ expirationdate => undef, > itemnumber => $hold->item_level_hold ? $hold->itemnumber : undef, > } > )->store(); >diff --git a/Koha/Club/Hold.pm b/Koha/Club/Hold.pm >index 9c1bbc7a70..dbfd500de1 100644 >--- a/Koha/Club/Hold.pm >+++ b/Koha/Club/Hold.pm >@@ -125,7 +125,7 @@ sub add { > borrowernumber => $patron_id, > biblionumber => $params->{biblio_id}, > priority => $priority, >- expiration_date => $params->{expiration_date}, >+ expiration_date => C4::Context->preference('ReserveExpiration') ? $params->{expiration_date} : undef, > notes => $params->{notes}, > title => $biblio->title, > itemnumber => $params->{item_id}, >diff --git a/Koha/Hold.pm b/Koha/Hold.pm >index a5a9d03003..4ce50bc58b 100644 >--- a/Koha/Hold.pm >+++ b/Koha/Hold.pm >@@ -228,10 +228,14 @@ sub set_waiting { > desk_id => $desk_id, > }; > >+ my $new_expiration_date; >+ >+ if ( C4::Context->preference('ReserveExpiration') ) { >+ > my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); > my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); > >- my $new_expiration_date = $today->clone->add(days => $max_pickup_delay); >+ $new_expiration_date = $today->clone->add(days => $max_pickup_delay); > > if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) { > my $itemtype = $self->item ? $self->item->effective_itemtype : $self->biblio->itemtype; >@@ -243,25 +247,31 @@ sub set_waiting { > } > ); > my $calendar = Koha::Calendar->new( branchcode => $self->branchcode, days_mode => $daysmode ); >- > $new_expiration_date = $calendar->days_forward( dt_from_string(), $max_pickup_delay ); > } > >- # If patron's requested expiration date is prior to the >- # calculated one, we keep the patron's one. >- if ( $self->patron_expiration_date ) { >- my $requested_expiration = dt_from_string( $self->patron_expiration_date ); >- >- my $cmp = >- $requested_expiration >- ? DateTime->compare( $requested_expiration, $new_expiration_date ) >- : 0; >- >- $new_expiration_date = >- $cmp == -1 ? $requested_expiration : $new_expiration_date; >+ if ( C4::Context->preference('ExpireReservesMaxPickUpDelay') ) { >+ # If patron's requested expiration date is prior to the >+ # calculated one, we keep the patron's one. >+ if ( $self->patron_expiration_date ) { >+ my $requested_expiration = dt_from_string( $self->patron_expiration_date ); >+ >+ my $cmp = >+ $requested_expiration >+ ? DateTime->compare( $requested_expiration, $new_expiration_date ) >+ : 0; >+ >+ $new_expiration_date = >+ $cmp == -1 ? $requested_expiration : $new_expiration_date; >+ } >+ } else { >+ # if holds don't need a waiting expiration date to be expired automatically, don't set one >+ $new_expiration_date = undef; > } > >- $values->{expirationdate} = $new_expiration_date->ymd; >+ } # ReserveExpiration >+ >+ $values->{expirationdate} = $new_expiration_date ? $new_expiration_date->ymd : undef; > > $self->set($values)->store(); > >diff --git a/Koha/REST/V1/Clubs/Holds.pm b/Koha/REST/V1/Clubs/Holds.pm >index 7af5602a81..386ac71b0f 100644 >--- a/Koha/REST/V1/Clubs/Holds.pm >+++ b/Koha/REST/V1/Clubs/Holds.pm >@@ -53,7 +53,7 @@ sub add { > my $pickup_library_id = $body->{pickup_library_id}; > my $item_id = $body->{item_id}; > my $item_type = $body->{item_type}; >- my $expiration_date = $body->{expiration_date}; >+ my $expiration_date = C4::Context->preference('ReserveExpiration') ? $body->{expiration_date} : undef; > my $notes = $body->{notes}; > my $default_patron_home = $body->{default_patron_home}; > >diff --git a/Koha/REST/V1/Holds.pm b/Koha/REST/V1/Holds.pm >index afd62badca..d1b91a7d22 100644 >--- a/Koha/REST/V1/Holds.pm >+++ b/Koha/REST/V1/Holds.pm >@@ -75,7 +75,7 @@ sub add { > my $item_id = $body->{item_id}; > my $patron_id = $body->{patron_id}; > my $item_type = $body->{item_type}; >- my $expiration_date = $body->{expiration_date}; >+ my $expiration_date = C4::Context->preference('ReserveExpiration') ? $body->{expiration_date} : undef; > my $notes = $body->{notes}; > my $hold_date = $body->{hold_date}; > my $non_priority = $body->{non_priority}; >diff --git a/circ/waitingreserves.pl b/circ/waitingreserves.pl >index 2e56c5e86f..3466250709 100755 >--- a/circ/waitingreserves.pl >+++ b/circ/waitingreserves.pl >@@ -100,9 +100,9 @@ while ( my $hold = $holds->next ) { > next unless $hold->waitingdate; > > my ( $expire_year, $expire_month, $expire_day ) = split (/-/, $hold->expirationdate); >- my $calcDate = Date_to_Days( $expire_year, $expire_month, $expire_day ); >+ my $calcDate = Date_to_Days( $expire_year, $expire_month, $expire_day ) if $hold->expirationdate; > >- if ($today > $calcDate) { >+ if ($calcDate and $today > $calcDate) { > if ($cancelall) { > my $res = cancel( $hold->item->itemnumber, $hold->borrowernumber, $hold->item->holdingbranch, $hold->item->homebranch, !$transfer_when_cancel_all ); > push @cancel_result, $res if $res; >diff --git a/installer/data/mysql/atomicupdate/bug24194-add-ReserveExpiration-syspref.pl b/installer/data/mysql/atomicupdate/bug24194-add-ReserveExpiration-syspref.pl >new file mode 100644 >index 0000000000..82668b44ae >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug24194-add-ReserveExpiration-syspref.pl >@@ -0,0 +1,12 @@ >+use Modern::Perl; >+ >+return { >+ bug_number => "24194", >+ description => "Add new system preference ReserveExpiration", >+ up => sub { >+ my ($args) = @_; >+ my ($dbh, $out) = @$args{qw(dbh out)}; >+ >+ $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ("ReserveExpiration", 1, NULL, "Enable the use of expiration date in holds module.", "YesNo") }); >+ }, >+}; >diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql >index beebd27a6f..160876d7a4 100644 >--- a/installer/data/mysql/mandatory/sysprefs.sql >+++ b/installer/data/mysql/mandatory/sysprefs.sql >@@ -606,6 +606,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('RequireChoosingExistingAuthority','0',NULL,'Require existing authority selection in controlled fields during cataloging.','YesNo'), > ('RequirePaymentType','0','','Require staff to select a payment type when a payment is made','YesNo'), > ('RequireStrongPassword','1','','Require a strong login password for staff and patrons','YesNo'), >+('ReserveExpiration', 1, NULL, 'Enable the use of expiration date in holds module.', 'YesNo'), > ('ReservesControlBranch','PatronLibrary','ItemHomeLibrary|PatronLibrary','Branch checked for members reservations rights','Choice'), > ('ReservesMaxPickUpDelay','7','','Define the Maximum delay to pick up an item on hold','Integer'), > ('ReservesNeedReturns','1','','If ON, a hold placed on an item available in this library must be checked-in, otherwise, a hold on a specific item, that is in the library & available is considered available','YesNo'), >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >index d5b9a67a4f..ed1ea2684c 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >@@ -12,7 +12,9 @@ > <th>Patron</th> > <th>Notes</th> > <th>Date</th> >- <th>Expiration</th> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <th>Expiration</th> >+ [% END %] > <th>Pickup library</th> > <th>Details</th> > [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %] >@@ -124,9 +126,11 @@ > [% hold.date | $KohaDates %] > [% END %] > </td> >+ [% IF Koha.Preference('ReserveExpiration') %] > <td> > <input type="text" class="flatpickr" data-flatpickr-futuredate="true" value="[% hold.expirationdate | html %]" size="10" name="expirationdate" /> > </td> >+ [% END %] > <td> > [%- IF ( hold.found ) -%] > <input type="hidden" name="pickup" value="[% hold.wbrcode | html %]" /> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc >index d4007b3b7c..ab617e9bb6 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc >@@ -10,7 +10,9 @@ > [% IF table_name == 'holdscr' %] > <th>Date cancellation requested</th> > [% END %] >+ [% IF Koha.Preference('ReserveExpiration') %] > <th>Expiration date</th> >+ [% END %] > <th class="anti-the">Title</th> > <th>Patron</th> > <th>Home library</th> >@@ -35,7 +37,9 @@ > [% END %] > </td> > [% END %] >+ [% IF Koha.Preference('ReserveExpiration') %] > <td><span data-order="[% reserveloo.expirationdate | html %]">[% reserveloo.expirationdate | $KohaDates %]</span></td> >+ [% END %] > <td> > [% INCLUDE 'biblio-title.inc' biblio=reserveloo.biblio link = 1 %] > [% UNLESS ( item_level_itypes ) %] >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 e025fc6e9d..c8a5b39514 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 >@@ -766,13 +766,13 @@ Circulation: > - Mark a hold as problematic if it has been waiting for more than > - pref: ReservesMaxPickUpDelay > class: integer >- - days. >+ - 'days.<br><strong>NOTE:</strong> If <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReserveExpiration">ReserveExpiration</a> is disabled, holds marked as problematic must be dealt with manually as they will never automatically expire.' > - > - pref: ExpireReservesMaxPickUpDelay > choices: > 1: Allow > 0: "Don't allow" >- - 'holds to expire automatically if they have not been picked by within the time period specified in the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReservesMaxPickUpDelay">ReservesMaxPickUpDelay</a> system preference.</br>' >+ - 'holds to expire automatically if they have not been picked by within the time period specified in the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReservesMaxPickUpDelay">ReservesMaxPickUpDelay</a> system preference.<br><strong>NOTE:</strong> This system preference requires the <code>misc/cronjobs/holds/cancel_expired_holds.pl</code> cronjob. Ask your system administrator to schedule it.<br><strong>NOTE:</strong> This will not apply if <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReserveExpiration">ReserveExpiration</a> is disabled.<br>' > - pref: ExpireReservesAutoFill > choices: > 1: "Do" >@@ -787,7 +787,7 @@ Circulation: > - If using <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ExpireReservesMaxPickUpDelay">ExpireReservesMaxPickUpDelay</a>, charge a patron who allows their waiting hold to expire a fee of > - pref: ExpireReservesMaxPickUpDelayCharge > class: currency >- - "." >+ - '.<br><strong>NOTE:</strong> This will not apply if <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReserveExpiration">ReserveExpiration</a> is disabled.' > - > - Satisfy holds using items from the libraries > - pref: StaticHoldsQueueWeight >@@ -877,7 +877,7 @@ Circulation: > choices: > 1: allow > 0: "don't allow" >- - expired holds to be canceled on days the library is closed per the calendar. >+ - 'expired holds to be canceled on days the library is closed per the calendar.<br><strong>NOTE:</strong> This will not apply if <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReserveExpiration">ReserveExpiration</a> is disabled.' > - > - pref: ExcludeHolidaysFromMaxPickUpDelay > choices: >@@ -1006,6 +1006,12 @@ Circulation: > 1: block > 0: allow > - renewing of items from the staff interface and via the <code>misc/cronjobs/automatic_renewals.pl</code> cronjob. >+ - >+ - pref: ReserveExpiration >+ choices: >+ 1: Enable >+ 0: "Disable" >+ - the use of expiration dates in holds. When enabled, patrons can specify a date when their hold is not needed, any hold awaiting pickup will automatically expire after it has been waiting for a problematic number of days, and expiration dates will show on both the OPAC and staff interface. > Interlibrary loans: > - > - pref: ILLModule >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 50614e7b23..1ed977e03e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >@@ -1055,6 +1055,7 @@ > relatives_borrowernumbers.push("[% b | html %]"); > [% END %] > var SuspendHoldsIntranet = [% ( Koha.Preference('SuspendHoldsIntranet') ) ? 1 : 0 | html %]; >+ var ReserveExpiration = [% ( Koha.Preference('ReserveExpiration') ) ? 1 : 0 | html %]; > </script> > [% Asset.js("js/pages/circulation.js") | $raw %] > [% Asset.js("js/checkouts.js") | $raw %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/holdshistory.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/holdshistory.tt >index ce521036d1..847ceccdc3 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/holdshistory.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/holdshistory.tt >@@ -139,12 +139,23 @@ > [% INCLUDE 'str/members-menu.inc' %] > [% Asset.js("js/members-menu.js") | $raw %] > <script> >+ var ReserveExpiration = [% ( Koha.Preference('ReserveExpiration') ) ? 1 : 0 | html %]; >+ var show_itemtype_column = [% ( show_itemtype_column ) ? 1 : 0 | html %]; >+ var table_settings = [% TablesSettings.GetTableSettings('members', 'holdshistory', 'holdshistory-table', 'json') | $raw %]; > $(document).ready(function() { >- var table_settings = [% TablesSettings.GetTableSettings('members', 'holdshistory', 'holdshistory-table', 'json') | $raw %]; >- [% UNLESS show_itemtype_column %] >- //Remove item type column settings >- table_settings['columns'] = table_settings['columns'].filter(function(c){return c['columnname'] != 'itemtype';}); >- [% END %] >+ table_settings['columns'].forEach(function(thisCol) { >+ if( show_itemtype_column == 0 && thisCol.columnname == "itemtype" ){ >+ thisCol.cannot_be_modified = 1; >+ thisCol.cannot_be_toggled = 1; >+ thisCol.is_hidden = 1; >+ } >+ if( ReserveExpiration == 0 && thisCol.columnname == "expirationdate" ){ >+ thisCol.cannot_be_modified = 1; >+ thisCol.cannot_be_toggled = 1; >+ thisCol.is_hidden = 1; >+ } >+ }); >+ > var table = KohaTable("table_holdshistory", { > "sPaginationType": "full", > "aaSorting": [[4, 'desc']] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember-print.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember-print.tt >index 3a606e06bb..8d7585f197 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember-print.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember-print.tt >@@ -115,7 +115,9 @@ > <th>Title</th> > <th>Author</th> > <th>Placed on</th> >- <th>Expires on</th> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <th>Expires on</th> >+ [% END %] > <th>Pick up location</th> > </tr> > </thead> >@@ -125,7 +127,9 @@ > <td>[% reserve.title | html %]</td> > <td>[% reserve.author | html %]</td> > <td>[% reserve.reservedate | $KohaDates %]</td> >- <td>[% reserve.expirationdate | $KohaDates %]</td> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <td>[% reserve.expirationdate | $KohaDates %]</td> >+ [% END %] > <td>[% reserve.waiting_at | html %]</td> > </tr> > [% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt >index ef0a906c90..c2e2ae8752 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt >@@ -876,6 +876,7 @@ > relatives_borrowernumbers.push("[% b | html %]"); > [% END %] > var SuspendHoldsIntranet = [% ( Koha.Preference('SuspendHoldsIntranet') ) ? 1 : 0 | html %]; >+ var ReserveExpiration = [% ( Koha.Preference('ReserveExpiration') ) ? 1 : 0 | html %]; > </script> > [% Asset.js("js/pages/circulation.js") | $raw %] > [% Asset.js("js/checkouts.js") | $raw %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >index e2d33c5415..8ddb62f366 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >@@ -591,10 +591,12 @@ > </li> > [% END %] > >- <li> >- <label for="to">Hold expires on date:</label> >- <input id="expiration_date" name="expiration_date" id="to" size="10" type="text" class="flatpickr" data-flatpickr-futuredate="true" /> >- </li> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <li> >+ <label for="to">Hold expires on date:</label> >+ <input id="expiration_date" name="expiration_date" id="to" size="10" type="text" class="flatpickr" data-flatpickr-futuredate="true" /> >+ </li> >+ [% END %] > > [% UNLESS ( multi_hold ) %] > <li> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/holds.js b/koha-tmpl/intranet-tmpl/prog/js/holds.js >index 0b223bf302..6cb5aea556 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/holds.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/holds.js >@@ -223,7 +223,10 @@ $(document).ready(function() { > else { return oObj.branchcode.escapeHtml() || ""; } > } > }, >- { "data": { _: "expirationdate_formatted", "sort": "expirationdate" } }, >+ { >+ "visible": ReserveExpiration, >+ "data": { _: "expirationdate_formatted", "sort": "expirationdate" } >+ }, > { > "mDataProp": function( oObj ) { > if ( oObj.priority && parseInt( oObj.priority ) && parseInt( oObj.priority ) > 0 ) { >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/holds-table.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/holds-table.inc >index 973332fd29..d7d92488bb 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/holds-table.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/holds-table.inc >@@ -16,7 +16,9 @@ > [% ELSE %] > <th class="psort">Placed on</th> > [% END %] >- <th>Expires on</th> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <th>Expires on</th> >+ [% END %] > [% UNLESS( singleBranchMode) %] > <th>Pickup location</th> > [% END %] >@@ -68,20 +70,22 @@ > [% HOLD.reservedate | $KohaDates %] > </span> > </td> >- [% IF ! HOLD.found %] >- <td class="expirationdate" data-order="[% HOLD.expirationdate | html %]"> >- [% IF ( HOLD.expirationdate ) %] >- <span class="tdlabel">Expiration:</span> >- [% HOLD.expirationdate | $KohaDates %] >- [% ELSE %] >- <span class="tdlabel">Expiration:</span> >- Never expires >- [% END %] >- [% ELSE %] >- <td class="expirationdate" data-order="0000-00-00"> >- - >+ [% IF Koha.Preference('ReserveExpiration') %] >+ [% IF ! HOLD.found %] >+ <td class="expirationdate" data-order="[% HOLD.expirationdate | html %]"> >+ [% IF ( HOLD.expirationdate ) %] >+ <span class="tdlabel">Expiration:</span> >+ [% HOLD.expirationdate | $KohaDates %] >+ [% ELSE %] >+ <span class="tdlabel">Expiration:</span> >+ Never expires >+ [% END %] >+ [% ELSE %] >+ <td class="expirationdate" data-order="0000-00-00"> >+ - >+ [% END %] >+ </td> > [% END %] >- </td> > [% UNLESS( singleBranchMode) %] > <td class="branch"> > <span class="tdlabel">Pickup location:</span> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-holdshistory.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-holdshistory.tt >index 8171142628..576d7b556d 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-holdshistory.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-holdshistory.tt >@@ -106,7 +106,9 @@ > <th>Barcode</th> > <th>Library</th> > <th>Hold date</th> >- <th>Expiration date</th> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <th>Expiration date</th> >+ [% END %] > <th>Waiting date</th> > <th>Cancellation date</th> > [% IF show_itemtype_column %] >@@ -123,11 +125,13 @@ > <td>[% hold.item.barcode | html %]</td> > <td>[% Branches.GetName( hold.branchcode ) | html %]</td> > <td data-order="[% hold.reservedate | html %]">[% hold.reservedate | $KohaDates %]</td> >- <td data-order="[% hold.expirationdate | html %]"> >- [% IF hold.expirationdate %] >- [% hold.expirationdate | $KohaDates %] >- [% END %] >- </td> >+ [% IF Koha.Preference('ReserveExpiration') %] >+ <td data-order="[% hold.expirationdate | html %]"> >+ [% IF hold.expirationdate %] >+ [% hold.expirationdate | $KohaDates %] >+ [% END %] >+ </td> >+ [% END %] > <td data-order="[% hold.waitingdate | html %]"> > [% IF hold.waitingdate %] > [% hold.waitingdate | $KohaDates %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >index 61ae289193..e2a4c76a41 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >@@ -296,11 +296,13 @@ > </li> > [% END %] > >+ [% IF Koha.Preference('ReserveExpiration') %] > <li> > <label for="to[% bibitemloo.biblionumber | html %]">Hold not needed after:</label> > <input type="text" name="expiration_date_[% bibitemloo.biblionumber | html %]" id="to[% bibitemloo.biblionumber | html %]" size="10" class="flatpickr futuredate" /> > <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber | html %]">[% INCLUDE 'date-format.inc' %]</span> > </li> >+ [% END %] > > [% IF Koha.Preference('AllowHoldItemTypeSelection') %] > <li> >diff --git a/misc/cronjobs/holds/cancel_expired_holds.pl b/misc/cronjobs/holds/cancel_expired_holds.pl >index 5d7de4cbee..bb316fe005 100755 >--- a/misc/cronjobs/holds/cancel_expired_holds.pl >+++ b/misc/cronjobs/holds/cancel_expired_holds.pl >@@ -75,6 +75,8 @@ pod2usage(1) if $help; > > cronlogaction({ info => $command_line_options }); > >-C4::Reserves::CancelExpiredReserves($reason); >+if ( C4::Context->preference('ReserveExpiration') ) { >+ C4::Reserves::CancelExpiredReserves($reason); >+} > > cronlogaction({ action => 'End', info => "COMPLETED" }); >diff --git a/t/db_dependent/Hold.t b/t/db_dependent/Hold.t >index 73007c18a0..69c9f62d1a 100755 >--- a/t/db_dependent/Hold.t >+++ b/t/db_dependent/Hold.t >@@ -29,7 +29,7 @@ use Koha::Item; > use Koha::DateUtils qw( dt_from_string ); > use t::lib::TestBuilder; > >-use Test::More tests => 35; >+use Test::More tests => 36; > use Test::Exception; > use Test::Warn; > >@@ -386,3 +386,38 @@ subtest 'suspend() tests' => sub { > > $schema->storage->txn_rollback; > }; >+ >+subtest 'ReserveExpiration syspref tests' => sub { >+ >+ plan tests => 2; >+ >+ $schema->storage->txn_begin; >+ t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelay', 1 ); >+ >+ # Disable expiration date for reserves >+ t::lib::Mocks::mock_preference( 'ReserveExpiration', 0 ); >+ >+ my $expirationdate = dt_from_string->add( days => 1 ); >+ my $hold = $builder->build_object( >+ { class => 'Koha::Holds', >+ value => { patron_expiration_date => $expirationdate } >+ } >+ ); >+ $hold->set_waiting; >+ >+ is( $hold->expirationdate, undef, "No expiration date should be set with reserve expiration disabled" ); >+ >+ # Re-enable expiration date for reserves >+ t::lib::Mocks::mock_preference( 'ReserveExpiration', 1 ); >+ >+ $hold = $builder->build_object( >+ { class => 'Koha::Holds', >+ value => { patron_expiration_date => $expirationdate } >+ } >+ ); >+ $hold->set_waiting(); >+ >+ is( $hold->expirationdate, $expirationdate->ymd, "Expiration date is set as expected" ); >+ >+ $schema->storage->txn_rollback; >+}; >diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t >index 9c8c85d473..413447f754 100755 >--- a/t/db_dependent/Reserves.t >+++ b/t/db_dependent/Reserves.t >@@ -17,7 +17,7 @@ > > use Modern::Perl; > >-use Test::More tests => 77; >+use Test::More tests => 78; > use Test::MockModule; > use Test::Warn; > >@@ -1406,6 +1406,40 @@ subtest 'ModReserveAffect logging' => sub { > like( $log->info, qr{$expected}, 'Timestamp logged is the current one' ); > }; > >+subtest 'ReserveExpiration syspref tests' => sub { >+ >+ plan tests => 2; >+ >+ t::lib::Mocks::mock_preference( 'ReserveExpiration', 1 ); >+ >+ my $expirationdate = dt_from_string->add( days => 1 ); >+ my $hold = $builder->build_object( >+ { class => 'Koha::Holds', >+ value => { expirationdate => $expirationdate } >+ } >+ ); >+ >+ # Disable expiration date for reserves >+ t::lib::Mocks::mock_preference( 'ReserveExpiration', 0 ); >+ >+ my $reverted = C4::Reserves::RevertWaitingStatus({ itemnumber => $hold->itemnumber }); >+ >+ is( $reverted->expirationdate, undef, "Expiration date should be removed with reserve expiration disabled" ); >+ >+ # Re-enable expiration date for reserves >+ t::lib::Mocks::mock_preference( 'ReserveExpiration', 1 ); >+ >+ $hold = $builder->build_object( >+ { class => 'Koha::Holds', >+ value => { expirationdate => $expirationdate } >+ } >+ ); >+ >+ $reverted = C4::Reserves::RevertWaitingStatus({ itemnumber => $hold->itemnumber }); >+ >+ is( $reverted->expirationdate, undef, "Expiration date is still removed because we can't reset to the original expiration date" ); >+}; >+ > sub count_hold_print_messages { > my $message_count = $dbh->selectall_arrayref(q{ > SELECT COUNT(*) >-- >2.30.2
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 24194
:
96120
|
96121
|
98048
|
98368
|
100927
|
110082
|
110127
|
111443
|
113284
|
113285
|
116626
|
116627
|
117016
|
117085
|
117089
|
117097
|
117098
|
117099
|
117100
|
117101
|
118258
|
118259
|
118260
|
118261
|
118262
|
118263
|
128301
|
128302
|
128303
|
128304
|
128305
|
128306
|
128307
|
128308
|
140646
|
140647
|
144076
|
147527
|
147528
|
150799
|
150800
|
159060
|
159061
|
167796
|
167797
|
169174
|
174650
|
174651
|
174652