From a16cc13075865e24ee58bcecaecdad6885004d04 Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Tue, 15 Mar 2022 06:57:54 +1300 Subject: [PATCH] Bug 30295: Send a notification when a recall is manually cancelled This patch adds a RECALL_MANUAL_CANCEL email and sms notice which will be sent to the requestor when their recall is cancelled. This notice can also be configured using the messaging preferences. To test: 1. Apply the patch, update database, restart services. 2. Ensure UseRecalls system preference is enabled and values have been set in the circulation rules for recalls 3. Log in as a patron (Patron A) to the staff client and view your account details 4. Notice there is now a 'recall cancelled' notice that can be configured under messaging preferences 5. Confirm this notice also shows in the messaging preferences page on the OPAC 6. Select email and sms as a preference for the 'recall cancelled' notice and save. You may need to enable other settings to see the sms options (SMSSendDriver for example) 7. Check out an item to another patron (Patron B) 8. Log into the OPAC as Patron A and place a recall on the checked out item/biblio 9. Go back to the staff client and view the biblio. Go to the recalls tab and cancel the recall. 10. Go to Patron A's accout and view their notices tab 11. Confirm the 'recall cancelled' notice has been generated for both email and sms. Sponsored-by: Toi Ohomai Institute of Technology --- Koha/Recall.pm | 26 ++++++++++++++++- ...-add_RECALL_MANUAL_CANCEL_message_attributes.pl | 12 ++++++++ ...-add_RECALL_MANUAL_CANCEL_message_transports.pl | 12 ++++++++ .../bug_30295-add_RECALL_MANUAL_CANCEL_notice.pl | 24 +++++++++++++++ .../data/mysql/en/mandatory/sample_notices.yml | 34 ++++++++++++++++++++++ .../mysql/fr-FR/1-Obligatoire/sample_notices.sql | 16 +++++++++- .../sample_notices_message_attributes.sql | 3 +- .../sample_notices_message_transports.sql | 4 ++- .../prog/en/includes/messaging-preference-form.inc | 5 ++-- .../bootstrap/en/modules/opac-messaging.tt | 5 ++-- 10 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_attributes.pl create mode 100644 installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_transports.pl create mode 100644 installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_notice.pl diff --git a/Koha/Recall.pm b/Koha/Recall.pm index 638e6bb6472..ba987b02eae 100644 --- a/Koha/Recall.pm +++ b/Koha/Recall.pm @@ -18,7 +18,8 @@ package Koha::Recall; # along with Koha; if not, see . use Modern::Perl; - +use C4::Letters; +use C4::Members::Messaging; use Koha::Database; use Koha::DateUtils qw( dt_from_string ); use Koha::Biblios; @@ -450,6 +451,29 @@ sub set_cancelled { my ( $self ) = @_; $self->update({ status => 'cancelled', old => 1, cancellationdate => dt_from_string }); C4::Log::logaction( 'RECALLS', 'CANCEL', $self->recall_id, "Recall cancelled", 'INTRANET' ) if ( C4::Context->preference('RecallsLog') ); + + # send notice to recaller to pick up item + my $letter = C4::Letters::GetPreparedLetter( + module => 'circulation', + letter_code => 'RECALL_MANUAL_CANCEL', + branchcode => $self->branchcode, + lang => $self->patron->lang, + tables => { + biblio => $self->biblionumber, + borrowers => $self->borrowernumber, + branches => $self->branchcode, + }, + ); + + my $messaging_preferences = C4::Members::Messaging::GetMessagingPreferences({ borrowernumber => $self->borrowernumber, message_name => 'Recall_Cancelled' }); + while ( my ( $transport, $letter_code ) = each %{ $messaging_preferences->{transports} } ) { if ( $transport eq 'email' ){ + C4::Message->enqueue($letter, $self->patron->unblessed, 'email'); + } + if ( $transport eq 'sms' ){ + C4::Message->enqueue($letter, $self->patron->unblessed, 'sms'); + } + } + return $self; } diff --git a/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_attributes.pl b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_attributes.pl new file mode 100644 index 00000000000..d0c2c6cd453 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_attributes.pl @@ -0,0 +1,12 @@ +use Modern::Perl; + +return { + bug_number => "30295", + description => "Adding message attributes for RECALL_MANUAL_CANCEL", + up => sub { + my ($args) = @_; + my ($dbh, $out) = @$args{qw(dbh out)}; + + $dbh->do(q{ INSERT IGNORE INTO message_attributes (message_attribute_id, message_name, takes_days) VALUES (13, 'Recall_Cancelled', 0) }); + }, +}; diff --git a/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_transports.pl b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_transports.pl new file mode 100644 index 00000000000..1c515c72692 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_message_transports.pl @@ -0,0 +1,12 @@ +use Modern::Perl; + +return { + bug_number => "30295", + description => "Adding message transports for RECALL_MANUAL_CANCEL notice", + up => sub { + my ($args) = @_; + my ($dbh, $out) = @$args{qw(dbh out)}; + + $dbh->do(q{ INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code, branchcode) VALUES (13, "email", 0, "circulation", "RECALL_MANUAL_CANCEL", null), (13, "sms", 0, "circulation", "RECALL_MANUAL_CANCEL", null) }); + }, +}; diff --git a/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_notice.pl b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_notice.pl new file mode 100644 index 00000000000..46e0882883e --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_30295-add_RECALL_MANUAL_CANCEL_notice.pl @@ -0,0 +1,24 @@ +use Modern::Perl; + +return { + bug_number => "30295", + description => "Add RECALL_MANUAL_CANCEL email and sms notice", + up => sub { + my ($args) = @_; + my ($dbh, $out) = @$args{qw(dbh out)}; + + $dbh->do(q{ INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`) VALUES ('circulation','RECALL_MANUAL_CANCEL','','Recall has been cancelled','0','Recall has been cancelled','Dear [% borrower.firstname %] [% borrower.surname %], + +We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled. + +Title: [% biblio.title %] +Author: [% biblio.author %] +Location: [% branch.branchname %]','sms'), ('circulation','RECALL_MANUAL_CANCEL','','Recall has been cancelled','0','Recall has been cancelled','Dear [% borrower.firstname %] [% borrower.surname %], + +We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled. + +Title: [% biblio.title %] +Author: [% biblio.author %] +Location: [% branch.branchname %]','email') }); + }, +}; diff --git a/installer/data/mysql/en/mandatory/sample_notices.yml b/installer/data/mysql/en/mandatory/sample_notices.yml index 1fc886f1a7d..0f2b0514f2c 100644 --- a/installer/data/mysql/en/mandatory/sample_notices.yml +++ b/installer/data/mysql/en/mandatory/sample_notices.yml @@ -1668,3 +1668,37 @@ tables: - "A recall that you requested on the following item: <> / <> (<>) is now ready for you to pick up at <>. Please pick up your item by <>." - "" - "Thank you!" + + - module: circulation + code: RECALL_MANUAL_CANCEL + branchcode: "" + name: "Recall has been cancelled" + is_html: 0 + title: "Recall has been cancelled" + message_transport_type: email + lang: default + content: + - "Dear [% borrower.firstname %] [% borrower.surname %]," + - "" + - "We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled." + - "" + - "Title: [% biblio.title %]" + - "Author: [% biblio.author %]" + - "Location: [% branch.branchname %]" + + - module: circulation + code: RECALL_MANUAL_CANCEL + branchcode: "" + name: "Recall has been cancelled" + is_html: 0 + title: "Recall has been cancelled" + message_transport_type: sms + lang: default + content: + - "Dear [% borrower.firstname %] [% borrower.surname %]," + - "" + - "We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled." + - "" + - "Title: [% biblio.title %]" + - "Author: [% biblio.author %]" + - "Location: [% branch.branchname %]" 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 cf1f4a940bf..739d977acf5 100644 --- a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql +++ b/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql @@ -259,7 +259,21 @@ Thank you!','sms'), A recall that you requested on the following item: <> / <> (<>) is now ready for you to pick up at <>. Please pick up your item by <>. -Thank you!','sms'); +Thank you!','sms'), +('circulation','RECALL_MANUAL_CANCEL','','Recall has been cancelled','0','Recall has been cancelled','Dear [% borrower.firstname %] [% borrower.surname %], + +We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled. + +Title: [% biblio.title %] +Author: [% biblio.author %] +Location: [% branch.branchname %]','sms'), +('circulation','RECALL_MANUAL_CANCEL','','Recall has been cancelled','0','Recall has been cancelled','Dear [% borrower.firstname %] [% borrower.surname %], + +We regret to inform you that the item you have recalled cannot be provided. Your recall was cancelled. + +Title: [% biblio.title %] +Author: [% biblio.author %] +Location: [% branch.branchname %]','email'); INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES ('circulation', 'ACCOUNT_PAYMENT', '', 'Account payment', 0, 'Account payment', '[%- USE Price -%]\r\nA payment of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis payment affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default'), diff --git a/installer/data/mysql/mandatory/sample_notices_message_attributes.sql b/installer/data/mysql/mandatory/sample_notices_message_attributes.sql index 4c84f556b10..ade719c321f 100644 --- a/installer/data/mysql/mandatory/sample_notices_message_attributes.sql +++ b/installer/data/mysql/mandatory/sample_notices_message_attributes.sql @@ -11,4 +11,5 @@ values (9, 'Auto_Renewals', 0), (10, 'Hold_Reminder', 0), (11, 'Recall_Waiting', 0), -(12, 'Recall_Requested', 0); +(12, 'Recall_Requested', 0), +(13, 'Recall_Cancelled', 0); diff --git a/installer/data/mysql/mandatory/sample_notices_message_transports.sql b/installer/data/mysql/mandatory/sample_notices_message_transports.sql index 29e4c06eed0..89daf976fdb 100644 --- a/installer/data/mysql/mandatory/sample_notices_message_transports.sql +++ b/installer/data/mysql/mandatory/sample_notices_message_transports.sql @@ -42,4 +42,6 @@ values (11, "email", 0, "circulation", "PICKUP_RECALLED_ITEM"), (11, "sms", 0, "circulation", "PICKUP_RECALLED_ITEM"), (12, "email", 0, "circulation", "RETURN_RECALLED_ITEM"), -(12, "sms", 0, "circulation", "RETURN_RECALLED_ITEM"); +(12, "sms", 0, "circulation", "RETURN_RECALLED_ITEM"), +(13, "email", 0, "circulation", "RECALL_MANUAL_CANCEL"), +(13, "sms", 0, "circulation", "RECALL_MANUAL_CANCEL"); diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/messaging-preference-form.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/messaging-preference-form.inc index 67795a56f2c..df1f34005a8 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/messaging-preference-form.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/messaging-preference-form.inc @@ -30,8 +30,9 @@ [% ELSIF ( messaging_preference.Ill_ready ) %]Interlibrary loan ready [% ELSIF ( messaging_preference.Ill_unavailable ) %]Interlibrary loan unavailable [% ELSIF ( messaging_preference.Auto_Renewals ) %]Auto renewal - [% ELSIF ( messaging_preference.Recall_Waiting ) %]Recall awaiting pickup - [% ELSIF ( messaging_preference.Recall_Requested ) %]Return recalled item + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Waiting ) %]Recall awaiting pickup + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Requested ) %]Return recalled item + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Cancelled ) %]Recall cancelled [% ELSE %]Unknown [% END %] [% IF ( messaging_preference.takes_days ) %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt index 59afa391370..d30da918f38 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt @@ -76,8 +76,9 @@ [% ELSIF ( messaging_preference.Ill_ready ) %]Interlibrary loan ready [% ELSIF ( messaging_preference.Ill_unavailable ) %]Interlibrary loan unavailable [% ELSIF ( messaging_preference.Auto_Renewals ) %]Auto renewal - [% ELSIF ( messaging_preference.Recall_Waiting ) %]Recall awaiting pickup - [% ELSIF ( messaging_preference.Recall_Requested ) %]Return recalled item + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Waiting ) %]Recall awaiting pickup + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Requested ) %]Return recalled item + [% ELSIF ( Koha.Preference('UseRecalls') && messaging_preference.Recall_Cancelled ) %]Recall cancelled [% ELSE %]Unknown [% END %] [% IF ( messaging_preference.takes_days ) %]