Bugzilla – Attachment 27288 Details for
Bug 5670
Housebound Readers Module
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 5670: Housebound Readers Module
Bug-5670-Housebound-Readers-Module.patch (text/plain), 62.60 KB, created by
Kyle M Hall (khall)
on 2014-04-18 13:04:28 UTC
(
hide
)
Description:
Bug 5670: Housebound Readers Module
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2014-04-18 13:04:28 UTC
Size:
62.60 KB
patch
obsolete
>From c1a2d4d7cae7ee8d5f4078bb08e187680e2baace Mon Sep 17 00:00:00 2001 >From: A. Sassmannshausen <alex.sassmannshausen@ptfs-europe.com> >Date: Fri, 4 Apr 2014 09:55:07 +0000 >Subject: [PATCH] Bug 5670: Housebound Readers Module > >New module to handle management of circulation to Housebound readers. > >- Ability to record users as housebound (HB category), volunteers > (combined deliverers and choosers, VOL category), deliverers (DELIV > category) choosers (CHO category). >- Ability to link users to individual delivery runs. >- Ability to check on issuing to housebound users flagging > if title has previously been issued to this user, to aid choosers. >- 'Delivery Days' and 'Delivery Frequencies' are customizable through > authorised values ('Day' and 'Frequency' categories respectively. > >Sponsored by Halton Borough Council > >* C4/Auth.pm: Add check: useHouseboundModule. >* C4/Circulation.pm: use Housebound to check for previous issue. >* koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc: add > Housebound menu if appropriate. >* koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt: add > 'previous checkout' warning. >* C4/Housebound.pm: new. >* koha-tmpl/intranet-tmpl/prog/en/modules/members/housebound.tt: new. >* koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundedit.tt: new. >* koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundinstances.tt: new. >* members/housebound.pl: new. >* members/houseboundedit.pl: new. >* members/houseboundinstances.pl: new. >* installer/data/mysql/atomicupdate/housebound_tables.sql: new. > - create 'housebound', 'housebound_instance' tables, > - create 'HB', 'VOL', 'DELIV', 'CHO' borrower categories, > - create sample 'Day', 'Frequency' authorised values, > - add 'useHouseboundModule', 'useHouseboundCheckPrevious' syspref. >* t/Housebound.t: new. > >Test plan: >- Apply patch. >- Run atomic update script. >- Optionally, run Unit Tests (t/Housebound.t) >- Create at least 1 of each: 'HB', 'VOL', 'DELIV', 'CHO' borrower. >- Optionally, add additional authorised values of 'Day' and > 'Frequency' categories. >- Verify 'useHouseboundModule' & 'useHouseboundCheckPrevious' sysprefs > are on. >- On the page of the 'HB' borrower, open the new 'Housebound' menu. > - create housebound profile > + ensure Day and Frequency values are from correct authorised > values > - create 'housebound instances' (deliveries) > + ensure chooser/deliverer lists are populated with VOL, DELIV, > CHO borrowers > - edit the profile/instances. > - delete the profile/instances. >- For a borrower with a housebound profile, issue an item, then > - return that item > - attempt to re-issue that item (you should get a warning) >- Switch off 'useHouseboundCheckPrevious', repeat last test > - the warning should not appear >- Switch off 'useHouseboundModule' > - the Housebound menu should disappear > - the issue warnings should no longer appear. > >Largely based on prior work from Mark Gavillet and Colin Campbell. > >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> >--- > C4/Auth.pm | 1 + > C4/Circulation.pm | 12 + > C4/Housebound.pm | 377 ++++++++++++++++++++ > .../data/mysql/atomicupdate/housebound_tables.sql | 41 +++ > .../intranet-tmpl/prog/en/includes/circ-menu.inc | 3 + > .../prog/en/modules/circ/circulation.tt | 4 + > .../prog/en/modules/members/housebound.tt | 69 ++++ > .../prog/en/modules/members/houseboundedit.tt | 102 ++++++ > .../prog/en/modules/members/houseboundinstances.tt | 133 +++++++ > members/housebound.pl | 91 +++++ > members/houseboundedit.pl | 114 ++++++ > members/houseboundinstances.pl | 138 +++++++ > t/Housebound.t | 292 +++++++++++++++ > 13 files changed, 1377 insertions(+), 0 deletions(-) > create mode 100644 C4/Housebound.pm > create mode 100644 installer/data/mysql/atomicupdate/housebound_tables.sql > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/members/housebound.tt > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundedit.tt > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundinstances.tt > create mode 100755 members/housebound.pl > create mode 100755 members/houseboundedit.pl > create mode 100755 members/houseboundinstances.pl > create mode 100755 t/Housebound.t > >diff --git a/C4/Auth.pm b/C4/Auth.pm >index 44edf67..d47ee0f 100644 >--- a/C4/Auth.pm >+++ b/C4/Auth.pm >@@ -328,6 +328,7 @@ sub get_template_and_user { > ); > if ( $in->{'type'} eq "intranet" ) { > $template->param( >+ useHouseboundModule => C4::Context->preference("useHouseboundModule"), > AmazonCoverImages => C4::Context->preference("AmazonCoverImages"), > AutoLocation => C4::Context->preference("AutoLocation"), > "BiblioDefaultView".C4::Context->preference("IntranetBiblioDefaultView") => 1, >diff --git a/C4/Circulation.pm b/C4/Circulation.pm >index f4fe578..23c2951 100644 >--- a/C4/Circulation.pm >+++ b/C4/Circulation.pm >@@ -58,6 +58,8 @@ use Date::Calc qw( > Day_of_Week > Add_Delta_Days > ); >+use C4::Housebound qw( CheckPrevIssue ); >+ > use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); > > BEGIN { >@@ -841,6 +843,16 @@ sub CanBookBeIssued { > } > } > >+ # If Housebound patron and useHouseboundCheckPrev syspref is ON >+ # check for previous issue of item to patron. >+ if ( C4::Context->preference('useHouseboundCheckPrevious') == 1 >+ && $borrower->{categorycode} eq 'HB' ) >+ { >+ $needsconfirmation{HOUSEBOUNDPREVISSUE} = 1 >+ if CheckPrevIssue( $borrower->{borrowernumber}, >+ $item->{biblionumber} ); >+ } >+ > # > # ITEM CHECKING > # >diff --git a/C4/Housebound.pm b/C4/Housebound.pm >new file mode 100644 >index 0000000..879334b >--- /dev/null >+++ b/C4/Housebound.pm >@@ -0,0 +1,377 @@ >+package C4::Housebound; >+ >+# Copyright 2011 Mark Gavillet >+# Copyright 2014 PTFS-Europe Ltd >+# >+# 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 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, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+use C4::Context; >+use base qw(Exporter); >+ >+our $VERSION = 3.02; >+our @EXPORT_OK = qw( >+ GetHouseboundDetails >+ CreateHouseboundDetails >+ UpdateHouseboundDetails >+ GetCurrentHouseboundInstanceList >+ GetHouseboundInstanceDetails >+ UpdateHouseboundInstanceDetails >+ CreateHouseboundInstanceDetails >+ DeleteHouseboundInstanceDetails >+ GetVolunteerNameAndID >+ GetVolunteerList >+ GetChooserList >+ GetDelivererList >+ CheckPrevIssue >+); >+ >+=head1 NAME >+ >+C4::Housebound - Koha housebound patrons module. >+ >+=head1 SYNOPSIS >+ >+use C4::Housebound; >+ >+=head1 DESCRIPTION >+ >+This module contains routines for adding, modifying and deleting >+housebound details for patrons, and instances of item delivery by >+volunteers. >+ >+=head1 FUNCTIONS >+ >+=head2 GetHouseboundDetails >+ >+ $housebound = GetHouseboundDetails( $borrowernumber ); >+ >+Return a hashref containing the housebound table's row associated with >+$BORROWERNUMBER or undef. >+ >+=cut >+ >+sub GetHouseboundDetails { >+ my ($borrowernumber) = @_; >+ if ($borrowernumber) { >+ my $dbh = C4::Context->dbh; >+ return $dbh->selectrow_hashref( >+ 'select * from housebound where borrowernumber=?', >+ {}, $borrowernumber ); >+ } >+ return; >+} >+ >+=head2 CreateHouseboundDetails >+ >+ CreateHouseboundDetails( $borrowernumber, $day, $frequency, >+ $Itype_quant, $Item_subject, $Item_authors, >+ $referral, $notes ); >+ >+Create a new entry in the housebound table containing our arguments. >+The return value is undef. >+ >+=cut >+ >+sub CreateHouseboundDetails { >+ my ( $borrowernumber, $day, $frequency, $Itype_quant, $Item_subject, >+ $Item_authors, $referral, $notes ) >+ = @_; >+ if ($borrowernumber) { >+ my $dbh = C4::Context->dbh; >+ my $sth = $dbh->prepare( >+'insert into housebound (day, frequency, borrowernumber, Itype_quant, Item_subject, Item_authors, referral, notes) values (?,?,?,?,?,?,?,?)' >+ ); >+ $sth->execute( $day, $frequency, $borrowernumber, $Itype_quant, >+ $Item_subject, $Item_authors, $referral, $notes ); >+ } >+ return; >+} >+ >+=head2 UpdateHouseboundDetails >+ >+ UpdateHouseboundDetails( $hbnumber, $borrowernumber, $day, >+ $frequency, $Itype_quant, $Item_subject, >+ $Item_authors, $referral, $notes ); >+ >+Update housebound table's row matching $hbnumber with our arguments. >+The return value is undef. >+ >+=cut >+ >+sub UpdateHouseboundDetails { >+ my ( >+ $hbnumber, $borrowernumber, $day, >+ $frequency, $Itype_quant, $Item_subject, >+ $Item_authors, $referral, $notes >+ ) = @_; >+ if ($hbnumber) { >+ my $dbh = C4::Context->dbh; >+ my $sth = $dbh->prepare( >+'update housebound set day=?,frequency=?,borrowernumber=?,Itype_quant=?,Item_subject=?,Item_authors=?,referral=?,notes=? where hbnumber=?' >+ ); >+ $sth->execute( >+ $day, $frequency, $borrowernumber, >+ $Itype_quant, $Item_subject, $Item_authors, >+ $referral, $notes, $hbnumber >+ ); >+ } >+ return; >+} >+ >+=head2 GetCurrentHouseboundInstanceList >+ >+ $hb_instances = GetCurrentHouseboundInstanceList( $borrowernumber ); >+ >+Return an arrayref containing all Housebound_Instances associated with >+$BORROWERNUMBER, or undef. >+ >+=cut >+ >+sub GetCurrentHouseboundInstanceList { >+ my ($borrowernumber) = @_; >+ if ($borrowernumber) { >+ my $dbh = C4::Context->dbh; >+ my $sql =<<'END_SQL'; >+SELECT housebound_instance . * , concat( volunteer.firstname, ' ', volunteer.surname ) AS vol, >+ concat(chooser.firstname, ' ', chooser.surname) as cho, >+ concat(deliverer.firstname, ' ', deliverer.surname) as del >+ FROM housebound_instance >+ left JOIN borrowers volunteer ON volunteer.borrowernumber = housebound_instance.volunteer >+ left join borrowers chooser on chooser.borrowernumber = housebound_instance.chooser >+ left join borrowers deliverer on deliverer.borrowernumber = housebound_instance.deliverer >+ where housebound_instance.borrowernumber=? >+ order by housebound_instance.dmy desc >+END_SQL >+ return $dbh->selectall_arrayref( $sql, { Slice => {} }, >+ $borrowernumber ); >+ } >+ return; >+} >+ >+=head2 GetVolunteerNameAndID >+ >+ $volunteer = GetVolunteerNameAndID( $borrowernumber ); >+ >+Return a hashref containing details of the volunteer identified by >+$BORROWERNUMBER, or undef. >+ >+=cut >+ >+sub GetVolunteerNameAndID { >+ my ($borrowernumber) = @_; >+ if ($borrowernumber) { >+ my $dbh = C4::Context->dbh; >+ return $dbh->selectrow_hashref( >+'select borrowernumber,title,firstname,surname from borrowers where borrowernumber=?', >+ {}, $borrowernumber >+ ); >+ } >+ return; >+} >+ >+=head2 GetVolunteerList >+ >+ $volunteers = GetVolunteerList(); >+ >+Return an arrayref containing borrowernumbers and names of all known >+volunteers, or undef. >+ >+=cut >+ >+sub GetVolunteerList { >+ return GetHouseboundList("VOL"); >+} >+ >+=head2 GetDelivererList >+ >+ $deliverers = GetDelivererList(); >+ >+Return an arrayref containing borrowernumbers and names of all known >+deliverers, or undef. >+ >+=cut >+ >+sub GetDelivererList { >+ return GetHouseboundList("DELIV"); >+} >+ >+=head2 GetChooserList >+ >+ $choosers = GetChooserList(); >+ >+Return an arrayref containing borrowernumbers and names of all known >+choosers, or undef. >+ >+=cut >+ >+sub GetChooserList { >+ return GetHouseboundList("CHO"); >+} >+ >+=head2 GetHouseboundList >+ >+ $patrons = GetHouseboundList( $brw_cat_code ); >+ >+Return an arrayref containing borrowernumbers and names of all >+borrowers with $BRW_CAT_CODE, or undef. >+ >+=cut >+ >+sub GetHouseboundList { >+ my ( $cat_code ) = @_; >+ my $dbh = C4::Context->dbh; >+ my $sql = "SELECT borrowernumber as volbornumber, >+ concat(title, ' ', firstname, ' ', surname) as fullname >+ from borrowers where categorycode=? >+ order by surname, firstname asc"; >+ return $dbh->selectall_arrayref( $sql, { Slice => {} }, $cat_code ); >+} >+ >+=head2 GetHouseboundInstanceDetails >+ >+ $housebound = GetHouseboundInstanceDetails( $instance_id ); >+ >+Return a hashref containing all details of the housebound_instance >+associated with $INSTANCE_ID or undef. >+ >+=cut >+ >+sub GetHouseboundInstanceDetails { >+ my ($instanceid) = @_; >+ if ($instanceid) { >+ my $dbh = C4::Context->dbh; >+ return $dbh->selectrow_hashref( >+ 'SELECT * from housebound_instance where instanceid=?', >+ {}, $instanceid ); >+ } >+ return; >+} >+ >+=head2 UpdateHouseboundInstanceDetails >+ >+ UpdateHouseboundInstanceDetails( $instanceid, $hbnumber, $dmy, >+ $time, $borrowernumber, $volunteer, >+ $chooser, $deliverer ); >+ >+Update housebound_instance table's row matching $instanceid with our >+arguments. The return value is undef. >+ >+=cut >+ >+sub UpdateHouseboundInstanceDetails { >+ my ( $instanceid, $hbnumber, $dmy, $time, $borrowernumber, $volunteer, >+ $chooser, $deliverer ) >+ = @_; >+ if ($hbnumber) { >+ my $dbh = C4::Context->dbh; >+ my $sth = $dbh->prepare( >+'update housebound_instance set hbnumber=?, dmy=?, time=?, borrowernumber=?, volunteer=?, chooser=?, deliverer=? where instanceid=?' >+ ); >+ $sth->execute( $hbnumber, $dmy, $time, $borrowernumber, $volunteer, >+ $chooser, $deliverer, $instanceid ); >+ } >+ return; >+} >+ >+=head2 CreateHouseboundInstanceDetails >+ >+ CreateHouseboundInstanceDetails( $hbnumber, $dmy, $time, >+ $borrowernumber, $volunteer, >+ $chooser, $deliverer ); >+ >+Create a new housebound_instance table row containing our >+arguments. The return value is undef. >+ >+=cut >+ >+sub CreateHouseboundInstanceDetails { >+ my ( $hbnumber, $dmy, $time, $borrowernumber, $volunteer, $chooser, >+ $deliverer ) >+ = @_; >+ if ($borrowernumber) { >+ my $dbh = C4::Context->dbh; >+ my $sth = $dbh->prepare( >+'insert into housebound_instance (hbnumber, dmy, time, borrowernumber, volunteer, chooser, deliverer) values (?,?,?,?,?,?,?)' >+ ); >+ $sth->execute( $hbnumber, $dmy, $time, $borrowernumber, $volunteer, >+ $chooser, $deliverer ); >+ } >+ return; >+} >+ >+=head2 DeleteHouseboundInstanceDetails >+ >+ DeleteHouseboundInstanceDetails( $instanceid ); >+ >+Delete the row from housebound_instance identified by >+$INSTANCEID. The return value is undef. >+ >+=cut >+ >+sub DeleteHouseboundInstanceDetails { >+ my ($instanceid) = @_; >+ if ($instanceid) { >+ my $dbh = C4::Context->dbh; >+ my $sth = >+ $dbh->prepare('delete from housebound_instance where instanceid=?'); >+ $sth->execute($instanceid); >+ } >+ return; >+} >+ >+=head2 CheckPrevIssue >+ >+ CheckPrevIssue( $borrowernumber, $biblionumber ); >+ >+Return 1 if $BIBLIONUMBER has previously been issued to >+$BORROWERNUMBER, 0 otherwise. >+ >+=cut >+ >+sub CheckPrevIssue { >+ my ( $borrowernumber, $biblionumber ) = @_; >+ my $dbh = C4::Context->dbh; >+ my $previssue = 0; >+ my $sth = >+ $dbh->prepare('select itemnumber from items where biblionumber=?'); >+ $sth->execute($biblionumber); >+ >+ my $query = $dbh->prepare( >+'select count(itemnumber) from old_issues where borrowernumber=? and itemnumber=?' >+ ); >+ while ( my @row = $sth->fetchrow_array() ) { >+ $query->execute( $borrowernumber, $row[0] ); >+ while ( my @matches = $query->fetchrow_array() ) { >+ if ( $matches[0] > 0 ) { >+ $previssue = 1; >+ } >+ } >+ } >+ return $previssue; >+} >+ >+1; >+ >+__END__ >+ >+=head1 AUTHOR >+ >+Mark Gavillet >+Alex Sassmannshausen >+ >+=cut >diff --git a/installer/data/mysql/atomicupdate/housebound_tables.sql b/installer/data/mysql/atomicupdate/housebound_tables.sql >new file mode 100644 >index 0000000..ee509f8 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/housebound_tables.sql >@@ -0,0 +1,41 @@ >+CREATE TABLE IF NOT EXISTS `housebound` ( >+ `hbnumber` int(11) NOT NULL auto_increment, >+ `day` text NOT NULL, >+ `frequency` text, >+ `borrowernumber` int(11) default NULL, >+ `Itype_quant` varchar(10) default NULL, >+ `Item_subject` text, >+ `Item_authors` text, >+ `referral` text, >+ `notes` text, >+ PRIMARY KEY (`hbnumber`), >+ KEY `borrowernumber` (`borrowernumber`) >+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; >+ >+ >+ >+CREATE TABLE IF NOT EXISTS `housebound_instance` ( >+ `instanceid` int(11) NOT NULL auto_increment, >+ `hbnumber` int(11) NOT NULL, >+ `dmy` date default NULL, >+ `time` text, >+ `borrowernumber` int(11) NOT NULL, >+ `volunteer` int(11) default NULL, >+ `chooser` int(11) default NULL, >+ `deliverer` int(11) default NULL, >+ PRIMARY KEY (`instanceid`), >+ KEY `hbnumber` (`hbnumber`,`borrowernumber`,`volunteer`,`chooser`,`deliverer`) >+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; >+ >+insert into systempreferences (variable,value,options,explanation,type) values >+('useHouseboundModule',1,'','If ON, use the Housebound module','YesNo'); >+ >+insert into systempreferences (variable,value,options,explanation,type) values >+('useHouseboundCheckPrevious',1,'','If ON, checks if Housebound patrons have previous issued items to be checked out', >+'YesNo'); >+ >+insert into categories (categorycode, description, enrolmentperiod, upperagelimit, dateofbirthrequired, category_type) >+values ('VOL','Housebound volunteer','99','999','1','A'),('HB','Housebound patron','99','999','1','A'),('DELIV','Housebound deliverer','99','999','1','A'),('CHO','Housebound chooser','99','999','1','A'); >+ >+insert into authorised_values (category, authorised_value, lib) >+values ('Day','Example_Day','Change Me In Authorised Values (Day)'), ('Frequency','Example_Freq','Change Me In Authorised Values (Frequency)'); >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 6162293..8331639 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc >@@ -76,6 +76,9 @@ > [% IF ( CAN_user_parameters ) %] > [% IF ( logview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/tools/viewlog.pl?do_it=1&modules=MEMBERS&modules=circulation&object=[% borrowernumber %]&src=circ">Modification log</a></li> > [% END %] >+ [% IF useHouseboundModule %] >+ [% IF houseboundview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/housebound.pl?borrowernumber=[% borrowernumber %]">Housebound</a></li> >+ [% END %] > [% IF ( EnhancedMessagingPreferences ) %] > [% IF ( sentnotices ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/notices.pl?borrowernumber=[% borrowernumber %]">Notices</a></li> > [% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >index d1a36ae..fdb5e20 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >@@ -271,6 +271,10 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); > [% IF HIGHHOLDS %] > <li>High demand item. Loan period shortened to [% HIGHHOLDS.duration %] days (due [% HIGHHOLDS.returndate %]). Check out anyway?</li> > [% END %] >+ >+[% IF HOUSEBOUNDPREVISSUE %] >+ <li>Housebound patron has previously issued this item. Check out anyway?</li> >+[% END %] > </ul> > > [% IF HIGHHOLDS %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/housebound.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/housebound.tt >new file mode 100644 >index 0000000..4311668 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/housebound.tt >@@ -0,0 +1,69 @@ >+[% USE AuthorisedValues %] >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Koha Housebound - [% surname %], [% firstname %]</title> >+[% INCLUDE 'doc-head-close.inc' %] >+ >+</head> >+<body> >+[% INCLUDE 'header.inc' %] >+[% INCLUDE 'patron-search.inc' %] >+ >+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Housebound details for [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</div> >+ >+<div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b" >+ <h1>Housebound details for [% title %] [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</h1> >+ [% IF ( housebound.hbnumber ) %] >+ <div><ul class="toolbar"><li><span class="yui-button yui-link-button"><span class="first-child"><a href="/cgi-bin/koha/members/houseboundedit.pl?hbnumber=[% housebound.hbnumber %]&borrowernumber=[% borrowernumber %]&op=edit">Edit</a></span></span></li></ul></div> >+ <div id="houseboundinfo" class="rows"> >+ <ol> >+ <li> >+ <span class="label">Delivery day:</span> >+ [% AuthorisedValues.GetByCode( 'day', housebound.day, 0 ) >+ || housebound.day %] >+ </li> >+ <li> >+ <span class="label">Frequency:</span> >+ [% AuthorisedValues.GetByCode( 'frequency', housebound.frequency, 0 ) >+ || housebound.frequency %] >+ </li> >+ <li><span class="label">Material:</span>[% housebound.Itype_quant %]</li> >+ <li><span class="label">Subjects:</span>[% housebound.Item_subject %]</li> >+ <li><span class="label">Authors:</span>[% housebound.Item_authors %]</li> >+ <li><span class="label">Referral:</span>[% housebound.referral %]</li> >+ <li><span class="label">Notes:</span>[% housebound.notes %]</li> >+ </ol> >+ <br/> >+ <div style="height:10px;clear:both;"></div> >+ <h1>Deliveries</h1> >+ <div><ul class="toolbar"><li><span class="yui-button yui-link-button"><span class="first-child"><a href="/cgi-bin/koha/members/houseboundinstances.pl?op=add&hbnumber=[% housebound.hbnumber %]&borrowernumber=[% borrowernumber %]">Add a new delivery</a></span></span></li></ul></div> >+ <table border="0" width="100%" cellpadding="3" cellspacing="0"> >+ <tr> >+ <th>ID</th><th>Date</th><th>Volunteer</th><th>Chooser</th> >+ <th>Deliverer</th><th>Actions</th> >+ </tr> >+ [% FOREACH instance IN instanceloop %] >+ <tr> >+ <td>[% instance.instanceid %]</td> >+ <td>[% instance.dmy %] ([% instance.time %])</td> >+ <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% instance.volunteer %]">[% instance.vol %]</a></td> >+ <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% instance.chooser %]">[% instance.cho %]</a></td> >+ <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% instance.deliverer %]">[% instance.del %]</a></td> >+ <td align="center"><a href="/cgi-bin/koha/members/houseboundinstances.pl?op=edit&instanceid=[% instance.instanceid %]&borrowernumber=[% instance.borrowernumber %]&hbnumber=[% instance.hbnumber %]">Edit</a> | <a href="/cgi-bin/koha/members/houseboundinstances.pl?op=del&instanceid=[% instance.instanceid %]&borrowernumber=[% instance.borrowernumber %]&hbnumber=[% instance.hbnumber %]">Delete</a></td> >+ </tr> >+ [% END %] >+ </table> >+ </div> >+ [% ELSE %] >+ <p>This patron does not currently have registered housebound details. To add these details <a href="/cgi-bin/koha/members/houseboundedit.pl?hnbnumber=[% housebound.hbnumber %]&borrowernumber=[% borrowernumber %]&op=add">click here</a>.</p> >+ [% END %] >+ </div> >+ </div> >+ <div class="yui-b"> >+ [% INCLUDE 'circ-menu.inc' %] >+ </div> >+ </div> >+</div> >+[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundedit.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundedit.tt >new file mode 100644 >index 0000000..3668fac >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundedit.tt >@@ -0,0 +1,102 @@ >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Koha Housebound - [% surname %], [% firstname %]</title> >+[% INCLUDE 'doc-head-close.inc' %] >+<script type="text/javascript" language="javascript"> >+//<![CDATA[ >+ $(document).ready(function() { >+ $("#editform").validate() >+ }); >+</script> >+</head> >+<body> >+ [% INCLUDE 'header.inc' %] >+ [% INCLUDE 'patron-search.inc' %] >+ >+ <div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Edit housebound details for [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</div> >+ >+ <div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b"> >+ <h1>Edit housebound details for [% title %] [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</h1> >+ >+ <form id="editform" method="post" action="/cgi-bin/koha/members/houseboundedit.pl" name="form"> >+ <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" /> >+ <input type="hidden" name="hbnumber" value="[% housebound.hbnumber %]" /> >+ <input type="hidden" name="op" value="[% opeditsubmit %][% opaddsubmit %]" /> >+ <fieldset id="houseboundentry" class="rows"> >+ <legend>Housebound details</legend> >+ <ol> >+ <li> >+ <label for="day">Delivery day:</label> >+ <select id="day" name="day" required> >+ <option value="">Select a day</option> >+ [% FOREACH d IN days %] >+ [% IF ( housebound.day == d.authorised_value ) %] >+ <option value="[% d.authorised_value %]" selected="selected"> >+ [% ELSE %] >+ <option value="[% d.authorised_value %]"> >+ [% END %] >+ [% IF ( d.lib ) %] >+ [% d.lib %] >+ [% ELSE %] >+ [% d.authorised_value %] >+ [% END %] >+ </option> >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="frequency">Frequency:</label> >+ <select id="frequency" name="frequency" required> >+ <option value="">Select a frequency</option> >+ [% FOREACH f IN frequencies %] >+ [% IF ( housebound.frequency == f.authorised_value ) %] >+ <option value="[% f.authorised_value %]" selected="selected"> >+ [% ELSE %] >+ <option value="[% f.authorised_value %]"> >+ [% END %] >+ [% IF ( f.lib ) %] >+ [% f.lib %] >+ [% ELSE %] >+ [% f.authorised_value %] >+ [% END %] >+ </option> >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="Itype_quant">Material:</label> >+ <input id="Itype_quant" type="text" value="[% housebound.Itype_quant %]" size="50" name="Itype_quant"> >+ </li> >+ <li> >+ <label for="Item_subject">Subjects:</label> >+ <input id="Item_subject" type="text" value="[% housebound.Item_subject %]" size="50" name="Item_subject"> >+ </li> >+ <li> >+ <label for="Item_authors">Authors:</label> >+ <input id="Item_authors" type="text" value="[% housebound.Item_authors %]" size="50" name="Item_authors"> >+ </li> >+ <li> >+ <label for="referral">Referral:</label> >+ <input id="referral" type="text" value="[% housebound.referral %]" size="50" name="referral"> >+ </li> >+ <li> >+ <label for="notes">Notes:</label> >+ <input id="notes" type="text" value="[% housebound.notes %]" size="50" name="notes"> >+ </li> >+ </ol> >+ </fieldset> >+ <fieldset class="action"> >+ <input type="submit" value="Save changes" onclick="return check_form_housebound();" name="save"> >+ <a class="cancel" href="/cgi-bin/koha/members/housebound.pl?borrowernumber=[% borrowernumber %]">Cancel</a> >+ </fieldset> >+ </form> >+ </div> >+ </div> >+ <div class="yui-b"> >+ [% INCLUDE 'circ-menu.inc' %] >+ </div> >+ </div> >+ </div> >+ [% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundinstances.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundinstances.tt >new file mode 100644 >index 0000000..460ef5c >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/houseboundinstances.tt >@@ -0,0 +1,133 @@ >+[% USE KohaDates %] >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Koha Housebound - [% surname %], [% firstname %]</title> >+[% INCLUDE 'doc-head-close.inc' %] >+[% INCLUDE 'calendar.inc' %] >+<script type="text/javascript" language="javascript"> >+//<![CDATA[ >+ $(document).ready(function() { >+ $("#dmy").datepicker({ minDate: "-1D", >+ dateFormat: "yy-mm-dd" >+ }) >+ $("#instance_form").validate() >+ }); >+ function deleteInstance() >+ { >+ window.location="/cgi-bin/koha/members/houseboundinstances.pl?op=delsubmit&borrowernumber=[% borrowernumber %]&instanceid=[% delinstanceid %]&hbnumber=[% housebound.hbnumber %]"; >+ } >+ function cancelInstance() >+ { >+ window.location="/cgi-bin/koha/members/housebound.pl?borrowernumber=[% borrowernumber %]"; >+ } >+</script> >+</head> >+<body> >+ [% INCLUDE 'header.inc' %] >+ [% INCLUDE 'patron-search.inc' %] >+ >+ <div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Housebound deliveries for [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</div> >+ <div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b"> >+ <h1>Housebound deliveries for [% title %] [% firstname %] [% surname %] [% IF ( cardnumber ) %]([% cardnumber %])[% END %]</h1> >+ <form name="form" id="instance_form" method="post" action="/cgi-bin/koha/members/houseboundinstances.pl"> >+ <input type="hidden" name="op" value="[% op %]" /> >+ <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" /> >+ <input type="hidden" name="hbnumber" value="[% housebound.hbnumber %]" /> >+ <input type="hidden" name="instanceid" value="[% instanceid %]" /> >+ [% IF ( opdel ) %] >+ <p>Are you sure you want to delete this delivery?</p> >+ <p><button id="ybutton" onclick="deleteInstance(); return false;">YES</button> <button id="nbutton" onclick="cancelInstance(); return false;">NO</button></p> >+ [% ELSE %] >+ <fieldset class="rows" id="instance"> >+ <legend>Delivery details</legend> >+ <ol> >+ <li> >+ <label for="dmy">Date: </label> >+ <input type="text" id="dmy" name="dmy" size="20" value="[% instance.dmy %]" required/> >+ </li> >+ <li> >+ <label for="time">Time:</label> >+ <select id="time" name="time" required> >+ <option value="">Select a time</option> >+ [% IF ( instance.time == 'am' ) %] >+ <option value="am" selected="selected"> >+ [% ELSE %] >+ <option value="am"> >+ [% END %] >+ am >+ </option> >+ [% IF ( instance.time == 'pm' ) %] >+ <option value="pm" selected="selected"> >+ [% ELSE %] >+ <option value="pm"> >+ [% END %] >+ pm >+ </option> >+ </select> >+ </li> >+ <li> >+ <label for="volunteer">Chooser/Deliverer:</label> >+ <select id="volunteer" name="volunteer"> >+ <option value="">Select a chooser_deliverer</option> >+ [% FOREACH vol IN volunteerlist %] >+ [% IF ( vol.volbornumber == instance.volunteer ) %] >+ <option value="[% vol.volbornumber %]" >+ selected="selected"> >+ [% ELSE %] >+ <option value="[% vol.volbornumber %]"> >+ [% END %] >+ [% vol.fullname %] >+ </option> >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="chooser">Chooser:</label> >+ <select id="chooser" name="chooser"> >+ <option value="">Select a chooser</option> >+ [% FOREACH cho IN chooserlist %] >+ [% IF ( cho.volbornumber == instance.chooser ) %] >+ <option value="[% cho.volbornumber %]" >+ selected="selected"> >+ [% ELSE %] >+ <option value="[% cho.volbornumber %]"> >+ [% END %] >+ [% cho.fullname %] >+ </option> >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="deliverer">Deliverer:</label> >+ <select id="deliverer" name="deliverer"> >+ <option value="">Select a deliverer</option> >+ [% FOREACH del IN delivererlist %] >+ [% IF ( del.volbornumber == instance.deliverer ) %] >+ <option value="[% del.volbornumber %]" >+ selected="selected"> >+ [% ELSE %] >+ <option value="[% del.volbornumber %]"> >+ [% END %] >+ [% del.fullname %] >+ </option> >+ [% END %] >+ </select> >+ </li> >+ </ol> >+ </fieldset> >+ <fieldset class="action"> >+ <input type="submit" value="Save" name="save"> >+ <a class="cancel" href="/cgi-bin/koha/members/housebound.pl?borrowernumber=[% borrowernumber %]">Cancel</a> >+ </fieldset> >+ [% END %] >+ </form> >+ </div> >+ </div> >+ <div class="yui-b"> >+ [% INCLUDE 'circ-menu.inc' %] >+ </div> >+ </div> >+ </div> >+ [% INCLUDE 'intranet-bottom.inc' %] >diff --git a/members/housebound.pl b/members/housebound.pl >new file mode 100755 >index 0000000..2b1bccb >--- /dev/null >+++ b/members/housebound.pl >@@ -0,0 +1,91 @@ >+#!/usr/bin/perl >+ >+# Copyright 2011 Mark Gavillet >+# Copyright 2014 PTFS-Europe Ltd >+# >+# 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 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, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+use CGI; >+use C4::Context; >+use C4::Auth; >+use C4::Output; >+use C4::Members; >+use C4::Koha; >+use C4::Branch; >+use C4::Housebound qw( GetHouseboundDetails >+ GetCurrentHouseboundInstanceList ); >+ >+my $input = CGI->new(); >+ >+sub nl2br { >+ my ($t) = shift or return; >+ $t =~ s/\n/\n<br>/g; >+ return ($t); >+} >+ >+my $dbh = C4::Context->dbh; >+ >+my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+ { >+ template_name => 'members/housebound.tmpl', >+ query => $input, >+ type => 'intranet', >+ authnotrequired => 0, >+ flagsrequired => { borrowers => 1 }, >+ debug => $ENV{DEBUG}, >+ } >+); >+ >+my $borrowernumber = $input->param('borrowernumber'); >+ >+my $borrowerdetails = C4::Members::GetMemberDetails($borrowernumber); >+my $branchdetail = GetBranchDetail( $borrowerdetails->{branchcode} ); >+my $categorydetail = GetMember( borrowernumber => $borrowernumber); >+my $housebound = GetHouseboundDetails($borrowernumber); >+my $housebound_instances = GetCurrentHouseboundInstanceList($borrowernumber); >+ >+$template->param( >+ surname => $borrowerdetails->{surname}, >+ firstname => $borrowerdetails->{firstname}, >+ cardnumber => $borrowerdetails->{cardnumber}, >+ borrowernumber => $borrowerdetails->{borrowernumber}, >+ houseboundview => 'on', >+ address => $borrowerdetails->{address}, >+ address2 => $borrowerdetails->{address2}, >+ city => $borrowerdetails->{city}, >+ phone => $borrowerdetails->{phone}, >+ phonepro => $borrowerdetails->{phonepro}, >+ mobile => $borrowerdetails->{mobile}, >+ email => $borrowerdetails->{email}, >+ emailpro => $borrowerdetails->{emailpro}, >+ categoryname => $categorydetail->{description}, >+ categorycode => $borrowerdetails->{categorycode}, >+ branch => $borrowerdetails->{branch}, >+ branchname => $branchdetail->{branchname}, >+ zipcode => $borrowerdetails->{zipcode} >+); >+ >+$template->param( >+ housebound => $housebound >+); >+ >+if ($housebound_instances) { >+ $template->param( instanceloop => $housebound_instances ); >+} >+ >+output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/members/houseboundedit.pl b/members/houseboundedit.pl >new file mode 100755 >index 0000000..ced3cfb >--- /dev/null >+++ b/members/houseboundedit.pl >@@ -0,0 +1,114 @@ >+#!/usr/bin/perl >+ >+# Copyright 2011 Mark Gavillet >+# Copyright 2014 PTFS-Europe Ltd >+# >+# 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 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, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+use CGI; >+use C4::Context; >+use C4::Auth; >+use C4::Output; >+use C4::Members; >+use C4::Koha; >+use C4::Branch; >+use C4::Housebound qw( GetHouseboundDetails >+ UpdateHouseboundDetails >+ CreateHouseboundDetails ); >+ >+my $input = CGI->new(); >+ >+my $dbh = C4::Context->dbh; >+ >+my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+ { >+ template_name => 'members/houseboundedit.tmpl', >+ query => $input, >+ type => 'intranet', >+ authnotrequired => 0, >+ flagsrequired => { borrowers => 1 }, >+ debug => $ENV{DEBUG}, >+ } >+); >+ >+my $borrowernumber = $input->param('borrowernumber'); >+my $op = $input->param('op'); >+if ( $op eq 'editsubmit' ) { >+ UpdateHouseboundDetails( >+ $input->param('hbnumber'), $input->param('borrowernumber'), >+ $input->param('day'), $input->param('frequency'), >+ $input->param('Itype_quant'), $input->param('Item_subject'), >+ $input->param('Item_authors'), $input->param('referral'), >+ $input->param('notes') >+ ); >+ my $url = >+ "/cgi-bin/koha/members/housebound.pl?borrowernumber=$borrowernumber"; >+ print "Location: $url"; >+} >+if ( $op eq 'addsubmit' ) { >+ CreateHouseboundDetails( >+ $input->param('borrowernumber'), $input->param('day'), >+ $input->param('frequency'), $input->param('Itype_quant'), >+ $input->param('Item_subject'), $input->param('Item_authors'), >+ $input->param('referral'), $input->param('notes') >+ ); >+ my $url = >+ "/cgi-bin/koha/members/housebound.pl?borrowernumber=$borrowernumber"; >+ print "Location: $url"; >+} >+if ( $op eq 'edit' ) { >+ $template->param( opeditsubmit => 'editsubmit' ); >+} >+if ( $op eq 'add' ) { >+ $template->param( opaddsubmit => 'addsubmit' ); >+} >+ >+my $borrowerdetails = C4::Members::GetMemberDetails($borrowernumber); >+my $branchdetail = GetBranchDetail( $borrowerdetails->{branchcode} ); >+my $categorydetail = GetMember( borrowernumber => $borrowernumber ); >+my $housebound = GetHouseboundDetails($borrowernumber); >+ >+ >+$template->param( >+ surname => $borrowerdetails->{surname}, >+ firstname => $borrowerdetails->{firstname}, >+ cardnumber => $borrowerdetails->{cardnumber}, >+ borrowernumber => $borrowerdetails->{borrowernumber}, >+ address => $borrowerdetails->{address}, >+ address2 => $borrowerdetails->{address2}, >+ city => $borrowerdetails->{city}, >+ phone => $borrowerdetails->{phone}, >+ phonepro => $borrowerdetails->{phonepro}, >+ mobile => $borrowerdetails->{mobile}, >+ email => $borrowerdetails->{email}, >+ emailpro => $borrowerdetails->{emailpro}, >+ categoryname => $categorydetail->{description}, >+ categorycode => $borrowerdetails->{categorycode}, >+ branch => $borrowerdetails->{branch}, >+ branchname => $branchdetail->{branchname}, >+ zipcode => $borrowerdetails->{zipcode} >+); >+ >+$template->param( >+ housebound => $housebound, >+ houseboundview => 'on', >+ days => GetAuthorisedValues('day'), >+ frequencies => GetAuthorisedValues('frequency'), >+); >+ >+output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/members/houseboundinstances.pl b/members/houseboundinstances.pl >new file mode 100755 >index 0000000..ec64e8f >--- /dev/null >+++ b/members/houseboundinstances.pl >@@ -0,0 +1,138 @@ >+#!/usr/bin/perl >+ >+# Copyright 2011 Mark Gavillet >+# Copyright 2014 PTFS-Europe Ltd >+# >+# 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 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, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use strict; >+use warnings; >+use CGI; >+use C4::Context; >+use C4::Auth; >+use C4::Output; >+use C4::Members; >+use C4::Koha; >+use C4::Branch; >+use C4::Dates; >+use C4::Housebound qw( GetHouseboundDetails >+ GetHouseboundInstanceDetails >+ CreateHouseboundInstanceDetails >+ DeleteHouseboundInstanceDetails >+ UpdateHouseboundInstanceDetails >+ GetVolunteerList GetChooserList >+ GetDelivererList ); >+ >+my $input = CGI->new(); >+ >+my $dbh = C4::Context->dbh; >+ >+my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+ { >+ template_name => 'members/houseboundinstances.tmpl', >+ query => $input, >+ type => 'intranet', >+ authnotrequired => 0, >+ flagsrequired => { borrowers => 1 }, >+ debug => $ENV{DEBUG}, >+ } >+); >+ >+my $borrowernumber = $input->param('borrowernumber'); >+ >+my $op = $input->param('op'); >+if ( $op eq 'add' ) { >+ $template->param( opadd => 1, op => 'addsubmit' ); >+} >+if ( $op eq 'edit' ) { >+ $template->param( opedit => 1, op => 'editsubmit' ); >+} >+if ( $op eq 'del' ) { >+ $template->param( opdel => 1, op => 'delsubmit' ); >+} >+if ( $op eq 'addsubmit' ) { >+ CreateHouseboundInstanceDetails( >+ $input->param('hbnumber'), $input->param('dmy'), >+ $input->param('time'), $input->param('borrowernumber'), >+ $input->param('volunteer'), $input->param('chooser'), >+ $input->param('deliverer') >+ ); >+ my $url = >+ "/cgi-bin/koha/members/housebound.pl?borrowernumber=$borrowernumber"; >+ print "Location: $url"; >+} >+if ( $op eq 'delsubmit' ) { >+ DeleteHouseboundInstanceDetails( $input->param('instanceid') ); >+ my $url = >+ "/cgi-bin/koha/members/housebound.pl?borrowernumber=$borrowernumber"; >+ print "Location: $url"; >+} >+if ( $op eq 'editsubmit' ) { >+ UpdateHouseboundInstanceDetails( >+ $input->param('instanceid'), $input->param('hbnumber'), >+ $input->param('dmy'), $input->param('time'), >+ $input->param('borrowernumber'), $input->param('volunteer'), >+ $input->param('chooser'), $input->param('deliverer') >+ ); >+ my $url = >+ "/cgi-bin/koha/members/housebound.pl?borrowernumber=$borrowernumber"; >+ print "Location: $url"; >+} >+ >+my $borrowerdetails = C4::Members::GetMemberDetails($borrowernumber); >+my $branchdetail = GetBranchDetail( $borrowerdetails->{branchcode} ); >+my $categorydetail = GetMember( $borrowernumber, 'borrowernumber' ); >+my $housebound = GetHouseboundDetails($borrowernumber); >+my $volunteerlist = GetVolunteerList(); >+my $chooserlist = GetChooserList(); >+my $delivererlist = GetDelivererList(); >+my $delinstanceid = $input->param('instanceid'); >+my $instanceid = $input->param('instanceid'); >+my $instancedetails = GetHouseboundInstanceDetails($instanceid); >+ >+$template->param( >+ surname => $borrowerdetails->{surname}, >+ firstname => $borrowerdetails->{firstname}, >+ cardnumber => $borrowerdetails->{cardnumber}, >+ borrowernumber => $borrowerdetails->{borrowernumber}, >+ address => $borrowerdetails->{address}, >+ address2 => $borrowerdetails->{address2}, >+ city => $borrowerdetails->{city}, >+ phone => $borrowerdetails->{phone}, >+ phonepro => $borrowerdetails->{phonepro}, >+ mobile => $borrowerdetails->{mobile}, >+ email => $borrowerdetails->{email}, >+ emailpro => $borrowerdetails->{emailpro}, >+ categoryname => $categorydetail->{description}, >+ categorycode => $borrowerdetails->{categorycode}, >+ branch => $borrowerdetails->{branch}, >+ branchname => $branchdetail->{branchname}, >+ zipcode => $borrowerdetails->{zipcode} >+); >+ >+$template->param( >+ houseboundview => 'on', >+ housebound => $housebound, >+ DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), >+ volunteerlist => $volunteerlist, >+ chooserlist => $chooserlist, >+ delivererlist => $delivererlist, >+ delinstanceid => $delinstanceid, >+ instanceid => $instanceid, >+ instance => $instancedetails, >+); >+ >+output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/t/Housebound.t b/t/Housebound.t >new file mode 100755 >index 0000000..afbd98e >--- /dev/null >+++ b/t/Housebound.t >@@ -0,0 +1,292 @@ >+#!/usr/bin/perl >+use strict; >+use warnings; >+ >+use C4::Context; >+use Test::More tests => 29; >+use Test::MockModule; >+use DBD::Mock; >+ >+use_ok('C4::Housebound'); >+ >+use C4::Housebound qw( GetHouseboundDetails CreateHouseboundDetails >+ UpdateHouseboundDetails >+ GetCurrentHouseboundInstanceList >+ GetHouseboundInstanceDetails >+ UpdateHouseboundInstanceDetails >+ CreateHouseboundInstanceDetails >+ DeleteHouseboundInstanceDetails >+ GetVolunteerNameAndID GetVolunteerList >+ GetChooserList GetDelivererList CheckPrevIssue >+ ); >+ >+# Setup mock db >+my $module_context = new Test::MockModule('C4::Context'); >+$module_context->mock( >+ '_new_dbh', >+ sub { >+ my $dbh = DBI->connect( 'DBI:Mock:', '', '' ) >+ || die "Cannot create handle: $DBI::errstr\n"; >+ return $dbh; >+ } >+); >+ >+my $dbh = C4::Context->dbh(); >+ >+# convenience variables >+my $name; >+# mock_add_resultset vars >+my ( $sql, $sql2, @bound_params, @keys, @values, %result ) = ( ); >+# mock_history_verification vars >+my ( $history, $params, $query ) = ( ); >+ >+sub clean_vars { >+ ( $name, $sql, $sql2, @bound_params, @keys, @values, %result, >+ $history, $params, $query ) = ( ); >+ $dbh->{mock_clear_history} = 1; >+} >+ >+# Tests >+## GetHouseboundDetails >+$name = 'GetHouseboundDetails'; >+$sql = 'select * from housebound where borrowernumber=?'; >+@bound_params = ( 101 ); >+@keys = qw< hbnumber day frequency borrowernumber Itype_quant >+ Item_subject Item_authors referral notes >; >+@values = qw< 5 Monday Week-2/4 101 books dvd thrillers cooke >+ alex none >; >+foreach my $i ( 0 .. $#keys) { >+ $result{$keys[$i]} = $values[$i]; >+} >+ >+is( GetHouseboundDetails('unknown'), undef, >+ $name . ': Return value "undefined".' ); >+ >+$dbh->{mock_add_resultset} = >+ { >+ sql => $sql, >+ bound_params => [ @bound_params ], >+ results => [ [ @keys ], [ @values ] ], >+ }; >+ >+is_deeply( GetHouseboundDetails($bound_params[0]), \%result, >+ $name . ': Return value "$result".' ); >+ >+clean_vars(); >+ >+## CreateHouseboundDetails >+$name = 'CreateHouseboundDetails'; >+$sql = 'insert into housebound' >+ . ' (day, frequency, borrowernumber, Itype_quant, Item_subject,' >+ . ' Item_authors, referral, notes) values (?,?,?,?,?,?,?,?)'; >+@keys = qw< day frequency borrowernumber Itype_quant Item_subject >+ Item_authors referral notes >; >+@values = qw< Tuesday Week-3/4 103 journals psychology sam bob $name >; >+ >+is( CreateHouseboundDetails($values[2], $values[0], $values[1], $values[3], >+ $values[4], $values[5], $values[6], $values[7]), >+ undef, $name . ': Return value "undefined".'); >+ >+$history = $dbh->{mock_all_history}; >+$query = $history->[0]; >+$params = $query->bound_params; >+ >+is($query->statement, $sql, $name . ': Correct statement generated' ); >+is(scalar(@{$params}), scalar(@values), >+ $name . ': Correct number of parameters bound.' ); >+is_deeply( $params, \@values, >+ $name . ': Correct parameter values passed.' ); >+ >+clean_vars(); >+ >+## UpdateHouseboundDetails >+$name = 'UpdateHouseboundDetails'; >+$sql = 'update housebound set day=?,frequency=?,borrowernumber=?,' >+ . 'Itype_quant=?,Item_subject=?,Item_authors=?,referral=?,notes=?' >+ . ' where hbnumber=?', >+@keys = qw< day frequency borrowernumber Itype_quant Item_subject >+ Item_authors referral notes hbnumber>; >+@values = qw< Tuesday Week-3/4 103 journals psychology sam bob $name 1>; >+is( UpdateHouseboundDetails( $values[8], $values[2], $values[0], $values[1], >+ $values[3], $values[4], $values[5], $values[6], >+ $values[7] ), >+ undef, $name . ': Return value "undefined".'); >+ >+$history = $dbh->{mock_all_history}; >+$query = $history->[0]; >+$params = $query->bound_params; >+ >+is($query->statement, $sql, $name . ': Correct statement generated' ); >+is(scalar(@{$params}), scalar(@values), >+ $name . ': Correct number of parameters bound.'); >+is_deeply( $params, \@values, >+ $name . ': Correct parameter values passed.'); >+ >+clean_vars(); >+ >+## GetCurrentHouseboundInstanceList >+### GetcurrentHouseboundInstanceList's Slice causes >+### mock dbd to fail >+### Cannot test. >+ >+## GetVolunteerNameAndID >+$name = "GetVolunteerNameAndID"; >+$sql = 'select borrowernumber,title,firstname,surname' >+ . ' from borrowers where borrowernumber=?'; >+@bound_params = ( 101 ); >+@keys = qw< borrowernumber title firstname surname >; >+@values = qw< 101 Mr John Doe >; >+foreach my $i ( 0 .. $#keys) { >+ $result{$keys[$i]} = $values[$i]; >+} >+ >+is( GetVolunteerNameAndID($bound_params[0]), undef, >+ $name . ': Return value "undefined".' ); >+ >+$dbh->{mock_add_resultset} = >+ { >+ sql => $sql, >+ bound_params => [ @bound_params ], >+ results => [ [ @keys ], [ @values ] ], >+ }; >+ >+is_deeply( GetVolunteerNameAndID($bound_params[0]), >+ \%result, $name . ': Return value "$result".' ); >+ >+clean_vars(); >+ >+## GetVolunteerList >+### GetVolunteerList's Slice causes mock dbd to fail >+### Cannot test. >+ >+## GetHouseboundInstanceDetails >+$name = 'GetHouseboundInstanceDetails'; >+$sql = 'SELECT * from housebound_instance where instanceid=?'; >+@bound_params = ( 1 ); >+@keys = qw< instanceid hbnumber dmy time borrowernumber volunteer >+ chooser deliverer >; >+@values = qw< 1 5 2014-03-31 am 101 102 103 104 >; >+foreach my $i ( 0 .. $#keys) { >+ $result{$keys[$i]} = $values[$i]; >+} >+ >+is( GetHouseboundInstanceDetails('1'), undef, >+ $name . ': Return value "undefined".' ); >+ >+$dbh->{mock_add_resultset} = >+ { >+ sql => $sql, >+ bound_params => [ @bound_params ], >+ results => [ [ @keys ], [ @values ] ], >+ }; >+ >+is_deeply( GetHouseboundInstanceDetails('1'), \%result, >+ $name . ': Return value "$result".' ); >+ >+clean_vars(); >+ >+## UpdateHouseboundInstanceDetails >+$name = "UpdateHouseboundInstanceDetails"; >+$sql = 'update housebound_instance set hbnumber=?, dmy=?,' >+ . ' time=?, borrowernumber=?, volunteer=?, chooser=?, deliverer=?' >+ . ' where instanceid=?'; >+@keys = qw< hbnumber dmy time borrowernumber volunteer chooser >+ deliverer instanceid >; >+@values = qw< 5 2014-03-31 am 101 102 103 104 1 >; >+ >+is( UpdateHouseboundInstanceDetails( $values[7], $values[0], $values[1], >+ $values[2], $values[3], $values[4], >+ $values[5], $values[6] ), undef, >+ $name . ': Return value "undefined".' ); >+ >+$history = $dbh->{mock_all_history}; >+$query = $history->[0]; >+$params = $query->bound_params; >+ >+is($query->statement, $sql, $name . ': Correct statement generated' ); >+is(scalar(@{$params}), scalar(@values), >+ $name . ': Correct number of parameters bound.'); >+is_deeply( $params, \@values, >+ $name . ': Correct parameter values passed.'); >+ >+clean_vars(); >+ >+## CreateHouseboundInstanceDetails >+$name = "CreateHouseboundInstanceDetails"; >+$sql = 'insert into housebound_instance' >+ . ' (hbnumber, dmy, time, borrowernumber, volunteer, chooser, deliverer)' >+ . ' values (?,?,?,?,?,?,?)'; >+@keys = qw< hbnumber dmy time borrowernumber volunteer chooser >+ deliverer >; >+@values = qw< 5 2014-03-31 am 101 102 103 104 >; >+ >+is( CreateHouseboundInstanceDetails( @values ), undef, >+ $name . ': Return value "undefined".'); >+ >+$history = $dbh->{mock_all_history}; >+$query = $history->[0]; >+$params = $query->bound_params; >+ >+is($query->statement, $sql, $name . ': Correct statement generated' ); >+is(scalar(@{$params}), scalar(@values), >+ $name . ': Correct number of parameters bound.' ); >+is_deeply( $params, \@values, >+ $name . ': Correct parameter values passed.' ); >+ >+$dbh->{mock_clear_history} = 1; >+ >+## DeleteHouseboundInstanceDetails >+$name = 'DeleteHouseboundInstanceDetails'; >+$sql = 'delete from housebound_instance where instanceid=?'; >+@keys = qw< instanceid >; >+@values = qw< 1 >; >+ >+is( DeleteHouseboundInstanceDetails( @values ), undef, >+ $name . ': Return value "undefined".'); >+ >+$history = $dbh->{mock_all_history}; >+$query = $history->[0]; >+$params = $query->bound_params; >+ >+is($query->statement, $sql, $name . ': Correct statement generated' ); >+is(scalar(@{$params}), scalar(@values), >+ $name . ': Correct number of parameters bound.' ); >+is_deeply( $params, \@values, >+ $name . ': Correct parameter values passed.' ); >+ >+clean_vars(); >+ >+## CheckPrevIssue >+$name = 'CheckPrevIssue'; >+$sql = 'select itemnumber from items where biblionumber=?'; >+$sql2 = 'select count(itemnumber) from old_issues' >+ . ' where borrowernumber=? and itemnumber=?'; >+@keys = qw< borrowernumber biblionumber itemnumber >; >+@values = qw< 101 3576 5043 >; >+ >+# 1) Prepop items with itemnumber for result >+$dbh->{mock_add_resultset} = { >+ sql => $sql, >+ bound_params => $keys[1], >+ results => [ [ ( $keys[2] ) ], [ ( $values[2] ) ] ], >+ }; >+# 2) Test if never issued before (expect 0) >+is( CheckPrevIssue( $keys[0], $keys[1] ), 0, >+ $name . ': Return value "no matches".' ); >+# 3) Prepop old_issues with itemnumber and borrowernumber >+$dbh->{mock_add_resultset} = { >+ sql => $sql2, >+ bound_params => [ $keys[0], $keys[2] ], >+ results => [ >+ [ ( $keys[0], $keys[2] ) ], >+ [ ( $values[0], $values[2] ) ], >+ [ ( $values[0], $values[2] ) ], >+ [ ( $values[0], $values[2] ) ], >+ [ ( $values[0], $values[2] ) ], >+ ], >+ }; >+# 4) Test if issued before (e.g. 7 times รข expect 1) >+is( CheckPrevIssue( $keys[0], $keys[1] ), 1, >+ $name . ': Return value "> 0 matches".' ); >+ >+clean_vars(); >-- >1.7.2.5
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 5670
:
3038
|
22162
|
22163
|
22164
|
22165
|
26816
|
27288
|
50930
|
51377
|
51875
|
54384
|
54385
|
55326
|
55334
|
55335
|
55336
|
55734
|
55735
|
55736
|
55737
|
55738
|
55739
|
55865
|
55866
|
55867
|
55890
|
55891
|
56298
|
56299
|
56300
|
56301
|
56302
|
56308
|
56337
|
56341
|
56346
|
56347
|
56348
|
56349
|
56350
|
56351
|
56352
|
56353
|
56354
|
56355
|
56356
|
56357
|
56358
|
56359
|
56360
|
56361
|
56362
|
56363
|
56364
|
56365
|
56366
|
56367
|
56368
|
56369
|
56580
|
56581
|
56582
|
56583
|
56584
|
56585
|
56586
|
56587
|
56588
|
56589
|
56590
|
56591
|
56592
|
56593
|
56594
|
56595
|
56596
|
56597
|
56598
|
56599
|
56600
|
56601
|
56602
|
56603
|
56604
|
56605
|
56606