Cleaned up contents of location information
[koha.git] / C4 / Reserves2.pm
1 package C4::Reserves2; #assumes C4/Reserves2
2
3 use strict;
4 require Exporter;
5 use DBI;
6 use C4::Database;
7 #use C4::Accounts;
8
9 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
10   
11 # set the version for version checking
12 $VERSION = 0.01;
13     
14 @ISA = qw(Exporter);
15 @EXPORT = qw(&FindReserves &CheckReserves &CheckWaiting &CancelReserve &FillReserve &ReserveWaiting &CreateReserve &updatereserves &getreservetitle &Findgroupreserve);
16                                                     
17 # make all your functions, whether exported or not;
18
19 sub FindReserves {
20   my ($bib,$bor)=@_;
21   my $dbh=C4Connect;
22   my $query="SELECT *,reserves.branchcode,biblio.title AS btitle
23                       FROM reserves,borrowers,biblio ";
24   if ($bib ne ''){
25       $bib = $dbh->quote($bib);
26       if ($bor ne ''){
27           $bor = $dbh->quote($bor);
28           $query .=  " where reserves.biblionumber   = $bib
29                          and borrowers.borrowernumber = $bor 
30                          and reserves.borrowernumber = borrowers.borrowernumber 
31                          and biblio.biblionumber     = $bib 
32                          and cancellationdate is NULL 
33                          and (found <> 'F' or found is NULL)";
34       } else {
35           $query .= " where reserves.borrowernumber = borrowers.borrowernumber
36                         and biblio.biblionumber     = $bib 
37                         and reserves.biblionumber   = $bib
38                         and cancellationdate is NULL 
39                         and (found <> 'F' or found is NULL)";
40       }
41   } else {
42       $query .= " where borrowers.borrowernumber = $bor 
43                     and reserves.borrowernumber  = borrowers.borrowernumber 
44                     and reserves.biblionumber    = biblio.biblionumber 
45                     and cancellationdate is NULL and 
46                     (found <> 'F' or found is NULL)";
47   }
48   $query.=" order by priority";
49   my $sth=$dbh->prepare($query);
50   $sth->execute;
51   my $i=0;
52   my @results;
53   while (my $data=$sth->fetchrow_hashref){
54     $results[$i]=$data;
55     $i++;
56   }
57 #  print $query;
58   $sth->finish;
59   $dbh->disconnect;
60   return($i,\@results);
61 }
62
63 sub CheckReserves {
64     my ($item) = @_;
65     my $dbh=C4Connect;
66     my $qitem=$dbh->quote($item);
67 # get the biblionumber...
68     my $sth=$dbh->prepare("select biblionumber, biblioitemnumber from items where itemnumber=$qitem");
69     $sth->execute;
70     my ($biblio, $bibitem) = $sth->fetchrow_array;
71     $sth->finish;
72     $dbh->disconnect;
73 # get the reserves...
74     my ($count, @reserves) = Findgroupreserve($bibitem, $biblio);
75     my $priority = 10000000; 
76     my $highest;
77     if ($count) {
78         foreach my $res (@reserves) {
79             if ($res->{'itemnumber'} == $item) {
80                 return ("Waiting", $res);
81             } else {
82                 if ($res->{'priority'} < $priority) {
83                     $priority = $res->{'priority'};
84                     $highest = $res;
85                 }
86             }
87         }
88         $highest->{'itemnumber'} = $item;
89         return ("Reserved", $highest);
90     } else {
91         return (0, 0);
92     }
93 }
94
95 sub CancelReserve {
96     my ($biblio, $item, $borr) = @_;
97     my $dbh=C4Connect;
98     warn "In CancelReserve";
99     if (($item and $borr) and (not $biblio)) {
100 # removing a waiting reserve record....
101         $item = $dbh->quote($item);
102         $borr = $dbh->quote($borr);
103 # update the database...
104         my $query = "update reserves set cancellationdate = now(), 
105                                          found            = Null, 
106                                          priority         = 0 
107                                    where itemnumber       = $item 
108                                      and borrowernumber   = $borr";
109         my $sth = $dbh->prepare($query);
110         $sth->execute;
111         $sth->finish;
112     }
113     if (($biblio and $borr) and (not $item)) {
114 # removing a reserve record....
115         my $q_biblio = $dbh->quote($biblio);
116         $borr = $dbh->quote($borr);
117 # fix up the priorities on the other records....
118         my $query = "SELECT priority FROM reserves 
119                                     WHERE biblionumber   = $q_biblio 
120                                       AND borrowernumber = $borr
121                                       AND cancellationdate is NULL 
122                                       AND (found <> 'F' or found is NULL)";
123         my $sth=$dbh->prepare($query);
124         $sth->execute;
125         my ($priority) = $sth->fetchrow_array;
126         $sth->finish;
127 # update the database, removing the record...
128         my $query = "update reserves set cancellationdate = now(), 
129                                          found            = Null, 
130                                          priority         = 0 
131                                    where biblionumber     = $q_biblio 
132                                      and borrowernumber   = $borr
133                                      and cancellationdate is NULL 
134                                      and (found <> 'F' or found is NULL)";
135         my $sth = $dbh->prepare($query);
136         $sth->execute;
137         $sth->finish;
138 # now fix the priority on the others....
139         fixpriority($priority, $biblio);
140     }
141     $dbh->disconnect;
142 }
143
144
145 sub FillReserve {
146     my ($res) = @_;
147     my $dbh=C4Connect;
148 # removing a waiting reserve record....
149     my $biblio = $res->{'biblionumber'}; my $qbiblio = $dbh->quote($biblio);
150     my $borr = $res->{'borrowernumber'}; $borr = $dbh->quote($borr);
151     my $resdate = $res->{'reservedate'}; $resdate = $dbh->quote($resdate);
152 # update the database...
153     my $query = "UPDATE reserves SET found            = 'F', 
154                                      priority         = 0 
155                                WHERE biblionumber     = $qbiblio
156                                  AND reservedate      = $resdate
157                                  AND borrowernumber   = $borr";
158     my $sth = $dbh->prepare($query);
159     $sth->execute;
160     $sth->finish;
161     $dbh->disconnect;
162 # now fix the priority on the others....
163     fixpriority($res->{'priority'}, $biblio);
164 }
165
166 sub fixpriority {
167     my ($priority, $biblio) =  @_;
168     my $dbh = C4Connect;
169     my ($count, $reserves) = FindReserves($biblio);
170     foreach my $rec (@$reserves) {
171         if ($rec->{'priority'} > $priority) {
172             my $newpr = $rec->{'priority'};      $newpr = $dbh->quote($newpr - 1);
173             my $nbib = $rec->{'biblionumber'};   $nbib = $dbh->quote($nbib);
174             my $nbor = $rec->{'borrowernumber'}; $nbor = $dbh->quote($nbor);
175             my $nresd = $rec->{'reservedate'};   $nresd = $dbh->quote($nresd);
176             my $query = "UPDATE reserves SET priority = $newpr 
177                                WHERE biblionumber     = $nbib 
178                                  AND borrowernumber   = $nbor
179                                  AND reservedate      = $nresd";
180             warn $query;
181             my $sth = $dbh->prepare($query);
182             $sth->execute;
183             $sth->finish;
184         } 
185     }
186     $dbh->disconnect;
187 }
188
189
190
191 sub ReserveWaiting {
192     my ($item, $borr) = @_;
193     my $dbh = C4Connect;
194     $item = $dbh->quote($item);
195     $borr = $dbh->quote($borr);
196 # get priority and biblionumber....
197     my $query = "SELECT reserves.priority     as priority, 
198                         reserves.biblionumber as biblionumber,
199                         reserves.branchcode   as branchcode 
200                       FROM reserves,items 
201                      WHERE reserves.biblionumber   = items.biblionumber 
202                        AND items.itemnumber        = $item 
203                        AND reserves.borrowernumber = $borr 
204                        AND reserves.cancellationdate is NULL
205                        AND (reserves.found <> 'F' or reserves.found is NULL)";
206     my $sth = $dbh->prepare($query);
207     $sth->execute;
208     my $data = $sth->fetchrow_hashref;
209     $sth->finish;
210     my $biblio = $data->{'biblionumber'};
211     my $q_biblio = $dbh->quote($biblio);
212 # update reserves record....
213     $query = "UPDATE reserves SET priority = 0, found = 'W', itemnumber = $item 
214                             WHERE borrowernumber = $borr AND biblionumber = $q_biblio";
215     $sth = $dbh->prepare($query);
216     $sth->execute;
217     $sth->finish;
218     $dbh->disconnect;
219 # now fix up the remaining priorities....
220     fixpriority($data->{'priority'}, $biblio);
221     my $branchcode = $data->{'branchcode'};
222     return $branchcode;
223 }
224
225 sub CheckWaiting {
226     my ($borr)=@_;
227     my $dbh = C4Connect;
228     $borr = $dbh->quote($borr);
229     my @itemswaiting;
230     my $query = "SELECT * FROM reserves
231                          WHERE borrowernumber = $borr
232                            AND reserves.found = 'W' 
233                            AND cancellationdate is NULL";
234     my $sth = $dbh->prepare($query);
235     $sth->execute();
236     my $cnt=0;
237     if (my $data=$sth->fetchrow_hashref) {
238         @itemswaiting[$cnt] =$data;
239         $cnt ++;
240     }
241     $sth->finish;
242     return ($cnt,\@itemswaiting);
243 }
244
245 sub Findgroupreserve {
246   my ($bibitem,$biblio)=@_;
247   my $dbh=C4Connect;
248   $bibitem=$dbh->quote($bibitem);
249   my $query = "SELECT reserves.biblionumber               AS biblionumber, 
250                       reserves.borrowernumber             AS borrowernumber, 
251                       reserves.reservedate                AS reservedate, 
252                       reserves.branchcode                 AS branchcode, 
253                       reserves.cancellationdate           AS cancellationdate, 
254                       reserves.found                      AS found, 
255                       reserves.reservenotes               AS reservenotes, 
256                       reserves.priority                   AS priority, 
257                       reserves.timestamp                  AS timestamp, 
258                       reserveconstraints.biblioitemnumber AS biblioitemnumber, 
259                       reserves.itemnumber                 AS itemnumber 
260                  FROM reserves LEFT JOIN reserveconstraints
261                    ON reserves.biblionumber = reserveconstraints.biblionumber
262                 WHERE reserves.biblionumber = $biblio
263                   AND ( ( reserveconstraints.biblioitemnumber = $bibitem 
264                       AND reserves.borrowernumber = reserveconstraints.borrowernumber
265                       AND reserves.reservedate    =reserveconstraints.reservedate )
266                    OR reserves.constrainttype='a' )
267                   AND reserves.cancellationdate is NULL
268                   AND (reserves.found <> 'F' or reserves.found is NULL)";
269   my $sth=$dbh->prepare($query);
270   $sth->execute;
271   my $i=0;
272   my @results;
273   while (my $data=$sth->fetchrow_hashref){
274     $results[$i]=$data;
275     $i++;
276   }
277   $sth->finish;
278   $dbh->disconnect;
279   return($i,@results);
280 }
281
282 sub CreateReserve {                                                           
283   my
284 ($env,$branch,$borrnum,$biblionumber,$constraint,$bibitems,$priority,$notes,$title)= @_;   
285   my $fee=CalcReserveFee($env,$borrnum,$biblionumber,$constraint,$bibitems);
286   my $dbh = &C4Connect;       
287   my $const = lc substr($constraint,0,1);       
288   my @datearr = localtime(time);                                
289   my $resdate =(1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];                   
290   #eval {                                                           
291   # updates take place here             
292   if ($fee > 0) {           
293 #    print $fee;
294     my $nextacctno = &getnextacctno($env,$borrnum,$dbh);   
295     my $updquery = "insert into accountlines       
296     (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)                                              
297                                                           values
298     ($borrnum,$nextacctno,now(),$fee,'Reserve Charge - $title','Res',$fee)";          
299     my $usth = $dbh->prepare($updquery);                      
300     $usth->execute;             
301     $usth->finish;                        
302   }                     
303   #if ($const eq 'a'){
304     my $query="insert into reserves
305    (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes)
306     values
307 ('$borrnum','$biblionumber','$resdate','$branch','$const','$priority','$notes')";   
308     my $sth = $dbh->prepare($query);                        
309     $sth->execute();                
310     $sth->finish;
311   #}
312   if (($const eq "o") || ($const eq "e")) {     
313     my $numitems = @$bibitems;             
314     my $i = 0;                                        
315     while ($i < $numitems) {   
316       my $biblioitem = @$bibitems[$i];   
317       my $query = "insert into
318       reserveconstraints                          
319       (borrowernumber,biblionumber,reservedate,biblioitemnumber)         
320       values
321       ('$borrnum','$biblionumber','$resdate','$biblioitem')";                 
322       my $sth = $dbh->prepare($query);                    
323       $sth->execute();
324       $sth->finish;
325       $i++;                         
326     }                                   
327   } 
328 #  print $query;
329   $dbh->disconnect();         
330   return();   
331 }             
332
333 sub CalcReserveFee {
334   my ($env,$borrnum,$biblionumber,$constraint,$bibitems) = @_;        
335   #check for issues;    
336   my $dbh = &C4Connect;           
337   my $const = lc substr($constraint,0,1); 
338   my $query = "select * from borrowers,categories 
339   where (borrowernumber = '$borrnum')         
340   and (borrowers.categorycode = categories.categorycode)";   
341   my $sth = $dbh->prepare($query);                       
342   $sth->execute;                                    
343   my $data = $sth->fetchrow_hashref;                  
344   $sth->finish();       
345   my $fee = $data->{'reservefee'};         
346   my $cntitems = @->$bibitems;   
347   if ($fee > 0) {                         
348     # check for items on issue      
349     # first find biblioitem records       
350     my @biblioitems;    
351     my $query1 = "select * from biblio,biblioitems                           
352     where (biblio.biblionumber = '$biblionumber')     
353     and (biblio.biblionumber = biblioitems.biblionumber)";
354     my $sth1 = $dbh->prepare($query1);                   
355     $sth1->execute();                                     
356     while (my $data1=$sth1->fetchrow_hashref) { 
357       if ($const eq "a") {    
358         push @biblioitems,$data1;       
359       } else {                     
360         my $found = 0;        
361         my $x = 0;
362         while ($x < $cntitems) {                                             
363           if (@$bibitems->{'biblioitemnumber'} == $data->{'biblioitemnumber'}) {         
364             $found = 1;   
365           }               
366           $x++;                                       
367         }               
368         if ($const eq 'o') {
369           if ( $found == 1) {
370             push @biblioitems,$data1;
371           }                            
372         } else {
373           if ($found == 0) {
374             push @biblioitems,$data1;
375           } 
376         }     
377       }   
378     }             
379     $sth1->finish;                                  
380     my $cntitemsfound = @biblioitems; 
381     my $issues = 0;                 
382     my $x = 0;                   
383     my $allissued = 1; 
384     while ($x < $cntitemsfound) { 
385       my $bitdata = $biblioitems[$x];                                       
386       my $query2 = "select * from items                   
387       where biblioitemnumber = '$bitdata->{'biblioitemnumber'}'";     
388       my $sth2 = $dbh->prepare($query2);                       
389       $sth2->execute;   
390       while (my $itdata=$sth2->fetchrow_hashref) { 
391         my $query3 = "select * from issues
392         where itemnumber = '$itdata->{'itemnumber'}' and
393         returndate is null";
394         
395         my $sth3 = $dbh->prepare($query3);                      
396         $sth3->execute();                     
397         if (my $isdata=$sth3->fetchrow_hashref) {
398         } else {
399           $allissued = 0; 
400         }  
401       }                                                           
402       $x++;   
403     }         
404     if ($allissued == 0) { 
405       my $rquery = "select * from reserves           
406       where biblionumber = '$biblionumber'"; 
407       my $rsth = $dbh->prepare($rquery);   
408       $rsth->execute();   
409       if (my $rdata = $rsth->fetchrow_hashref) { 
410       } else {                                     
411         $fee = 0;                                                           
412       }   
413     }             
414   }                   
415 #  print "fee $fee";
416   $dbh->disconnect();   
417   return $fee;                                      
418 }                   
419
420 sub getnextacctno {                                                           
421   my ($env,$bornumber,$dbh)=@_;           
422   my $nextaccntno = 1;      
423   my $query = "select * from accountlines                             
424   where (borrowernumber = '$bornumber')                               
425   order by accountno desc";                       
426   my $sth = $dbh->prepare($query);                                  
427   $sth->execute;                    
428   if (my $accdata=$sth->fetchrow_hashref){    
429     $nextaccntno = $accdata->{'accountno'} + 1;           
430   }                       
431   $sth->finish;                                       
432   return($nextaccntno);                   
433 }              
434
435 sub updatereserves{
436   #subroutine to update a reserve 
437   my ($rank,$biblio,$borrower,$del,$branch)=@_;
438   my $dbh=C4Connect;
439   my $query="Update reserves ";
440   if ($del ==0){
441     $query.="set  priority='$rank',branchcode='$branch' where
442     biblionumber=$biblio and borrowernumber=$borrower";
443   } else {
444     $query="Select * from reserves where biblionumber=$biblio and
445     borrowernumber=$borrower";
446     my $sth=$dbh->prepare($query);
447     $sth->execute;
448     my $data=$sth->fetchrow_hashref;
449     $sth->finish;
450     $query="Select * from reserves where biblionumber=$biblio and 
451     priority > '$data->{'priority'}' and cancellationdate is NULL 
452     order by priority";
453     my $sth2=$dbh->prepare($query) || die $dbh->errstr;
454     $sth2->execute || die $sth2->errstr;
455     while (my $data=$sth2->fetchrow_hashref){
456       $data->{'priority'}--;
457       $query="Update reserves set priority=$data->{'priority'} where
458       biblionumber=$data->{'biblionumber'} and
459       borrowernumber=$data->{'borrowernumber'}";
460       my $sth3=$dbh->prepare($query);
461       $sth3->execute || die $sth3->errstr;
462       $sth3->finish;
463     }
464     $sth2->finish;
465     $query="update reserves set cancellationdate=now() where biblionumber=$biblio 
466     and borrowernumber=$borrower";    
467   }
468   my $sth=$dbh->prepare($query);
469   $sth->execute;
470   $sth->finish;  
471   $dbh->disconnect;
472 }
473
474 sub getreservetitle {
475  my ($biblio,$bor,$date,$timestamp)=@_;
476  my $dbh=C4Connect;
477  my $query="Select * from reserveconstraints,biblioitems where
478  reserveconstraints.biblioitemnumber=biblioitems.biblioitemnumber
479  and reserveconstraints.biblionumber=$biblio and reserveconstraints.borrowernumber
480  = $bor and reserveconstraints.reservedate='$date' and
481  reserveconstraints.timestamp=$timestamp";
482  my $sth=$dbh->prepare($query);
483  $sth->execute;
484  my $data=$sth->fetchrow_hashref;
485  $sth->finish;
486  $dbh->disconnect;
487 # print $query;
488  return($data);
489 }
490
491
492
493
494
495                         
496 END { }       # module clean-up code here (global destructor)