Bugzilla – Attachment 9487 Details for
Bug 4246
Koha support for Itiva Talking Tech phone notification service
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
[SIGNED-OFF] Talking Tech Support - Phase I
SIGNED-OFF-Talking-Tech-Support---Phase-I.patch (text/plain), 32.73 KB, created by
Nicole C. Engard
on 2012-05-09 15:27:13 UTC
(
hide
)
Description:
[SIGNED-OFF] Talking Tech Support - Phase I
Filename:
MIME Type:
Creator:
Nicole C. Engard
Created:
2012-05-09 15:27:13 UTC
Size:
32.73 KB
patch
obsolete
>From ff006bf2757065217aca3e449e5a7ad3322ddf32 Mon Sep 17 00:00:00 2001 >From: Ian Walls <ian.walls@bywatersolutions.com> >Date: Wed, 22 Feb 2012 12:44:38 -0500 >Subject: [PATCH] [SIGNED-OFF] Talking Tech Support - Phase I > >Implements support for Talking Tech I-tiva phone notification for OVERDUE, PREDUE and HOLD notifications. >Overdues respect triggers as configured for the patron's branch. >Predue and Holds notifications respect patron's messaging preference choices. >A new column for phone notification is added if the TalkingTechItivaPhoneNotification system preference is turned on > >Record of phone messages being sent to patrons is added to the patron's Notices >tab; notice of success or failure can be retrieved from I-tiva. > >See the TalkingTech.README for installation and set-up instructions. > >Aside from the control system preference, and the necessary changes to Messaging Preferences >forms to make use of phone notifications, the bulk of the code resides in external >cronjobs. > >TalkingTech_itiva_outbound.pl generates the Spec C file to send to I-tiva. Actual transmission >of the file must be handled by the system administrator. > >TalkingTech_itiva_inbound.pl processes the received Results file from I-tiva. Getting the >file from I-tiva to Koha is the job of the system administrator, as well. > >Both scripts have a --help option with full documentation. > >The only necessary change to core Koha behavior is in C4::Letters::EnqueueLetter. The return >value was changed from 0 or 1 (successful addition of letter to message_queue or not), to the actual >insert ID of the letter. This was required by the outbound script to present a unique Transaction ID >for the notice added to the patron's record (so a 'sent' or 'failed' status could be updated). Since >the dbh and sth are not shared, and the last_insert_id() command is table-specific, this should be thread-safe. >No changes are necessary to any parts of Koha, as all usage of EnqueueLetter currently ignores the return value. > >To Test: > >1. Turn on TalkingTechItivaPhoneNotification system preference >2. Verify that 'phone' is now a valid notification option for patrons on both staff and OPAC side >3. Attempt to set a 'phone' preference for PREDUE or HOLD messaging; attempt should succeed >4. Set up the patron for notices to triggers: > a. include checked out items due in a range of days, including the value set up in their messaging preferences. > b. place several holds, some in position, others waiting for pickup, others in transit. > c. set the patron up to have overdues, overdue by a range of days that includes the delay values for >the patrons branch and categorycode >5. Run TalkingTech_itiva_outbound.pl --type=RESERVE --type=PREOVERDUE --type=OVERDUE --outfile=/tmp/talkingtechtest.csv > >The resulting talkingtechtest.csv file should include all the items due on X days (where X is the patrons' preference), >and none of the ones due in other increments. Similarly, overdues messages should be added for each item due by a delay >value as configured; overdues of other numbers of days should be ignore. Holds that are waiting pick up or in transit should >have messages, those still pending should not. > >Messages should be added to the patron's notices tab for each issue sent. Verify these messages exist, and all Notices >tokens are replaced with appropriate information. > >Repeat, this time with 4c making use of the default branch overdue triggers, instead of branch-specific triggers. > >To test the inbound script, create a CSV with rows in the format "<<Message_id>>","<<SUCCESS or FAIL>>" >Message ID should correspond to the final column of the talkingtechtest.csv file (the transaction id) for the message. > >Primary Authorship: Ian Walls >Additional modifications: Kyle M Hall > >http://bugs.koha-community.org/show_bug.cgi?id=4246 >Signed-off-by: Nicole C. Engard <nengard@bywatersolutions.com> > >Tested and in use in production by two public libraries : Middletown >and Washoe. Both have given their sign off, but don't have git to >actually sign off. >--- > C4/Letters.pm | 4 +- > admin/categorie.pl | 3 +- > ...-4246-Talking-Tech-itiva-phone-notifications.pl | 27 ++ > .../prog/en/includes/messaging-preference-form.inc | 29 ++ > .../prog/en/modules/admin/preferences/patrons.pref | 6 + > .../opac-tmpl/prog/en/modules/opac-messaging.tt | 19 ++- > members/memberentry.pl | 1 + > members/moremember.pl | 1 + > misc/cronjobs/thirdparty/TalkingTech.README | 32 +++ > .../thirdparty/TalkingTech_itiva_inbound.pl | 129 +++++++++ > .../thirdparty/TalkingTech_itiva_outbound.pl | 295 ++++++++++++++++++++ > opac/opac-messaging.pl | 3 +- > 12 files changed, 543 insertions(+), 6 deletions(-) > create mode 100644 installer/data/mysql/atomicupdate/Bug-4246-Talking-Tech-itiva-phone-notifications.pl > create mode 100644 misc/cronjobs/thirdparty/TalkingTech.README > create mode 100755 misc/cronjobs/thirdparty/TalkingTech_itiva_inbound.pl > create mode 100755 misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl > >diff --git a/C4/Letters.pm b/C4/Letters.pm >index 89213fe..e2012e1 100644 >--- a/C4/Letters.pm >+++ b/C4/Letters.pm >@@ -661,7 +661,7 @@ places a letter in the message_queue database table, which will > eventually get processed (sent) by the process_message_queue.pl > cronjob when it calls SendQueuedMessages. > >-return true on success >+return message_id on success > > =cut > >@@ -703,7 +703,7 @@ ENDSQL > $params->{'from_address'}, # from_address > $params->{'letter'}->{'content-type'}, # content_type > ); >- return $result; >+ return $dbh->last_insert_id(undef,undef,'message_queue', undef); > } > > =head2 SendQueuedMessages ([$hashref]) >diff --git a/admin/categorie.pl b/admin/categorie.pl >index 521346b..dc360c2 100755 >--- a/admin/categorie.pl >+++ b/admin/categorie.pl >@@ -112,8 +112,9 @@ if ($op eq 'add_form') { > hidelostitems => $data->{'hidelostitems'}, > category_type => $data->{'category_type'}, > DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), >+ SMSSendDriver => C4::Context->preference("SMSSendDriver"), >+ TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification"), > "type_".$data->{'category_type'} => 1, >- SMSSendDriver => C4::Context->preference("SMSSendDriver") > ); > if (C4::Context->preference('EnhancedMessagingPreferences')) { > C4::Form::MessagingPreferences::set_form_values({ categorycode => $categorycode } , $template); >diff --git a/installer/data/mysql/atomicupdate/Bug-4246-Talking-Tech-itiva-phone-notifications.pl b/installer/data/mysql/atomicupdate/Bug-4246-Talking-Tech-itiva-phone-notifications.pl >new file mode 100644 >index 0000000..7f288e2 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/Bug-4246-Talking-Tech-itiva-phone-notifications.pl >@@ -0,0 +1,27 @@ >+#! /usr/bin/perl >+use strict; >+use warnings; >+use C4::Context; >+my $dbh = C4::Context->dbh; >+ >+# add phone message transport type >+$dbh->do("INSERT INTO message_transport_types (message_transport_type) VALUES ('phone')"); >+ >+# adds HOLD_PHONE and PREDUE_PHONE letters (as placeholders) >+$dbh->do("INSERT INTO letter (module, code, name, title, content) VALUES >+ ('reserves', 'HOLD_PHONE', 'Item Available for Pick-up (phone notice)', 'Item Available for Pick-up (phone notice)', 'Your item is available for pickup'), >+ ('circulation', 'PREDUE_PHONE', 'Advance Notice of Item Due (phone notice)', 'Advance Notice of Item Due (phone notice)', 'Your item is due soon'), >+ ('circulation', 'OVERDUE_PHONE', 'Overdue Notice (phone notice)', 'Overdue Notice (phone notice)', 'Your item is overdue') >+ "); >+ >+# add phone notifications to patron message preferences options >+$dbh->do("INSERT INTO message_transports >+ (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES >+ (4, 'phone', 0, 'reserves', 'HOLD_PHONE'), >+ (2, 'phone', 0, 'circulation', 'PREDUE_PHONE') >+ "); >+ >+# add TalkingTechItivaPhoneNotification syspref >+$dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('TalkingTechItivaPhoneNotification',0,'If ON, enables Talking Tech I-tiva phone notifications',NULL,'YesNo');"); >+ >+print "Upgrade done (Support for Talking Tech i-tiva phone notification system)\n"; >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 2ff131b..c11aaf2 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 >@@ -21,6 +21,7 @@ > <tr><th></th> > <th>Days in advance</th> > [% IF ( SMSSendDriver ) %]<th>SMS</th>[% END %] >+ [% IF ( TalkingTechItivaPhone ) %]<th>Phone</th>[% END %] > <th>Email</th><th>Digests only?</th> > <!-- <th>RSS</th> --> > [% UNLESS ( messaging_form_inactive ) %]<th>Do not notify</th>[% END %] >@@ -83,6 +84,34 @@ > <td>-</td> > [% END %] > >+ [% IF ( TalkingTechItivaPhone ) %]<td> >+ [% IF ( messaging_form_inactive ) %] >+ [% IF ( messaging_preference.transports_phone ) %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" checked="checked" disabled="disabled" /> >+ [% ELSE %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" disabled="disabled" /> >+ [% END %] >+ [% ELSE %] >+ [% IF ( messaging_preference.transports_phone ) %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" checked="checked" onclick = "$('#none'+'[% messaging_preference.message_attribute_id %]').attr('checked','');" /> >+ [% ELSE %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" onclick = "$('#none'+'[% messaging_preference.message_attribute_id %]').attr('checked','');" /> >+ [% END %] >+ [% END %] >+ </td>[% END %] >+ > [% IF ( messaging_preference.transport_email ) %] > <td> > [% IF ( messaging_form_inactive ) %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref >index 55b4457..58d67f0 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref >@@ -121,3 +121,9 @@ Patrons: > choices: > now: current date. > dateexpiry: current membership expiry date. >+ - >+ - pref: TalkingTechItivaPhoneNotification >+ choices: >+ yes: Enable >+ no: Disable >+ - patron phone notifications using Talking Tech i-tiva (overdues, predues and holds notices currently supported). >diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tt >index 6d6b8cb..0e11438 100644 >--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tt >+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-messaging.tt >@@ -36,7 +36,7 @@ > <div class="dialog message"><h3>Settings updated</h3></div> > [% END %] > <table style="margin-right:1em;"> >- <tr><th> </th><th>Days in advance</th>[% IF ( SMSSendDriver ) %]<th>SMS</th>[% END %]<th>Email</th><th>Digests only?</th><!-- <th>RSS</th> --><th>Do not notify</th></tr> >+ <tr><th> </th><th>Days in advance</th>[% IF ( SMSSendDriver ) %]<th>SMS</th>[% END %][% IF ( TalkingTechItivaPhone ) %]<th>Phone</th>[% END %]<th>Email</th><th>Digests only?</th><!-- <th>RSS</th> --><th>Do not notify</th></tr> > [% FOREACH messaging_preference IN messaging_preferences %] > <tr> > <td>[% IF ( messaging_preference.Item_Due ) %]Item due >@@ -75,7 +75,22 @@ > </td> > [% END %] > [% ELSE %] >- <td>-</td> >+ <td>--</td> >+ [% END %] >+ [% IF ( TalkingTechItivaPhone ) %] >+ <td> >+ [% IF ( messaging_preference.transports_phone ) %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" checked="checked" onclick = "document.opacmessaging.none[% messaging_preference.message_attribute_id %].checked=false;" /> >+ [% ELSE %] >+ <input type="checkbox" >+ id="phone[% messaging_preference.message_attribute_id %]" >+ name="[% messaging_preference.message_attribute_id %]" >+ value="phone" onclick = "document.opacmessaging.none[% messaging_preference.message_attribute_id %].checked=false;" /> >+ [% END %] >+ </td> > [% END %] > > [% IF ( messaging_preference.transport_email ) %] >diff --git a/members/memberentry.pl b/members/memberentry.pl >index 2d8cace..7096f37 100755 >--- a/members/memberentry.pl >+++ b/members/memberentry.pl >@@ -688,6 +688,7 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) { > } > $template->param(SMSSendDriver => C4::Context->preference("SMSSendDriver")); > $template->param(SMSnumber => defined $data{'smsalertnumber'} ? $data{'smsalertnumber'} : $data{'mobile'}); >+ $template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification")); > } > > $template->param( "showguarantor" => ($category_type=~/A|I|S|X/) ? 0 : 1); # associate with step to know where you are >diff --git a/members/moremember.pl b/members/moremember.pl >index cc9afb9..5e94960 100755 >--- a/members/moremember.pl >+++ b/members/moremember.pl >@@ -398,6 +398,7 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) { > $template->param(messaging_form_inactive => 1); > $template->param(SMSSendDriver => C4::Context->preference("SMSSendDriver")); > $template->param(SMSnumber => defined $data->{'smsalertnumber'} ? $data->{'smsalertnumber'} : $data->{'mobile'}); >+ $template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification")); > } > > # in template <TMPL_IF name="I"> => instutitional (A for Adult, C for children) >diff --git a/misc/cronjobs/thirdparty/TalkingTech.README b/misc/cronjobs/thirdparty/TalkingTech.README >new file mode 100644 >index 0000000..7120d85 >--- /dev/null >+++ b/misc/cronjobs/thirdparty/TalkingTech.README >@@ -0,0 +1,32 @@ >+Installation and Setup instructions for Talking Tech I-tiva phone notification >+============================= >+ >+Be sure you've run installer/data/mysql/atomicupdate/Bug-4246-Talking-Tech-itiva-phone-notifications.pl >+to install the required data pack (new syspref, notice placeholders and messaging transport preferences) >+ >+To use, TalkingTechItivaPhoneNotification syspref must be turned on. >+ >+If you wish to process PREOVERDUE or RESERVES messages, you'll need the EnhancedMessagingPreferences >+system preference turned on, and patrons to have filled in a perference for receiving these notices by phone. >+ >+For OVERDUE messages, overdue notice triggers must be configured under Koha -> Tools -> Overdue Notice Triggers. >+Either branch-specific triggers or the default level triggers may be used (script will select whichever is appropriate). >+ >+ >+Sending Notices file to I-tiva: >+============================= >+ >+1. Add the TalkingTech_itiva_outbound.pl script to your crontab >+2. Add an FTP/SFTP or other transport method to send the output file to the I-tiva server >+3. If you wish, archive the sent notices file in another directory after sending >+ >+Run TalkingTech_itiva_outbound.pl --help for more information >+ >+ >+Receiving Results file from I-tiva: >+============================= >+1. Add an FTP/SFTP or other transport method to send the Results file to a known directory on your Koha server >+2. Add the TalkingTech_itiva_inbound.pl script to your crontab, aimed at that directory >+3. If you wish, archive the results file in another directory after processing >+ >+Run TalkingTech_itiva_inbound.pl --help for more information >diff --git a/misc/cronjobs/thirdparty/TalkingTech_itiva_inbound.pl b/misc/cronjobs/thirdparty/TalkingTech_itiva_inbound.pl >new file mode 100755 >index 0000000..92f59f3 >--- /dev/null >+++ b/misc/cronjobs/thirdparty/TalkingTech_itiva_inbound.pl >@@ -0,0 +1,129 @@ >+#!/usr/bin/perl >+# >+# Copyright (C) 2011 ByWater Solutions >+# >+# 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., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+BEGIN { >+ # find Koha's Perl modules >+ # test carefully before changing this >+ use FindBin; >+ eval { require "$FindBin::Bin/../kohalib.pl" }; >+} >+ >+use Getopt::Long; >+use Pod::Usage; >+ >+use C4::Context; >+ >+sub usage { >+ pod2usage( -verbose => 2 ); >+ exit; >+} >+ >+die "TalkingTechItivaPhoneNotification system preference not activated... dying\n" unless (C4::Context->preference("TalkingTechItivaPhoneNotification")); >+ >+# Database handle >+my $dbh = C4::Context->dbh; >+ >+# Benchmarking >+my $updated= 0; >+my $total = 0; >+ >+# Options >+my $verbose; >+my $help; >+my $infile; >+ >+GetOptions( >+ 'i|input:s' => \$infile, >+ 'v' => \$verbose, >+ 'help|h' => \$help, >+); >+ >+die pod2usage() if $help; >+ >+# initialize the input data, either file or query >+if (defined $infile) { >+ open(IN, $infile) || die ("Cannot open input file"); >+ print "Opening $infile\n" if (defined $verbose); >+ >+ while (<IN>) { >+ # data should take to form "<Transaction ID>","<SUCCESS or FAIL>" >+ s/["\n]//g; # strip quotes and newlines: they're unnecessary >+ my @data = split(/,/); >+ my $result = update_notice(@data); >+ $updated += $result; >+ $total++; >+ } >+} else { >+ die pod2usage( -verbose => 1 ); >+} >+ >+print "$updated of $total results lines processed\n" if (defined $verbose); >+ >+ >+=head1 NAME >+ >+TalkingTech_itiva_inbound.pl >+ >+=head1 SYNOPSIS >+ >+ TalkingTech_itiva_inbound.pl >+ TalkingTech_itiva_inbound.pl -v --input=/tmp/talkingtech/results.csv >+ >+Script to process received Results files for Talking Tech i-tiva >+phone notification system. >+ >+=over 8 >+ >+=item B<--help> B<-h> >+ >+Prints this help >+ >+=item B<-v> >+ >+Provide verbose log information. >+ >+=item B<--input> B<-i> >+ >+REQUIRED. Path to incoming results file. >+ >+=back >+ >+=cut >+ >+sub update_notice { >+ my $message_id = shift; >+ my $status = shift; >+ >+ if ($status =~ m/SUCCESS/i) { >+ $status = 'sent'; >+ } elsif ($status =~ m/FAIL/i) { >+ $status = 'failed'; >+ } else { >+ warn "unexpected status $status for message ID $message_id\n"; >+ return 0; >+ } >+ >+ my $query = "UPDATE message_queue SET status = ? WHERE message_id = ? and status = 'pending'"; >+ my $sth = $dbh->prepare($query); >+ >+ my $result = $sth->execute($status,$message_id); >+ return $result; >+} >diff --git a/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl b/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl >new file mode 100755 >index 0000000..3cf0ebd >--- /dev/null >+++ b/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl >@@ -0,0 +1,295 @@ >+#!/usr/bin/perl >+# >+# Copyright (C) 2011 ByWater Solutions >+# >+# 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., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+BEGIN { >+ # find Koha's Perl modules >+ # test carefully before changing this >+ use FindBin; >+ eval { require "$FindBin::Bin/../kohalib.pl" }; >+} >+ >+use Getopt::Long; >+use Pod::Usage; >+use Date::Calc qw(Add_Delta_Days); >+ >+use C4::Context; >+use C4::Items; >+use C4::Letters; >+use C4::Overdues; >+use C4::Dates; >+use C4::Calendar; >+ >+sub usage { >+ pod2usage( -verbose => 2 ); >+ exit; >+} >+ >+die "TalkingTechItivaPhoneNotification system preference not activated... dying\n" unless (C4::Context->preference("TalkingTechItivaPhoneNotification")); >+ >+# Database handle >+my $dbh = C4::Context->dbh; >+ >+# Options >+my $verbose; >+my $language = "EN"; >+my @types; >+my @holds_waiting_days_to_call; >+my $library_code; >+my $help; >+my $outfile; >+ >+# maps to convert I-tiva terms to Koha terms >+my $type_module_map = { 'PREOVERDUE' => 'circulation', >+ 'OVERDUE' => 'circulation', >+ 'RESERVE' => 'reserves', >+ }; >+ >+my $type_notice_map = { 'PREOVERDUE' => 'PREDUE_PHONE', >+ 'OVERDUE' => 'OVERDUE_PHONE', >+ 'RESERVE' => 'HOLD_PHONE', >+ }; >+ >+GetOptions( >+ 'o|output:s' => \$outfile, >+ 'v' => \$verbose, >+ 'lang:s' => \$language, >+ 'type:s' => \@types, >+ 'w|waiting-hold-day:s' => \@holds_waiting_days_to_call, >+ 'c|code|library-code:s' => \$library_code, >+ 'help|h' => \$help, >+); >+ >+$language = uc($language); >+$library_code ||= ''; >+ >+pod2usage( -verbose => 1 ) if $help; >+ >+# output log or STDOUT >+if (defined $outfile) { >+ open (OUT, ">$outfile") || die ("Cannot open output file"); >+} else { >+ print "No output file defined; printing to STDOUT\n" if (defined $verbose); >+ open(OUT, ">&STDOUT") || die ("Couldn't duplicate STDOUT: $!"); >+} >+ >+my $format = 'V'; # format for phone notifications >+ >+foreach my $type (@types) { >+ $type = uc($type); #just in case lower or mixed-case was supplied >+ my $module = $type_module_map->{$type}; #since the module is required to get the letter >+ my $code = $type_notice_map->{$type}; #to get the Koha name of the notice >+ >+ my @loop; >+ if ($type eq 'OVERDUE') { >+ @loop = GetOverdueIssues(); >+ } elsif ($type eq 'PREOVERDUE') { >+ @loop = GetPredueIssues(); >+ } elsif ($type eq 'RESERVE') { >+ @loop = GetWaitingHolds(); >+ } else { >+ print "Unknown or unsupported message type $type; skipping...\n" if (defined $verbose); >+ next; >+ } >+ >+ foreach my $issues (@loop) { >+ my $date = C4::Dates->new($issues->{'date_due'}, 'iso'); >+ my $due_date = $date->output('metric'); >+ >+ # gets the placeholder message, and enqueues the letter >+ my $letter = getletter($module, $code); >+ die "No letter found for type $type!... dying\n" unless $letter; >+ # covers basic variable parsing in letter >+ $letter = C4::Letters::parseletter($letter, 'borrowers', $issues->{'borrowernumber'}); >+ $letter = C4::Letters::parseletter($letter, 'biblio', $issues->{'biblionumber'}); >+ $letter = C4::Letters::parseletter($letter, 'biblioitems', $issues->{'biblionumber'}); >+ >+ my $message_id = 0; >+ if ($outfile) { >+ $message_id = C4::Letters::EnqueueLetter( { letter => $letter, >+ borrowernumber => $issues->{'borrowernumber'}, >+ message_transport_type => 'phone', >+ }); >+ } >+ >+ print OUT "\"$format\",\"$language\",\"$type\",\"$issues->{level}\",\"$issues->{cardnumber}\",\"$issues->{patron_title}\",\"$issues->{firstname}\","; >+ print OUT "\"$issues->{surname}\",\"$issues->{phone}\",\"$issues->{email}\",\"$library_code\","; >+ print OUT "\"$issues->{site}\",\"$issues->{site_name}\",\"$issues->{barcode}\",\"$due_date\",\"$issues->{title}\",\"$message_id\"\n"; >+ } >+} >+ >+ >+=head1 NAME >+ >+TalkingTech_itiva_outbound.pl >+ >+=head1 SYNOPSIS >+ >+ TalkingTech_itiva_outbound.pl >+ TalkingTech_itiva_outbound.pl --type=OVERDUE -w 0 -w 2 -w 6 --output=/tmp/talkingtech/outbound.csv >+ TalkingTech_itiva_outbound.pl --type=RESERVE --type=PREOVERDUE --lang=FR >+ >+ >+Script to generate Spec C outbound notifications file for Talking Tech i-tiva >+phone notification system. >+ >+=item B<--help> B<-h> >+ >+Prints this help >+ >+=item B<-v> >+ >+Provide verbose log information. >+ >+=item B<--output> B<-o> >+ >+Destination for outbound notifications file (CSV format). If no value is specified, >+output is dumped to screen. >+ >+=item B<--lang> >+ >+Sets the language for all outbound messages. Currently supported values are EN, FR and ES. >+If no value is specified, EN will be used by default. >+ >+=item B<--type> >+ >+REQUIRED. Sets which messaging types are to be used. Can be given multiple times, to >+specify multiple types in a single output file. Currently supported values are RESERVE, PREOVERDUE >+and OVERDUE. If no value is given, this script will not produce any outbound notifications. >+ >+=item B<--waiting-hold-day> B<-w> >+ >+OPTIONAL for --type=RESERVE. Sets the days after a hold has been set to waiting on which to call. Use >+switch as many times as desired. For example, passing "-w 0 -w 2 -w 6" will cause calls to be placed >+on the day the hold was set to waiting, 2 days after the waiting date, and 6 days after. See example above. >+If this switch is not used with --type=RESERVE, calls will be placed every day until the waiting reserve >+is picked up or canceled. >+ >+=item B<--library-code> B<--code> B<-c> >+ >+OPTIONAL >+The code of the source library of the message. >+The library code is used to group notices together for >+consortium purposes and apply library specific settings, such as >+prompts, to those notices. >+This field can be blank if all messages are from a single library. >+ >+=cut >+ >+sub GetOverdueIssues { >+ my $query = "SELECT borrowers.borrowernumber, borrowers.cardnumber, borrowers.title as patron_title, borrowers.firstname, borrowers.surname, >+ borrowers.phone, borrowers.email, borrowers.branchcode, biblio.biblionumber, biblio.title, items.barcode, issues.date_due, >+ max(overduerules.branchcode) as rulebranch, TO_DAYS(NOW())-TO_DAYS(date_due) as daysoverdue, delay1, delay2, delay3, >+ issues.branchcode as site, branches.branchname as site_name >+ FROM borrowers JOIN issues USING (borrowernumber) >+ JOIN items USING (itemnumber) >+ JOIN biblio USING (biblionumber) >+ JOIN branches ON (issues.branchcode = branches.branchcode) >+ JOIN overduerules USING (categorycode) >+ WHERE ( overduerules.branchcode = borrowers.branchcode or overduerules.branchcode = '') >+ AND ( (TO_DAYS(NOW())-TO_DAYS(date_due) ) = delay1 >+ OR (TO_DAYS(NOW())-TO_DAYS(date_due) ) = delay2 >+ OR (TO_DAYS(NOW())-TO_DAYS(date_due) ) = delay3 ) >+ GROUP BY items.itemnumber >+ "; >+ my $sth = $dbh->prepare($query); >+ $sth->execute(); >+ my @results; >+ while( my $issue = $sth->fetchrow_hashref() ) { >+ if ( $issue->{'daysoverdue'} == $issue->{'delay1'} ) { >+ $issue->{'level'} = 1; >+ } elsif ( $issue->{'daysoverdue'} == $issue->{'delay2'} ) { >+ $issue->{'level'} = 2; >+ } elsif ( $issue->{'daysoverdue'} == $issue->{'delay3'} ) { >+ $issue->{'level'} = 3; >+ } else { >+ # this shouldn't ever happen, based our SQL criteria >+ } >+ push @results, $issue; >+ } >+ return @results; >+} >+ >+sub GetPredueIssues { >+ my $query = "SELECT borrowers.borrowernumber, borrowers.cardnumber, borrowers.title as patron_title, borrowers.firstname, borrowers.surname, >+ borrowers.phone, borrowers.email, borrowers.branchcode, biblio.biblionumber, biblio.title, items.barcode, issues.date_due, >+ issues.branchcode as site, branches.branchname as site_name >+ FROM borrowers JOIN issues USING (borrowernumber) >+ JOIN items USING (itemnumber) >+ JOIN biblio USING (biblionumber) >+ JOIN branches ON (issues.branchcode = branches.branchcode) >+ JOIN borrower_message_preferences USING (borrowernumber) >+ JOIN borrower_message_transport_preferences USING (borrower_message_preference_id) >+ JOIN message_attributes USING (message_attribute_id) >+ WHERE ( TO_DAYS( date_due ) - TO_DAYS( NOW() ) ) = days_in_advance >+ AND message_transport_type = 'phone' >+ AND message_name = 'Advance_Notice' >+ "; >+ my $sth = $dbh->prepare($query); >+ $sth->execute(); >+ my @results; >+ while( my $issue = $sth->fetchrow_hashref() ) { >+ $issue->{'level'} = 1; # only one level for Predue notifications >+ push @results, $issue; >+ } >+ return @results; >+} >+ >+sub GetWaitingHolds { >+ my $query = "SELECT borrowers.borrowernumber, borrowers.cardnumber, borrowers.title as patron_title, borrowers.firstname, borrowers.surname, >+ borrowers.phone, borrowers.email, borrowers.branchcode, biblio.biblionumber, biblio.title, items.barcode, reserves.waitingdate, >+ reserves.branchcode AS site, branches.branchname AS site_name, >+ TO_DAYS(NOW())-TO_DAYS(reserves.waitingdate) AS days_since_waiting >+ FROM borrowers JOIN reserves USING (borrowernumber) >+ JOIN items USING (itemnumber) >+ JOIN biblio ON (biblio.biblionumber = items.biblionumber) >+ JOIN branches ON (reserves.branchcode = branches.branchcode) >+ JOIN borrower_message_preferences USING (borrowernumber) >+ JOIN borrower_message_transport_preferences USING (borrower_message_preference_id) >+ JOIN message_attributes USING (message_attribute_id) >+ WHERE ( reserves.found = 'W' ) >+ AND message_transport_type = 'phone' >+ AND message_name = 'Hold_Filled' >+ "; >+ my $pickupdelay = C4::Context->preference("ReservesMaxPickUpDelay"); >+ my $sth = $dbh->prepare($query); >+ $sth->execute(); >+ my @results; >+ while( my $issue = $sth->fetchrow_hashref() ) { >+ my @waitingdate = split( /-/, $issue->{'waitingdate'} ); >+ my @date_due = Add_Delta_Days( $waitingdate[0], $waitingdate[1], $waitingdate[2], $pickupdelay ); >+ $issue->{'date_due'} = sprintf( "%04d-%02d-%02d", $date_due[0], $date_due[1], $date_due[2] ); >+ $issue->{'level'} = 1; # only one level for Hold Waiting notifications >+ >+ my $days_to_subtract = 0; >+ my $calendar = C4::Calendar->new( branchcode => $issue->{'site'} ); >+ while( $calendar->isHoliday( reverse( Add_Delta_Days( $waitingdate[0], $waitingdate[1], $waitingdate[2], $days_to_subtract ) ) ) ) { >+ $days_to_subtract++; >+ } >+ $issue->{'days_since_waiting'} = $issue->{'days_since_waiting'} - $days_to_subtract; >+ >+ if ( ( grep $_ eq $issue->{'days_since_waiting'}, @holds_waiting_days_to_call ) || !scalar( @holds_waiting_days_to_call ) ) { >+ push @results, $issue; >+ } >+ } >+ return @results; >+ >+ >+} >diff --git a/opac/opac-messaging.pl b/opac/opac-messaging.pl >index 9e1e4f8..dc244db 100755 >--- a/opac/opac-messaging.pl >+++ b/opac/opac-messaging.pl >@@ -67,6 +67,7 @@ C4::Form::MessagingPreferences::set_form_values({ borrowernumber => $borrowe > $template->param( BORROWER_INFO => [ $borrower ], > messagingview => 1, > SMSnumber => defined $borrower->{'smsalertnumber'} ? $borrower->{'smsalertnumber'} : $borrower->{'mobile'}, >- SMSSendDriver => C4::Context->preference("SMSSendDriver") ); >+ SMSSendDriver => C4::Context->preference("SMSSendDriver"), >+ TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification") ); > > output_html_with_http_headers $query, $cookie, $template->output; >-- >1.7.2.3
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 4246
:
7964
|
7965
|
8012
|
8014
|
8636
|
8637
|
8638
|
8639
| 9487 |
9488
|
9501
|
10062