From de8418c65e5952434ae3f71d07c818e69b91589d Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Tue, 23 May 2023 05:09:10 +0000 Subject: [PATCH] Bug 28130: Manage a patron's subscription alerts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This enhancement adds an 'Alert subscriptions' page to a patron account to easily view or cancel email alerts the patron has subscribed to. To test: 1. Go to Cataloging. Create a biblio. 2. Go to Tools -> Notices & slips. Create a notice under the "Serials (new issue)" module, if you don't already have one. 3. Go to Serials. Create a subscription. Link the biblio you just created. Add info like the callnumber, location, library. Choose your notice under Patron notification. Fill out the remaining details and save your subscription. 4. Open this record in the OPAC. Under the Subscriptions tab, click the button to "Subscribe to email notification on new issues" 5. Go back to the staff interface. Go to your patron account. 6. Notice there is a new "Alert subscriptions" tab in the left sidebar menu. The number in brackets should say 1, for the subscription you just enabled email alerts. 7. Click into the page. Confirm your subscription shows in the table. 8. Click the button to unsubscribe. A confirmation should pop up. Confirm you can cancel the unsubscribe action. Then confirm you can unsubscribe using this button. 9. Confirm tests pass t/db_dependent/Koha/Patron.t Sponsored-by: Bibliotheksservice-Zentrum Baden-Wuerttemberg Signed-off-by: Christian Stelzenmüller Signed-off-by: Sam Lau Signed-off-by: Nick Clemens --- Koha/Patron.pm | 18 +++ .../prog/en/includes/circ-menu.inc | 3 + .../en/modules/members/alert-subscriptions.tt | 115 ++++++++++++++++++ members/alert-subscriptions.pl | 56 +++++++++ t/db_dependent/Koha/Patron.t | 23 +++- 5 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt create mode 100755 members/alert-subscriptions.pl diff --git a/Koha/Patron.pm b/Koha/Patron.pm index 2a8eecf9f66..e2eab4643a8 100644 --- a/Koha/Patron.pm +++ b/Koha/Patron.pm @@ -2490,6 +2490,24 @@ sub get_savings { )->next->get_column('total_savings') // 0; } +=head3 alert_subscriptions + + my $subscriptions = $patron->alert_subscriptions; + +Return a Koha::Subscriptions object containing subscriptions for which the patron has subscribed to email alerts. + +=cut + +sub alert_subscriptions { + my ( $self ) = @_; + + my $schema = Koha::Database->new->schema; + my @alerts = $schema->resultset('Alert')->search({ borrowernumber => $self->borrowernumber }); + my @subscription_ids = map { $_->externalid } @alerts; + + return Koha::Subscriptions->search({ subscriptionid => \@subscription_ids }); +} + =head2 Internal methods =head3 _type diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc index 3ed1cc52826..8aec41dfcb6 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc @@ -185,6 +185,9 @@ [% IF Koha.Preference('UseRecalls') && CAN_user_recalls %] [% IF recallsview %]
  • [% ELSE %]
  • [% END %]Recalls history
  • [% END %] + [% IF ( CAN_user_serials && patron.alert_subscriptions.count ) %] + [% IF alertsview %]
  • [% ELSE %]
  • [% END %]Alert subscriptions ([% patron.alert_subscriptions.count | html %])
  • + [% END %] [% IF patronimages && CAN_user_tools_batch_upload_patron_images %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt new file mode 100644 index 00000000000..d087835b5e8 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt @@ -0,0 +1,115 @@ +[% USE raw %] +[% USE Asset %] +[% USE AuthorisedValues %] +[% USE Branches %] +[% SET footerjs = 1 %] +[% INCLUDE 'doc-head-open.inc' %] +Alert subscriptions for [% INCLUDE 'patron-title.inc' no_html = 1 %] › Patrons › Koha +[% INCLUDE 'doc-head-close.inc' %] + + + +[% WRAPPER 'header.inc' %] + [% INCLUDE 'patron-search-header.inc' %] +[% END %] + +[% WRAPPER 'sub-header.inc' %] + [% WRAPPER breadcrumbs %] + [% WRAPPER breadcrumb_item %] + Patrons + [% END %] + [% WRAPPER breadcrumb_item %] + [% INCLUDE 'patron-title.inc' %] + [% END %] + [% WRAPPER breadcrumb_item bc_active= 1 %] + Alert subscriptions + [% END %] + [% END #/ WRAPPER breadcrumbs %] +[% END #/ WRAPPER sub-header.inc %] + +
    +
    +
    +
    + + [% INCLUDE 'members-toolbar.inc' %] +

    Alert subscriptions

    + + [% IF patron.alert_subscriptions.count %] +
    + + + + + + + + + + + + + + [% FOREACH sub IN patron.alert_subscriptions %] + + + + + + + + + [% END %] + +
    ISSNTitleLibraryLocationCall numberActions
    + [% IF sub.biblio.biblioitem.issn %][% sub.biblio.biblioitem.issn | html %][% END %] + + [% sub.biblio.title | html %] [% sub.biblio.subtitle | html %] + + [% IF ( sub.branchcode ) %][% Branches.GetName( sub.branchcode ) | html %][% END %] + + [% IF ( sub.location ) %][% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.location', authorised_value => sub.location ) | html %][% END %] + + [% IF ( sub.callnumber ) %][% sub.callnumber | html %][% END %] + +
    + + + +
    +
    +
    + [% ELSE %] +
    +

    This patron has not subscribed to email alerts for any subscriptions.

    +
    + [% END %] + +
    +
    + +
    + +
    +
    + +[% MACRO jsinclude BLOCK %] + [% INCLUDE 'str/members-menu.inc' %] + [% Asset.js("js/members-menu.js") | $raw %] + [% INCLUDE 'datatables.inc' %] + +[% END %] + +[% INCLUDE 'intranet-bottom.inc' %] diff --git a/members/alert-subscriptions.pl b/members/alert-subscriptions.pl new file mode 100755 index 00000000000..82fc894e275 --- /dev/null +++ b/members/alert-subscriptions.pl @@ -0,0 +1,56 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Copyright 2023 Aleisha Amohia +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI qw ( -utf8 ); +use C4::Auth qw( get_template_and_user ); +use C4::Context; +use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers ); +use Koha::Patrons; + +my $input = CGI->new; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { template_name => "members/alert-subscriptions.tt", + query => $input, + type => "intranet", + flagsrequired => { serials => '*' }, + } +); + +my $borrowernumber = $input->param('borrowernumber'); + +my $logged_in_user = Koha::Patrons->find( $loggedinuser ); +my $patron = Koha::Patrons->find( $borrowernumber ); +output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } ); + +my $subscription_id = $input->param('subscription_id'); +if ( $subscription_id ) { + my $subscription = Koha::Subscriptions->find( $subscription_id ); + $subscription->remove_subscriber( $patron ); + print $input->redirect("/cgi-bin/koha/members/alert-subscriptions.pl?borrowernumber=".$borrowernumber); +} + +$template->param( + patron => $patron, + alertsview => 1, +); + +output_html_with_http_headers $input, $cookie, $template->output; diff --git a/t/db_dependent/Koha/Patron.t b/t/db_dependent/Koha/Patron.t index 5d05a16efda..80f3b663d8b 100755 --- a/t/db_dependent/Koha/Patron.t +++ b/t/db_dependent/Koha/Patron.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 24; +use Test::More tests => 25; use Test::Exception; use Test::Warn; @@ -1498,3 +1498,24 @@ subtest 'update privacy tests' => sub { is( $old_checkout->borrowernumber, $anon_patron->id, "Checkout is successfully anonymized"); is( $patron->privacy(), 2, "Patron privacy is successfully updated"); }; + +subtest 'alert_subscriptions tests' => sub { + + plan tests => 3; + + my $patron = $builder->build_object({ class => 'Koha::Patrons' }); + + my $subscription1 = $builder->build_object({ class => 'Koha::Subscriptions' }); + $subscription1->add_subscriber( $patron ); + + my $subscription2 = $builder->build_object({ class => 'Koha::Subscriptions' }); + $subscription2->add_subscriber( $patron ); + + my @subscriptions = $patron->alert_subscriptions->as_list; + + is( @subscriptions, 2, "Number of patron's subscribed alerts successfully fetched" ); + is( $subscriptions[0]->subscriptionid, $subscription1->subscriptionid, "First subscribed alert is correct" ); + is( $subscriptions[1]->subscriptionid, $subscription2->subscriptionid, "Second subscribed alert is correct" ); + + $patron->discard_changes; +}; -- 2.30.2