From 401c84cc09e8fc341d5cf4598174b2bcaff1e18d Mon Sep 17 00:00:00 2001 From: Andrew Moore Date: Fri, 20 Jun 2008 13:01:59 -0500 Subject: [PATCH] Bug 2176 (2/5): adding patron interface to update messaging preferences This patch allows patrons to update their messaging preferences. This includes methods in C4::Members to manage patron messaging preferences. added cgi script to allow patron to edit their messaging preferences Signed-off-by: Joshua Ferraro --- C4/Auth.pm | 21 +- C4/Members/Messaging.pm | 215 ++++++++++++++++++ .../opac-tmpl/prog/en/includes/usermenu.inc | 10 +- .../prog/en/modules/opac-messaging.tmpl | 116 ++++++++++ opac/opac-messaging.pl | 122 ++++++++++ 5 files changed, 472 insertions(+), 12 deletions(-) create mode 100644 C4/Members/Messaging.pm create mode 100644 koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tmpl create mode 100755 opac/opac-messaging.pl diff --git a/C4/Auth.pm b/C4/Auth.pm index de55f120ff..f7ae6d9c70 100755 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -250,16 +250,17 @@ sub get_template_and_user { # these template parameters are set the same regardless of $in->{'type'} $template->param( "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1, - GoogleJackets => C4::Context->preference("GoogleJackets"), - KohaAdminEmailAddress => "" . C4::Context->preference("KohaAdminEmailAddress"), - LoginBranchcode => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"), - LoginFirstname => (C4::Context->userenv?C4::Context->userenv->{"firstname"}:"Bel"), - LoginSurname => C4::Context->userenv?C4::Context->userenv->{"surname"}:"Inconnu", - TagsEnabled => C4::Context->preference("TagsEnabled"), - hide_marc => C4::Context->preference("hide_marc"), - 'item-level_itypes' => C4::Context->preference('item-level_itypes'), - patronimages => C4::Context->preference("patronimages"), - singleBranchMode => C4::Context->preference("singleBranchMode"), + EnhancedMessagingPreferences => C4::Context->preference('EnhancedMessagingPreferences'), + GoogleJackets => C4::Context->preference("GoogleJackets"), + KohaAdminEmailAddress => "" . C4::Context->preference("KohaAdminEmailAddress"), + LoginBranchcode => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"), + LoginFirstname => (C4::Context->userenv?C4::Context->userenv->{"firstname"}:"Bel"), + LoginSurname => C4::Context->userenv?C4::Context->userenv->{"surname"}:"Inconnu", + TagsEnabled => C4::Context->preference("TagsEnabled"), + hide_marc => C4::Context->preference("hide_marc"), + 'item-level_itypes' => C4::Context->preference('item-level_itypes'), + patronimages => C4::Context->preference("patronimages"), + singleBranchMode => C4::Context->preference("singleBranchMode"), ); if ( $in->{'type'} eq "intranet" ) { diff --git a/C4/Members/Messaging.pm b/C4/Members/Messaging.pm new file mode 100644 index 0000000000..4ca03b5bfb --- /dev/null +++ b/C4/Members/Messaging.pm @@ -0,0 +1,215 @@ +package C4::Members::Messaging; + +# Copyright (C) 2008 LibLime +# +# This file is part of Koha. +# +# 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +use strict; +use warnings; +use C4::Context; + +use vars qw($VERSION); + +BEGIN { + # set the version for version checking + $VERSION = 3.00; +} + +=head1 NAME + +C4::Members::Messaging - manage patron messaging preferences + +=head1 SYNOPSIS + +=over 4 + +=back + +=head1 FUNCTIONS + + +=head2 GetMessagingPreferences + +=over 4 + +my $preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrower->{'borrowernumber'}, + message_name => 'DUE' } ); + +returns: a hashref of messaging preferences for this borrower for a particlar message_name + +=back + +=cut + +sub GetMessagingPreferences { + my $params = shift; + + foreach my $required ( qw( borrowernumber message_name ) ) { + if ( ! exists $params->{ $required } ) { + return; + } + } + + my $sql = <<'END_SQL'; +SELECT borrower_message_preferences.*, + borrower_message_transport_preferences.message_transport_type, + message_attributes.*, + message_transports.* + FROM borrower_message_preferences + LEFT JOIN borrower_message_transport_preferences + ON borrower_message_transport_preferences.borrower_message_preference_id = borrower_message_preferences.borrower_message_preference_id + LEFT JOIN message_attributes + ON message_attributes.message_attribute_id = borrower_message_preferences.message_attribute_id + LEFT JOIN message_transports + ON message_transports.message_attribute_id = message_attributes.message_attribute_id + AND message_transports.message_transport_type = borrower_message_transport_preferences.message_transport_type + WHERE borrower_message_preferences.borrowernumber = ? + AND message_attributes.message_name = ? +END_SQL + + my @bind_params = ( $params->{'borrowernumber'}, $params->{'message_name'} ); + + my $sth = C4::Context->dbh->prepare($sql); + $sth->execute(@bind_params); + my $return; + my %transports; # helps build a list of unique message_transport_types + ROW: while ( my $row = $sth->fetchrow_hashref() ) { + next ROW unless $row->{'message_attribute_id'}; + # warn( Data::Dumper->Dump( [ $row ], [ 'row' ] ) ); + $return->{'days_in_advance'} = $row->{'days_in_advance'} if defined $row->{'days_in_advance'}; + $return->{'wants_digest'} = $row->{'wants_digest'} if defined $row->{'wants_digest'}; + $transports{$row->{'message_transport_type'}} = 1; + } + @{$return->{'transports'}} = keys %transports; + return $return; +} + +=head2 SetMessagingPreferences + +=over 4 + + +C4::Members::Messaging::SetMessagingPreference( { borrowernumber => $borrower->{'borrowernumber'} + message_attribute_id => $message_attribute_id, + message_transport_types => [ qw( email sms ) ], + days_in_advance => 5 + wants_digest => 1 } ) + +returns nothing useful. + +=back + +=cut + +sub SetMessagingPreference { + my $params = shift; + + foreach my $required ( qw( borrowernumber message_attribute_id message_transport_types ) ) { + if ( ! exists $params->{ $required } ) { + warn "SetMessagingPreference called without required parameter: $required"; + return; + } + } + $params->{'days_in_advance'} = undef unless exists ( $params->{'days_in_advance'} ); + $params->{'wants_digest'} = 0 unless exists ( $params->{'wants_digest'} ); + + my $dbh = C4::Context->dbh(); + + my $delete_sql = <<'END_SQL'; +DELETE FROM borrower_message_preferences + WHERE borrowernumber = ? + AND message_attribute_id = ? +END_SQL + my $sth = $dbh->prepare( $delete_sql ); + my $deleted = $sth->execute( $params->{'borrowernumber'}, $params->{'message_attribute_id'} ); + + if ( $params->{'message_transport_types'} ) { + my $insert_bmp = <<'END_SQL'; +INSERT INTO borrower_message_preferences +(borrower_message_preference_id, borrowernumber, message_attribute_id, days_in_advance, wants_digest) +VALUES +(NULL, ?, ?, ?, ?) +END_SQL + + $sth = C4::Context->dbh()->prepare($insert_bmp); + my $success = $sth->execute( $params->{'borrowernumber'}, + $params->{'message_attribute_id'}, + $params->{'days_in_advance'}, + $params->{'wants_digest'} ); + + # my $borrower_message_preference_id = $dbh->last_insert_id(); + my $borrower_message_preference_id = $dbh->{'mysql_insertid'}; + + my $insert_bmtp = <<'END_SQL'; +INSERT INTO borrower_message_transport_preferences +(borrower_message_preference_id, message_transport_type) +VALUES +(?, ?) +END_SQL + $sth = C4::Context->dbh()->prepare($insert_bmtp); + foreach my $transport ( @{$params->{'message_transport_types'}}) { + my $success = $sth->execute( $borrower_message_preference_id, $transport ); + } + } + return; +} + +=head2 GetMessagingOptions + +=over 4 + +my $messaging_options = C4::Members::Messaging::SetMessagingPreference() + +returns a hashref of messaing options available. + +=back + +=cut + +sub GetMessagingOptions { + + my $sql = <<'END_SQL'; +select message_attributes.message_attribute_id, takes_days, message_name, message_transport_type, is_digest + FROM message_attributes + LEFT JOIN message_transports + ON message_attributes.message_attribute_id = message_transports.message_attribute_id +END_SQL + + my $sth = C4::Context->dbh->prepare($sql); + $sth->execute(); + my $choices; + while ( my $row = $sth->fetchrow_hashref() ) { + $choices->{ $row->{'message_name'} }->{'message_attribute_id'} = $row->{'message_attribute_id'}; + $choices->{ $row->{'message_name'} }->{'message_name'} = $row->{'message_name'}; + $choices->{ $row->{'message_name'} }->{'takes_days'} = $row->{'takes_days'}; + $choices->{ $row->{'message_name'} }->{'has_digest'} = 1 if $row->{'is_digest'}; + $choices->{ $row->{'message_name'} }->{'transport-' . $row->{'message_transport_type'}} = ' '; + } + + my @return = values %$choices; + # warn( Data::Dumper->Dump( [ \@return ], [ 'return' ] ) ); + return \@return; +} + +=head1 AUTHOR + +Koha Development Team + +Andrew Moore + +=cut + +1; diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/usermenu.inc b/koha-tmpl/opac-tmpl/prog/en/includes/usermenu.inc index 3b6524faed..17dda147fa 100644 --- a/koha-tmpl/opac-tmpl/prog/en/includes/usermenu.inc +++ b/koha-tmpl/opac-tmpl/prog/en/includes/usermenu.inc @@ -1,4 +1,5 @@ - + + diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tmpl new file mode 100644 index 0000000000..d0be477b04 --- /dev/null +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tmpl @@ -0,0 +1,116 @@ +Koha OnlineKoha Online Catalog › Updating Details for + + + + + +
+
+
+
+ +
+ +

's account ../../images/caret.gif" width="16" height="16" alt=">" border="0" /> Your Messaging Settings

+ + +
+
+ + + +
Mange your Messaging settings + +

Settings Updated

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# days in advancesmsemailDigests only?rssdo not notify
+ -" + name="" + value="sms" + onclick = "document.opacmessaging.none.checked=false;"> + -" + name="" + value="email" + onclick = "document.opacmessaging.none.checked=false;"> + -" + value="" + name="digest" + onclick = "document.opacmessaging.none.checked=false;"> + -" + name="" + value="rss" + onclick = "document.opacmessaging.none.checked=false;"> + -" + onclick = "if ( document.opacmessaging.none.checked == true ) { + document.opacmessaging.sms.checked=false; + document.opacmessaging.email.checked=false; + document.opacmessaging.digest.checked=false; + document.opacmessaging.rss.checked=false; }" />
+SMS number: " /> + +
+ +
+ +
+ Cancel +
+ +
+
+
+
+
+
+
+ + +
+
+
+ diff --git a/opac/opac-messaging.pl b/opac/opac-messaging.pl new file mode 100755 index 0000000000..b7ecac06db --- /dev/null +++ b/opac/opac-messaging.pl @@ -0,0 +1,122 @@ +#!/usr/bin/perl + +# Copyright 2008 LibLime +# +# This file is part of Koha. +# +# 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +use strict; +use warnings; +require Exporter; +use CGI; + +use C4::Auth; # checkauth, getborrowernumber. +use C4::Context; +use C4::Koha; +use C4::Circulation; +use C4::Output; +use C4::Dates qw/format_date/; +use C4::Members; +use C4::Members::Messaging; +use C4::Branch; + +my $query = CGI->new(); + +my ( $template, $borrowernumber, $cookie ) = get_template_and_user( + { + template_name => 'opac-messaging.tmpl', + query => $query, + type => 'opac', + authnotrequired => 0, + flagsrequired => { borrow => 1 }, + debug => 1, + } +); + +my $borrower = GetMemberDetails( $borrowernumber ); +my $messaging_options = C4::Members::Messaging::GetMessagingOptions(); + +if ( defined $query->param('modify') && $query->param('modify') eq 'yes' ) { + + # If they've modified the SMS number, record it. + if ( ( defined $query->param('SMSnumber') ) && ( $query->param('SMSnumber') ne $borrower->{'mobile'} ) ) { + ModMember( borrowernumber => $borrowernumber, + smsalertnumber => $query->param('SMSnumber') ); + $borrower = GetMemberDetails( $borrowernumber ); + } + + # TODO: If a "NONE" box and another are checked somehow (javascript failed), we should pay attention to the "NONE" box + + # warn( Data::Dumper->Dump( [ $messaging_options ], [ 'messaging_options' ] ) ); + OPTION: foreach my $option ( @$messaging_options ) { + # warn( Data::Dumper->Dump( [ $option ], [ 'option' ] ) ); + my $updater = { borrowernumber => $borrower->{'borrowernumber'}, + message_attribute_id => $option->{'message_attribute_id'} }; + + # find the desired transports + @{$updater->{'message_transport_types'}} = $query->param( $option->{'message_attribute_id'} ); + next OPTION unless $updater->{'message_transport_types'}; + + if ( $option->{'has_digest'} ) { + if ( List::Util::first { $_ == $option->{'message_attribute_id'} } $query->param( 'digest' ) ) { + $updater->{'wants_digest'} = 1; + } + } + + if ( $option->{'takes_days'} ) { + if ( defined $query->param( $option->{'message_attribute_id'} . '-DAYS' ) ) { + $updater->{'days_in_advance'} = $query->param( $option->{'message_attribute_id'} . '-DAYS' ); + } + } + + # warn( 'calling SetMessaginPreferencse with ' . Data::Dumper->Dump( [ $updater ], [ 'updater' ] ) ); + C4::Members::Messaging::SetMessagingPreference( $updater ); + } + + # show the success message + $template->param( settings_updated => 1 ); +} + +$messaging_options = C4::Members::Messaging::GetMessagingOptions(); +# walk through the options and update them with these borrower_preferences +PREF: foreach my $option ( @$messaging_options ) { + my $pref = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrower->{'borrowernumber'}, + message_name => $option->{'message_name'} } ); + # warn( Data::Dumper->Dump( [ $pref ], [ 'pref' ] ) ); + # make a hashref of the days, selecting one. + if ( $option->{'takes_days'} ) { + foreach my $day ( 0..30 ) { # FIXME: 30 is a magic number. + my $dayrow = { day => $day, + selected => '' }; + if ( defined $pref->{'days_in_advance'} && $pref->{'days_in_advance'} == $day ) { + $dayrow->{'selected'} = 'SELECTED'; + } + push @{$option->{'select_days'}}, $dayrow + } + } + foreach my $transport ( @{$pref->{'transports'}} ) { + $option->{'transport-'.$transport} = 'CHECKED'; + } + + $option->{'digest'} = $pref->{'wants_digest'} ? 'CHECKED' : ''; +} + +# warn( Data::Dumper->Dump( [ $messaging_options ], [ 'messaging_options' ] ) ); +$template->param( BORROWER_INFO => [ $borrower ], + messagingview => 1, + messaging_preferences => $messaging_options, + SMSnumber => defined $borrower->{'smsalertnumber'} ? $borrower->{'smsalertnumber'} : $borrower->{'mobile'} ); + +output_html_with_http_headers $query, $cookie, $template->output; -- 2.20.1