diff --git a/Koha/Patron.pm b/Koha/Patron.pm index df9b6b9313..93fac36d09 100644 --- a/Koha/Patron.pm +++ b/Koha/Patron.pm @@ -2699,6 +2699,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 3ed1cc5282..8aec41dfcb 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 0000000000..d087835b5e --- /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 0000000000..82fc894e27 --- /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 ce85ee592f..cde132e550 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 => 27; +use Test::More tests => 28; use Test::Exception; use Test::Warn; @@ -1929,3 +1929,24 @@ subtest 'update privacy tests' => sub { $schema->storage->txn_rollback; }; + +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; +};