overduenotices-csv from 2.2 + DL file from overdue.pl

Signed-off-by: Chris Cormack <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Paul POULAIN 2008-02-10 01:41:47 -06:00 committed by Joshua Ferraro
parent 2915b0f7a3
commit 3c58e8faad
3 changed files with 227 additions and 36 deletions

View File

@ -37,6 +37,7 @@ my $borcatfilter = $input->param('borcat');
my $itemtypefilter = $input->param('itemtype');
my $borflagsfilter = $input->param('borflags') || " ";
my $branchfilter = $input->param('branch');
my $op = $input->param('op');
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{
@ -50,6 +51,18 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
);
my $dbh = C4::Context->dbh;
# download the complete CSV
if ($op eq 'csv') {
warn "BRANCH : $branchfilter";
my $csv = `../misc/cronjobs/overduenotices-csv.pl -c -n -b $branchfilter`;
print $input->header(-type => 'application/vnd.sun.xml.calc',
-encoding => 'utf-8',
-attachment=>"overdues.csv",
-filename=>"overdues.csv" );
print $csv;
exit;
}
my $req;
$req = $dbh->prepare( "select categorycode, description from categories order by description");
$req->execute;
@ -95,13 +108,14 @@ foreach my $thisbranch ( sort keys %$branches ) {
my %row = (
value => $thisbranch,
branchname => $branches->{$thisbranch}->{'branchname'},
selected => (C4::Context->userenv && $branches->{$thisbranch}->{'branchcode'} eq C4::Context->userenv->{'branch'})
selected => ($branches->{$thisbranch}->{'branchcode'} eq $branchfilter)
);
push @branchloop, \%row;
}
$branchfilter=C4::Context->userenv->{'branch'} if ($onlymine && !$branchfilter);
$template->param( branchloop => \@branchloop );
$template->param( branchloop => \@branchloop,
branchfilter => $branchfilter);
$template->param(borcatloop=> \@borcatloop,
itemtypeloop => \@itemtypeloop,
branchloop=> \@branchloop,
@ -131,36 +145,36 @@ my $todaysdate =
$bornamefilter =~s/\*/\%/g;
$bornamefilter =~s/\?/\_/g;
my $strsth="select date_due,concat(surname,' ', firstname) as borrower,
borrowers.phone, borrowers.email,issues.itemnumber, items.barcode, biblio.title, biblio.author,borrowers.borrowernumber,biblio.biblionumber
from issues
my $strsth="SELECT date_due,concat(surname,' ', firstname) as borrower,
borrowers.phone, borrowers.email,issues.itemnumber, items.barcode, biblio.title, biblio.author,borrowers.borrowernumber,biblio.biblionumber,borrowers.branchcode
FROM issues
LEFT JOIN borrowers ON (issues.borrowernumber=borrowers.borrowernumber )
LEFT JOIN items ON (issues.itemnumber=items.itemnumber)
LEFT JOIN biblioitems ON (biblioitems.biblioitemnumber=items.biblioitemnumber)
LEFT JOIN biblio ON (biblio.biblionumber=items.biblionumber )
where isnull(returndate) ";
WHERE isnull(returndate) ";
$strsth.= " && date_due<'".$todaysdate."' " unless ($showall);
$strsth.=" && (borrowers.firstname like '".$bornamefilter."%' or borrowers.surname like '".$bornamefilter."%' or borrowers.cardnumber like '".$bornamefilter."%')" if($bornamefilter) ;
$strsth.=" && borrowers.categorycode = '".$borcatfilter."' " if($borcatfilter) ;
$strsth.=" && biblioitems.itemtype = '".$itemtypefilter."' " if($itemtypefilter) ;
$strsth.=" && borrowers.flags = '".$borflagsfilter."' " if ($borflagsfilter ne " ") ;
$strsth.=" && issues.branchcode = '".$branchfilter."' " if($branchfilter) ;
$strsth.=" && borrowers.branchcode = '".$branchfilter."' " if($branchfilter) ;
if ($order eq "borrower"){
$strsth.=" order by borrower,date_due " ;
$strsth.=" ORDER BY borrower,date_due " ;
} elsif ($order eq "title"){
$strsth.=" order by title,date_due,borrower ";
$strsth.=" ORDER BY title,date_due,borrower ";
} elsif ($order eq "barcode"){
$strsth.=" order by items.barcode,date_due,borrower ";
}elsif ($order eq "borrower desc"){
$strsth.=" order by borrower desc,date_due " ;
} elsif ($order eq "title desc"){
$strsth.=" order by title desc,date_due,borrower ";
} elsif ($order eq "barcode desc"){
$strsth.=" order by items.barcode desc,date_due,borrower ";
} elsif ($order eq "date_due desc"){
$strsth.=" order by date_due desc,borrower ";
$strsth.=" ORDER BY items.barcode,date_due,borrower ";
}elsif ($order eq "borrower DESC"){
$strsth.=" ORDER BY borrower desc,date_due " ;
} elsif ($order eq "title DESC"){
$strsth.=" ORDER BY title desc,date_due,borrower ";
} elsif ($order eq "barcode DESC"){
$strsth.=" ORDER BY items.barcode desc,date_due,borrower ";
} elsif ($order eq "date_due DESC"){
$strsth.=" ORDER BY date_due DESC,borrower ";
} else {
$strsth.=" order by date_due,borrower ";
$strsth.=" ORDER BY date_due,borrower ";
}
my $sth=$dbh->prepare($strsth);
#warn "overdue.pl : query string ".$strsth;
@ -188,7 +202,8 @@ while (my $data=$sth->fetchrow_hashref) {
email => $email,
biblionumber => $data->{'biblionumber'},
title => $title,
author => $author });
author => $author,
branchcode => $data->{'branchcode'} });
}
$template->param(

View File

@ -17,32 +17,32 @@
<h2>Items Overdue as of <!-- TMPL_VAR NAME="todaysdate" --></h2>
<form method="post" action="/cgi-bin/koha/circ/overdue.pl">
<div id="filters">Filter on :<br />
Name or cardnumber :<input type="text" name="borname" value="<!--TMPL_VAR Name="borname"-->">
Patron category :<select name="borcat" id="borcat"><option value="">Any</option>
<fieldset>
<legend>Filter on :</legend>
<p><label>Name or cardnumber:</label><input type="text" name="borname" value="<!--TMPL_VAR Name="borname"-->"></p>
<p><label>Patron category:</label><select name="borcat" id="borcat"><option value="">Any</option>
<!-- TMPL_LOOP name="borcatloop" -->
<option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="catname" --></option>
<!-- /TMPL_LOOP -->
</select>
Patron flags :<!--TMPL_VAR Name="CGIflags" --><br/>
Item type :<select name="itemtype" id="itemtype"><option value="">Any</option>
</p>
<p>
<p><label>Patron flags:</label><!--TMPL_VAR Name="CGIflags" --></p>
<p><label>Item type:</label><select name="itemtype" id="itemtype"><option value="">Any</option>
<!-- TMPL_LOOP name="itemtypeloop" -->
<option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="itemtypename" --></option>
<!-- /TMPL_LOOP -->
</select>
Library :<select name="branch" id="branch">
</p>
<p>
<label>Library of the patron:</label><select name="branch" id="branch">
<option value="">Any</option>
<!-- TMPL_LOOP name="branchloop" -->
<option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
<!-- /TMPL_LOOP -->
</select><br/>
</select>
</p>
Show any items currently issued:<input type="checkbox" name="showall" value="show" <!--TMPL_IF Name="showall"-->checked="checked"<!--/TMPL_IF-->>
Sort By<select name="order" tabindex="0" size="1" id="order">
<option <!--TMPL_UNLESS Name"order"-->selected<!-- /TMPL_UNLESS--> value="">Due Date</option>
<option value="borrower">Patron</option>
@ -54,14 +54,15 @@
<option value="barcode desc">Barcode</option>
</select>
<input TYPE="submit" value="Apply Filter" class="button reports">
</div>
</fieldset>
</form>
<a href="overdue.pl?op=csv&branch=<!-- TMPL_VAR name="branchfilter" -->">Download file of all overdues</a> (for <!-- TMPL_IF name="branchfilter" -->branch <!-- TMPL_VAR name="branchfilter" --><!-- TMPL_ELSE --> all branches <!-- /TMPL_IF --> . Other filters are ignored)
<div class="searchresults">
<table>
<tr>
<th>Due Date</th>
<th>Patron</th>
<th>Branch</th>
<th>Title</th>
</tr>
@ -71,9 +72,10 @@
<!-- TMPL_IF NAME="email" -->
<td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=<!-- TMPL_VAR name="borrowernumber"-->"><!-- TMPL_VAR NAME="name" --></a> <a href="mailto:<!-- TMPL_VAR NAME="email" -->?subject=Overdue: <!-- TMPL_VAR NAME="title" -->">[email]</a> (<!-- TMPL_VAR NAME="phone" -->)</td>
<!-- TMPL_ELSE -->
<td><!-- TMPL_VAR NAME="name" --> (<!--TMPL_IF NAME="phone" --><!-- TMPL_VAR NAME="phone" --><!-- TMPL_ELSE -->
<td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=<!-- TMPL_VAR name="borrowernumber"-->"><!-- TMPL_VAR NAME="name" --></a> (<!--TMPL_IF NAME="phone" --><!-- TMPL_VAR NAME="phone" --><!-- TMPL_ELSE -->
<!--TMPL_IF NAME="mobile" --><!-- TMPL_VAR NAME="mobile" --><!-- TMPL_ELSE --><!--TMPL_IF NAME="phonepro" --> <!-- TMPL_VAR NAME="phonepro" --><!-- /TMPL_IF --><!-- /TMPL_IF --><!-- /TMPL_IF -->)</td>
<!-- /TMPL_IF -->
<td><!-- TMPL_VAR name="branchcode" --></td>
<td>
<p><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR name="biblionumber" -->"><!-- TMPL_VAR NAME="title" --></a></p>
<p><!-- TMPL_VAR NAME="author" --></p>

View File

@ -0,0 +1,174 @@
#!/usr/bin/perl -w
#-----------------------------------
# Script Name: overduenotices.pl
# Script Version: 1.0
# Date: 2003/9/7
# Author: Stephen Hedges (shedges@skemotah.com)
# modified by Paul Poulain (paul@koha-fr.org)
# Description:
# This script runs send a mail with an attached file of all overdues
# that can be used for overdues claims, with your preffered word processor
# (OpenOffice.org hopefully ;-) )
# Revision History:
# 1.0 2003/9/7: original version
#-----------------------------------
# Copyright 2003 Skemotah Solutions
# 2007 Paul POULAIN
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
use strict;
use C4::Context;
use C4::Date;
use Date::Manip;
use Mail::Sendmail; # comment out if not doing e-mail notices
use Getopt::Long;
use MIME::QuotedPrint;
use MIME::Base64;
my ($confirm, $nomail,$branch);
GetOptions(
'c' => \$confirm,
'n' => \$nomail,
'b:s' => \$branch,
);
unless ($confirm) {
print qq|
This script will send overdue notices by e-mail and prepare a file of\nnotices for printing if the borrower does not have e-mail.
You MUST edit this script for your library BEFORE you run it for the first time!
See the comments in the script for directions on changing the script.
This script has 2 parameters :
-c to confirm and remove this help & warning
-n to avoid sending any mail. Instead, all mail messages are printed on screen. Usefull for testing purposes.
Do you wish to continue? (y/n)
|;
chomp($_ = <STDIN>);
exit unless (/^y/i); # comment these lines out once you've made the changes
}
#
# BEGINNING OF PARAMETERS
#
my $mindays = 7; # the notice will be sent after mindays days (grace period)
my $maxdays = 30; # issues being more than maxdays late are managed somewhere else. (borrower probably suspended)
my $smtpserver = 'smtp.laposte.net'; # your smtp server (the server who sent mails)
my $from = 'fromadress@toto'; # all the mails sent to the borrowers will appear coming from here.
my $mailtitle = 'Relances'; # the title of the mails
my $librarymail = 'tonadress@email'; # all notices without mail are sent (in 1 mail) to this mail address. They must then be managed manua lly.
# this parameter (the last) is the text of the mail that is sent.
# this text contains fields that are replaced by their value. Those fields must be written between brackets
# The following fields are available :
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode>
my $mailtext = "<firstname>;<lastname>;<address>;<address2>;<postcode>;<city>;<email>;<itemcount>;<titles>\n";
#
# END OF PARAMETERS
#
open OUTFILE, ">:utf8","overdues.csv" or die "impossible d'ouvrir le fichier de relances";
print OUTFILE "Date;Name;Surname;Adress1;Adress2;zipcode;city;Mail;Nbitems;1title;1author;1barcode;1issuedate;1returndate;";
print OUTFILE "2title;2author;2barcode;2issue_date;2return_date;3title;3author;3barcode;3issue_date;3return_date;4title;4author;4barcode;4issue_date;4return_date;5title;5author;5barcode;5issue_date;5return_date;6title;6author;6barcode;6issue_date;6return_date;7title;7author;7barcode;7issue_date;7return_date;8title;8author;8barcode;8issue_date;8return_date;9title;9author;9barcode;9issue_date;9return_date;10title;10author;10barcode;10issue_date;10return_date;\n";
# set the e-mail server -- comment out if not doing e-mail notices
# unshift @{$Mail::Sendmail::mailcfg{'smtp'}} , $smtpserver;
# set your own mail server name here
my $dbh = C4::Context->dbh;
my $query = "SELECT COUNT(*), issues.borrowernumber,firstname,surname,address,address2,city,zipcode,email FROM issues,borrowers ,categories WHERE returndate IS NULL AND TO_DAYS(NOW())-TO_DAYS(date_due) BETWEEN 0 and 500 AND issues.borrowernumber=borrowers.borrowernumber and borrowers.categorycode=categories.categorycode and (categories.overduenoticerequired = 1)";
$query .= " AND borrowers.branchcode=".$dbh->quote($branch) if $branch;
$query .=" GROUP BY issues.borrowernumber";
my $sth = $dbh->prepare ($query);
warn "Q : $query";
my $sth2 = $dbh->prepare("SELECT biblio.title,biblio.author,items.barcode, issues.timestamp, issues.date_due FROM issues,items,biblio WHERE items.itemnumber=issues.itemnumber and biblio.biblionumber=items.biblionumber AND issues.borrowernumber=? AND returndate IS NULL AND TO_DAYS(NOW())-TO_DAYS(date_due) BETWEEN 0 and 500");
$sth->execute;
#
# my $itemcount = 0;
# my $row;
my $count = 0; # to keep track of how many notices are printed
my $e_count = 0; # and e-mailed
my ($itemcount,$borrnum,$firstname,$lastname,$address1,$address2,$city,$postcode,$email);
while (($itemcount,$borrnum,$firstname,$lastname,$address1,$address2,$city,$postcode,$email) = $sth->fetchrow) {
my $notice = $mailtext;
$notice =~ s/\<firstname\>/$firstname/g if $firstname;
$notice =~ s/\<lastname\>/$lastname/g if $lastname;
$notice =~ s/\<address1\>/$address1/g if $address1;
$notice =~ s/\<address2\>/$address2/g if $address2;
$notice =~ s/\<email\>/$email/g if $email;
$notice =~ s/\<postcode\>/$postcode/g if $postcode;
$notice =~ s/\<city\>/$city/g if $city;
$notice =~ s/\<itemcount\>/$itemcount/g;
$sth2->execute($borrnum);
my $titles="";
my ($title, $author, $barcode,$timestamp,$date_due);
while (($title, $author, $barcode,$timestamp,$date_due) = $sth2->fetchrow){
$titles .= ($title?$title:"").";".($author?$author:"").";".($barcode?$barcode:"").";" ;
$titles .= ($timestamp?format_date(substr($timestamp,0,10)):"").";".($date_due?format_date($date_due):"").";" ;
}
$notice =~ s/\<titles\>/$titles/g;
$notice =~ s/(\<.*?\>)//g;
$sth2->finish;
print OUTFILE $notice;
$count++;
}
$sth->finish;
close OUTFILE;
if ($nomail) {
open(OD,"overdues.csv");
print <OD>;
} else {
my %mail = ( To => 'mailto@mail.com',
From => 'mailfrom@mail.com',
Subject => 'Koha overdues',
);
my $boundary = "====" . time() . "====";
$mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
# open FILE, "Relances.csv";
my $message = encode_qp("The file");
my $file = "overdues.csv";
open (F, $file) or die "Cannot read $ $!";
binmode F;
undef $/;
$mail{body} = encode_base64(<F>);
close F;
$boundary = '--'.$boundary;
$mail{body} = <<END_OF_BODY;
$boundary
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
$message
$boundary
Content-Type: application/octet-stream; name="$^X"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Overdues.csv"
$mail{body}
$boundary--
END_OF_BODY
sendmail(%mail) || print "Error: $Mail::Sendmail::error\n";
}
#}