This is the begining of a process of dividing up circulation.pl
[koha.git] / circ / circulation.pl
1 #!/usr/bin/perl
2
3 use CGI qw/:standard/;
4 use C4::Circulation::Circ2;
5 use C4::Output;
6 use C4::Print;
7 use DBI;
8
9
10 my %env;
11 my $headerbackgroundcolor='#99cc33';
12 my $circbackgroundcolor='#ffffcc';
13 my $circbackgroundcolor='white';
14 my $linecolor1='#ffffcc';
15 my $linecolor2='white';
16 my $backgroundimage="/images/background-mem.gif";
17 my $query=new CGI;
18 my $branches=getbranches(\%env);
19 my $printers=getprinters(\%env);
20 my $branch=$query->param('branch');
21 my $printer=$query->param('printer');
22 #print $query->header;
23 ($branch) || ($branch=$query->cookie('branch'));
24 ($printer) || ($printer=$query->cookie('printer'));
25 my ($oldbranch, $oldprinter);
26 if ($query->param('selectnewbranchprinter')) {
27     $oldbranch=$branch;
28     $oldprinter=$printer;
29     $branch='';
30     $printer='';
31 }
32 $env{'branchcode'}=$branch;
33 $env{'printer'}=$printer;
34 $env{'queue'}=$printer;
35 my $branchcount=0;
36 my $printercount=0;
37 my $branchoptions;
38 my $printeroptions;
39 foreach (keys %$branches) {
40     (next) unless ($_);
41     (next) if (/^TR$/);
42     $branchcount++;
43     my $selected='';
44     ($selected='selected') if ($_ eq $oldbranch);
45     $branchoptions.="<option value=$_ $selected>$branches->{$_}->{'branchname'}\n";
46 }
47 foreach (keys %$printers) {
48     (next) unless ($_);
49     $printercount++;
50     my $selected='';
51     ($selected='selected') if ($_ eq $oldprinter);
52     $printeroptions.="<option value=$_ $selected>$printers->{$_}->{'printername'}\n";
53 }
54 if ($printercount==1) {
55     ($printer)=keys %$printers;
56 }
57 if ($branchcount==1) {
58     ($branch)=keys %$branches;
59 }
60
61
62 my $branchname='';
63 my $printername='';
64 if ($branch && $printer) {
65     $branchname=$branches->{$branch}->{'branchname'};
66     $printername=$printers->{$printer}->{'printername'};
67 }
68
69
70 my $branchcookie=$query->cookie(-name=>'branch', -value=>"$branch", -expires=>'+1y');
71 my $printercookie=$query->cookie(-name=>'printer', -value=>"$printer", -expires=>'+1y');
72
73 print $query->header(-type=>'text/html',-expires=>'now', -cookie=>[$branchcookie,$printercookie]);
74 #print $query->dump;
75 print startpage();
76 #print startmenu('circulation');
77 my @inp=startmenu('circulation');
78 if ($query->param('module') eq 'issues' && $query->param('barcode') eq '' && $query->param('charges') eq 'yes'){
79  my $count=@inp;
80  for (my $i=0;$i<$count;$i++){
81   my $bornum=$query->param('borrnumber');
82   $inp[$i]=~ s/onLoad=focusinput\(\)/onLoad=focusinput\(\)\;messenger\(\"\/cgi-bin\/koha\/pay.pl?bornum=$bornum\"\)\;window1.focus\(\)/;
83  }
84 }
85 print @inp;
86
87 print <<EOF
88 <script language="javascript" type="text/javascript">
89 <!--
90 function messenger(url){
91    window1=window.open(url,"window1","height=700,width=600,left=150,top=50,350,screenY=50");
92 }
93 //-->
94 </script>
95 EOF
96 ;
97 if ($printer && $branch) {
98
99     SWITCH: {
100         if ($query->param('module') eq 'issues') { issues(); last SWITCH; }
101         if ($query->param('module') eq 'returns') { returns(); last SWITCH; }
102         issues();
103     }
104 } else {
105     my ($printerform, $branchform);
106     if ($printercount>1) {
107         $printerform=<<"EOF";
108
109 <table border=0 cellspacing=0 cellpadding=5>
110 <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Choose a Printer</font></td></tr>
111 <tr><td>
112 <select name=printer>
113 $printeroptions
114 </select>
115 </td></tr>
116 </table>
117 EOF
118     } else {
119         my ($printer) = keys %$printers;
120         $printerform=<<"EOF";
121         <input type=hidden name=printer value=$printer>
122 EOF
123     }
124
125     if ($branchcount>1) {
126         $branchform=<<"EOF";
127 <table border=0 cellpadding=5 cellspacing=0>
128 <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Choose a Branch</font></td></tr>
129 <tr><td>
130 <select name=branch>
131 $branchoptions
132 </select>
133 </td></tr>
134 </table>
135 EOF
136     }
137     print << "EOF";
138     <center>
139     Select a branch and a printer
140     <form method=get>
141     <table border=0>
142     <tr><td>
143     $branchform
144     </td><td>
145     $printerform
146     </td></tr>
147     </table>
148     <input type=submit>
149     </form>
150 EOF
151 }
152
153
154 print endmenu('circulation');
155 print endpage();
156
157 sub default {
158 print << "EOF";
159 <a href=circulation.pl?module=issues&branch=$branch&printer=$printer>Issues</a>
160 <a href=circulation.pl?module=returns&branch=$branch&printer=$printer>Returns</a>
161 EOF
162 }
163
164
165 sub decode {
166     ($encoded) = @_;
167     $seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
168     @s = map { index($seq,$_); } split(//,$encoded);
169     $l = ($#s+1) % 4;
170     if ($l)
171     {
172         if ($l == 1)
173         {
174             print "Error!";
175             return;
176         }
177         $l = 4-$l;
178         $#s += $l;
179     }
180     $r = '';
181     while ($#s >= 0)
182     {
183         $n = (($s[0] << 6 | $s[1]) << 6 | $s[2]) << 6 | $s[3];
184         $r .=chr(($n >> 16) ^ 67) .
185              chr(($n >> 8 & 255) ^ 67) .
186              chr(($n & 255) ^ 67);
187         @s = @s[4..$#s];
188     }
189     $r = substr($r,0,length($r)-$l);
190     return $r;
191 }
192
193 sub returns {
194     my %returneditems;
195     print << "EOF";
196     <table border=0 cellpadding=10 cellspacing=0 cellpadding=5><tr><th background=$backgroundimage>Circulation - Returns</th></tr><tr><td bgcolor=$circbackgroundcolor align=center>
197 EOF
198     foreach ($query->param) {
199         (next) unless (/ri-(\d*)/);
200         my $counter=$1;
201         (next) if ($counter>20);
202         my $barcode=$query->param("ri-$counter");
203       # I'm not POSITIVE this decode belongs here - can't tell what causes it to run.
204       # decode cuecat
205       chomp($barcode);
206       @fields = split(/\./,$barcode);
207       @results = map(decode($_), @fields[1..$#fields]);
208       if ($#results == 2)
209       {
210         $barcode=$results[2];
211       }
212       # end decode
213         my $duedate=$query->param("dd-$counter");
214         my $borrowernumber=$query->param("bn-$counter");
215         $counter++;
216         $returneditems{$counter}=$barcode;
217         $riduedate{$counter}=$duedate;
218         $riborrowernumber{$counter}=$borrowernumber;
219         $ritext.="<input type=hidden name=ri-$counter value=$barcode>\n";
220         $ritext.="<input type=hidden name=dd-$counter value=$duedate>\n";
221         $ritext.="<input type=hidden name=bn-$counter value=$borrowernumber>\n";
222     }
223     if (my $barcode=$query->param('barcode')) {
224       # decode cuecat
225       chomp($barcode);
226       @fields = split(/\./,$barcode);
227       @results = map(decode($_), @fields[1..$#fields]);
228       if ($#results == 2)
229       {
230         $barcode=$results[2];
231       }
232       # end decode
233         $ritext.="<input type=hidden name=ri-0 value=$barcode>\n";
234         $returneditems{0}=$barcode;
235     }
236         
237     my $barcodeentrytext= << "EOF";
238     <form method=post action=/cgi-bin/koha/circ/circulation.pl>
239     <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
240         <tr><td colspan=2 bgcolor=$headerbackgroundcolor align=center background=$backgroundimage><font color=black><b>Enter Book Barcode</b></font></td></tr>
241         <tr><td>Item Barcode:</td><td><input name=barcode size=10></td></tr>
242     </table>
243     <input type=hidden name=module value=returns>
244     <input type=hidden name=branch value=$branch>
245     <input type=hidden name=printer value=$printer>
246     $ritext
247 EOF
248     if ((my $barcode=$query->param('barcode')) || (%returneditems)) {
249       # decode cuecat
250       chomp($barcode);
251       @fields = split(/\./,$barcode);
252       @results = map(decode($_), @fields[1..$#fields]);
253       if ($#results == 2)
254       {
255         $barcode=$results[2];
256       }
257       # end decode
258         my ($iteminformation, $borrower, $messages, $overduecharge) = returnbook(\%env, $barcode);
259         
260         (my $nosuchitem=1) unless ($iteminformation);
261         $riborrowernumber{0}=$borrower->{'borrowernumber'};
262         $riduedate{0}=$iteminformation->{'date_due'};
263         $barcodeentrytext.= "<input type=hidden name=dd-0 value=$iteminformation->{'date_due'}>\n";
264         $barcodeentrytext.= "<input type=hidden name=bn-0 value=$borrower->{'borrowernumber'}>\n";
265         my @datearr = localtime(time());
266         my $todaysdate = (1900+$datearr[5]).'-'.sprintf ("%0.2d", ($datearr[4]+1)).'-'.
267           sprintf ("%0.2d", $datearr[3]);
268         my $itemtable=<<"EOF";
269 <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
270 <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Returned Item Information</font></th></tr>
271 <tr><td>
272 Title: $iteminformation->{'title'}<br>
273 <!--Hlt decided they dont want these showing, uncoment the html to make it work
274
275 Author: $iteminformation->{'author'}<br>
276 Barcode: <a href=/cgi-bin/koha/detail.pl?bib=$iteminformation->{'biblionumber'}&type=intra onClick="openWindow(this, 'Item', 480, 640)">$iteminformation->{'barcode'}</a><br>
277 Date Due: $iteminformation->{'date_due'}-->
278 </td></tr>
279 </table>
280 EOF
281         if ($messages) {
282             my $messagetext='';
283             foreach (@$messages) {
284                 $messagetext.="$_<p>\n";
285             }
286             print << "EOF";
287 <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
288 <tr><th bgcolor=$headerbackgroundcolor $background=$backgroundimage><font color=black>Messages</font></th></tr>
289 <tr><td>
290 $messagetext
291 </td></tr>
292 </table>
293 <p>
294 EOF
295         }
296         if (($nosuchitem) && ($barcode)) {
297             print << "EOF";
298             <table border=0 cellpadding=1>
299             <tr>
300             <td valign=top>
301             $barcodeentrytext
302             </td>
303             <td valign=top>
304             <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
305             <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Error</font></th></tr>
306             <tr><td>
307             <table border=0 cellpadding=5>
308             <tr><td>
309             $barcode is not a valid barcode.
310             </td></tr>
311             </table>
312             </td></tr>
313             </table>
314             </td>
315             </tr>
316             </table>
317 EOF
318         } elsif ($nosuchitem) {
319             print << "EOF";
320             <table border=0 cellpadding=1>
321             <tr>
322             <td valign=top>
323             $barcodeentrytext
324             </td>
325             </tr>
326             </table>
327 EOF
328         } else {
329             if ($borrower->{'borrowernumber'}) {
330                 my ($patrontable, $flaginfotext) = patrontable($borrower);
331                 print << "EOF";
332                 <table border=0 cellpadding=5>
333                     <tr>
334                         <td>
335                         $barcodeentrytext
336                         </td>
337                         <td align=center valign=top>
338                         $itemtable
339                         </td>
340                     </tr>
341                     <tr>
342                         <td valign=top align=center colspan=2>
343                         <table border=0>
344                         <tr><td valign=top>
345                         $patrontable
346                         </td>
347                         <td valign=top>
348                         $flaginfotext
349                         </td>
350                         </tr>
351                         </table>
352                         </td>
353                     </tr>
354                 </table>
355                 <br>
356 EOF
357             } else {
358                 print << "EOF";
359                 <table border=0 cellpadding=5>
360                 <tr><td>
361                 $barcodeentrytext
362                 </td>
363                 <td>
364
365                 <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
366                 <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Error</font></th></tr>
367                 <tr><td>
368                 <table border=0 cellpadding=5>
369                 <tr><td>
370                 $iteminformation->{'title'} by $iteminformation->{'author'} was not loaned out.
371                 </td></tr>
372                 </table>
373                 </td></tr>
374                 </table>
375                 </td>
376                 </tr>
377                 </table>
378 EOF
379             }
380         }
381         print << "EOF";
382         <p>
383         <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
384         <tr><th colspan=6 bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Returned Items</font></th></tr>
385         <tr><th>Due Date</th><th>Bar Code</th><th>Title</th><th>Author</th><th>Type</th><th>Borrower</th></tr>
386 EOF
387         my $color='';
388         #set up so only the lat 8 returned items display (make for faster loading pages)
389         my $count=0;
390         foreach (sort {$a <=> $b} keys %returneditems) {
391           if ($count < 8){
392             ($color eq $linecolor1) ? ($color=$linecolor2) : ($color=$linecolor1);
393             my $barcode=$returneditems{$_};
394             my $duedate=$riduedate{$_};
395             my @datearr = localtime(time());
396             ###
397             # convert to nz date format
398             my @tempdate=split(/-/,$duedate);
399             $duedate="$tempdate[2]/$tempdate[1]/$tempdate[0]";
400             ####
401             my $todaysdate = (1900+$datearr[5]).'-'.sprintf ("%0.2d", ($datearr[4]+1)).'-'.sprintf ("%0.2d", $datearr[3]);
402             my $overduetext="$duedate";
403             ($overduetext="<font color=red>$duedate</font>") if ($duedate lt $todaysdate);
404             ($duedate) || ($overduetext="<img src=/koha/images/blackdot.gif>");
405             my $borrowernumber=$riborrowernumber{$_};
406             my ($borrower) = getpatroninformation(\%env,$borrowernumber,0);
407             my ($iteminformation) = getiteminformation(\%env, 0, $barcode);
408             print "<tr><td bgcolor=$color>$overduetext</td><td bgcolor=$color align=center><a href=/cgi-bin/koha/detail.pl?bib=$iteminformation->{'biblionumber'}&type=intra onClick=\"openWindow(this, 'Item', 480, 640)\">$barcode</a></td><td bgcolor=$color>$iteminformation->{'title'}</td><td bgcolor=$color>$iteminformation->{'author'}</td><td bgcolor=$color align=center>$iteminformation->{'itemtype'}</td><td bgcolor=$color><img src=/koha/images/blackdot.gif><a href=/cgi-bin/koha/moremember.pl?bornum=$borrower->{'borrowernumber'} onClick=\"openWindow(this,'Member', 480, 640)\">$borrower->{'cardnumber'}</a> $borrower->{'firstname'} $borrower->{'surname'}</td></tr>\n";
409           } else {
410             last
411           }
412           $count++;
413         }
414         print "</table>\n";
415     } else {
416         print $barcodeentrytext;
417     }
418     print "</form>\n";
419     print "</td></tr></table>\n";
420 }
421
422 sub issues {
423     my ($noheader) = shift;
424     my $print=$query->param('print');
425     my $borrowernumber=$query->param('borrnumber');    
426     my $barcode=$query->param('barcode');
427     if ($barcode eq ''){
428       $print='yes';     
429     } elsif ($barcode eq ' '){
430       $query->param('barcode','');
431       $barcode='';
432     }
433     if ($print eq 'yes' && $borrowernumber ne ''){
434       my ($borrower, $flags) = getpatroninformation(\%env,$borrowernumber,0);
435       $env{'todaysissues'}=1;
436       my ($borrowerissues) = currentissues(\%env, $borrower);
437       $env{'nottodaysissues'}=1;
438       $env{'todaysissues'}=0;
439       my ($borroweriss2)=currentissues(\%env, $borrower);
440       $env{'nottodaysissues'}=0;
441       my $i=0;
442       my @issues;
443       foreach (sort keys %$borrowerissues) {
444         $issues[$i]=$borrowerissues->{$_};
445         my $dd=$issues[$i]->{'date_due'};
446         #convert to nz style dates
447         #this should be set with some kinda config variable     
448         my @tempdate=split(/-/,$dd);
449         $issues[$i]->{'date_due'}="$tempdate[2]/$tempdate[1]/$tempdate[0]";
450         $i++;
451       }
452       foreach (sort keys %$borroweriss2) {
453         $issues[$i]=$borroweriss2->{$_};
454         my $dd=$issues[$i]->{'date_due'};
455         #convert to nz style dates
456         #this should be set with some kinda config variable     
457         my @tempdate=split(/-/,$dd);
458         $issues[$i]->{'date_due'}="$tempdate[2]/$tempdate[1]/$tempdate[0]";
459         $i++;
460       }
461       remoteprint(\%env,\@issues,$borrower);
462       $query->param('borrnumber','')
463     }
464     unless ($noheader) {
465       print <<EOF
466       <p align=right>
467       <FONT SIZE=2  face="arial, helvetica">
468       <a href=circulation.pl?borrnumber=$borrowernumber&module=issues&branch=$branch&printer=$printer&print>Next Borrower</a> ||
469       <a href=circulation.pl?module=returns&branch=$branch&printer=$printer>Returns</a> ||
470       <a href=branchtransfers.pl>Transfer Book</a></font><p>
471         
472         </p>
473 EOF
474     }
475     if (my $borrnumber=$query->param('borrnumber')) {
476         my ($borrower, $flags) = getpatroninformation(\%env,$borrnumber,0);
477         my $year=$query->param('year');
478         my $month=$query->param('month');
479         my $day=$query->param('day');
480         if (my $barcode=$query->param('barcode')) {
481           # decode cuecat
482           chomp($barcode);
483           @fields = split(/\./,$barcode);
484           @results = map(decode($_), @fields[1..$#fields]);
485           if ($#results == 2)
486           {
487             $barcode=$results[2];
488           }
489           # end decode
490             my $invalidduedate=0;
491             $env{'datedue'}='';
492             if (($year eq 0) && ($month eq 0) && ($year eq 0)) {
493                 $env{'datedue'}='';
494             } else {
495                 if (($year eq 0) || ($month eq 0) || ($year eq 0)) {
496                     print "Invalid Due Date Specified. Book was not issued.<p>\n";
497                     $invalidduedate=1;
498                 } else {
499                     if (($day>30) && (($month==4) || ($month==6) || ($month==9) || ($month==11))) {
500                         print "Invalid Due Date Specified. Book was not issued. Only 30 days in $month month.<p>\n";
501                         $invalidduedate=1;
502                     } elsif (($day>29) && ($month==2)) {
503                         print "Invalid Due Date Specified. Book was not issued.  Never that many days in February!<p>\n";
504                         $invalidduedate=1;
505                     } elsif (($month==2) && ($day>28) && (($year%4) && ((!($year%100) || ($year%400))))) {
506                         print "Invalid Due Date Specified. Book was not issued.  $year is not a leap year.<p>\n";
507                         $invalidduedate=1;
508                     } else {
509                         $env{'datedue'}="$year-$month-$day";
510                     }
511                 }
512             }
513             my %responses;
514             foreach (sort $query->param) {
515                 if ($_ =~ /response-(\d*)/) {
516                     $responses{$1}=$query->param($_);
517                 }
518             }
519             if (my $qnumber=$query->param('questionnumber')) {
520                 $responses{$qnumber}=$query->param('answer');
521             }
522             unless ($invalidduedate) {
523                 my @time=localtime(time);
524                 my $date= (1900+$time[5])."-".($time[4]+1)."-".$time[3];
525                 my ($iteminformation, $duedate, $rejected, $question, $questionnumber, $defaultanswer, $message) = issuebook(\%env, $borrower, $barcode, \%responses,$date);
526                 unless ($iteminformation) {
527                     print << "EOF";
528                     <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
529                     <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Error</font></th></tr>
530                     <tr><td>
531                     <table border=0 cellpadding=5>
532                     <tr><td>
533                     $barcode is not a valid barcode.
534                     </td></tr>
535                     </table>
536 EOF
537                 }
538                 if ($rejected) {
539                     if ($rejected == -1) {
540                     } else {
541                         print << "EOF"
542                         <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
543                         <tr><th><font color=black size=6>Error Issuing Book</font></th></tr>
544                         <tr><td><font color=red size=6>$rejected</font></td></tr>
545                         </table>
546                         <br>
547 EOF
548                     }
549                 }
550                 my $responsesform='';
551                 foreach (keys %responses) {
552                     $responsesform.="<input type=hidden name=response-$_ value=$responses{$_}>\n";
553                 }
554                 if ($question) {
555                     my $stickyduedate=$query->param('stickyduedate');
556                     print << "EOF";
557                     <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
558                     <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black><b>Issuing Question</b></font></td></tr>
559                     <tr><td>
560                     <table border=0 cellpadding=10>
561                     <tr><td>
562                     Attempting to issue $iteminformation->{'title'} by $iteminformation->{'author'} to $borrower->{'firstname'} $borrower->{'surname'}.
563                     <p>
564                     $question
565                     </td></tr>
566                     </table>
567                     </td></tr>
568
569                     <tr><td align=center>
570                     <table border=0>
571                     <tr><td>
572                     <form method=get>
573                     <input type=hidden name=module value=issues>
574                     <input type=hidden name=borrnumber value=$borrnumber>
575                     <input type=hidden name=barcode value=$barcode>
576                     <input type=hidden name=questionnumber value=$questionnumber>
577                     <input type=hidden name=day value=$day>
578                     <input type=hidden name=month value=$month>
579                     <input type=hidden name=year value=$year>
580                     <input type=hidden name=stickyduedate value=$stickyduedate>
581                     <input type=hidden name=branch value=$branch>
582                     <input type=hidden name=printer value=$printer>
583                     $responsesform
584                     <input type=hidden name=answer value=Y>
585                     <input type=submit value=Yes>
586                     </form>
587                     </td>
588                     <td>
589                     <form method=get>
590                     <input type=hidden name=module value=issues>
591                     <input type=hidden name=borrnumber value=$borrnumber>
592                     <input type=hidden name=barcode value=$barcode>
593                     <input type=hidden name=questionnumber value=$questionnumber>
594                     <input type=hidden name=day value=$day>
595                     <input type=hidden name=month value=$month>
596                     <input type=hidden name=year value=$year>
597                     <input type=hidden name=stickyduedate value=$stickyduedate>
598                     <input type=hidden name=branch value=$branch>
599                     <input type=hidden name=printer value=$printer>
600                     $responsesform
601                     <input type=hidden name=answer value=N>
602                     <input type=submit value=No>
603                     </form>
604                     </td>
605                     </tr>
606                     </table>
607                     </td></tr>
608                     </table>
609                     </td></tr>
610                     </table>
611 EOF
612                     return;
613                 }
614                 if ($message) {
615                     print << "EOF";
616                     <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
617                     <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black>Message</font></th></tr>
618                     <tr><td>$message</td></tr>
619                     </table>
620                     <p>
621 EOF
622                 }
623             }
624         }
625         my $issueid=$query->param('issueid');
626         ($issueid) || ($issueid=int(rand()*1000000000));
627         my $flag='';
628         my $flagtext='';
629         my $flaginfotext='';
630         foreach $flag (sort keys %$flags) {
631             if ($flags->{$flag}->{'noissues'}) {
632                 $flagtext.="<font color=red>$flag</font> ";
633             } else {
634                 $flagtext.="$flag ";
635             }
636             $flags->{$flag}->{'message'}=~s/\n/<br>/g;
637             if ($flags->{$flag}->{'noissues'}) {
638                 $flaginfotext.="<tr><td bgcolor=red valign=top><font color=black><b>$flag</b></font></td><td bgcolor=red><font color=black><b>$flags->{$flag}->{'message'}</b></font></td></tr>\n";
639             } else {
640                 $flaginfotext.="<tr><td valign=top>$flag</td><td>$flags->{$flag}->{'message'}</td></tr>\n";
641             }
642         }
643         if ($flaginfotext) {
644             $flaginfotext="<table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd><tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage colspan=2><font color=black>Patron Flags</font></th></tr>$flaginfotext</table>\n";
645         }
646         $env{'nottodaysissues'}=1;
647         my ($borrowerissues) = currentissues(\%env, $borrower);
648         $env{'nottodaysissues'}=0;
649         $env{'todaysissues'}=1;
650         my ($today) = currentissues(\%env, $borrower);
651         $env{'todaysissues'}=0;
652         my $previssues='';
653         my @datearr = localtime(time());
654         my $todaysdate = (1900+$datearr[5]).sprintf ("%0.2d", ($datearr[4]+1)).sprintf ("%0.2d", $datearr[3]);
655         my $color='';
656         foreach (sort keys %$borrowerissues) {
657             ($color eq $linecolor1) ? ($color=$linecolor2) : ($color=$linecolor1);
658             my $bookissue=$borrowerissues->{$_};
659             my $bgcolor='';
660             my $datedue=$bookissue->{'date_due'};
661             my $dd=$bookissue->{'date_due'};
662             #convert to nz style dates
663             #this should be set with some kinda config variable
664             
665             my @tempdate=split(/-/,$dd);
666             $dd="$tempdate[2]/$tempdate[1]/$tempdate[0]";
667             
668             #####
669             $datedue=~s/-//g;
670             if ($datedue < $todaysdate) {
671                 $dd="<font color=red>$dd</font>\n";
672             }
673             $previssues.="<tr><td bgcolor=$color align=center>$dd</td><td bgcolor=$color align=center><a href=/cgi-bin/koha/detail.pl?bib=$bookissue->{'biblionumber'}&type=intra onClick=\"openWindow(this, 'Item', 480, 640)\">$bookissue->{'barcode'}</a></td><td bgcolor=$color>$bookissue->{'title'}</td><td bgcolor=$color>$bookissue->{'author'}</td><td bgcolor=$color align=center>$bookissue->{'dewey'} $bookissue->{'subclass'}</td></tr>\n";
674         }
675         my $todaysissues='';
676         $color='';
677         foreach (sort keys %$today) {
678             ($color eq $linecolor1) ? ($color=$linecolor2) : ($color=$linecolor1);
679             my $bookissue=$today->{$_};
680             $todaysissues.="<tr><td bgcolor=$color align=center>$bookissue->{'date_due'}</td><td bgcolor=$color align=center><a href=/cgi-bin/koha/detail.pl?bib=$bookissue->{'biblionumber'}&type=intra onClick=\"openWindow(this, 'Item', 480, 640)\">$bookissue->{'barcode'}</a></td><td bgcolor=$color>$bookissue->{'title'}</td><td bgcolor=$color>$bookissue->{'author'}</td><td bgcolor=$color align=center>$bookissue->{'dewey'} $bookissue->{'subclass'}</td></tr>\n";
681         }
682         for ($i=1; $i<32; $i++) {
683             my $selected='';
684             if (($query->param('stickyduedate')) && ($day==$i)) {
685                 $selected='selected';
686             }
687             $dayoptions.="<option value=$i $selected>$i";
688         }
689         my $counter=1;
690         foreach (('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) {
691             my $selected='';
692             if (($query->param('stickyduedate')) && ($month==$counter)) {
693                 $selected='selected';
694             }
695             $monthoptions.="<option value=$counter $selected>$_";
696             $counter++;
697         }
698         for ($i=$datearr[5]+1900; $i<$datearr[5]+1905; $i++) {
699             my $selected='';
700             if (($query->param('stickyduedate')) && ($year==$i)) {
701                 $selected='selected';
702             }
703             $yearoptions.="<option value=$i $selected>$i";
704         }
705
706         my $selected='';
707         ($query->param('stickyduedate')) && ($selected='checked');
708         my ($borrower, $flags) = getpatroninformation(\%env,$borrnumber,0);
709         my ($patrontable, $flaginfotable) = patrontable($borrower);
710         print << "EOF";
711         $patrontable
712         $flaginfotable
713         <FONT SIZE=6><em>Issues</em></FONT> &nbsp; &nbsp;<br> <a href=circulation.pl?selectnewbranchprinter=1><b>Branch:</b></a> $branch,
714          <a href=circulation.pl?selectnewbranchprinter=1><b>Printer:</b></a> $printer<P>
715          <p>
716         <form method=get>
717     <table border=1 cellpadding=5>
718     <tr>
719         <td align=center valign=top>
720             <table border=0 cellspacing=0 cellpadding=5>
721                 <tr><th align=center background=$backgroundimage><font color=black><b>Enter Book Barcode</b></font></th></tr>
722                 <tr><td align=center>
723                 <table border=0>
724                 <tr><td>Item Barcode:</td><td><input name=barcode size=10></td><td><input type=submit value=Issue></tr>
725                 <tr><td colspan=3 align=center>
726                 <table border=0 cellpadding=0 cellspacing=0>
727                 <tr><td>
728                 <select name=day><option value=0>Day$dayoptions</select>
729                 </td><td>
730                 <select name=month><option value=0>Month$monthoptions</select>
731                 </td><td>
732                 <select name=year><option value=0>Year$yearoptions</select>
733                 </td></tr>
734                 </table>
735                 <input type=checkbox name=stickyduedate $selected> Sticky Due Date
736                 </td></tr>
737               </table>
738         <input type=hidden name=module value=issues>
739         <input type=hidden name=borrnumber value=$borrnumber>
740         <input type=hidden name=branch value=$branch>
741         <input type=hidden name=printer value=$printer>
742         
743 EOF
744 ;
745
746   if ($flags->{'CHARGES'}){
747             print "<input type=hidden name=charges value=yes>";
748   }
749     my $amountold=$flags->{'CHARGES'}->{'message'};
750   my @temp=split(/\$/,$amountold);
751   $amountold=$temp[1];
752   print "<input type=hidden name=oldamount value=$amountold>";
753 print <<EOF
754 </form>
755         </td>
756
757
758     </tr>
759     </table>
760     </table>
761     
762     <p clear=all>
763 <!-- issues tables-->
764         <table border=1 cellpadding=5 cellspacing=0 width=90%>
765         <td colspan=2 align=center>
766         <table border=0 cellpadding=5 cellspacing=0 width=100% > 
767             <tr><th colspan=5 bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black><b>Issues Today</b></font></th></tr>
768             <tr><th>Due Date</th><th>Bar Code</th><th>Title</th><th>Author</th><th>Class</th></tr>
769             $todaysissues
770         </table>
771         </td>
772     </tr>
773
774     <tr>
775         <td colspan=2 align=center>
776         <table border=0 cellpadding=5 cellspacing=0 width=100%>
777             <tr><th colspan=5 bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black><b>Previous Issues</b></font></th></tr>
778             <tr><th>Due Date</th><th>Bar Code</th><th>Title</th><th>Author</th><th>Class</th></tr>
779             $previssues
780         </table>
781         </td>
782     </tr>
783 </table>
784 </td></tr></table>
785 <p>
786 EOF
787     } else {
788         if (my $findborrower=$query->param('findborrower')) {
789             my ($borrowers, $flags) = findborrower(\%env, $findborrower);
790             my @borrowers=@$borrowers;
791             if ($#borrowers == -1) {
792                 $query->param('findborrower', '');
793                 print "No borrower matched '$findborrower'<p>\n";
794                 issues(1);
795                 return;
796             }
797             if ($#borrowers == 0) {
798                 $query->param('borrnumber', $borrowers[0]->{'borrowernumber'});
799                 $query->param('barcode',' ');
800                 issues(1);
801                 return;
802             } else {
803                 print "<form method=get>\n";
804                 print "<input type=hidden name=module value=issues>\n";
805                 print "<input type=hidden name=branch value=$branch>\n";
806                 print "<input type=hidden name=printer value=$printer>\n";
807                 print "<input type=hidden name=barcode value=\" \">\n";
808                 print "<table border=0 cellspacing=0 cellpadding=5 bgcolor=#dddddd>";
809                 print "<tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black><b>Select a borrower</b></font></th></tr>\n";
810                 print "<tr><td align=center>\n";
811                 print "<select name=borrnumber size=7>\n";
812                 foreach (sort {$a->{'surname'}.$a->{'firstname'} cmp $b->{'surname'}.$b->{'firstname'}} @$borrowers) {
813                     print "<option value=$_->{'borrowernumber'}>$_->{'surname'}, $_->{'firstname'} ($_->{'cardnumber'})\n";
814                 }
815                 print "</select><br>";
816                 print "<input type=submit>\n";
817                 print "</td></tr></table>\n";
818                 print "</td></tr></table>\n";
819             }
820         } else {
821             print << "EOF";
822 <form method=get>
823 <table border=0 cellpadding=5 cellspacing=0 bgcolor=#dddddd>
824 <tr><th bgcolor=$headerbackgroundcolor background=$backgroundimage><font color=black><b>Enter borrower card number<br> or partial last name</b></font></td></tr>
825 <tr><td><input name=findborrower></td></tr>
826 </table>
827 <input type=hidden name=module value=issues>
828 <input type=hidden name=branch value=$branch>
829 <input type=hidden name=printer value=$printer>
830 <input type=hidden name=barcode value=" ">
831 </form>
832 </td></tr></table>
833 EOF
834         }
835     }
836 }
837
838
839 sub patrontable {
840     my ($borrower) = @_;
841     my $flags=$borrower->{'flags'};
842     my $flagtext='';
843     my $flaginfotable='';
844     my $flaginfotext='';
845     my $flag;
846     foreach $flag (sort keys %$flags) {
847         ($color eq $linecolor1) ? ($color=$linecolor2) : ($color=$linecolor1);
848         if ($flags->{$flag}->{'noissues'}) {
849             $flagtext.="<font color=red>$flag</font> ";
850         } else {
851             $flagtext.="$flag ";
852         }
853         $flags->{$flag}->{'message'}=~s/\n/<br>/g;
854         if ($flags->{$flag}->{'noissues'}) {
855             if ($flag eq 'CHARGES') {
856                 $flaginfotext.="<tr><td valign=top><font color=red>$flag</font></td><td bgcolor=$color><b>$flags->{$flag}->{'message'}</b> <a href=/cgi-bin/koha/pay.pl?bornum=$borrower->{'borrowernumber'} onClick=\"openWindow(this, 'Payment', 480,640)\">Payment</a></td></tr>\n";
857             } else {
858                 $flaginfotext.="<tr><td valign=top><font color=red>$flag</font></td><td bgcolor=$color>$flags->{$flag}->{'message'}</td></tr>\n";
859             }
860         } else {
861             if ($flag eq 'CHARGES') {
862                 $flaginfotext.="<tr><td valign=top>$flag</td><td> $flags->{$flag}->{'message'} <a href=/cgi-bin/koha/pay.pl?bornum=$borrower->{'borrowernumber'} onClick=\"openWindow(this, 'Payment', 480,640)\">Payment</a></td></tr>\n";
863             } elsif ($flag eq 'WAITING') {
864                 my $itemswaiting='';
865                 my $items=$flags->{$flag}->{'itemlist'};
866                 foreach $item (@$items) {
867                     my ($iteminformation) = getiteminformation($env, $item->{'itemnumber'}, 0);
868                     $itemswaiting.="<a href=/cgi-bin/koha/detail.pl?bib=$iteminformation->{'biblionumber'}&type=intra onClick=\"openWindow(this, 'Item', 480, 640)\">$iteminformation->{'barcode'}</a> $iteminformation->{'title'} ($branches->{$iteminformation->{'holdingbranch'}}->{'branchname'})<br>\n";
869                 }
870                 $flaginfotext.="<tr><td valign=top>$flag</td><td>$itemswaiting</td></tr>\n";
871             } elsif ($flag eq 'ODUES') {
872                 my $items=$flags->{$flag}->{'itemlist'};
873                 my $itemswaiting="<table border=0 cellspacing=0 cellpadding=2>\n";
874                 my $currentcolor=$color;
875                 {
876                     my $color=$currentcolor;
877                     foreach $item (@$items) {
878                         ($color eq $linecolor1) ? ($color=$linecolor2) : ($color=$linecolor1);
879                         my ($iteminformation) = getiteminformation($env, $item->{'itemnumber'}, 0);
880                         $itemswaiting.="<tr><td><font color=red>$iteminformation->{'date_due'}</font></td><td bgcolor=$color><a href=/cgi-bin/koha/detail.pl?bib=$iteminformation->{'biblionumber'}&type=intra onClick=\"openWindow(this, 'Item', 480, 640)\">$iteminformation->{'barcode'}</a></td><td>$iteminformation->{'title'}</td></tr>\n";
881                     }
882                 }
883                 $itemswaiting.="</table>\n";
884                 if ($query->param('module') ne 'returns'){
885                   $flaginfotext.="<tr><td valign=top>$flag</td><td>$flags->{$flag}->{'message'}, See below</td></tr>\n";
886                 } else {
887                   $flaginfotext.="<tr><td valign=top>$flag</td><td>$flags->{$flag}->{'message'}</td></tr>\n"; 
888                 }
889             } else {
890                 $flaginfotext.="<tr><td valign=top>$flag</td><td>$flags->{$flag}->{'message'}</td></tr>\n";
891             }
892         }
893     }
894     ($flaginfotext) && ($flaginfotext="<tr><td bgcolor=$headerbackgroundcolor background=$backgroundimage colspan=2><b>Flags</b></td></tr>$flaginfotext\n");
895     $flaginfotext.="</table>";
896     my $patrontable= << "EOF";
897     <table border=1
898     cellpadding=5 cellspacing=0 align=right>
899     <tr><td bgcolor=$headerbackgroundcolor background=$backgroundimage colspan=2><font color=black><b>Patron Information</b></font></td></tr>
900     <tr><td colspan=2>
901     <a href=/cgi-bin/koha/moremember.pl?bornum=$borrower->{'borrowernumber'} onClick="openWindow(this,'Member', 480, 640)">$borrower->{'cardnumber'}</a> $borrower->{'surname'}, $borrower->{'title'} $borrower->{'firstname'}<br>
902 EOF
903     if ($query->param('module') ne 'returns'){ 
904        $patrontable.="$borrower->{'streetaddress'} $borrower->{'city'} Cat:
905        $borrower->{'categorycode'} ";
906      }
907     $patrontable.=<< "EOF";
908     
909     </td></tr>
910
911 EOF
912     return($patrontable, $flaginfotext);
913 }