SQL cleanup in new circ scripts: use placeholders
[wip/koha-chris_n.git] / circ / pendingreserves.pl
1 #!/usr/bin/perl
2
3
4 # Copyright 2000-2002 Katipo Communications
5 #
6 # This file is part of Koha.
7 #
8 # Koha is free software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
11 # version.
12 #
13 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License along with
18 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 # Suite 330, Boston, MA  02111-1307 USA
20
21 # Modification by D.Ulm, actually works (as long as indep. branches not turned on)
22 #               Someone let me know what indep. branches is supposed to do and I'll make that part work too
23 #
24 #               The reserve pull lists *works* as long as not for indepencdant branches, I can fix!
25
26 use strict;
27 use C4::Context;
28 use C4::Output;
29 use CGI;
30 use C4::Auth;
31 use C4::Dates qw/format_date format_date_in_iso/;
32 use C4::Debug;
33 use Date::Calc qw/Today Add_Delta_YMD/;
34
35 my $input = new CGI;
36 my $order = $input->param('order');
37 my $startdate=$input->param('from');
38 my $enddate=$input->param('to');
39
40 my $theme = $input->param('theme');    # only used if allowthemeoverride is set
41
42 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
43     {
44         template_name   => "circ/pendingreserves.tmpl",
45         query           => $input,
46         type            => "intranet",
47         authnotrequired => 0,
48         flagsrequired   => { circulate => 1 },
49         debug           => 1,
50     }
51 );
52
53 my $duedate;
54 my $borrowernumber;
55 my $itemnum;
56 my $data1;
57 my $data2;
58 my $data3;
59 my $name;
60 my $phone;
61 my $email;
62 my $biblionumber;
63 my $title;
64 my $author;
65
66 my ( $year, $month, $day ) = Today();
67 my $todaysdate     = sprintf("%-04.4d-%-02.2d-%02.2d", $year, $month, $day);
68 my $yesterdaysdate = sprintf("%-04.4d-%-02.2d-%02.2d", Add_Delta_YMD($year, $month, $day,   0, 0, -1));
69 # Find 10 years ago for the default shelf pull start and end dates
70 #    A default of the prior day's holds is a reasonable way to pull holds 
71 my $pastdate       = sprintf("%-04.4d-%-02.2d-%02.2d", Add_Delta_YMD($year, $month, $day, -10, 0,  0));
72
73 #               Predefine the start and end dates if they are not already defined
74 $startdate =~ s/^\s+//;
75 $startdate =~ s/\s+$//;
76 $enddate =~ s/^\s+//;
77 $enddate =~ s/\s+$//;
78 #               Check if null, should string match, if so set start and end date to yesterday
79 if (!defined($startdate) or $startdate eq "") {
80         $startdate = format_date($pastdate);
81 }
82 if (!defined($enddate) or $enddate eq "") {
83         $enddate = format_date($yesterdaysdate);
84 }
85
86
87 my $dbh    = C4::Context->dbh;
88 my ($sqlorderby, $sqldatewhere) = ("","");
89 $debug and warn format_date_in_iso($startdate) . "\n" . format_date_in_iso($enddate);
90 my @query_params = ();
91 if ($startdate) {
92     $sqldatewhere .= " AND reservedate >= ?";
93     push @query_params, format_date_in_iso($startdate);
94 }
95 if ($enddate) {
96     $sqldatewhere .= " AND reservedate <= ?";
97     push @query_params, format_date_in_iso($enddate);
98 }
99
100 if ($order eq "biblio") {
101         $sqlorderby = " ORDER BY biblio.title ";
102 } elsif ($order eq "itype") {
103         $sqlorderby = " ORDER BY l_itype, location, l_itemcallnumber ";
104 } elsif ($order eq "location") {
105         $sqlorderby = " ORDER BY location, l_itemcallnumber, holdingbranch ";
106 } elsif ($order eq "date") {
107     $sqlorderby = " ORDER BY l_reservedate, location, l_itemcallnumber ";
108 } elsif ($order eq "library") {
109     $sqlorderby = " ORDER BY holdingbranch, l_itemcallnumber, location ";
110 } elsif ($order eq "call") {
111     $sqlorderby = " ORDER BY l_itemcallnumber, holdingbranch, location ";    
112 } else {
113         $sqlorderby = " ORDER BY biblio.title ";
114 }
115 my $strsth =
116 "SELECT min(reservedate) as l_reservedate,
117         reserves.borrowernumber as borrowernumber,
118         GROUP_CONCAT(DISTINCT items.holdingbranch 
119                         ORDER BY items.itemnumber SEPARATOR '<br>') l_holdingbranch,
120         reserves.biblionumber,
121         reserves.branchcode,
122         GROUP_CONCAT(DISTINCT reserves.branchcode 
123                         ORDER BY items.itemnumber SEPARATOR ', ') l_branch,
124         items.holdingbranch as branch,
125         items.itemcallnumber,
126         GROUP_CONCAT(DISTINCT items.itype 
127                         ORDER BY items.itemnumber SEPARATOR '<br>') l_itype,
128         GROUP_CONCAT(DISTINCT items.location 
129                         ORDER BY items.itemnumber SEPARATOR '<br>') l_location,
130         GROUP_CONCAT(DISTINCT items.itemcallnumber 
131                         ORDER BY items.itemnumber SEPARATOR '<br>') l_itemcallnumber,
132         items.itemnumber,
133         notes,
134         notificationdate,
135         reminderdate,
136         max(priority) as priority,
137         reserves.found,
138         biblio.title,
139         biblio.author,
140         count(DISTINCT items.itemnumber) as icount,
141         count(DISTINCT reserves.borrowernumber) as rcount
142  FROM  reserves
143         LEFT JOIN items ON items.biblionumber=reserves.biblionumber 
144         LEFT JOIN biblio ON reserves.biblionumber=biblio.biblionumber
145         LEFT JOIN branchtransfers ON items.itemnumber=branchtransfers.itemnumber
146  WHERE
147 reserves.found IS NULL
148  $sqldatewhere
149 AND items.itemnumber NOT IN (SELECT itemnumber FROM branchtransfers where datearrived IS NULL)
150 AND items.itemnumber NOT IN (SELECT itemnumber FROM issues)
151 AND reserves.priority <> 0 
152 AND reserves.itemnumber is NULL
153 AND notforloan = 0 AND damaged = 0 AND itemlost = 0 AND wthdrawn = 0
154 ";
155 # GROUP BY reserves.biblionumber allows only items that are not checked out, else multiples occur when 
156 #    multiple patrons have a hold on an item
157
158
159 if (C4::Context->preference('IndependantBranches')){
160         $strsth .= " AND items.holdingbranch=? ";
161     push @query_params, C4::Context->userenv->{'branch'};
162 }
163 $strsth .= " GROUP BY reserves.biblionumber " . $sqlorderby;
164
165 my $sth = $dbh->prepare($strsth);
166 $sth->execute(@query_params);
167
168 my @reservedata;
169 my $previous;
170 my $this;
171 while ( my $data = $sth->fetchrow_hashref ) {
172     $this=$data->{biblionumber}.":".$data->{borrowernumber};
173     my @itemlist;
174     push(
175         @reservedata,
176         {
177             reservedate      => format_date( $data->{l_reservedate} ),
178             priority         => $data->{priority},
179             name             => $data->{l_patron},
180             title            => $data->{title},
181             author           => $data->{author},
182             borrowernumber   => $data->{borrowernumber},
183             itemnum          => $data->{itemnumber},
184             phone            => $data->{phone},
185             email            => $data->{email},
186             biblionumber     => $data->{biblionumber},
187             statusw          => ( $data->{found} eq "W" ),
188             statusf          => ( $data->{found} eq "F" ),
189             holdingbranch    => $data->{l_holdingbranch},
190             branch           => $data->{l_branch},
191             itemcallnumber   => $data->{l_itemcallnumber},
192             notes            => $data->{notes},
193             notificationdate => $data->{notificationdate},
194             reminderdate     => $data->{reminderdate},
195             count                                 => $data->{icount},
196             rcount                        => $data->{rcount},
197             pullcount             => $data->{icount} <= $data->{rcount} ? $data->{icount} : $data->{rcount},
198             itype                                 => $data->{l_itype},
199             location                      => $data->{l_location}
200         }
201     );
202     $previous=$this;
203 }
204
205 $sth->finish;
206
207 # *** I doubt any of this is needed now with the above fixes *** -d.u.
208
209 #$strsth=~ s/AND reserves.itemnumber is NULL/AND reserves.itemnumber is NOT NULL/;
210 #$strsth=~ s/LEFT JOIN items ON items.biblionumber=reserves.biblionumber/LEFT JOIN items ON items.biblionumber=reserves.itemnumber/;
211 #$sth = $dbh->prepare($strsth);
212 #if (C4::Context->preference('IndependantBranches')){
213 #       $sth->execute(C4::Context->userenv->{'branch'});
214 #}
215 #else {
216 #       $sth->execute();
217 #}
218 #while ( my $data = $sth->fetchrow_hashref ) {
219 #    $this=$data->{biblionumber}.":".$data->{borrowernumber};
220 #    my @itemlist;
221 #    push(
222 #        @reservedata,
223 #        {
224 #            reservedate      => format_date( $data->{l_reservedate} ),
225 #            priority         => $data->{priority},
226 #            name             => $data->{l_patron},
227 #            title            => $data->{title},
228 #            author           => $data->{author},
229 #            borrowernumber   => $data->{borrowernumber},
230 #            itemnum          => $data->{itemnumber},
231 #            phone            => $data->{phone},
232 #            email            => $data->{email},
233 #            biblionumber     => $data->{biblionumber},
234 #            statusw          => ( $data->{found} eq "W" ),
235 #            statusf          => ( $data->{found} eq "F" ),
236 #            holdingbranch    => $data->{l_holdingbranch},
237 #            branch           => $data->{l_branch},
238 #            itemcallnumber   => $data->{l_itemcallnumber},
239 #            notes            => $data->{notes},
240 #            notificationdate => $data->{notificationdate},
241 #            reminderdate     => $data->{reminderdate},
242 #            count                                => $data->{icount},
243 #            rcount                       => $data->{rcount},
244 #            pullcount            => $data->{icount} <= $data->{rcount} ? $data->{icount} : $data->{rcount},
245 #            itype                                => $data->{l_itype},
246 #            location                     => $data->{l_location},
247 #            thisitemonly     => 1,
248
249 #        }
250 #    );
251 #    $previous=$this;
252 #}
253 #$sth->finish;
254
255 $template->param(
256     todaysdate          => format_date($todaysdate),
257     from             => $startdate,
258     to                  => $enddate,
259     reserveloop         => \@reservedata,
260     "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
261     DHTMLcalendar_dateformat =>  C4::Dates->DHTMLcalendar(),
262 );
263
264 output_html_with_http_headers $input, $cookie, $template->output;