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