8 use C4::Circulation::Borrissues;
9 use C4::Circulation::Renewals;
22 my $issuebut, $returnbut, $mainholder;
23 my $borrnumber, $borrower, $borrowerlist;
24 my @items2, $currentissues;
27 my $MW=MainWindow->new(-height => 500, -width => 600);
28 $MW->fontCreate('C_normal',-family => 'courier', -size => -12);
29 my $titlebar=$MW->Frame(-height => 100, -width => 600, -relief => 'ridge', -borderwidth => '4');
30 my $frametop=$MW->Frame(-height => 100, -width => 600, -relief => 'ridge', -borderwidth => '2');
31 my $framebot=$MW->Frame(-height => 430, -width => 600, -relief => 'ridge', -borderwidth => '2');
32 #$framebot->gridPropagate(0);
33 my $kohalabel=$titlebar->Label(-text => 'Koha');
34 my $menulabel=$titlebar->Label(-text => 'Main Menu');
35 my $branchlabel=$titlebar->Label(-text => 'Stewart Elementary-lp');
36 $kohalabel->pack(qw/-side left -padx 10/);
37 $branchlabel->pack(qw/-side left -padx 10 -fill x -expand 1/);
38 $menulabel->pack(qw/-side left -padx 10/);
39 my $issuesbut=$frametop->Button(-text => 'Issues', -command => sub { $data='Issues'; getborrnumber(); });
40 $issuesbut->pack(qw/-side left -padx 2 -pady 2 -expand 1 -fill x/);
41 my $returnsbut=$frametop->Button(-text => 'Returns', -command => sub { $data='Returns'; returns(); });
42 $returnsbut->pack(qw/-side right -padx 2 -pady 2 -expand 1 -fill x/);
43 #$titlebar->pack(qw/-fill x -side top/);
44 #$frametop->pack(qw/-fill x/);
45 #$framebot->pack(-fill => both, -expand => 1);
46 Tk::grid($titlebar, -col => 0, -row => 0, -sticky => 'nsew');
47 Tk::grid($frametop, -col => 0, -row => 1, -sticky => 'nsew');
48 Tk::grid($framebot, -col => 0, -row => 2, -sticky => 'nsew');
49 #$MW->gridPropagate(0);
57 ($mainholder) && ($mainholder->destroy);
58 $mainholder=$framebot->Frame(-height => 500, -width => 600);
59 Tk::grid($mainholder, -col => 0, -row => 0, -sticky => 'nsew');
60 $mainholder->gridPropagate(0);
61 my $borrentryframe=$mainholder->Frame(-height => 40, -width => 200, -relief=>'ridge', -borderwidth=>4);
62 $borrentryframe->pack(-ipadx => 10, -ipady => 10);
63 $label=$borrentryframe->Label(-text => "Borrower CardNumber\nor Last Name:", -anchor => 'w');
64 Tk::grid($label, -col => 0, -row => 0, -sticky => 'nw');
65 $borrentry=$borrentryframe->Entry(-width => 15);
66 $borrentry->bind('<Return>' => \&checkborrower);
67 Tk::grid($borrentry, -col => 1, -row => 0, -sticky => 'nw');
69 #Check for surname entry instead of borrower card number
74 $borrnumber=$borrentry->get();
75 my $sth=$dbh->prepare("Select * from borrowers where cardnumber=\"$borrnumber\"");
77 if ($borrower=$sth->fetchrow_hashref) {
79 $borrnumber=$borrower->{'borrowernumber'};
83 $borrnumber=lc($borrnumber);
84 my $borquery = "Select * from borrowers
85 where lower(surname) like \"$borrnumber%\" order by surname,firstname";
86 my $sthb =$dbh->prepare($borquery);
91 if ($sthb->rows == 1) {
92 $borrower= $sthb->fetchrow_hashref;
93 $borrnumber=$borrower->{'borrowernumber'};
95 } elsif ($sthb->rows > 0) {
97 ($mainholder) && ($mainholder->destroy);
98 $mainholder=$framebot->Frame(-height => 500, -width => 500);
99 Tk::grid($mainholder, -col => 0, -row => 0, -sticky => 'nsew');
100 my $frame=$mainholder->Frame(-height => 500, -width => 500, -relief => 'ridge', -borderwidth => '5');
101 Tk::grid($frame, -col=>0, -row=>0, -sticky => 'nsew');
102 $frame->pack(-ipadx=>10, -ipady=>10);
103 my $label=$frame->Label(-text => 'Pick a Patron', -justify => 'center', -relief => 'ridge', -borderwidth => 3);
104 Tk::grid($label, -col => 0, -row => 0, -sticky => 'nsew');
105 $borrowerlist=$frame->Scrolled(Listbox, -width => '50', -height => '10', -setgrid => '1', -scrollbars => 'se', -font => 'C_normal');
106 $borrowerlist->bind('<Double-1>' => \&pickborrower);
107 $borrowerlist->bind('<Return>' => \&pickborrower);
108 #$borrowerlist->bind('<ESC>' => \&issues);
109 Tk::grid($borrowerlist, -col => 0, -row => 1, -sticky => 'n', -pady => 10);
110 my $buttonframe=$frame->Frame(-height=>40, -width =>500);
111 Tk::grid($buttonframe, -col => 0, -row => 2);
112 my $okbutton=$buttonframe->Button(-text => 'OK', -command => \&pickborrower);
113 $okbutton->pack(-side => 'left', -padx => 10, -pady => 10);
114 my $cancelbutton=$buttonframe->Button(-text => 'Cancel', -command => \&getborrnumber);
115 $cancelbutton->pack(-side => 'left', -padx => 10, -pady => 10);
117 while ($borrower= $sthb->fetchrow_hashref) {
118 my $cardnumber=$borrower->{'cardnumber'};
119 my $categorycode=$borrower->{'categorycode'};
120 my $name=$borrower->{'surname'}.", ".$borrower->{'firstname'};
121 my $line = sprintf "%10s %4s %-25s", $cardnumber, $categorycode, $name;
122 push (@borrowerlist, $line);
124 $borrowerlist->insert(0,@borrowerlist);
125 $borrowerlist->activate(0);
126 $borrowerlist->focus();
127 #Tk::grid($borrowerlist, -col => 0, -row => 0, -sticky => 'n');
128 #my ($cardnum) = C4::InterfaceCDK::selborrower($env,$dbh,\@borrows,\@bornums);
129 my $query = "select * from borrowers where cardnumber = '$cardnum'";
130 $sth = $dbh->prepare($query);
132 $borrower =$sth->fetchrow_hashref;
134 $bornum=$borrower->{'borrowernumber'};
136 #error_msg($env,"Borrower not found");
143 my $line=$borrowerlist->get('active');
145 my $borcardnumber=(split(/\s+/, $line))[0];
146 my $sth=$dbh->prepare("select borrowernumber from borrowers where cardnumber='$borcardnumber'");
148 ($borrnumber) = $sth->fetchrow;
153 my $query = "select * from borrowers where borrowernumber = '$borrnumber'";
154 $sth = $dbh->prepare($query);
156 $borrower =$sth->fetchrow_hashref;
158 my ($items,$items2) = C4::Circulation::Main::pastitems($env, $borrower->{'borrowernumber'}, $dbh);
164 $mainholder->destroy;
165 $mainholder=$framebot->Frame();
166 Tk::grid($mainholder, -col => 0, -row => 0, -sticky => 'n');
167 $mainholder->gridPropagate(0);
168 $topline=$mainholder->Frame();
169 $topline->pack(-side => top, -fill => 'x', -expand => '1');
172 $barcodeduedate=$topline->LabFrame(-label=>'Item Information', -height=>80, -width=>100, -labelside=>acrosstop);
173 Tk::grid($barcodeduedate, -col => 0, -row => 0, -sticky => 'nsew');
174 $barcodelabel=$barcodeduedate->Label(-text => 'Item Barcode:', -justify => right, -anchor => e);
175 Tk::grid($barcodelabel, -col => 0, -row => 0, -sticky => 'e');
176 $barcodeentry=$barcodeduedate->Entry(-width => 15);
177 $barcodeentry->bind('<Return>' => \&issuebook);
178 $barcodeentry->grid(-col => 1, -row => 0);
179 $barcodeentry->focus;
180 $duedatelabel=$barcodeduedate->Label(-text => 'Due Date:', -justify => right, -anchor => e);
181 Tk::grid($duedatelabel, -col => 0, -row => 1, -sticky => 'e');
182 $duedateentry=$barcodeduedate->Entry(-width => 15);
183 $duedateentry->bind('<Return>' => \&issuebook);
184 $duedateentry->grid(-col => 1, -row => 1);
185 $middle=$topline->Frame(-width => 40);
186 Tk::grid($middle, -col => 1, -sticky => 'ew');
188 $biframe=$topline->LabFrame(-label=>'Patron Information', -labelside=>acrosstop);
189 Tk::grid($biframe, -col=>2, -row=>0, -sticky=>'nsew');
190 $borrowerinfo=$biframe->Text(-height => 4, -width => 40, -wrap => none, -relief=>flat);
191 my $line = "$borrower->{'cardnumber'} ";
192 $line .= "$borrower->{'surname'}, ";
193 $line .= "$borrower->{'title'} $borrower->{'firstname'}\n";
194 $line .= "$borrower->{'streetaddress'}, $borrower->{'city'}\n";
195 $line .= "$borrower->{'categorycode'}";
198 $borrowerinfo->insert('0.0',$line);
199 $borrowerinfo->configure(-state => 'disabled');
201 my $ciframe=$mainholder->LabFrame(-label=>'Current Issues', -labelside=>acrosstop);
203 $currentissues=$ciframe->Scrolled(Text, -height=>10, -width=>80, -relief => 'flat', -scrollbars => 'e');
204 $currentissues->insert('0.0','');
205 $currentissues->configure(-state => 'disabled');
206 $currentissues->pack(-side => top);
207 my $piframe=$mainholder->LabFrame(-label=>'Previous Issues', -labelside=>acrosstop);
209 $previousissues=$piframe->Scrolled(Text, -height=>10, -width=>80, -relief => 'flat', -setgrid => '1', -scrollbars => 'e');
210 $previousissues->insert('0.0',$previssues);
211 $previousissues->pack(-side => top, -fill => both, -expand => 1);
212 $previousissues->configure(-state => 'disabled');
216 my ($env, $message) = @_;
217 my $button = $MW->messageBox(-type => 'OK', -title => 'Error Message', -message => "$message");
221 my ($env, $message) = @_;
222 my $button = $MW->messageBox(-type => 'OK', -title => 'Informational Message', -message => "$message");
226 my ($env, $message1, $message2, $message3) =@_;
227 my $message = $message1;
228 ($message2) && ($message.="\n$message2");
229 ($message3) && ($message.="\n$message3");
230 my $button = $MW ->messageBox(-type => 'YesNo', -default => 'Yes', -title => 'Message', -message => "$message");
231 $button=substr($button,0,1);
237 my ($env, $message1, $message2, $message3) =@_;
238 my $message = $message1;
239 ($message2) && ($message.="\n$message2");
240 ($message3) && ($message.="\n$message3");
241 my $button = $MW ->messageBox(-type => 'YesNo', -default => 'No', -title => 'Message', -message => "$message");
242 $button=substr($button,0,1);
249 my ($env,$itemno,$bitno,$dbh,$bornum)=@_;
251 my $query="Select * from biblioitems,itemtypes
252 where (biblioitems.biblioitemnumber='$bitno')
253 and (biblioitems.itemtype = itemtypes.itemtype)";
254 my $sth=$dbh->prepare($query);
256 if (my $data=$sth->fetchrow_hashref) {
257 $loanlength = $data->{'loanlength'}
260 open O, ">/root/tkcirc.out";
261 print O "env->loanlength: ".$env->{'loanlength'}."\n";
263 if ($env->{'loanlength'} eq "") {
265 my $datedue = time + ($loanlength * 86400);
266 my @datearr = localtime($datedue);
267 $dateduef = (1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
270 my $datedue = time + ($env->{'loanlength'} * 86400);
271 my @datearr = localtime($datedue);
272 $dateduef = (1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
274 print O "dateduef: $dateduef\n";
276 $query = "Insert into issues (borrowernumber,itemnumber, date_due,branchcode)
277 values ($bornum,$itemno,'$dateduef','$env->{'branchcode'}')";
278 my $sth=$dbh->prepare($query);
281 $query = "Select * from items where itemnumber=$itemno";
282 $sth=$dbh->prepare($query);
284 my $item=$sth->fetchrow_hashref;
287 $query="Update items set issues=$item->{'issues'} where itemnumber=$itemno";
288 $sth=$dbh->prepare($query);
291 #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($datedue);
292 my @datearr = split('-',$dateduef);
293 my $dateret = join('-',$datearr[2],$datearr[1],$datearr[0]);
294 # debug_msg($env,"query $query");
299 # mark items as returned
300 my ($env,$dbh,$bornum,$itemno)=@_;
301 #my $amt_owing = calc_odues($env,$dbh,$bornum,$itemno);
302 my @datearr = localtime(time);
303 my $dateret = (1900+$datearr[5])."-".$datearr[4]."-".$datearr[3];
304 my $query = "update issues set returndate = now(), branchcode ='$env->{'branchcode'}' where
305 (borrowernumber = '$bornum') and (itemnumber = '$itemno')
306 and (returndate is null)";
307 my $sth = $dbh->prepare($query);
310 updatelastseen($env,$dbh,$itemno);
311 # check for overdue fine
313 my $query = "select * from accountlines
314 where (borrowernumber = '$bornum')
315 and (itemnumber = '$itemno')
316 and (accounttype = 'FU' or accounttype='O')";
317 my $sth = $dbh->prepare($query);
319 if (my $data = $sth->fetchrow_hashref) {
320 # alter fine to show that the book has been returned.
321 my $uquery = "update accountlines
322 set accounttype = 'F'
323 where (borrowernumber = '$bornum')
324 and (itemnumber = '$itemno')
325 and (accountno = '$data->{'accountno'}') ";
326 my $usth = $dbh->prepare($uquery);
329 $oduecharge = $data->{'amountoutstanding'};
332 # check for charge made for lost book
333 my $query = "select * from accountlines
334 where (borrowernumber = '$bornum')
335 and (itemnumber = '$itemno')
336 and (accounttype = 'L')";
337 my $sth = $dbh->prepare($query);
339 if (my $data = $sth->fetchrow_hashref) {
340 # writeoff this amount
342 my $amount = $data->{'amount'};
343 my $acctno = $data->{'accountno'};
345 if ($data->{'amountoutstanding'} == $amount) {
346 $offset = $data->{'amount'};
349 $offset = $amount - $data->{'amountoutstanding'};
350 $amountleft = $data->{'amountoutstanding'} - $amount;
352 my $uquery = "update accountlines
353 set accounttype = 'LR',amountoutstanding='0'
354 where (borrowernumber = '$bornum')
355 and (itemnumber = '$itemno')
356 and (accountno = '$acctno') ";
357 my $usth = $dbh->prepare($uquery);
360 my $nextaccntno = C4::Accounts::getnextacctno($env,$bornum,$dbh);
361 $uquery = "insert into accountlines
362 (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
363 values ($bornum,$nextaccntno,now(),0-$amount,'Book Returned',
365 $usth = $dbh->prepare($uquery);
368 $uquery = "insert into accountoffsets
369 (borrowernumber, accountno, offsetaccount, offsetamount)
370 values ($bornum,$data->{'accountno'},$nextaccntno,$offset)";
371 $usth = $dbh->prepare($uquery);
376 UpdateStats($env,'branch','return','0','',$itemno);
383 # calculate charges due
384 my ($env, $dbh, $itemno, $bornum)=@_;
387 my $q1 = "select itemtypes.itemtype,rentalcharge from items,biblioitems,itemtypes
388 where (items.itemnumber ='$itemno')
389 and (biblioitems.biblioitemnumber = items.biblioitemnumber)
390 and (biblioitems.itemtype = itemtypes.itemtype)";
391 my $sth1= $dbh->prepare($q1);
393 if (my $data1=$sth1->fetchrow_hashref) {
394 $item_type = $data1->{'itemtype'};
395 $charge = $data1->{'rentalcharge'};
396 my $q2 = "select rentaldiscount from borrowers,categoryitem
397 where (borrowers.borrowernumber = '$bornum')
398 and (borrowers.categorycode = categoryitem.categorycode)
399 and (categoryitem.itemtype = '$item_type')";
400 my $sth2=$dbh->prepare($q2);
402 if (my $data2=$sth2->fetchrow_hashref) {
403 my $discount = $data2->{'rentaldiscount'};
404 $charge = ($charge *(100 - $discount)) / 100;
415 my ($env,$itemnum,$dbh,$bornum)=@_;
416 my $sth=$dbh->prepare("Select
417 firstname,surname,issues.borrowernumber,cardnumber,returndate
418 from issues,borrowers where
419 issues.itemnumber='$itemnum' and
420 issues.borrowernumber=borrowers.borrowernumber
421 and issues.returndate is NULL");
423 my $borrower=$sth->fetchrow_hashref;
427 if ($borrower->{'borrowernumber'} ne ''){
428 if ($bornum eq $borrower->{'borrowernumber'}){
430 my ($renewstatus) = C4::Circulation::Renewals::renewstatus($env,$dbh,$bornum,$itemnum);
431 my ($resbor,$resrec) = checkreserve($env,$dbh,$itemnum);
432 if ($renewstatus == "0") {
433 info_msg($env,"</S>Issued to this borrower - No renewals<!S>");
435 } elsif ($resbor ne "") {
436 my $resp = msg_ny($env,"Book is issued to this borrower",
437 "and is reserved - Renew?");
439 $newdate = C4::Circulation::Renewals::renewbook($env,$dbh,$bornum,$itemnum);
445 my $resp = msg_yn($env,"Book is issued to this borrower", "Renew?");
447 $newdate = C4::Circulation::Renewals::renewbook($env,$dbh,$bornum,$itemnum);
454 my $text="Issued to $borrower->{'firstname'} $borrower->{'surname'} ($borrower->{'cardnumber'})";
455 my $resp = msg_yn($env,$text,"Mark as returned?");
457 &returnrecord($env,$dbh,$borrower->{'borrowernumber'},$itemnum);
463 return($borrower->{'borrowernumber'},$canissue,$newdate);
466 # Check for reserves for biblio
467 my ($env,$dbh,$itemnum)=@_;
469 my $query = "select * from reserves,items
470 where (items.itemnumber = '$itemnum')
471 and (reserves.cancellationdate is NULL)
472 and (items.biblionumber = reserves.biblionumber)
473 and ((reserves.found = 'W')
474 or (reserves.found is null))
476 my $sth = $dbh->prepare($query);
479 if (my $data=$sth->fetchrow_hashref) {
481 my $const = $data->{'constrainttype'};
483 $resbor = $data->{'borrowernumber'};
486 my $cquery = "select * from reserveconstraints,items
487 where (borrowernumber='$data->{'borrowernumber'}')
488 and reservedate='$data->{'reservedate'}'
489 and reserveconstraints.biblionumber='$data->{'biblionumber'}'
490 and (items.itemnumber=$itemnum and
491 items.biblioitemnumber = reserveconstraints.biblioitemnumber)";
492 my $csth = $dbh->prepare($cquery);
494 if (my $cdata=$csth->fetchrow_hashref) {$found = 1;}
496 if ($found eq 1) {$resbor = $data->{'borrowernumber'};}
498 if ($found eq 0) {$resbor = $data->{'borrowernumber'};}
504 return ($resbor,$resrec);
509 my ($env,$interface)=@_;
511 my ($number,$reason)=dialog("Book Barcode:");
513 return ($number,$reason);
518 my $bornum=$borrnumber;
519 $barcode=$barcodeentry->get();
520 $barcodeentry->delete('0.0', 'end');
521 my $itemnum=$barcode;
522 #my ($env,$dbh,$itemnum,$bornum,$items)=@_;
523 $env->{'loanlength'}=14;
524 $env->{'branchcode'}='STWE';
525 $itemnum=uc $itemnum;
527 ## my ($itemnum,$reason)=&scanbook();
528 my $query="Select * from items,biblio,biblioitems where (barcode='$itemnum') and
529 (items.biblionumber=biblio.biblionumber) and
530 (items.biblioitemnumber=biblioitems.biblioitemnumber) ";
533 my $datedue = $env->{'loanlength'};
534 my $sth=$dbh->prepare($query);
536 if ($item=$sth->fetchrow_hashref) {
538 #check if item is restricted
539 if ($item->{'notforloan'} == 1) {
540 error_msg($env,"Item Not for Loan");
542 } elsif ($item->{'wthdrawn'} == 1) {
543 error_msg($env,"Item Withdrawn");
545 } elsif ($item->{'restricted'} == 1 ){
546 error_msg($env,"Restricted Item");
548 } elsif ($item->{'itemtype'} eq 'REF'){
549 error_msg($env,"Item Not for Loan");
552 #check if item is on issue already
553 if ($canissue == 1) {
554 my ($currbor,$issuestat,$newdate) =
555 &previousissue($env,$item->{'itemnumber'},$dbh,$bornum);
556 if ($issuestat eq "N") {
558 } elsif ($issuestat eq "R") {
561 $charge = calc_charges($env,$dbh,$item->{'itemnumber'},$bornum);
563 createcharge($env,$dbh,$item->{'itemnumber'},$bornum,$charge);
565 &UpdateStats($env,$env->{'branchcode'},'renew',$charge,'',$item->{'itemnumber'},$item->{'itemtype'});
568 if ($canissue == 1) {
570 my ($resbor,$resrec) = &checkreserve($env,$dbh,$item->{'itemnumber'});
571 #debug_msg($env,$resbor);
572 if ($resbor eq $bornum) {
573 my $rquery = "update reserves set found = 'F' where reservedate = '$resrec->{'reservedate'}' and borrowernumber = '$resrec->{'borrowernumber'}' and biblionumber = '$resrec->{'biblionumber'}'";
574 my $rsth = $dbh->prepare($rquery);
577 } elsif ($resbor ne "") {
578 my $bquery = "select * from borrowers
579 where borrowernumber = '$resbor'";
580 my $btsh = $dbh->prepare($bquery);
582 my $resborrower = $btsh->fetchrow_hashref;
583 my $msgtxt = chr(7)."Res for $resborrower->{'cardnumber'},";
584 $msgtxt = $msgtxt." $resborrower->{'initials'} $resborrower->{'surname'}";
585 my $ans = msg_ny($env,$msgtxt,"Allow issue?");
588 printreserve($env,$resrec,$resborrower,$item);
591 my $ans = msg_ny($env,"Cancel reserve?");
593 my $rquery = "update reserves set found = 'F' where reservedate = '$resrec->{'reservedate'}' and borrowernumber = '$resrec->{'borrowernumber'}' and biblionumber = '$resrec->{'biblionumber'}'";
594 my $rsth = $dbh->prepare($rquery);
602 #if charge deal with it
604 if ($canissue == 1) {
605 $charge = calc_charges($env,$dbh,$item->{'itemnumber'},$bornum);
607 if ($canissue == 1) {
609 $datedue=&updateissues($env,$item->{'itemnumber'},$item->{'biblioitemnumber'},$dbh,$bornum);
610 #debug_msg("","date $datedue");
611 &UpdateStats($env,$env->{'branchcode'},'issue',$charge,'',$item->{'itemnumber'},$item->{'itemtype'});
613 createcharge($env,$dbh,$item->{'itemnumber'},$bornum,$charge);
615 } elsif ($canissue == 0) {
616 #info_msg($env,"Can't issue $item->{'cardnumber'}");
619 #my $valid = checkdigit($env,$itemnum);
622 if (substr($itemnum,0,1) = "V") {
624 $env->{'newborrower'} = $itemnum;
626 error_msg($env,"$itemnum not found - rescan");
629 error_msg($env,"Invalid Number");
633 #debug_msg($env,"date $datedue");
634 if (($datedue ne "") && ($canissue)) {
635 my $line=formatitem($env, $item, $datedue, $charge);
636 unshift @items2, $line;
638 my $currentissuestext='';
640 $currentissuestext.="$_\n";
642 $currentissues->configure(-state => 'normal');
643 $currentissues->delete('0.0','end');
644 $currentissues->insert('0.0',$currentissuestext);
645 $currentissues->configure(-state => 'disabled');
646 return($item,$charge,$datedue);
650 my ($env,$item,$datedue,$charge) = @_;
651 my $line = $datedue." ".$item->{'barcode'}." ".$item->{'title'}.": ".$item->{'author'};
652 my $iclass = $item->{'itemtype'};
653 if ($item->{'dewey'} > 0) {
654 my $dewey = $item->{'dewey'};
657 $iclass = $iclass.$dewey.$item->{'subclass'};
659 my $llen = 65 - length($iclass);
660 my $line = fmtstr($env,$line,"L".$llen);
661 my $line = $line." $iclass ";
662 my $line = $line.fmtdec($env,$charge,"22");
667 my $item = $barcodeentry->get();
668 $barcodeentry->delete('0.0', 'end');
669 my ($resp, $bornum, $borrower, $itemno, $itemrec, $amt_owing) = checkissue($env, $dbh, $item);
670 my $line = "$borrower->{'cardnumber'} ";
671 $line .= "$borrower->{'surname'}, ";
672 $line .= "$borrower->{'title'} $borrower->{'firstname'}\n";
673 $line .= "$borrower->{'streetaddress'}, $borrower->{'city'}\n";
674 $line .= "$borrower->{'categorycode'}";
675 $borrowerinfo->configure(-state => 'normal');
676 $borrowerinfo->delete('0.0', 'end');
677 $borrowerinfo->insert('0.0',$line);
678 $borrowerinfo->configure(-state => 'disabled');
680 ($issues,$odues,$amt_owing) = borrdata2($env,$bornum);
687 if ($itemno ne "" ) {
688 my $item = itemnodata($env,$dbh,$itemno);
689 my $fmtitem = C4::Circulation::Issues::formatitem($env,$item,"",$amt_owing);
690 $item->{'borrower'}=$borrower->{'cardnumber'};
691 unshift @items,$item;
692 if ($items[20] > "") {
697 displayitemsreturned();
700 sub displayitemsreturned {
702 $itemsreturned->put($counter,0,$itemsreturned->Label(-text=>"Bar Code", -relief => 'groove', borderwidth=>'3'));
703 $itemsreturned->put($counter,1,$itemsreturned->Label(-text=>"Title", -relief => 'groove', borderwidth=>'3'));
704 $itemsreturned->put($counter,2,$itemsreturned->Label(-text=>"Author", -relief => 'groove', borderwidth=>'3'));
705 $itemsreturned->put($counter,3,$itemsreturned->Label(-text=>"Class", -relief => 'groove', borderwidth=>'3'));
706 $itemsreturned->put($counter,4,$itemsreturned->Label(-text=>"Borrower", -relief => 'groove', borderwidth=>'3'));
707 $itemsreturned->see($counter,0);
708 $itemsreturned->see($counter,1);
709 $itemsreturned->see($counter,2);
710 $itemsreturned->see($counter,3);
711 $itemsreturned->see($counter,4);
714 foreach $itemno (reverse @items) {
715 $itemno->{'dewey'}=~s/0*$//;
716 $itemsreturned->put($counter,0,$itemsreturned->Label(-text=>$itemno->{'barcode'}, -relief => 'groove', borderwidth=>'2'));
717 $itemsreturned->put($counter,1,$itemsreturned->Label(-text=>$itemno->{'title'}, -relief => 'groove', borderwidth=>'2'));
718 $itemsreturned->put($counter,2,$itemsreturned->Label(-text=>$itemno->{'author'}, -relief => 'groove', borderwidth=>'2'));
719 $itemsreturned->put($counter,3,$itemsreturned->Label(-text=>$itemno->{'dewey'}.$itemno->{'subclass'}, -relief => 'groove', borderwidth=>'2'));
720 $itemsreturned->put($counter,4,$itemsreturned->Label(-text=>$itemno->{'borrower'}, -relief => 'groove', borderwidth=>'2'));
721 $itemsreturned->see($counter,0);
722 $itemsreturned->see($counter,1);
723 $itemsreturned->see($counter,2);
724 $itemsreturned->see($counter,3);
725 $itemsreturned->see($counter,4);
732 ($mainholder) && ($mainholder->destroy);
733 $mainholder=$framebot->Frame(-height => 500, -width => 600);
734 Tk::grid($mainholder, -col => 0, -row => 0, -sticky => 'nsew');
735 #$mainholder->gridPropagate(0);
736 $topline=$mainholder->Frame();
737 $topline->pack(-side => top, -fill => 'x', -expand => '1');
740 my $barcodeframe=$topline->LabFrame(-label=>'Item Barcode', -height=>80, -width=>100, -labelside=>acrosstop);
741 Tk::grid($barcodeframe, -col => 0, -row => 0, -sticky => 'n');
742 $barcodeentry=$barcodeframe->Entry(-width => 15);
743 $barcodeentry->bind('<Return>' => \&returnbook);
744 $barcodeentry->grid(-col => 1, -row => 0, -sticky=>'e', -padx=>10, -pady=>10);
745 $barcodeentry->focus;
747 $biframe=$topline->LabFrame(-label=>'Patron Information', -labelside=>acrosstop);
748 Tk::grid($biframe, -col=>2, -row=>0, -sticky=>'nsew');
749 $borrowerinfo=$biframe->Text(-height => 4, -width => 40, -wrap => none, -relief=>flat);
750 $borrowerinfo->configure(-state => 'disabled');
751 $borrowerinfo->grid(-col=>1, -row=>0, -sticky=>'w');
754 $returnedframe=$mainholder->LabFrame(-label=>'Items Returned', -labelside=>acrosstop);
755 $returnedframe->pack;
756 $itemsreturned=$returnedframe->Table(-rows=>10, -columns => 5, -scrollbars=>e, -fixedrows => 1);
757 $itemsreturned->pack(-side => top);
758 displayitemsreturned();
759 #$itemsreturned=$returnedframe->Scrolled(Text, -height=>20, -width=>80, -relief => 'flat', -scrollbars => 'e');
760 #$itemsreturned->insert('0.0','');
761 #$itemsreturned->configure(-state => 'disabled');
762 #$itemsreturned->pack(-side => top);
767 my ($env,$dbh,$itemnumber)= @_;
768 my $br = $env->{'branchcode'};
769 my $query = "update items
770 set datelastseen = now(), holdingbranch = '$br'
771 where (itemnumber = '$itemnumber')";
772 my $sth = $dbh->prepare($query);
781 my ($env,$dbh, $item) = @_;
789 my $query = "select * from items,biblio
790 where barcode = '$item'
791 and (biblio.biblionumber=items.biblionumber)";
792 my $sth=$dbh->prepare($query);
794 if ($itemrec=$sth->fetchrow_hashref) {
796 $itemno = $itemrec->{'itemnumber'};
797 $query = "select * from issues
798 where (itemnumber='$itemrec->{'itemnumber'}')
799 and (returndate is null)";
800 my $sth=$dbh->prepare($query);
802 if (my $issuerec=$sth->fetchrow_hashref) {
804 $query = "select * from borrowers where
805 (borrowernumber = '$issuerec->{'borrowernumber'}')";
806 my $sth= $dbh->prepare($query);
808 $env->{'bornum'}=$issuerec->{'borrowernumber'};
809 $borrower = $sth->fetchrow_hashref;
810 $bornum = $issuerec->{'borrowernumber'};
811 $itemno = $issuerec->{'itemnumber'};
812 $amt_owing = returnrecord($env,$dbh,$bornum,$itemno);
813 $reason = "Returned";
816 updatelastseen($env,$dbh,$itemrec->{'itemnumber'});
817 $reason = "Item not issued";
819 my ($resfound,$resrec) = find_reserves($env,$dbh,$itemrec->{'itemnumber'});
820 if ($resfound eq "y") {
821 my $bquery = "select * from borrowers
822 where borrowernumber = '$resrec->{'borrowernumber'}'";
823 my $btsh = $dbh->prepare($bquery);
825 my $resborrower = $btsh->fetchrow_hashref;
826 #printreserve($env,$resrec,$resborrower,$itemrec);
827 my $mess = "Reserved for collection at branch $resrec->{'branchcode'}";
828 error_msg($env,$mess);
833 $reason = "Item not found";
835 return ($reason,$bornum,$borrower,$itemno,$itemrec,$amt_owing);
839 my ($env,$dbh,$itemno) = @_;
840 my $itemdata = itemnodata($env,$dbh,$itemno);
841 my $query = "select * from reserves where found is null
842 and biblionumber = $itemdata->{'biblionumber'} and cancellationdate is NULL
843 order by priority,reservedate ";
844 my $sth = $dbh->prepare($query);
848 while (($resrec=$sth->fetchrow_hashref) && ($resfound eq "n")) {
849 if ($resrec->{'found'} eq "W") {
850 if ($resrec->{'itemnumber'} eq $itemno) {
853 } elsif ($resrec->{'constrainttype'} eq "a") {
856 my $conquery = "select * from reserveconstraints where borrowernumber
857 = $resrec->{'borrowernumber'} and reservedate = '$resrec->{'reservedate'}' and biblionumber = $resrec->{'biblionumber'} and biblioitemnumber = $itemdata->{'biblioitemnumber'}";
858 my $consth = $dbh->prepare($conquery);
860 if (my $conrec=$consth->fetchrow_hashref) {
861 if ($resrec->{'constrainttype'} eq "o") {
865 if ($resrec->{'constrainttype'} eq "e") {
871 if ($resfound eq "y") {
872 my $updquery = "update reserves
873 set found = 'W',itemnumber='$itemno'
874 where borrowernumber = $resrec->{'borrowernumber'}
875 and reservedate = '$resrec->{'reservedate'}'
876 and biblionumber = $resrec->{'biblionumber'}";
877 my $updsth = $dbh->prepare($updquery);
880 my $itbr = $resrec->{'branchcode'};
881 if ($resrec->{'branchcode'} ne $env->{'branchcode'}) {
882 my $updquery = "update items
883 set holdingbranch = 'TR'
884 where itemnumber = $itemno";
885 my $updsth = $dbh->prepare($updquery);
892 return ($resfound,$resrec);