From 0b175f79e2a47cdff0f05ef634547a2e40ec8593 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 5 Nov 2012 14:35:23 -0500 Subject: [PATCH] Bug 9011 - Add the ability to store the last patron to return an item Currently if the AnonymousPatron system preference is in use, all patron data is anonymized. Some libraries would like to be able to see the last patron who returned out an item ( in case of damage ) but still keep all other patrons anonymized. * Add the field items.last_borrower, foreign key to borrowers.borrowernumber * Add new system preference StoreLastBorrower * If StoreLastBorrower is enabled, upon checkin have Koha set this new field to the patron who last returned this item. * If this new field has a value, link to the patron from the item details page. Test plan: 1) Apply patch 2) Run updatedatabase.pl 3) Enable StoreLastBorrower 4) Issue an item to a patron and return said item 5) Issue the same item to a second patron, do not return it. 6) View moredetail.pl for the given bib, find the given item. There should be a new field in the history list 'Last returned by' with a link to the given borrowernumber. Optionally, you can also verify this works even if patron issuing history has been set to anonymize issues upon return. Signed-off-by: Owen Leonard --- C4/Circulation.pm | 4 ++ Koha/Template/Plugin/KohaBorrowers.pm | 44 ++++++++++++++++++++ catalogue/moredetail.pl | 1 + installer/data/mysql/kohastructure.sql | 4 ++ installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 14 ++++++ .../prog/en/modules/admin/preferences/opac.pref | 7 +++ .../prog/en/modules/catalogue/moredetail.tt | 2 + .../opac-tmpl/prog/en/modules/opac-privacy.tt | 2 + opac/opac-privacy.pl | 1 + 10 files changed, 80 insertions(+), 0 deletions(-) create mode 100644 Koha/Template/Plugin/KohaBorrowers.pm diff --git a/C4/Circulation.pm b/C4/Circulation.pm index ca66931..721aa50 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2001,6 +2001,10 @@ sub MarkIssueReturned { WHERE borrowernumber = ? AND itemnumber = ?"); $sth_del->execute($borrowernumber, $itemnumber); + + if ( C4::Context->preference('StoreLastBorrower') ) { + $dbh->do("UPDATE items SET last_returned_by = ? WHERE itemnumber = ?", undef, ( $borrowernumber, $itemnumber ) ); + } } =head2 _debar_user_on_return diff --git a/Koha/Template/Plugin/KohaBorrowers.pm b/Koha/Template/Plugin/KohaBorrowers.pm new file mode 100644 index 0000000..c575607 --- /dev/null +++ b/Koha/Template/Plugin/KohaBorrowers.pm @@ -0,0 +1,44 @@ +package Koha::Template::Plugin::KohaBorrowers; + +# Copyright ByWater Solutions 2013 + +# 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 Modern::Perl; + +use Template::Plugin; +use base qw( Template::Plugin ); + +use C4::Context; + +=pod + +This plugin contains TT helper functions related to borrowers + +=cut + +sub BorrowernumberToCardnumber { + my ( $self, $borrowernumber ) = @_; + + my $sql = "SELECT cardnumber FROM borrowers WHERE borrowernumber = ?"; + my $sth = C4::Context->dbh->prepare( $sql ); + $sth->execute( $borrowernumber ); + my ( $cardnumber ) = $sth->fetchrow_array(); + + return $cardnumber; +} + +1; diff --git a/catalogue/moredetail.pl b/catalogue/moredetail.pl index f0cfb13..f66371f 100755 --- a/catalogue/moredetail.pl +++ b/catalogue/moredetail.pl @@ -212,6 +212,7 @@ $template->param( z3950_search_params => C4::Search::z3950_search_args(GetBiblioData($biblionumber)), subtitle => $subtitle, hidepatronname => $hidepatronname, + StoreLastBorrower => C4::Context->preference('StoreLastBorrower'), ); $template->param(ONLY_ONE => 1) if ( $itemnumber && $showncount != @items ); diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 8a8b70f..f631826 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -862,6 +862,7 @@ CREATE TABLE `deleteditems` ( `replacementpricedate` date default NULL, -- the date the price is effective from (MARC21 952$w) `datelastborrowed` date default NULL, -- the date the item was last checked out `datelastseen` date default NULL, -- the date the item was last see (usually the last time the barcode was scanned or inventory was done) + `last_returned_by` int(11) DEFAULT NULL, -- the last borrower to return an item `stack` tinyint(1) default NULL, `notforloan` tinyint(1) NOT NULL default 0, -- authorized value defining why this item is not for loan (MARC21 952$7) `damaged` tinyint(1) NOT NULL default 0, -- authorized value defining this item as damaged (MARC21 952$4) @@ -899,6 +900,7 @@ CREATE TABLE `deleteditems` ( KEY `delhomebranch` (`homebranch`), KEY `delholdingbranch` (`holdingbranch`), KEY `itype_idx` (`itype`) + KEY `del_last_returned_by` (`last_returned_by`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- @@ -1154,6 +1156,7 @@ CREATE TABLE `items` ( -- holdings/item information `replacementpricedate` date default NULL, -- the date the price is effective from (MARC21 952$w) `datelastborrowed` date default NULL, -- the date the item was last checked out/issued `datelastseen` date default NULL, -- the date the item was last see (usually the last time the barcode was scanned or inventory was done) + `last_returned_by` int(11) DEFAULT NULL, -- the last borrower to return an item `stack` tinyint(1) default NULL, `notforloan` tinyint(1) NOT NULL default 0, -- authorized value defining why this item is not for loan (MARC21 952$7) `damaged` tinyint(1) NOT NULL default 0, -- authorized value defining this item as damaged (MARC21 952$4) @@ -1193,6 +1196,7 @@ CREATE TABLE `items` ( -- holdings/item information KEY `items_location` (`location`), KEY `items_ccode` (`ccode`), KEY `itype_idx` (`itype`), + KEY `last_returned_by` (`last_returned_by`), CONSTRAINT `items_ibfk_1` FOREIGN KEY (`biblioitemnumber`) REFERENCES `biblioitems` (`biblioitemnumber`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `items_ibfk_2` FOREIGN KEY (`homebranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE, CONSTRAINT `items_ibfk_3` FOREIGN KEY (`holdingbranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index c8caee7..0558ccc 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -430,3 +430,4 @@ INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) V INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('CalculateFinesOnReturn','1','Switch to control if overdue fines are calculated on return or not', '', 'YesNo'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AcqWarnOnDuplicateInvoice','0','Warn librarians when they try to create a duplicate invoice', '', 'YesNo'); INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('AllowTooManyOverride', '1', 'If on, allow staff to override and check out items when the patron has reached the maximum number of allowed checkouts', '', 'YesNo'); +INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('StoreLastBorrower','0','','If ON, the last borrower to return an item will be stored in items.last_returned_by','YesNo'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 74aeb3e..b1a6609 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -7067,6 +7067,20 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.00.XXX"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + $dbh->do("ALTER TABLE items ADD last_returned_by INT( 11 ) NULL DEFAULT NULL AFTER datelastseen"); + $dbh->do("ALTER TABLE items ADD INDEX ( last_returned_by )"); + + $dbh->do("ALTER TABLE deleteditems ADD last_returned_by INT( 11 ) NULL DEFAULT NULL AFTER datelastseen"); + $dbh->do("ALTER TABLE deleteditems ADD INDEX ( last_returned_by )"); + + $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('StoreLastBorrower','0','','If ON, the last borrower to return an item will be stored in items.last_returned_by','YesNo')"); + + print "Upgrade to $DBversion done ( Add syspref StoreLastBorrower )\n"; + SetVersion ($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref index 90295ef..0b2a31d 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref @@ -551,6 +551,13 @@ OPAC: track: "Track" no: "Don't track" - links that patrons click on + - + - pref: StoreLastBorrower + default: 0 + choices: + yes: Store + no: "Don't store" + - the last patron to return an item. This setting is independent of opacreadinghistory/AnonymousPatron. Shelf Browser: - diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt index 5234e28..58d5cbd 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt @@ -1,3 +1,4 @@ +[% USE KohaBorrowers %] [% INCLUDE 'doc-head-open.inc' %] Koha › Catalog › Item details for [% title %] [% FOREACH subtitl IN subtitle %] [% subtitl.subfield %][% END %] [% INCLUDE 'doc-head-close.inc' %] @@ -201,6 +202,7 @@
  • Last seen:[% IF ( ITEM_DAT.datelastseen ) %][% ITEM_DAT.datelastseen | $KohaDates %] [%END %] 
  • Last borrowed:[% IF (ITEM_DAT.datelastborrowed ) %][% ITEM_DAT.datelastborrowed | $KohaDates %][% END %] 
  • + [% IF ( StoreLastBorrower && ITEM_DAT.last_returned_by ) %]
  • Last returned by: [% KohaBorrowers.BorrowernumberToCardnumber( ITEM_DAT.last_returned_by ) %] 
  • [% END %] [% IF ( ITEM_DAT.card0 ) %]
  • Last borrower: [% ITEM_DAT.card0 %] 
  • [% END %] [% IF ( ITEM_DAT.card1 ) %]
  • Previous borrower: [% ITEM_DAT.card1 %] 
  • [% END %] [% IF ( ITEM_DAT.card2 ) %]
  • Previous borrower: [% ITEM_DAT.card2 %] 
  • [% END %] diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-privacy.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-privacy.tt index 3bb988f..05d54ca 100644 --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-privacy.tt +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-privacy.tt @@ -61,6 +61,8 @@ [% END %] + + [% IF StoreLastBorrower %]

    Please note, the last person to return an item is tracked for the management of items returned damaged.

    [% END %] diff --git a/opac/opac-privacy.pl b/opac/opac-privacy.pl index 22fe694..5905447 100755 --- a/opac/opac-privacy.pl +++ b/opac/opac-privacy.pl @@ -68,6 +68,7 @@ $template->param( 'Ask_data' => '1', 'firstname' => $borr->{'firstname'}, 'surname' => $borr->{'surname'}, 'privacyview' => 1, + 'StoreLastBorrower' => C4::Context->preference('StoreLastBorrower'), ); output_html_with_http_headers $query, $cookie, $template->output; -- 1.7.2.5