From 99a8e7e3aa63df8994c78c02b3866522f7a3bf84 Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Thu, 26 Mar 2020 17:13:15 +0000 Subject: [PATCH] Bug 20844: (follow-up) SendLostHoldNotices This patch adds a new syspref SendLostHoldNotices Test: 1) Update database and restart memcached 2) Enable the SendLostHoldNotices system preference 3) Place a hold on an item 4) Check in the item and set the hold to waiting 5) Go to edit the item and set an item lost status 6) Check the borrower's notices and confirm the notice has been enqueued 7) Confirm the notice is not sent twice when reverting or cancelling the hold 8) Confirm notice enqueues as expected for a bib-level hold Sponsored-by: Catalyst IT --- C4/Circulation.pm | 15 +++++++++++++++ catalogue/updateitem.pl | 2 ++ .../bug_20844-add_LOST_WAITING_HOLD_notice.perl | 6 ++++++ .../bug_20844-add_SendLostHoldNotices_syspref.perl | 6 ++++++ .../data/mysql/en/mandatory/sample_notices.yml | 19 +++++++++++++++++++ .../en/modules/admin/preferences/circulation.pref | 6 ++++++ t/db_dependent/Reserves.t | 22 ++++++++++++++++++++-- 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_20844-add_LOST_WAITING_HOLD_notice.perl create mode 100644 installer/data/mysql/atomicupdate/bug_20844-add_SendLostHoldNotices_syspref.perl diff --git a/C4/Circulation.pm b/C4/Circulation.pm index fa3fd4fb5a..3c7fb52e30 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -3949,6 +3949,21 @@ sub LostItem{ $hold = C4::Reserves::RevertWaitingStatus({ itemnumber => $itemnumber }); } } + + # SendLostHoldNotices + my $item = Koha::Items->find( $itemnumber ); + if ( C4::Context->preference('SendLostHoldNotices') && defined $hold && $item->itemlost ){ + my $letter = C4::Letters::GetPreparedLetter( + module => 'reserves', + letter_code => 'LOST_WAITING_HOLD', + branchcode => $hold->branchcode, + tables => { + borrowers => $hold->borrowernumber, + branches => $hold->branchcode, + }, + ); + C4::Message->enqueue($letter, $hold->borrower->unblessed, 'email'); + } } sub GetOfflineOperations { diff --git a/catalogue/updateitem.pl b/catalogue/updateitem.pl index 265653915e..0d1b3f0eec 100755 --- a/catalogue/updateitem.pl +++ b/catalogue/updateitem.pl @@ -47,6 +47,8 @@ if ( defined $cancelhold ){ } elsif ( defined $reverthold ){ $cancelhold = 0; LostItem($itemnumber, 'moredetail', 0, { cancel_reserve => $cancelhold }); +} else { + $cancelhold = undef; } if ( defined $redirecturl ){ print $cgi->redirect( $redirecturl . $biblionumber ); diff --git a/installer/data/mysql/atomicupdate/bug_20844-add_LOST_WAITING_HOLD_notice.perl b/installer/data/mysql/atomicupdate/bug_20844-add_LOST_WAITING_HOLD_notice.perl new file mode 100644 index 0000000000..4dc14f9606 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_20844-add_LOST_WAITING_HOLD_notice.perl @@ -0,0 +1,6 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + $dbh->do(q{INSERT IGNORE INTO letter (module, code, branchcode, name, is_html, title, message_transport_type, content) VALUES ('reserves','LOST_WAITING_HOLD','','Waiting hold marked lost','0','Your waiting hold has been marked lost','email',"Dear [% borrower.firstname %] [% borrowers.surname %],

Your hold awaiting pickup is no longer available. The item is lost.

Please contact the library for more information.

Thank you,

[% branch.branchname %]") }); + + NewVersion( $DBversion, 20844, "Add LOST_WAITING_HOLD notice"); +} diff --git a/installer/data/mysql/atomicupdate/bug_20844-add_SendLostHoldNotices_syspref.perl b/installer/data/mysql/atomicupdate/bug_20844-add_SendLostHoldNotices_syspref.perl new file mode 100644 index 0000000000..46b5f69da4 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_20844-add_SendLostHoldNotices_syspref.perl @@ -0,0 +1,6 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('SendLostHoldNotices', '0', NULL, 'Send a notice to a borrower if their reserved and waiting item is marked as lost', 'YesNo') }); + + NewVersion( $DBversion, 20844, "Add SendLostHoldNotices system preference"); +} diff --git a/installer/data/mysql/en/mandatory/sample_notices.yml b/installer/data/mysql/en/mandatory/sample_notices.yml index 95852015f5..146e764c2d 100644 --- a/installer/data/mysql/en/mandatory/sample_notices.yml +++ b/installer/data/mysql/en/mandatory/sample_notices.yml @@ -1745,3 +1745,22 @@ tables: - "

This is to confirm that someone enabled two factor authentication on your account.

" - "

If you did not do this, someone else may be using your account. Please contact technical support.

" - "

Your library

" + + - module: reserves + code: LOST_WAITING_HOLD + branchcode: "" + name: "Waiting hold marked lost" + is_html: 0 + title: "Your waiting hold has been marked lost" + message_transport_type: email + lang: default + content: + - "Dear [% borrower.firstname %] [% borrowers.surname %]," + - "" + - "Your hold awaiting pickup is no longer available. The item is lost." + - "" + - "Please contact the library for more information." + - "" + - "Thank you," + - "" + - "[% branch.branchname %]" 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 87ed4b7bd6..c7529ab241 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 @@ -668,6 +668,12 @@ Circulation: no: "Don't revert" - waiting status of a hold if the allocated item is marked as Lost. - + - pref: SendLostHoldNotices + choices: + yes: Send + no: "Don't send" + - a notice to a borrower if their reserved and waiting item is marked as Lost. + - - In the staff client, split the holds queue into separate tables by - pref: HoldsSplitQueue choices: diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t index b7efa2bebb..ae6d163d73 100755 --- a/t/db_dependent/Reserves.t +++ b/t/db_dependent/Reserves.t @@ -1410,13 +1410,14 @@ subtest 'ModReserveAffect logging' => sub { subtest 'Waiting item is marked as lost' => sub { - plan tests => 15; + plan tests => 17; # Set up data my $biblio = $builder->build_sample_biblio(); my $item = $builder->build_sample_item({ biblionumber => $biblio->biblionumber }); my $patron = $builder->build_object({ class => 'Koha::Patrons' }); - + t::lib::Mocks::mock_preference( 'SendLostHoldNotices', 0 ); + $dbh->do(q|DELETE FROM message_queue|); ## TEST 1: BIBLIO-LEVEL HOLD # place biblio-level hold @@ -1427,6 +1428,8 @@ subtest 'Waiting item is marked as lost' => sub { }); my $hold = Koha::Holds->find( $reserve_id ); + $dbh->do(q{INSERT IGNORE INTO letter (module, code, branchcode, name, is_html, title, message_transport_type, content) VALUES ('reserves','LOST_WAITING_HOLD','','Waiting hold marked lost','0','Your waiting hold has been marked lost','email',"Dear [% borrower.firstname %] [% borrowers.surname %],

Your hold awaiting pickup is no longer available. The item is lost.

Please contact the library for more information.

Thank you,

[% branch.branchname %]") }); + is( $hold->item_level_hold, 0, 'Biblio-level hold placed' ); # set hold as waiting and assign item @@ -1494,7 +1497,15 @@ subtest 'Waiting item is marked as lost' => sub { $hold->cancel; $item->itemlost( 0 ); + my $message_count = $dbh->selectall_arrayref(q{ + SELECT COUNT(*) + FROM message_queue + WHERE letter_code = 'LOST_WAITING_HOLD' + }); + is( $message_count->[0]->[0], 0, 'No notices enqueued because SendLostHoldNotices disabled' ); + # TEST 3: ITEM-LEVEL HOLD, CANCEL + t::lib::Mocks::mock_preference( 'SendLostHoldNotices', 1 ); # place item-level hold $reserve_id = AddReserve({ @@ -1528,6 +1539,13 @@ subtest 'Waiting item is marked as lost' => sub { C4::Circulation::LostItem( $item->itemnumber, 'test', 0, { cancel_reserve => 1 }); $hold = Koha::Holds->find( $reserve_id ); is( Koha::Holds->find( $reserve_id ), undef, 'Hold has been cancelled with RevertLostBibLevelHolds enabled' ); + + $message_count = $dbh->selectall_arrayref(q{ + SELECT COUNT(*) + FROM message_queue + WHERE letter_code = 'LOST_WAITING_HOLD' + }); + is( $message_count->[0]->[0], 2, 'LOST_WAITING_HOLD notice enqueued with each call to LostItem' ); }; sub count_hold_print_messages { -- 2.11.0