From 05311ad482d39da57e8146e8ee342b041f9bb1eb 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 +++++++++++++++++++
.../mysql/fr-CA/obligatoire/sample_notices.sql | 4 +++-
.../mysql/fr-FR/1-Obligatoire/sample_notices.sql | 4 +++-
installer/data/mysql/it-IT/necessari/notices.sql | 4 +++-
.../mysql/nb-NO/1-Obligatorisk/sample_notices.sql | 4 +++-
.../data/mysql/pl-PL/mandatory/sample_notices.sql | 4 +++-
.../data/mysql/ru-RU/mandatory/sample_notices.sql | 4 +++-
.../data/mysql/uk-UA/mandatory/sample_notices.sql | 4 +++-
.../en/modules/admin/preferences/circulation.pref | 6 ++++++
t/db_dependent/Reserves.t | 22 ++++++++++++++++++++--
14 files changed, 95 insertions(+), 9 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 025fa80cbd..a62253415b 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -3936,6 +3936,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 de712ae2c7..79e430b454 100755
--- a/catalogue/updateitem.pl
+++ b/catalogue/updateitem.pl
@@ -49,6 +49,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 e58c0075af..8355d2e454 100644
--- a/installer/data/mysql/en/mandatory/sample_notices.yml
+++ b/installer/data/mysql/en/mandatory/sample_notices.yml
@@ -1478,3 +1478,22 @@ tables:
- "Barcode: [% item.barcode %]
"
- "
"
- "[% END %]"
+
+ - 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/installer/data/mysql/fr-CA/obligatoire/sample_notices.sql b/installer/data/mysql/fr-CA/obligatoire/sample_notices.sql
index 2317e98575..6b36538a7d 100644
--- a/installer/data/mysql/fr-CA/obligatoire/sample_notices.sql
+++ b/installer/data/mysql/fr-CA/obligatoire/sample_notices.sql
@@ -36,7 +36,9 @@ Checked in items for [% borrower.title %] [% borrower.firstname %] [% borrower.i
[% item.biblio.title %]
Barcode: [% item.barcode %]
-[% END %]", 'print');
+[% END %]", 'print'),
+('reserves','LOST_WAITING_HOLD','','Waiting hold marked lost',0,'Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','Nouvelle suggestion','Nouvelle suggestion','Suggestion en attente
diff --git a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql b/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql
index 7bc86d3ec2..ece6c24571 100644
--- a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql
+++ b/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql
@@ -23,7 +23,9 @@ VALUES
('suggestions','TO_PROCESS','Avis au propriétaire du poste budgétaire', 'Une suggestion est prête à être traitée','<> <>,\n\nUne nouvelle suggestion est prête à être traitée : <> / <>.\n\nMerci,\n\n<>', 'email'),
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
('members', 'DISCHARGE', 'Quitus', 'Quitus pour <> <>', 'Quitus
\r\n\r\nLa librairie <> certifies que lecteur suivant :\r\n\r\n <> <>\r\n Numéro de carte : <>\r\n\r\na bien retourné tous ses documents.', 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email');
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','Suggestion pendin g approval
diff --git a/installer/data/mysql/it-IT/necessari/notices.sql b/installer/data/mysql/it-IT/necessari/notices.sql
index c2c2a9cfc0..9222f02724 100644
--- a/installer/data/mysql/it-IT/necessari/notices.sql
+++ b/installer/data/mysql/it-IT/necessari/notices.sql
@@ -28,7 +28,9 @@ biblio.title>>\r\n----\r\nGrazie per aver visitaro <>.', 'e
('suggestions','TO_PROCESS','Notifica al proprietario del fondo', 'Un suggeerimento è pronto per essere lavorato','Caro bibliotecario <> <>,\n\n c\'è un nuovo suggerimento pronto per essere lavorato: <> by <>.\n\n Grazie dell\'attenzione,\n\n<>', 'email'),
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
('members', 'DISCHARGE', 'Liberatoria', 'Liberatoria per <> <>', 'Liberatoria
\r\n\r\nLa biblioteca <> certifica che il seguente utente :\r\n\r\n <> <>\r\n Numero tessera : <>\r\n\r\nha restituito tutti i documenti ricevuti.', 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email');
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','Suggestion pendin g approval
diff --git a/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql b/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql
index 19821cb794..996f23c4eb 100644
--- a/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql
+++ b/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql
@@ -43,7 +43,9 @@ VALUES ('circulation','ODUE','Purring','Purring på dokument','<> <>,\n\nA new suggestion is ready to be processed: <> by <>.\n\nThank you,\n\n<>', 'email'),
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
('members', 'DISCHARGE', 'Discharge', 'Discharge for <> <>', 'Discharge
\r\n\r\nThe library <> certifies that the following borrower :\r\n\r\n <> <>\r\n Cardnumber : <>\r\n\r\nreturned all his documents.', 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email');
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','Suggestion pendin g approval
diff --git a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql b/installer/data/mysql/pl-PL/mandatory/sample_notices.sql
index 6a6da3c021..a0fb1a8966 100644
--- a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql
+++ b/installer/data/mysql/pl-PL/mandatory/sample_notices.sql
@@ -22,7 +22,9 @@ VALUES ('circulation','ODUE','Overdue notice','Item overdue','Dear <> <>,\n\nA new suggestion is ready to be processed: <> by <>.\n\nThank you,\n\n<>', 'email'),
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
('members', 'DISCHARGE', 'Discharge', 'Discharge for <> <>', 'Discharge
\r\n\r\nThe library <> certifies that the following borrower :\r\n\r\n <> <>\r\n Cardnumber : <>\r\n\r\nreturned all his documents.', 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email');
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','Suggestion pendin g approval
diff --git a/installer/data/mysql/ru-RU/mandatory/sample_notices.sql b/installer/data/mysql/ru-RU/mandatory/sample_notices.sql
index e9b0006f91..8dbc6f753e 100644
--- a/installer/data/mysql/ru-RU/mandatory/sample_notices.sql
+++ b/installer/data/mysql/ru-RU/mandatory/sample_notices.sql
@@ -21,7 +21,9 @@ VALUES ('circulation','ODUE','Overdue notice','Item overdue','Dear <> <>,\n\nA new suggestion is ready to be processed: <> by <>.\n\nThank you,\n\n<>', 'email'),
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
('members', 'DISCHARGE', 'Discharge', 'Discharge for <> <>', 'Discharge
\r\n\r\nThe library <> certifies that the following borrower :\r\n\r\n <> <>\r\n Cardnumber : <>\r\n\r\nreturned all his documents.', 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email');
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
+;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
VALUES ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','Suggestion pendin g approval
diff --git a/installer/data/mysql/uk-UA/mandatory/sample_notices.sql b/installer/data/mysql/uk-UA/mandatory/sample_notices.sql
index 1c8b70eda7..b5265e05e9 100644
--- a/installer/data/mysql/uk-UA/mandatory/sample_notices.sql
+++ b/installer/data/mysql/uk-UA/mandatory/sample_notices.sql
@@ -85,7 +85,9 @@ INSERT INTO `letter` (module, code, name, title, content, message_transport_type
('suggestions', 'NOTIFY_MANAGER', 'Notify manager of a suggestion', "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email'),
-('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email')
+('members', 'PROBLEM_REPORT','OPAC problem report','OPAC problem report','Username: <>\n\nProblem page: <>\n\nTitle: <>\n\nMessage: <>','email'),
+
+('reserves','LOST_WAITING_HOLD','Waiting hold marked lost','Your waiting hold has been marked lost',"Dear [% borrower.firstname %] [% borrowers.surname %],\n\nYour hold awaiting pickup is no longer available. The item is lost.\n\nPlease contact the library for more information.\n\nThank you,\n\n[% branch.branchname %]",'email')
;
INSERT INTO `letter` (module, code, name, title, content, is_html, message_transport_type)
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 905f0af1f7..41a26b2d70 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
@@ -665,6 +665,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 interface, 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 6cb04254d3..a5d5decaf1 100755
--- a/t/db_dependent/Reserves.t
+++ b/t/db_dependent/Reserves.t
@@ -1220,13 +1220,14 @@ subtest 'MergeHolds' => 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
@@ -1237,6 +1238,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
@@ -1304,7 +1307,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({
@@ -1338,6 +1349,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