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