# Copyright 2000-2002 Katipo Communications
+# Parts copyright 2010 BibLibre
#
# This file is part of Koha.
#
# 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
+# 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::Auth;
use C4::Branch;
use C4::Debug;
-use C4::Dates qw/format_date/;
+use C4::Dates qw/format_date format_date_in_iso/;
use Date::Calc qw/Today/;
use Text::CSV_XS;
my $borflagsfilter = $input->param('borflag') || '';
my $branchfilter = $input->param('branch') || '';
my $op = $input->param('op') || '';
+my $dateduefrom = format_date_in_iso($input->param( 'dateduefrom' )) || '';
+my $datedueto = format_date_in_iso($input->param( 'datedueto' )) || '';
my $isfiltered = $op =~ /apply/i && $op =~ /filter/i;
my $noreport = C4::Context->preference('FilterBeforeOverdueReport') && ! $isfiltered && $op ne "csv";
my $have_pattr_filter_data = keys(%cgi_attrcode_to_attrvalues) > 0;
my @patron_attr_filter_loop; # array of [ domid cgivalue ismany isclone ordinal code description repeatable authorised_value_category ]
-#my @patron_attr_order_loop; # array of { label => $patron_attr_label, value => $patron_attr_order }
+my @patron_attr_order_loop; # array of { label => $patron_attr_label, value => $patron_attr_order }
my @sort_roots = qw(borrower title barcode date_due);
push @sort_roots, map {$_ . " desc"} @sort_roots;
};
}
} continue { ++$ordinal }
-#for (@patron_attr_order_loop) { $_->{selected} = 1 if $order eq $_->{value} }
+for (@patron_attr_order_loop) { $_->{selected} = 1 if $order eq $_->{value} }
$template->param(ORDER_LOOP => \@order_loop);
my %borrowernumber_to_attributes; # hash of { borrowernumber => { attrcode => [ [val,display], [val,display], ... ] } }
# i.e. val differs from display when attr is an authorised value
-if (0 && @patron_attr_filter_loop) {
+if (@patron_attr_filter_loop) {
# MAYBE FIXME: currently, *all* borrower_attributes are loaded into %borrowernumber_to_attributes
# then filtered and honed down to match the patron attribute filters. If this is
# too resource intensive, MySQL can be used to do the filtering, i.e. rewire the
$template->param(
+ patron_attr_header_loop => [ map { { header => $_->{description} } } grep { ! $_->{isclone} } @patron_attr_filter_loop ],
branchloop => GetBranchesLoop($branchfilter, $onlymine),
branchfilter => $branchfilter,
borcatloop=> \@borcatloop,
itemtypeloop => \@itemtypeloop,
-# patron_attr_filter_loop => \@patron_attr_filter_loop,
+ patron_attr_filter_loop => \@patron_attr_filter_loop,
borname => $bornamefilter,
order => $order,
- showall => $showall);
+ showall => $showall,
+ DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+ dateduefrom => $input->param( 'dateduefrom' ) || '',
+ datedueto => $input->param( 'datedueto' ) || '',
+);
if ($noreport) {
# la de dah ... page comes up presto-quicko
$bornamefilter =~s/\?/\_/g;
my $strsth="SELECT date_due,
+ borrowers.title as borrowertitle,
concat(surname,' ', firstname) as borrower,
+ borrowers.streetnumber,
+ borrowers.streettype,
+ borrowers.address,
+ borrowers.address2,
+ borrowers.city,
+ borrowers.zipcode,
+ borrowers.country,
borrowers.phone,
borrowers.email,
issues.itemnumber,
$strsth.=" AND date_due < '" . $todaysdate . "' " unless ($showall);
$strsth.=" AND (borrowers.firstname like '".$bornamefilter."%' or borrowers.surname like '".$bornamefilter."%' or borrowers.cardnumber like '".$bornamefilter."%')" if($bornamefilter) ;
$strsth.=" AND borrowers.categorycode = '" . $borcatfilter . "' " if $borcatfilter;
- $strsth.=" AND biblioitems.itemtype = '" . $itemtypefilter . "' " if $itemtypefilter;
+ if( $itemtypefilter ){
+ if( C4::Context->preference('item-level_itypes') ){
+ $strsth.=" AND items.itype = '" . $itemtypefilter . "' ";
+ } else {
+ $strsth.=" AND biblioitems.itemtype = '" . $itemtypefilter . "' ";
+ }
+ }
$strsth.=" AND borrowers.flags = '" . $borflagsfilter . "' " if $borflagsfilter;
$strsth.=" AND borrowers.branchcode = '" . $branchfilter . "' " if $branchfilter;
+ $strsth.=" AND date_due < '" . $datedueto . "' " if $datedueto;
+ $strsth.=" AND date_due > '" . $dateduefrom . "' " if $dateduefrom;
# restrict patrons (borrowers) to those matching the patron attribute filter(s), if any
my $bnlist = $have_pattr_filter_data ? join(',',keys %borrowernumber_to_attributes) : '';
$strsth =~ s/WHERE 1=1/WHERE 1=1 AND borrowers.borrowernumber IN ($bnlist)/ if $bnlist;
borrowernumber => $data->{borrowernumber},
barcode => $data->{barcode},
itemnum => $data->{itemnumber},
+ borrowertitle => $data->{borrowertitle},
name => $data->{borrower},
+ streetnumber => $data->{streetnumber},
+ streettype => $data->{streettype},
+ address => $data->{address},
+ address2 => $data->{address2},
+ city => $data->{city},
+ zipcode => $data->{zipcode},
+ country => $data->{country},
phone => $data->{phone},
email => $data->{email},
biblionumber => $data->{biblionumber},
}
if ($op eq 'csv') {
- binmode(STDOUT, ":utf8");
+ binmode(STDOUT, ":encoding(UTF-8)");
my $csv = build_csv(\@overduedata);
print $input->header(-type => 'application/vnd.sun.xml.calc',
-encoding => 'utf-8',
my @lines = ();
# build header ...
- my @keys = grep { $_ ne 'patron_attr_value_loop' } sort keys %{ $overdues->[0] };
+ my @keys = qw /duedate title author borrowertitle name phone barcode email address address2 zipcode city country
+ branchcode itemcallnumber biblionumber borrowernumber itemnum replacementprice streetnumber streettype/;
my $csv = Text::CSV_XS->new();
$csv->combine(@keys);
push @lines, $csv->string();