Cosmetic change. Merged with rel-1-2
[koha.git] / C4 / InterfaceCDK.pm
1 package C4::InterfaceCDK; #assumes C4/InterfaceCDK
2
3 #uses Newt
4 use C4::Format;
5 use strict;
6 use Cdk;
7 use Date::Manip;
8 use C4::Accounts;
9 use C4::Circulation::Borrissues;
10 use C4::Circulation::Renewals;
11 #use C4::Circulation;
12
13 require Exporter;
14 use DBI;
15 use vars qw($VERSION @ISA @EXPORT);
16   
17 # set the version for version checking
18 $VERSION = 0.01;
19     
20 @ISA = qw(Exporter);
21 @EXPORT = qw(&dialog &startint &endint &output &clearscreen &pause &helptext
22 &textbox &menu &issuewindow &msg_yn &msg_ny &borrower_dialog &debug_msg &error_msg
23 &info_msg &selborrower &returnwindow &logondialog &borrowerwindow &titlepanel
24 &borrbind &borrfill &preeborr &borrowerbox &brmenu &prmenu);
25
26 sub suspend_cb {
27     # is this planned for something?
28 }
29       
30 sub startint {
31   my ($env,$msg)=@_;
32   Cdk::init();
33 }
34
35 sub menu {
36   my ($env,$type,$title,@items)=@_;
37   $env->{'sysarea'}="Menu";
38   my $titlebar=titlepanel($env,"Koha","Main Menu");
39   my $reason;
40   my $data;
41   my @mitems;
42   my $x = 0;
43   while ($items[$x] ne "") {
44     $mitems[$x]="<C>".$items[$x];
45     $x++;
46   }  
47   if ($type eq 'console'){
48     my $menucnt = @items;
49     my $menu = new Cdk::Scroll ('Title'=>"  ",
50       'List'=>\@mitems,
51       'Height'=> $menucnt+4,
52       'Width'=> 26);
53     # Activate the object.         
54     my ($menuItem) = $menu->activate();
55     # Check the results.
56     undef $menu;
57     if (!defined $menuItem) {      
58       $data = "Quit";
59     }
60     else { 
61       $data = $items[$menuItem];
62     }
63   }
64   return($reason,$data);
65   # end of menu
66 }
67
68   
69 sub clearscreen { 
70 }
71
72 sub pause {
73  
74 }
75
76 sub output {
77   my($left,$top,$msg)=@_;
78   my @outm;
79   $outm[0]=$msg;
80   my $output = new Cdk::Label ('Message' =>\@outm,
81     'Ypos'=>$top, 'Xpos'=>$left, 'Box'=>0);
82   $output->draw();
83   return $output;
84 }
85
86 sub helptext {
87   my ($text)=@_;
88   my $helptext = output(1,24,$text);
89   return $helptext;
90 }
91
92
93 sub titlepanel{
94   my ($env,$title,$title2)=@_;
95   my @header;
96   @header[0] = fmtstr($env,$title,"L24");
97   @header[0] = @header[0].fmtstr($env,
98     $env->{'branchname'}."-".$env->{'queue'},"C28");
99   @header[0] = @header[0].fmtstr($env,$title2,"R24");
100   my $label = new Cdk::Label ('Message' =>\@header,'Ypos'=>0,'Xpos'=>0);
101   $label->draw();
102   return $label;
103   }
104
105 sub msg_yn {
106   my ($env,$text1,$text2)=@_;
107   # Create the dialog buttons.
108   my @buttons = ("Yes", "No");
109   my @mesg = ("<C>$text1", "<C>$text2");
110   # Create the dialog object.
111   my $dialog = new Cdk::Dialog ('Message' => \@mesg, 'Buttons' => \@buttons);
112   my $resp = $dialog->activate();
113   my $response = "Y";
114   if ($resp == 1) {
115     $response = "N";
116   }
117   undef $dialog;
118   return $response;
119 }
120 sub msg_ny {
121   my ($env,$text1,$text2)=@_;
122   # Cdk::init();
123   # Create the dialog buttons.
124   my @buttons = ("No", "Yes");
125   my @mesg = ("<C>$text1", "<C>$text2");
126   # Create the dialog object.
127   my $dialog = new Cdk::Dialog ('Message' => \@mesg, 'Buttons' => \@buttons);
128   my $resp = $dialog->activate();
129   my $response = "N";
130   if ($resp == 1) {
131     $response = "Y";
132   }
133   undef $dialog;
134   return $response;
135 }
136
137 sub debug_msg {
138   my ($env,$text)=@_;
139   if ($env->{'telnet'} eq "Y") {
140     popupLabel (["Debug </R>$text"]);
141 #  } else {
142 #    print "****DEBUG $text****";
143   }  
144   return();
145 }
146
147 sub error_msg {
148   my ($env,$text)=@_;
149   popupLabel (["<C>Error </R>$text"]);
150   return();
151 }
152
153 sub info_msg {
154   my ($env,$text)=@_;
155   popupLabel ([$text]);
156   return();
157 }
158
159 sub endint {
160   Cdk::end();
161 }
162
163
164 sub brmenu {
165   my ($env,$brrecs)=@_;
166   $env->{'sysarea'}="Menu";
167   my $titlebar=titlepanel($env,"Koha","Select branch");
168   my @mitems;
169   my $x = 0;
170   while (@$brrecs[$x] ne "") {
171     my $brrec =@$brrecs[$x]; 
172     $mitems[$x]=fmtstr($env,$brrec->{'branchcode'},"L6");
173     $mitems[$x]=$mitems[$x].fmtstr($env,$brrec->{'branchname'},"L20");
174     $x++;
175   }  
176   my $menu = new Cdk::Scroll ('Title'=>"  ",
177       'List'=>\@mitems,
178       'Height'=> 16,
179       'Width'=> 30);
180   # Activate the object.         
181   my ($menuItem) = $menu->activate();
182   # Check the results.
183   if (defined $menuItem) {      
184     my $brrec = @$brrecs[$menuItem];
185     $env->{'branchcode'} = $brrec->{'branchcode'};
186     $env->{'branchname'} = $brrec->{'branchname'};
187   }
188   undef $menu;
189   undef $titlebar;
190   return();
191   
192 }
193
194 sub prmenu {
195   my ($env,$prrecs)=@_;
196   $env->{'sysarea'}="Menu";
197   my $titlebar=titlepanel($env,"Koha","Select printer");
198   my @mitems;
199   my $x = 0;
200   while (@$prrecs[$x] ne "") {
201     my $prrec =@$prrecs[$x]; 
202     $mitems[$x]=fmtstr($env,$prrec->{'printername'},"L20");
203     $x++;
204   }  
205   my $menu = new Cdk::Scroll ('Title'=>"  ",
206       'List'=>\@mitems,
207       'Height'=> 16,
208       'Width'=> 30);
209   # Activate the object.         
210   my ($menuItem) = $menu->activate();
211   undef $menu;
212   undef $titlebar;
213   # Check the results.
214   if (defined $menuItem) {      
215     my $prrec = @$prrecs[$menuItem];
216     $env->{'queue'} = $prrec->{'printqueue'};
217     $env->{'printtype'} = $prrec->{'printtype'};
218   }
219   return();
220   
221 }
222
223
224 sub borrower_dialog {
225   my ($env)=@_;
226   my $result;
227   my $borrower;
228   my $book;
229   my @coltitles = ("Borrower","Item");
230   my @rowtitles = (" ");
231   my @coltypes  = ("UMIXED","UMIXED");
232   my @colwidths = (12,12);
233   my $matrix = new Cdk::Matrix (
234      'ColTitles'=> \@coltitles,
235      'RowTitles'=> \@rowtitles, 
236      'ColWidths'=> \@colwidths,
237      'ColTypes'=>  \@coltypes,
238      'Vrows'=>     1, 
239      'Vcols'=>     2);
240   borrbind($env,$matrix);
241   #$matrix->draw();
242   my ($rows,$cols,$info) = $matrix->activate(); 
243   if ((!defined $rows) && ($info->[0][0] eq "")) { 
244     $result = "Circ";
245   } else {
246     $borrower = $info->[0][0];
247     $book     = $info->[0][1];
248   }
249   $matrix->erase();
250   $matrix->unregister();
251   undef $matrix;
252   Cdk::refreshCdkScreen();
253   return ($borrower,$result,$book);
254 }
255
256 sub selborrower {
257   my ($env,$dbh,$borrows,$bornums)=@_;
258   my $result;
259   my $label = "Select a borrower";
260   my $scroll = new Cdk::Scroll ('Title'=>$label,
261     'List'=>\@$borrows,'Height'=>15,'Width'=>60);
262   my $returnValue = $scroll->activate ();
263   if (!defined $returnValue) {
264     #$result = "Circ";
265   } else {  
266     $result = substr(@$borrows[$returnValue],0,9);
267   }
268   $scroll->erase();
269   #$scroll->unregister();
270   undef $scroll;
271   Cdk::refreshCdkScreen();
272   return $result;
273 }
274
275 sub issuewindow {
276   my ($env,$title,$dbh,$items1,$items2,$borrower,$amountowing,$odues)=@_;
277   my @functs=("Due Date","Renewals","Payments","Print","Current","Previous");
278   my $titlepanel = titlepanel($env,"Issues","Issue an Item");
279   my $scroll2 = new Cdk::Scroll ('Title'=>"Previous Issues",
280     'List'=>\@$items1,'Height'=> 8,'Width'=>78,'Ypos'=>18);
281   my $scroll1 = new Cdk::Scroll ('Title'=>"Current Issues",
282     'List'=>\@$items2,'Height'=> 8,'Width'=>78,'Ypos'=>9);
283   my $funcmenu = new Cdk::Scroll ('Title'=>"",
284     'List'=>\@functs,'Height'=>5,'Width'=>12,'Ypos'=>3,'Xpos'=>28);
285   my $loanlength = new Cdk::Entry('Label'=>"Due Date:      ",
286     'Max'=>"30",'Width'=>"11",
287     'Xpos'=>0,'Ypos'=>5,'Type'=>"UMIXED");
288   my $x = 0;
289   while ($x < length($env->{'loanlength'})) {
290      $loanlength->inject('Input'=>substr($env->{'loanlength'},$x,1));
291      $x++;
292   }
293   my $borrbox = borrowerbox($env,$borrower,$amountowing);
294   my $entryBox = new Cdk::Entry('Label'=>"Item Barcode:  ",
295      'Max'=>"11",'Width'=>"11",
296      'Xpos'=>"0",'Ypos'=>3,'Type'=>"UMIXED");
297   $scroll2->draw();
298   $scroll1->draw();
299   $funcmenu->draw();
300   $loanlength->draw(); 
301   $borrbox->draw();   
302   #$env->{'loanlength'} = "";
303   #debug_msg($env,"clear len");
304   my $x;
305   my $barcode;
306   $entryBox->preProcess ('Function' => 
307     sub{prebook(@_,$env,$dbh,$funcmenu,$entryBox,$loanlength,
308     $scroll1,$scroll2,$borrower,$amountowing,$odues);});
309   $barcode = $entryBox->activate();
310   my $reason;
311   if (!defined $barcode) {
312     $reason="Finished user"
313   }
314   $borrbox->erase();
315   $entryBox->erase();
316   $scroll2->erase();
317   $scroll1->erase();
318   $funcmenu->erase();
319   $loanlength->erase();
320   undef $titlepanel;
321   undef $borrbox;
322   undef $entryBox;
323   undef $scroll2;
324   undef $scroll1;
325   undef $funcmenu;
326   undef $loanlength;
327   Cdk::refreshCdkScreen();
328   #debug_msg($env,"exiting");    
329   return $barcode,$reason;
330 }  
331 sub actfmenu {
332   my ($env,$dbh,$funcmenu,$entryBox,$loanlength,$scroll1,
333     $scroll2,$borrower,$amountowing,$odues) = @_;
334   my $funct =  $funcmenu->activate();
335   if (!defined $funct) {
336   } elsif ($funct == 0 ) {
337     actloanlength ($env,$entryBox,$loanlength,$scroll1,$scroll2);
338   } elsif ($funct == 1 ) { 
339     $entryBox->erase();
340     $scroll1->erase();
341     $scroll2->erase();
342     $loanlength->erase();
343     $funcmenu->erase();
344     #debug_msg($env,"");
345     C4::Circulation::Renewals::bulkrenew($env,$dbh,
346       $borrower->{'borrowernumber'},$amountowing,$borrower,$odues);
347   } elsif ($funct == 2 ) {
348     $entryBox->erase();
349     $scroll1->erase();
350     $scroll2->erase();
351     $loanlength->erase();
352     $funcmenu->erase();
353     C4::Accounts::reconcileaccount($env,$dbh,$borrower->{'borrowernumber'},
354     $amountowing,$borrower,$odues);
355   } elsif ($funct == 3 ) {
356     C4::Circulation::Borrissues::printallissues ($env,$borrower);
357   } elsif ($funct == 4 ) {
358     actscroll1 ($env,$entryBox,$loanlength,$scroll1,$scroll2);
359   } elsif ($funct == 5 ) {
360     actscroll2 ($env,$entryBox,$loanlength,$scroll1,$scroll2);
361   }
362   Cdk::refreshCdkScreen();
363   $entryBox->unregister();
364   $entryBox->register();
365   return
366 }  
367 sub actscroll1 {
368   my ($env,$entryBox,$loanlength,$scroll1,$scroll2) = @_;
369   $scroll1->activate();
370   return 1;
371 }
372 sub actscroll2 {
373   my ($env,$entryBox,$loanlength,$scroll1,$scroll2) = @_;
374   $scroll2->activate();
375   return 1;
376 }
377 sub actloanlength {
378   my ($env,$entryBox,$loanlength,$scroll1,$scroll2) = @_;
379   my $validdate = "N";
380   while ($validdate eq "N") {
381     my $loanlength = $loanlength->activate();
382     if (!defined $loanlength) {
383       $env->{'loanlength'} = "";
384       $validdate = "Y";
385     } elsif ($loanlength eq "") {
386       $env->{'loanlength'} = "";
387       $validdate = "Y";
388     } else {    
389       my $date = ParseDate($loanlength);
390       if ( $date > ParseDate('today')){
391         $validdate="Y";
392         my $fdate = substr($date,0,4).'-'.substr($date,4,2).'-'.substr($date,6,2);
393         #debug_msg($env,"$date $fdate");
394         $env->{'loanlength'} = $fdate;
395       } else { 
396         error_msg($env,"Invalid date"); 
397       }
398     }
399   }  
400   return;
401 }
402
403 sub prebook {
404   my ($input,$env,$dbh,$funcmenu,$entryBox,$loanlength,
405     $scroll1,$scroll2,$borrower,$amountowing,$odues)= @_;
406   if ($input eq $key_tab) {    
407     actfmenu ($env,$dbh,$funcmenu,$entryBox,$loanlength,$scroll1,
408        $scroll2,$borrower,$amountowing,$odues);
409     return 0;
410   }
411   return 1;
412 }
413                                                           
414 sub borrowerbox {
415   my ($env,$borrower,$amountowing,$odues) = @_;
416   my @borrinfo;
417   my $amountowing = fmtdec($env,$amountowing,"42");
418   my $line = "$borrower->{'cardnumber'} ";
419   $line = $line."$borrower->{'surname'}, ";
420   $line = $line."$borrower->{'title'} $borrower->{'firstname'}";
421   $borrinfo[0]=$line;
422   $line = "$borrower->{'streetaddress'}, $borrower->{'city'}";
423   $borrinfo[1]=$line;
424   $line = "$borrower->{'categorycode'}";
425   if ($borrower->{'gonenoaddress'} == 1) {
426     $line = $line." </R>GNA<!R>";
427   }
428   if ($borrower->{'lost'} == 1) {
429     $line = $line." </R>LOST<!R>";
430   }
431   if ($odues > 0) {
432     $line = $line." </R>ODUE<!R>";
433   }     
434   if ($borrower->{'borrowernotes'} ne "" ) {
435     $line = $line." </R>NOTES<!R>";
436   }
437   if ($amountowing > 0) {
438     $line = $line." </B>\$$amountowing";
439   }
440   $borrinfo[2]=$line;
441   if ($borrower->{'borrowernotes'} ne "" ) {
442     $borrinfo[3]=substr($borrower->{'borrowernotes'},0,40);     
443   }
444   my $borrbox = new Cdk::Label ('Message' =>\@borrinfo,
445     'Ypos'=>3, 'Xpos'=>"RIGHT");
446   return $borrbox;
447 }
448
449 sub returnwindow {
450   my ($env,$title,$item,$items,$borrower,$amountowing,$odues,$dbh,$resp)=@_;
451   #debug_msg($env,$borrower);
452   my $titlepanel = titlepanel($env,"Returns","Scan Item");
453   my @functs=("Payments","Renewal");
454   my $funcmenu = new Cdk::Scroll ('Title'=>"",
455      'List'=>\@functs,'Height'=>5,'Width'=>12,'Ypos'=>3,'Xpos'=>16);
456   my $returnlist = new Cdk::Scroll ('Title'=>"Items Returned",
457      'List'=>\@$items,'Height'=> 12,'Width'=>74,'Ypos'=>10,'Xpos'=>1);
458   $returnlist->draw();
459   $funcmenu->draw();
460   my $borrbox;
461   if ($borrower->{'cardnumber'} ne "") {    
462     $borrbox = borrowerbox($env,$borrower,$amountowing);  
463     $borrbox->draw();
464   } else {
465     if ($resp ne "") {
466       my @text;
467       @text[0] = $resp;
468       $borrbox = new Cdk::Label ('Message' =>\@text, 'Ypos'=>3, 'Xpos'=>"RIGHT");
469       $borrbox->draw();
470     }
471   }  
472   my $bookentry  =  new Cdk::Entry('Label'=>" ",
473      'Max'=>"11",'Width'=>"11",
474      'Xpos'=>"2",'Ypos'=>"3",'Title'=>"Item Barcode",
475      'Type'=>"UMIXED");
476   $bookentry->preProcess ('Function' =>sub{preretbook(@_,$env,$dbh,
477      $funcmenu,$bookentry,$borrower,$amountowing,
478      $odues,$titlepanel,$borrbox,$returnlist);});
479   my $barcode = $bookentry->activate();
480   my $reason;
481   if (!defined $barcode) {
482     $barcode="";
483     $reason="Circ";
484     $bookentry->erase();
485     $funcmenu->erase();
486     if ($borrbox ne "") {$borrbox->erase();}
487     $returnlist->erase();
488   } else {
489     $reason="";
490   }
491   undef $bookentry;
492   undef $funcmenu;
493   undef $borrbox;
494   undef $returnlist;
495   undef $titlepanel;
496   return($reason,$barcode);
497   }
498
499 sub preretbook {
500   my ($input,$env,$dbh,$funcmenu,$bookentry,$borrower,
501   $amountowing,$odues,$titlepanel,$borrbox,$returnlist)=@_;
502   if ($input eq $key_tab) {
503     actrfmenu($env,$dbh,$funcmenu,$bookentry,$borrower,
504     $amountowing,$odues,$titlepanel,$borrbox,$returnlist);
505     return 0;
506   }
507   return 1;
508   }
509
510 sub actrfmenu {
511   my ($env,$dbh,$funcmenu,$bookentry,$borrower,
512     $amountowing,$odues,$titlepanel,$borrbox,$returnlist)= @_;
513   my $funct =  $funcmenu->activate();
514   #debug_msg($env,"funtion $funct");
515   if (!defined $funct) {
516   } elsif ($funct == 1 ) {
517     if ($borrower->{'borrowernumber'} ne "") {
518        $funcmenu->erase();
519        $bookentry->erase();
520        $titlepanel->erase();
521        $borrbox->erase();
522        $returnlist->erase();
523        C4::Circulation::Renewals::bulkrenew($env,$dbh,
524        $borrower->{'borrowernumber'},$amountowing,$borrower,$odues);
525        Cdk::refreshCdkScreen();
526        $funcmenu->draw();
527        $bookentry->draw();
528        $titlepanel->draw();
529        $borrbox->draw();
530        $returnlist->draw();
531     }
532   } elsif ($funct == 0 ) {
533     if ($borrower->{'borrowernumber'} ne "") {
534        $funcmenu->erase();
535        $bookentry->erase();
536        $titlepanel->erase();
537        $borrbox->erase();
538        $returnlist->erase();
539        C4::Accounts::reconcileaccount($env,$dbh,$borrower->{'borrowernumber'},
540        $amountowing,$borrower,$odues);
541        $funcmenu->draw();
542        $bookentry->draw();
543        $titlepanel->draw();
544        $borrbox->draw();
545        $returnlist->draw();
546        #Cdk::refreshCdkScreen();
547     }
548   } 
549 }
550   
551 sub act {
552   my ($obj) = @_;
553   my $ans = $obj->activate();
554   return $ans;
555   }
556
557 sub borrbind {
558   my ($env,$entry) = @_; 
559   my $lastborr = $env->{"bcard"};
560   $entry->preProcess ('Function' => sub {preborr (@_, $env,$entry);});
561 }
562
563 sub preborr {
564   my ($input,$env, $entry) = @_;
565   if ($env->{"bcard"} ne "") {
566 #     error_msg($env,"hi there");  
567     if ($input eq $lastval) {
568 #        error_msg($env,"its a ctrl-r");  
569       borfill($env,$entry);
570       return 0;
571     }
572   } 
573   return 1;
574 }  
575   
576   
577 sub borfill {
578   my ($env,$entry) = @_;
579   error_msg($env,"in borfill: $env->{'bcard'}");
580   my $lastborr = $env->{"bcard"};
581   my $i = 1;
582   $entry->inject('Input'=>$lastborr);
583   while ($i < 9) {
584 #    my $temp=substr($lastborr,$i,1);
585 #    $entry->inject('Input'=>$temp);
586     $i++;
587   }
588    
589 }
590                                
591 END { }       # module clean-up code here (global destructor)
592
593