Bugzilla – Attachment 115830 Details for
Bug 18532
Messaging preferences for auto renewals
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 18532: set auto_renewals as patron messaging preference
Bug-18532-set-autorenewals-as-patron-messaging-pre.patch (text/plain), 15.51 KB, created by
Martin Renvoize (ashimema)
on 2021-01-26 17:15:38 UTC
(
hide
)
Description:
Bug 18532: set auto_renewals as patron messaging preference
Filename:
MIME Type:
Creator:
Martin Renvoize (ashimema)
Created:
2021-01-26 17:15:38 UTC
Size:
15.51 KB
patch
obsolete
>From b50a276d1aabcbbd4f819d9c17a8595c35060cd3 Mon Sep 17 00:00:00 2001 >From: Agustin Moyano <agustinmoyano@theke.io> >Date: Tue, 29 Oct 2019 15:27:38 -0300 >Subject: [PATCH] Bug 18532: set auto_renewals as patron messaging preference > >This patch adds the "Auto renewals" messaging preference on intranet and OPAC, and adds digest feature to misc/cronjobs/automatic_renewals.pl script. > >(Deprecated test plan. Please check the last patch) >To test: >1. apply patches >2. perl installer/data/mysql/updatedatabase.pl >3. make sure automatic renewals are allowed in circ rules, have a positive number of allowed renewals and a positive number for renewal period >4. go to patron categories in administration of staff interface and choose a category. >CHECK => in "Default messaging preferences for this patron category" has a "Auto renewals" row and has email and digest options checked >5. grab a patron and go to details page >CHECK => patron's messaging preferences has a "Auto renewals" row with email and digest options checked >6. some settings and save >7. go to opac with that same patron to "your messaging" option >CHECK => patron's messaging preferences has a "Auto renewals" row, and displays changes made in staff interface. >8. uncheck email and digest from "Auto renewals" row and save >9. check out an item for that patron, and set it as automatic renewal and set due date as your current yesterday >10. perl misc/cronjobs/automatic_renewals.pl -c --send-notices -v >SUCCESS => item was renewed, and in message_queue table there is no new message for the patron >11. update patrons messaging preferences and set email option of "Auto renewals" row as checked >12. repeat steps 9 and 10 >SUCCESS => item was renewed, but in message_queue table there is a new message of type AUTO_RENEWALS >13. update patrons messaging preferences and set email and digest options of "Auto renewals" row as checked >14. repeat steps 9 and 10 >CHECK => item was not renewed >15. run step 10 again, but add -d flag, like this: > perl misc/cronjobs/automatic_renewals.pl -c --send-notices -v -d >SUCCESS => item was renewed, and in message_queue table there is a new message of type AUTO_RENEWALS_DGST >16. Sign off > >Signed-off-by: tgoat <tgoatley@gmail.com> >Signed-off-by: Kelly McElligott <kelly@bywatersolutions.com> >Signed-off-by: Kelly McElligott <kelly@bywatersolutions.com> >Signed-off-by: Marti Fuerst <mfuerst@hmcpl.org> >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> >Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> >--- > .../en/includes/messaging-preference-form.inc | 2 + > .../bootstrap/en/modules/opac-messaging.tt | 1 + > misc/cronjobs/automatic_renewals.pl | 184 ++++++++++++++++-- > 3 files changed, 169 insertions(+), 18 deletions(-) > >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 7808bb20f5..bccd846ce2 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 >@@ -17,6 +17,7 @@ > <tr> > <td>[% IF ( messaging_preference.Item_Due ) %]Item due > [% ELSIF ( messaging_preference.Advance_Notice ) %]Advance notice >+ [% ELSIF ( messaging_preference.Upcoming_Events ) %]Upcoming events > [% ELSIF ( messaging_preference.Hold_Filled ) %]Hold filled > [% ELSIF ( messaging_preference.Item_Check_in ) %]Item check-in > [% ELSIF ( messaging_preference.Item_Checkout ) %] >@@ -27,6 +28,7 @@ > [% END %] > [% ELSIF ( messaging_preference.Ill_ready ) %]Interlibrary loan ready > [% ELSIF ( messaging_preference.Ill_unavailable ) %]Interlibrary loan unavailable >+ [% ELSIF ( messaging_preference.Auto_Renewals ) %]Auto renewals > [% ELSE %]Unknown [% END %]</td> > [% IF ( messaging_preference.takes_days ) %] > <td> >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 a8f8ee1790..d6ecb17f6d 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-messaging.tt >@@ -69,6 +69,7 @@ > [% END %] > [% ELSIF ( messaging_preference.Ill_ready ) %]Interlibrary loan ready > [% ELSIF ( messaging_preference.Ill_unavailable ) %]Interlibrary loan unavailable >+ [% ELSIF ( messaging_preference.Auto_Renewals ) %]Auto renewals > [% ELSE %]Unknown [% END %]</td> > [% IF ( messaging_preference.takes_days ) %] > <td><select class="input-mini" name="[% messaging_preference.message_attribute_id | html %]-DAYS"> >diff --git a/misc/cronjobs/automatic_renewals.pl b/misc/cronjobs/automatic_renewals.pl >index 39f241248c..a02bdf9c16 100755 >--- a/misc/cronjobs/automatic_renewals.pl >+++ b/misc/cronjobs/automatic_renewals.pl >@@ -2,7 +2,7 @@ > > # This file is part of Koha. > # >-# Copyright (C) 2014 Hochschule für Gesundheit (hsg), Germany >+# Copyright (C) 2014 Hochschule für Gesundheit (hsg), Germany > # > # Koha is free software; you can redistribute it and/or modify it > # under the terms of the GNU General Public License as published by >@@ -23,10 +23,13 @@ automatic_renewals.pl - cron script to renew loans > > =head1 SYNOPSIS > >-./automatic_renewals.pl [-c|--confirm] [--send-notices] >+./automatic_renewals.pl [-c|--confirm] [-s|--send-notices] [-d|--digest] [-b|--digest-per-branch] [-v|--verbose] > > or, in crontab: >-0 3 * * * automatic_renewals.pl -c >+# Once every day for digest messages >+0 3 * * * automatic_renewals.pl -c -d >+# Three times a day for non digest messages >+0 0,8,16 * * * automatic_renewals.pl -c > > =head1 DESCRIPTION > >@@ -38,12 +41,10 @@ and the renewal isn't premature (No Renewal before) the issue is renewed. > > =over > >-=item B<--send-notices> >+=item B<-s|--send-notices> > > Send AUTO_RENEWALS notices to patrons if the auto renewal has been done. > >-Note that this option does not support digest yet. >- > =item B<-v|--verbose> > > Print report to standard out. >@@ -52,6 +53,25 @@ Print report to standard out. > > Without this parameter no changes will be made > >+=item B<-d|--digest> >+ >+Flag to indicate that this script should process digest messages. >+ >+=item B<-b|--digest-per-branch> >+ >+Flag to indicate that generation of message digests should be >+performed separately for each branch. Needs --digest option. >+ >+A patron could potentially have loans at several different branches >+There is no natural branch to set as the sender on the aggregated >+message in this situation so the default behavior is to use the >+borrowers home branch. This could surprise to the borrower when >+message sender is a library where they have not borrowed anything. >+ >+Enabling this flag ensures that the issuing library is the sender of >+the digested message. It has no effect unless the borrower has >+chosen 'Digests only' on the advance messages. >+ > =back > > =cut >@@ -69,36 +89,62 @@ use Koha::Checkouts; > use Koha::Libraries; > use Koha::Patrons; > >-my ( $help, $send_notices, $verbose, $confirm ); >+my ( $help, $send_notices, $verbose, $confirm, $digest, $digest_per_branch ); > GetOptions( > 'h|help' => \$help, >- 'send-notices' => \$send_notices, >+ 's|send-notices' => \$send_notices, > 'v|verbose' => \$verbose, > 'c|confirm' => \$confirm, >+ 'd|digest|' => \$digest, >+ 'b|digest-per-branch' => \$digest_per_branch, > ) || pod2usage(1); > > pod2usage(0) if $help; >+ >+# Since advance notice options are not visible in the web-interface >+# unless EnhancedMessagingPreferences is on, let the user know that >+# this script probably isn't going to do much >+if ( ! C4::Context->preference('EnhancedMessagingPreferences') ) { >+ warn <<'END_WARN'; >+ >+The "EnhancedMessagingPreferences" syspref is off. >+Therefore, it is unlikely that this script will actually produce any messages to be sent. >+To change this, edit the "EnhancedMessagingPreferences" syspref. >+ >+END_WARN >+} >+ > cronlogaction(); > >+$verbose = 1 unless $verbose or $confirm; >+print "Test run only\n" unless $confirm; >+ >+print "getting auto renewals\n" if $verbose; > my $auto_renews = Koha::Checkouts->search({ auto_renew => 1, 'borrower.autorenew_checkouts' => 1 },{ join => 'borrower'}); >+print "found " . $auto_renews->count . " auto renewals\n" if $verbose; > >+my $renew_digest = {}; > my %report; >-$verbose = 1 unless $verbose or $confirm; >-print "Test run only\n" unless $confirm; > while ( my $auto_renew = $auto_renews->next ) { >+ print "examining item '" . $auto_renew->itemnumber . "' to auto renew\n" if $verbose; >+ >+ my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $auto_renew->borrowernumber, >+ message_name => 'auto_renewals' } ); >+ >+ next if !$digest && $borrower_preferences && $borrower_preferences->{'wants_digest'}; > > # CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script > my ( $ok, $error ) = CanBookBeRenewed( $auto_renew->borrowernumber, $auto_renew->itemnumber, undef, 1 ); > if ( $error eq 'auto_renew' ) { > if ($verbose) { >- say sprintf "Issue id: %s for borrower: %s and item: %s ". ( $confirm ? 'will' : 'would') . " be renewed.", >- $auto_renew->issue_id, $auto_renew->borrowernumber, $auto_renew->itemnumber; >+ say sprintf "Issue id: %s for borrower: %s and item: %s %s be renewed.", >+ $auto_renew->issue_id, $auto_renew->borrowernumber, $auto_renew->itemnumber, $confirm ? 'will' : 'would'; > } > if ($confirm){ > my $date_due = AddRenewal( $auto_renew->borrowernumber, $auto_renew->itemnumber, $auto_renew->branchcode, undef, undef, undef, 0 ); > $auto_renew->auto_renew_error(undef)->store; > } >- push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew; >+ push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew unless $borrower_preferences && (!$borrower_preferences->{transports} || !$borrower_preferences->{transports}->{email} || $borrower_preferences->{'wants_digest'}); > } elsif ( $error eq 'too_many' > or $error eq 'on_reserve' > or $error eq 'restriction' >@@ -110,18 +156,30 @@ while ( my $auto_renew = $auto_renews->next ) { > or $error eq 'auto_too_soon' > or $error eq 'item_denied_renewal' ) { > if ( $verbose ) { >- say sprintf "Issue id: %s for borrower: %s and item: %s ". ( $confirm ? 'will' : 'would') . " not be renewed. (%s)", >- $auto_renew->issue_id, $auto_renew->borrowernumber, $auto_renew->itemnumber, $error; >+ say sprintf "Issue id: %s for borrower: %s and item: %s %s not be renewed. (%s)", >+ $auto_renew->issue_id, $auto_renew->borrowernumber, $auto_renew->itemnumber, $confirm ? 'will' : 'would', $error; > } > if ( not $auto_renew->auto_renew_error or $error ne $auto_renew->auto_renew_error ) { > $auto_renew->auto_renew_error($error)->store if $confirm; > push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew >- if $error ne 'auto_too_soon'; # Do not notify if it's too soon >+ if $error ne 'auto_too_soon' && (!$borrower_preferences || ($borrower_preferences->{transports} && $borrower_preferences->{transports}->{email} && !$borrower_preferences->{'wants_digest'})); # Do not notify if it's too soon > } > } >+ >+ if ( $borrower_preferences && $borrower_preferences->{transports} && $borrower_preferences->{transports}->{email} && $borrower_preferences->{'wants_digest'} ) { >+ # cache this one to process after we've run through all of the items. >+ if ($digest_per_branch) { >+ $renew_digest->{ $auto_renew->branchcode }->{ $auto_renew->borrowernumber }->{success}++ if $error eq 'auto_renew'; >+ $renew_digest->{ $auto_renew->branchcode }->{ $auto_renew->borrowernumber }->{error}++ unless $error eq 'auto_renew' || $error == 'auto_too_soon' ; >+ } else { >+ $renew_digest->{ $auto_renew->borrowernumber }->{success} ++ if $error eq 'auto_renew'; >+ $renew_digest->{ $auto_renew->borrowernumber }->{error}++ unless $error eq 'auto_renew' || $error eq 'auto_too_soon' ; >+ } >+ } >+ > } > >-if ( $send_notices ) { >+if ( $send_notices && $confirm ) { > for my $borrowernumber ( keys %report ) { > my $patron = Koha::Patrons->find($borrowernumber); > for my $issue ( @{ $report{$borrowernumber} } ) { >@@ -147,7 +205,97 @@ if ( $send_notices ) { > message_transport_type => 'email', > from_address => $admin_email_address, > } >- ) if $confirm; >+ ); >+ } >+ } >+ >+ if ($digest_per_branch) { >+ while (my ($branchcode, $digests) = each %$renew_digest) { >+ send_digests({ >+ digests => $digests, >+ branchcode => $branchcode, >+ letter_code => 'AUTO_RENEWALS_DGST', >+ }); >+ } >+ } else { >+ send_digests({ >+ digests => $renew_digest, >+ letter_code => 'AUTO_RENEWALS_DGST', >+ }); >+ } >+} >+ >+=head1 METHODS >+ >+=head2 send_digests >+ >+ send_digests({ >+ digests => ..., >+ letter_code => ..., >+ }) >+ >+Enqueue digested letters. >+ >+Parameters: >+ >+=over 4 >+ >+=item C<$digests> >+ >+Reference to the array of digested messages. >+ >+=item C<$letter_code> >+ >+String that denote the letter code. >+ >+=back >+ >+=cut >+ >+sub send_digests { >+ my $params = shift; >+ >+ my $admin_email_address = C4::Context->preference('KohaAdminEmailAddress'); >+ >+ PATRON: while ( my ( $borrowernumber, $digest ) = each %{$params->{digests}} ) { >+ my $borrower_preferences = >+ C4::Members::Messaging::GetMessagingPreferences( >+ { >+ borrowernumber => $borrowernumber, >+ message_name => 'auto_renewals' >+ } >+ ); >+ >+ next PATRON unless $borrower_preferences; # how could this happen? >+ >+ my $patron = Koha::Patrons->find( $borrowernumber ); >+ my $library = Koha::Libraries->find( $params->{branchcode} ); >+ my $from_address = $library->{branchemail} || $admin_email_address; >+ >+ foreach my $transport ( keys %{ $borrower_preferences->{'transports'} } ) { >+ my $letter = C4::Letters::GetPreparedLetter ( >+ module => 'circulation', >+ letter_code => $params->{letter_code}, >+ branchcode => $params->{branchcode}, >+ lang => $patron->lang, >+ substitute => { >+ error => $digest->{error}||0, >+ success => $digest->{success}||0, >+ }, >+ tables => { >+ borrowers => $patron->borrowernumber, >+ }, >+ message_transport_type => $transport, >+ ) || warn "no letter of type '$params->{letter_code}' found for borrowernumber $borrowernumber. Please see sample_notices.sql"; >+ >+ next unless $letter; >+ >+ C4::Letters::EnqueueLetter({ >+ letter => $letter, >+ borrowernumber => $borrowernumber, >+ from_address => $from_address, >+ message_transport_type => $transport >+ }); > } > } > } >-- >2.20.1
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 18532
:
95030
|
95031
|
95337
|
95338
|
95456
|
96049
|
96050
|
96487
|
96494
|
96495
|
98078
|
98079
|
99193
|
99194
|
104880
|
104881
|
104882
|
104883
|
105500
|
105501
|
105502
|
105503
|
114316
|
115798
|
115799
|
115800
|
115801
|
115802
|
115829
| 115830 |
115831
|
115832
|
115833
|
118198
|
118199
|
118205
|
118318
|
118329
|
118330
|
118331
|
118356