X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=circ%2Foverdue.pl;h=e44e792f0a8a2af7e8889e613b0f623484b60619;hb=37f3807442ce1136a57e6fec76648994ada7a5cb;hp=f801644358b8a398ccdb5f7600467a98d8fbaf91;hpb=36efd0d4d0cfe5bbdcd9a4b48e0e417a59aaa63a;p=koha.git diff --git a/circ/overdue.pl b/circ/overdue.pl index f801644358..e44e792f0a 100755 --- a/circ/overdue.pl +++ b/circ/overdue.pl @@ -27,9 +27,10 @@ use CGI qw(-oldstyle_urls); use C4::Auth; use C4::Branch; use C4::Debug; -use C4::Dates qw/format_date/; -use Date::Calc qw/Today/; +use C4::Dates qw/format_date format_date_in_iso/; use Text::CSV_XS; +use Koha::DateUtils; +use DateTime; my $input = new CGI; my $order = $input->param('order') || ''; @@ -40,6 +41,16 @@ my $itemtypefilter = $input->param('itemtype') || ''; 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' )) || ''; +# FIXME This is a kludge to include times +if ($datedueto) { + $datedueto .= ' 23:59'; +} +if ($dateduefrom) { + $dateduefrom .= ' 00:00'; +} +# kludge end my $isfiltered = $op =~ /apply/i && $op =~ /filter/i; my $noreport = C4::Context->preference('FilterBeforeOverdueReport') && ! $isfiltered && $op ne "csv"; @@ -209,7 +220,11 @@ $template->param( 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 @@ -223,14 +238,17 @@ if ($noreport) { # FIX 2: ensure there are indexes for columns participating in the WHERE clauses, where feasible/reasonable - my $todaysdate = sprintf("%-04.4d-%-02.2d-%02.2d", Today()); + my $today_dt = DateTime->now(time_zone => C4::Context->tz); + $today_dt->truncate(to => 'minute'); + my $todaysdate = $today_dt->strftime('%Y-%m-%d %H:%M'); $bornamefilter =~s/\*/\%/g; $bornamefilter =~s/\?/\_/g; my $strsth="SELECT date_due, borrowers.title as borrowertitle, - concat(surname,' ', firstname) as borrower, + borrowers.surname, + borrowers.firstname, borrowers.streetnumber, borrowers.streettype, borrowers.address, @@ -241,6 +259,7 @@ if ($noreport) { borrowers.phone, borrowers.email, issues.itemnumber, + issues.issuedate, items.barcode, biblio.title, biblio.author, @@ -248,7 +267,8 @@ if ($noreport) { biblio.biblionumber, borrowers.branchcode, items.itemcallnumber, - items.replacementprice + items.replacementprice, + items.enumchron FROM issues LEFT JOIN borrowers ON (issues.borrowernumber=borrowers.borrowernumber ) LEFT JOIN items ON (issues.itemnumber=items.itemnumber) @@ -259,19 +279,36 @@ if ($noreport) { $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; - $strsth.=" AND borrowers.flags = '" . $borflagsfilter . "' " if $borflagsfilter; + if( $itemtypefilter ){ + if( C4::Context->preference('item-level_itypes') ){ + $strsth.=" AND items.itype = '" . $itemtypefilter . "' "; + } else { + $strsth.=" AND biblioitems.itemtype = '" . $itemtypefilter . "' "; + } + } + if ( $borflagsfilter eq 'gonenoaddress' ) { + $strsth .= " AND borrowers.gonenoaddress <> 0"; + } + elsif ( $borflagsfilter eq 'debarred' ) { + $strsth .= " AND borrowers.debarred >= CURDATE()" ; + } + elsif ( $borflagsfilter eq 'lost') { + $strsth .= " AND borrowers.lost <> 0"; + } $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; $strsth =~ s/WHERE 1=1/WHERE 0=1/ if $have_pattr_filter_data && !$bnlist; # no match if no borrowers matched patron attrs $strsth.=" ORDER BY " . ( - ($order eq "borrower" or $order eq "borrower desc") ? "$order, date_due" : - ($order eq "title" or $order eq "title desc") ? "$order, date_due, borrower" : - ($order eq "barcode" or $order eq "barcode desc") ? "items.$order, date_due, borrower" : - ($order eq "date_due desc") ? "date_due DESC, borrower" : - "date_due, borrower" # default sort order + ($order eq "borrower") ? "surname, firstname, date_due" : + ($order eq "borrower desc") ? "surname desc, firstname desc, date_due" : + ($order eq "title" or $order eq "title desc") ? "$order, date_due, surname, firstname" : + ($order eq "barcode" or $order eq "barcode desc") ? "items.$order, date_due, surname, firstname" : + ($order eq "date_due desc") ? "date_due DESC, surname, firstname" : + "date_due, surname, firstname" # default sort order ); $template->param(sql=>$strsth); my $sth=$dbh->prepare($strsth); @@ -292,14 +329,17 @@ if ($noreport) { my @displayvalues = map { $_->[1] } @{ $pattrs->{$pattr_filter->{code}} }; # grab second value from each subarray push @patron_attr_value_loop, { value => join(', ', sort { lc $a cmp lc $b } @displayvalues) }; } + my $dt = dt_from_string($data->{date_due}, 'sql'); push @overduedata, { - duedate => format_date($data->{date_due}), + duedate => output_pref($dt), borrowernumber => $data->{borrowernumber}, barcode => $data->{barcode}, itemnum => $data->{itemnumber}, + issuedate => format_date($data->{issuedate}), borrowertitle => $data->{borrowertitle}, - name => $data->{borrower}, + surname => $data->{surname}, + firstname => $data->{firstname}, streetnumber => $data->{streetnumber}, streettype => $data->{streettype}, address => $data->{address}, @@ -315,6 +355,7 @@ if ($noreport) { branchcode => $data->{branchcode}, itemcallnumber => $data->{itemcallnumber}, replacementprice => $data->{replacementprice}, + enumchron => $data->{enumchron}, patron_attr_value_loop => \@patron_attr_value_loop, }; } @@ -343,7 +384,7 @@ if ($noreport) { } 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', @@ -360,7 +401,7 @@ if ($noreport) { $template->param( csv_param_string => $csv_param_string, - todaysdate => format_date($todaysdate), + todaysdate => output_pref($today_dt), overdueloop => \@overduedata, nnoverdue => scalar(@overduedata), noverdue_is_plural => scalar(@overduedata) != 1, @@ -384,7 +425,8 @@ sub build_csv { my @lines = (); # build header ... - my @keys = grep { $_ ne 'patron_attr_value_loop' } sort keys %{ $overdues->[0] }; + my @keys = qw /duedate title author borrowertitle firstname surname phone barcode email address address2 zipcode city country + branchcode itemcallnumber biblionumber borrowernumber itemnum issuedate replacementprice streetnumber streettype/; my $csv = Text::CSV_XS->new(); $csv->combine(@keys); push @lines, $csv->string();