[Koha-patches] [PATCH] Update longoverdue.pl cron job to manage setting lost values.
Ryan Higgins
rch at liblime.com
Sun Aug 10 22:42:29 CEST 2008
This patch deprecates the NoReturnSetLost system preference, which, as it
turns out, was not implemented anyway. New longoverdue script allows one to
specify on the commandline system-wide delays for changing items to different
lost statuses, and optionally charge for the item.
---
C4/Accounts.pm | 51 ++++++++-
catalogue/updateitem.pl | 38 +------
installer/data/mysql/en/mandatory/sysprefs.sql | 1 -
.../1-Obligatoire/unimarc_standard_systemprefs.sql | 1 -
misc/cronjobs/longoverdue.pl | 128 +++++++++++++++++---
5 files changed, 158 insertions(+), 61 deletions(-)
diff --git a/C4/Accounts.pm b/C4/Accounts.pm
index 3a57154..34dcede 100644
--- a/C4/Accounts.pm
+++ b/C4/Accounts.pm
@@ -23,7 +23,7 @@ use C4::Context;
use C4::Stats;
use C4::Members;
use C4::Items;
-use C4::Circulation;
+use C4::Circulation qw(MarkIssueReturned);
use vars qw($VERSION @ISA @EXPORT);
@@ -35,7 +35,7 @@ BEGIN {
@EXPORT = qw(
&recordpayment &makepayment &manualinvoice
&getnextacctno &reconcileaccount &getcharges &getcredits
- &getrefunds
+ &getrefunds &chargelostitem
); # removed &fixaccounts
}
@@ -262,7 +262,7 @@ EOT
=cut
-sub returnlost {
+sub returnlost{
my ( $borrowernumber, $itemnum ) = @_;
C4::Circulation::MarkIssueReturned( $borrowernumber, $itemnum );
my $borrower = C4::Members::GetMember( $borrowernumber, 'borrowernumber' );
@@ -272,6 +272,51 @@ sub returnlost {
ModItem({ paidfor => "Paid for by $bor $date" }, undef, $itemnum);
}
+
+sub chargelostitem{
+# http://wiki.koha.org/doku.php?id=en:development:kohastatuses
+# lost ==1 Lost, lost==2 longoverdue, lost==3 lost and paid for
+# FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that
+# a charge has been added
+# FIXME : if no replacement price, borrower just doesn't get charged?
+
+ my $dbh = C4::Context->dbh();
+ my ($itemnumber) = @_;
+ my $sth=$dbh->prepare("SELECT * FROM issues, items WHERE issues.itemnumber=items.itemnumber and issues.itemnumber=?");
+ $sth->execute($itemnumber);
+ my $issues=$sth->fetchrow_hashref();
+
+ # if a borrower lost the item, add a replacement cost to the their record
+ if ( $issues->{borrowernumber} ){
+
+ # first make sure the borrower hasn't already been charged for this item
+ my $sth1=$dbh->prepare("SELECT * from accountlines
+ WHERE borrowernumber=? AND itemnumber=? and accounttype='L'");
+ $sth1->execute($issues->{'borrowernumber'},$itemnumber);
+ my $existing_charge_hashref=$sth1->fetchrow_hashref();
+
+ # OK, they haven't
+ unless ($existing_charge_hashref) {
+ # This item is on issue ... add replacement cost to the borrower's record and mark it returned
+ # Note that we add this to the account even if there's no replacement price, allowing some other
+ # process (or person) to update it, since we don't handle any defaults for replacement prices.
+ my $accountno = getnextacctno($issues->{'borrowernumber'});
+ my $sth2=$dbh->prepare("INSERT INTO accountlines
+ (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding,itemnumber)
+ VALUES (?,?,now(),?,?,'L',?,?)");
+ $sth2->execute($issues->{'borrowernumber'},$accountno,$issues->{'replacementprice'},
+ "Lost Item $issues->{'title'} $issues->{'barcode'}",
+ $issues->{'replacementprice'},$itemnumber);
+ $sth2->finish;
+ # FIXME: Log this ?
+ }
+ #FIXME : Should probably have a way to distinguish this from an item that really was returned.
+ warn " $issues->{'borrowernumber'} / $itemnumber ";
+ C4::Circulation::MarkIssueReturned($issues->{borrowernumber},$itemnumber);
+ }
+ $sth->finish;
+}
+
=head2 manualinvoice
&manualinvoice($borrowernumber, $itemnumber, $description, $type,
diff --git a/catalogue/updateitem.pl b/catalogue/updateitem.pl
index 26a99fe..7b0b673 100755
--- a/catalogue/updateitem.pl
+++ b/catalogue/updateitem.pl
@@ -74,42 +74,6 @@ if (defined $itemnotes) { # i.e., itemnotes parameter passed from form
ModItem($item_changes, $biblionumber, $itemnumber);
-# check issues iff itemlost.
-# http://wiki.koha.org/doku.php?id=en:development:kohastatuses
-# lost ==1 Lost, lost==2 longoverdue, lost==3 lost and paid for
-# FIXME: itemlost should be set to 3 after payment is made, should be a warning to the interface that
-# a charge has been added
-# FIXME : if no replacement price, borrower just doesn't get charged?
-if ($itemlost==1) {
- my $sth=$dbh->prepare("SELECT * FROM issues WHERE itemnumber=?");
- $sth->execute($itemnumber);
- my $issues=$sth->fetchrow_hashref();
-
- # if a borrower lost the item, add a replacement cost to the their record
- if ( ($issues->{borrowernumber}) && ($itemlost==1) ){
-
- # first make sure the borrower hasn't already been charged for this item
- my $sth1=$dbh->prepare("SELECT * from accountlines
- WHERE borrowernumber=? AND itemnumber=?");
- $sth1->execute($issues->{'borrowernumber'},$itemnumber);
- my $existing_charge_hashref=$sth1->fetchrow_hashref();
-
- # OK, they haven't
- unless ($existing_charge_hashref) {
- # This item is on issue ... add replacement cost to the borrower's record and mark it returned
- my $accountno = getnextacctno($issues->{'borrowernumber'});
- my $sth2=$dbh->prepare("INSERT INTO accountlines
- (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding,itemnumber)
- VALUES
- (?,?,now(),?,?,'L',?,?)");
- $sth2->execute($issues->{'borrowernumber'},$accountno,$item_data_hashref->{'replacementprice'},
- "Lost Item $item_data_hashref->{'title'} $item_data_hashref->{'barcode'}",
- $item_data_hashref->{'replacementprice'},$itemnumber);
- $sth2->finish;
- # FIXME: Log this ?
- }
- }
- $sth->finish;
-}
+C4::Accounts::chargelostitem($itemnumber) if ($itemlost==1) ;
print $cgi->redirect("moredetail.pl?biblionumber=$biblionumber&itemnumber=$itemnumber#item$itemnumber");
diff --git a/installer/data/mysql/en/mandatory/sysprefs.sql b/installer/data/mysql/en/mandatory/sysprefs.sql
index 30ae545..00f8254 100755
--- a/installer/data/mysql/en/mandatory/sysprefs.sql
+++ b/installer/data/mysql/en/mandatory/sysprefs.sql
@@ -58,7 +58,6 @@ INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('memberofinstitution',0,'If ON, patrons can be linked to institutions',NULL,'YesNo');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MIME','EXCEL','Define the default application for exporting report data','EXCEL|OPENOFFICE.ORG','Choice');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('noissuescharge',5,'Define maximum amount withstanding before check outs are blocked','','Integer');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoReturnSetLost',99,'(if you have fines only) After this limit a non returned item is automatically marked as lost, and the itemprice is charged to the patron','','Integer');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NotifyBorrowerDeparture',30,'Define number of days before expiry where circulation is warned about patron account expiry',NULL,'Integer');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacAuthorities',1,'If ON, enables the search authorities link on OPAC',NULL,'YesNo');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('opacbookbag',1,'If ON, enables display of Cart feature','','YesNo');
diff --git a/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql b/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
index 59d9930..d074956 100755
--- a/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
+++ b/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
@@ -59,7 +59,6 @@ INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('memberofinstitution', '0', 'Vos adhérents sont ils membres d''une institution ?', NULL, 'YesNo');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MIME', 'OPENOFFICE.ORG', 'Ce paramètre définit l''application par défaut à ouvrir lorsqu''on télécharge un fichier (OpenOffice.org ou MS-Excel habituellement)', 'EXCEL|OPENOFFICE.ORG', 'Choice');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('noissuescharge', '5', 'Ce paramètre définit le montant maximal des dettes au delà duquel le lecteur ne peut plus emprunter', '', 'Integer');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoReturnSetLost','99','(uniquement si vous avez des amendes) Après cette limite, un document non retourné est automatiquement marqué perdu, et le cout du document est imputé à l''adhérent ','','Integer');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NotifyBorrowerDeparture', '0', 'Ce paramètre permet d''être prévenu N jours avant l''expiration de la carte d''un adhérent, à la banque de prêt.', '', 'Integer');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('DebugLevel', '2', 'Définit le niveau d''affichage des erreurs en cas de problème : 0= aucun affichage, 1= un peu, 2=tout (peut être risqué pour la sécurité)', '0|1|2', 'Choice');
INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoZebra','1','If ON, Zebra indexing is turned off, simpler setup, but slower searches','','YesNo');
diff --git a/misc/cronjobs/longoverdue.pl b/misc/cronjobs/longoverdue.pl
index 56b834f..13c0e90 100755
--- a/misc/cronjobs/longoverdue.pl
+++ b/misc/cronjobs/longoverdue.pl
@@ -1,17 +1,30 @@
#!/usr/bin/perl -w
#-----------------------------------
-# Script Name: longoverdue.pl
-# Script Version: 1.0.0
-# Date: 2004/04/01
-# Author: Stephen Hedges shedges at skemotah.com
-# Description: set itemlost status to '2'
-# ("long overdue") on items more than 90
-# days overdue.
-# Usage: longoverdue.pl.
-# Revision History:
-# 1.0.0 2004/04/01: original version
+# Copyright 2008 LibLime
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
#-----------------------------------
+=head1 NAME
+
+longoverdue.pl cron script to set lost statuses on overdue materials.
+ Execute without options for help.
+
+=cut
+
use strict;
BEGIN {
# find Koha's Perl modules
@@ -21,20 +34,97 @@ BEGIN {
}
use C4::Context;
use C4::Items;
+use C4::Accounts;
+use Getopt::Long;
+
+my $lost; # key=lost value, value=num days.
+my ($charge, $verbose, $confirm);
+
+GetOptions(
+ 'l|lost=s%' => \$lost,
+ 'c|charge=s' => \$charge,
+ 'confirm' => \$confirm,
+ 'v|verbose' => \$verbose,
+ );
+my $usage = << 'ENDUSAGE';
+longoverdue.pl : This cron script set lost values on overdue items and optionally sets charges the patron's account
+for the item's replacement price. It is designed to be run as a nightly job. The command line options that globally
+define this behavior for this script will likely be moved into Koha's core circulation / issuing rules code in a
+near-term release, so this script is not intended to have a long lifetime.
-my $dbh = C4::Context->dbh;
+This script takes the following parameters :
-my $itemnos_sth=$dbh->prepare("SELECT items.itemnumber FROM issues,items WHERE items.itemnumber=issues.itemnumber AND DATE_SUB(CURDATE(),INTERVAL 90 DAY) > date_due AND (itemlost=0 OR itemlost IS NULL)");
+ --lost | -l This option may be used multiple times, and takes the form of n=lv ,
+ where n is num days overdue, and lv is the lost value.
-# get itemnumbers of items more than 90 days overdue
-$itemnos_sth->execute();
+ --charge | -c This specifies what lost value triggers Koha to charge the account for the
+ lost item. Replacement costs are not charged if this is not specified.
-while (my $row=$itemnos_sth->fetchrow_arrayref) {
- my $itemnumber=$row->[0];
+ --verbose | v verbose.
- ModItem({ itemlost => 2 }, undef, $itemnumber);
-# print "$item\n";
+ --confirm confirm. without -c, this script will report the number of affected items and
+ return without modifying any records.
+
+ example : $PERL5LIB/misc/cronjobs/longoverdue.pl --lost 30=2 --lost 60=1 --charge 1
+ would set LOST= 1 after 30 days, LOST= 2 after 60 days, and charge the account when setting LOST= 2 (i.e., 60 days).
+ This would be suitable for the Koha default LOST authorized values of 1 -> 'Lost' and 2 -> 'Long Overdue'
+
+WARNING: Flippant use of this script could set all or most of the items in your catalog to Lost and charge your
+patrons for them!
+
+ENDUSAGE
+
+if ( ! defined($lost) ) {
+ print $usage;
+ die;
}
-$itemnos_sth->finish;
+my $dbh = C4::Context->dbh();
+
+#FIXME - Should add a 'system' user and get suitable userenv for it for logging, etc.
+
+my $endrange = 366; # hardcoded - don't deal with anything overdue by more than this num days.
+
+my @interval = sort keys %$lost;
+
+my $count;
+my @report;
+
+# FIXME - The item is only marked returned if you supply --charge .
+# We need a better way to handle this.
+#
+# FIXME - no sql should be outside the API.
+
+my $query = "SELECT items.itemnumber,borrowernumber FROM issues,items WHERE items.itemnumber=issues.itemnumber AND
+ DATE_SUB( CURDATE(), INTERVAL ? DAY) > date_due AND DATE_SUB( CURDATE(), INTERVAL ? DAY ) <= date_due AND itemlost <> ? ";
+my $sth_items = $dbh->prepare($query);
+while ( my $startrange = shift @interval ) {
+ if( my $lostvalue = $lost->{$startrange} ) {
+ #warn "query: $query \\with\\ params: $startrange,$endrange, $lostvalue "if($verbose);
+ warn "starting range: $startrange - $endrange with lost value $lostvalue" if($verbose);
+ $sth_items->execute( $startrange,$endrange, $lostvalue );
+ $count=0;
+ while (my $row=$sth_items->fetchrow_hashref) {
+ warn "updating $row->{'itemnumber'} for borrower $row->{'borrowernumber'} to lost: $lostvalue" if($verbose);
+ if($confirm) {
+ ModItem({ itemlost => $lostvalue }, $row->{'biblionumber'}, $row->{'itemnumber'});
+ chargelostitem($row->{'itemnumber'}) if( $charge && $charge eq $lostvalue);
+ }
+ $count++;
+ }
+ push @report, { range => "$startrange - $endrange",
+ lostvalue => $lostvalue,
+ count => $count,
+ };
+ }
+ $endrange = $startrange;
+}
+for my $range (@report) {
+ for my $var (keys %$range) {
+ warn "$var : $range->{$var}";
+ }
+}
+
+
+$sth_items->finish;
$dbh->disconnect;
--
1.5.5.GIT
More information about the Koha-patches
mailing list