Bug 18044: Add a test
[koha.git] / circ / pendingreserves.pl
blobe9cee0c2298dca4a9f02f8c4b012a95103e7b046
1 #!/usr/bin/perl
3 # Copyright 2000-2002 Katipo Communications
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 # Modification by D.Ulm, actually works (as long as indep. branches not turned on)
21 # Someone let me know what indep. branches is supposed to do and I'll make that part work too
23 # The reserve pull lists *works* as long as not for indepencdant branches, I can fix!
25 use strict;
26 #use warnings; FIXME - Bug 2505
28 use constant PULL_INTERVAL => 2;
30 use C4::Context;
31 use C4::Output;
32 use CGI qw ( -utf8 );
33 use C4::Auth;
34 use Koha::Biblios;
35 use C4::Debug;
36 use Koha::DateUtils;
37 use DateTime::Duration;
39 my $input = new CGI;
40 my $startdate=$input->param('from');
41 my $enddate=$input->param('to');
42 my $run_report = ( not defined $input->param('run_report') ) ? 1 : $input->param('run_report');
44 my $theme = $input->param('theme'); # only used if allowthemeoverride is set
46 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
48 template_name => "circ/pendingreserves.tt",
49 query => $input,
50 type => "intranet",
51 authnotrequired => 0,
52 flagsrequired => { circulate => "circulate_remaining_permissions" },
53 debug => 1,
57 my $today = dt_from_string;
58 $startdate =~ s/^\s+//;
59 $startdate =~ s/\s+$//;
60 $enddate =~ s/^\s+//;
61 $enddate =~ s/\s+$//;
63 if ( $startdate ) {
64 $startdate = eval{dt_from_string( $startdate )};
66 unless ( $startdate ){
67 # changed from delivered range of 10 years-yesterday to 2 days ago-today
68 # Find two days ago for the default shelf pull start date, unless HoldsToPullStartDate sys pref is set.
69 $startdate = $today - DateTime::Duration->new( days => C4::Context->preference('HoldsToPullStartDate') || PULL_INTERVAL );
72 if ( $enddate ) {
73 $enddate = eval{dt_from_string( $enddate )};
75 unless ( $enddate ) {
76 #similarly: calculate end date with ConfirmFutureHolds (days)
77 $enddate = $today + DateTime::Duration->new( days => C4::Context->preference('ConfirmFutureHolds') || 0 );
80 my @reservedata;
81 if ( $run_report ) {
82 my $dbh = C4::Context->dbh;
83 my $sqldatewhere = "";
84 my $startdate_iso = output_pref({ dt => $startdate, dateformat => 'iso', dateonly => 1 });
85 my $enddate_iso = output_pref({ dt => $enddate, dateformat => 'iso', dateonly => 1 });
86 $debug and warn $startdate_iso. "\n" . $enddate_iso;
87 my @query_params = ();
88 if ($startdate_iso) {
89 $sqldatewhere .= " AND reservedate >= ?";
90 push @query_params, $startdate_iso;
92 if ($enddate_iso) {
93 $sqldatewhere .= " AND reservedate <= ?";
94 push @query_params, $enddate_iso;
97 my $strsth =
98 "SELECT min(reservedate) as l_reservedate,
99 reserves.borrowernumber as borrowernumber,
100 GROUP_CONCAT(DISTINCT items.holdingbranch
101 ORDER BY items.itemnumber SEPARATOR '|') l_holdingbranch,
102 reserves.biblionumber,
103 reserves.branchcode,
104 GROUP_CONCAT(DISTINCT reserves.branchcode
105 ORDER BY items.itemnumber SEPARATOR ', ') l_branch,
106 items.holdingbranch as branch,
107 GROUP_CONCAT(DISTINCT items.itype
108 ORDER BY items.itemnumber SEPARATOR '|') l_itype,
109 GROUP_CONCAT(DISTINCT items.location
110 ORDER BY items.itemnumber SEPARATOR '|') l_location,
111 GROUP_CONCAT(DISTINCT items.itemcallnumber
112 ORDER BY items.itemnumber SEPARATOR '<br/>') l_itemcallnumber,
113 GROUP_CONCAT(DISTINCT items.enumchron
114 ORDER BY items.itemnumber SEPARATOR '<br/>') l_enumchron,
115 GROUP_CONCAT(DISTINCT items.copynumber
116 ORDER BY items.itemnumber SEPARATOR '<br/>') l_copynumber,
117 items.itemnumber,
118 notificationdate,
119 reminderdate,
120 max(priority) as priority,
121 reserves.found,
122 biblio.title,
123 biblio.author,
124 count(DISTINCT items.itemnumber) as icount,
125 count(DISTINCT reserves.borrowernumber) as rcount
126 FROM reserves
127 LEFT JOIN items ON items.biblionumber=reserves.biblionumber
128 LEFT JOIN biblio ON reserves.biblionumber=biblio.biblionumber
129 LEFT JOIN branchtransfers ON items.itemnumber=branchtransfers.itemnumber
130 LEFT JOIN issues ON items.itemnumber=issues.itemnumber
131 WHERE
132 reserves.found IS NULL
133 $sqldatewhere
134 AND (reserves.itemnumber IS NULL OR reserves.itemnumber = items.itemnumber)
135 AND items.itemnumber NOT IN (SELECT itemnumber FROM branchtransfers where datearrived IS NULL)
136 AND items.itemnumber NOT IN (select itemnumber FROM reserves where found='W')
137 AND issues.itemnumber IS NULL
138 AND reserves.priority <> 0
139 AND reserves.suspend = 0
140 AND notforloan = 0 AND damaged = 0 AND itemlost = 0 AND withdrawn = 0
142 # GROUP BY reserves.biblionumber allows only items that are not checked out, else multiples occur when
143 # multiple patrons have a hold on an item
146 if (C4::Context->preference('IndependentBranches')){
147 $strsth .= " AND items.holdingbranch=? ";
148 push @query_params, C4::Context->userenv->{'branch'};
150 $strsth .= " GROUP BY reserves.biblionumber ORDER BY biblio.title ";
152 my $sth = $dbh->prepare($strsth);
153 $sth->execute(@query_params);
155 while ( my $data = $sth->fetchrow_hashref ) {
156 my $record = Koha::Biblios->find($data->{biblionumber});
157 if ($record){
158 $data->{subtitle} = [ $record->subtitles ];
160 push(
161 @reservedata,
163 reservedate => $data->{l_reservedate},
164 priority => $data->{priority},
165 name => $data->{l_patron},
166 title => $data->{title},
167 subtitle => $data->{subtitle},
168 author => $data->{author},
169 borrowernumber => $data->{borrowernumber},
170 itemnum => $data->{itemnumber},
171 phone => $data->{phone},
172 email => $data->{email},
173 biblionumber => $data->{biblionumber},
174 statusw => ( $data->{found} eq "W" ),
175 statusf => ( $data->{found} eq "F" ),
176 holdingbranches => [split('\|', $data->{l_holdingbranch})],,
177 branch => $data->{l_branch},
178 itemcallnumber => $data->{l_itemcallnumber},
179 enumchron => $data->{l_enumchron},
180 copyno => $data->{l_copynumber},
181 notificationdate=> $data->{notificationdate},
182 reminderdate => $data->{reminderdate},
183 count => $data->{icount},
184 rcount => $data->{rcount},
185 pullcount => $data->{icount} <= $data->{rcount} ? $data->{icount} : $data->{rcount},
186 itypes => [split('\|', $data->{l_itype})],
187 locations => [split('\|', $data->{l_location})],
191 $sth->finish;
194 $template->param(
195 todaysdate => $today,
196 from => $startdate,
197 to => $enddate,
198 run_report => $run_report,
199 reserveloop => \@reservedata,
200 "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
201 HoldsToPullStartDate => C4::Context->preference('HoldsToPullStartDate') || PULL_INTERVAL,
202 HoldsToPullEndDate => C4::Context->preference('ConfirmFutureHolds') || 0,
205 output_html_with_http_headers $input, $cookie, $template->output;