X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=circ%2Freturns.pl;h=5a5b4a314c87275c13f40bb92d7d1a05c81ca3a1;hb=71f09311a9c3bbd643db6e4b49f371689fac730d;hp=f0a9beb930ff6fc9e9373bc421ae34195f6a46c9;hpb=9f42b8ad49fb17c4cbea4825639de7c4212f681c;p=koha.git diff --git a/circ/returns.pl b/circ/returns.pl index f0a9beb930..5a5b4a314c 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -1,6 +1,8 @@ #!/usr/bin/perl # Copyright 2000-2002 Katipo Communications +# 2006 SAN-OP +# 2007 BibLibre, Paul POULAIN # # This file is part of Koha. # @@ -21,27 +23,39 @@ script to execute returns of books -written 11/3/2002 by Finlay - =cut use strict; +# use warnings; # FIXME + use CGI; -use C4::Circulation; -use C4::Date; +use C4::Context; +use C4::Auth qw/:DEFAULT get_session/; use C4::Output; +use C4::Circulation; +use C4::Dates qw/format_date/; +use Date::Calc qw/Add_Delta_Days/; +use C4::Calendar; use C4::Print; use C4::Reserves; -use C4::Auth; use C4::Biblio; +use C4::Items; use C4::Members; -use C4::Interface::CGI::Output; -use C4::Branch; # GetBranchName +use C4::Branch; # GetBranches GetBranchName use C4::Koha; # FIXME : is it still useful ? -use C4::Context; my $query = new CGI; +if (!C4::Context->userenv){ + my $sessionID = $query->cookie("CGISESSID"); + my $session = get_session($sessionID); + if ($session->param('branch') eq 'NO_LIBRARY_SET'){ + # no branch set we can't return + print $query->redirect("/cgi-bin/koha/circ/selectbranchprinter.pl"); + exit; + } +} + #getting the template my ( $template, $librarian, $cookie ) = get_template_and_user( { @@ -49,7 +63,7 @@ my ( $template, $librarian, $cookie ) = get_template_and_user( query => $query, type => "intranet", authnotrequired => 0, - flagsrequired => { circulate => 1 }, + flagsrequired => { circulate => "circulate_remaining_permissions" }, } ); @@ -59,8 +73,10 @@ my $branches = GetBranches(); my $printers = GetPrinters(); #my $branch = C4::Context->userenv?C4::Context->userenv->{'branch'}:""; -my $printer = C4::Context->userenv?C4::Context->userenv->{'branchprinter'}:""; +my $printer = C4::Context->userenv ? C4::Context->userenv->{'branchprinter'} : ""; +my $overduecharges = (C4::Context->preference('finesMode') && C4::Context->preference('finesMode') ne 'off'); +my $userenv_branch = C4::Context->userenv->{'branch'} || ''; # # Some code to handle the error if there is no branch or printer setting..... # @@ -80,8 +96,8 @@ foreach ( $query->param ) { my $borrowernumber = $query->param("bn-$counter"); $counter++; - # decode cuecat - $barcode = cuecatbarcodedecode($barcode); + # decode barcode ## Didn't we already decode them before passing them back last time?? + $barcode = barcodedecode($barcode) if(C4::Context->preference('itemBarcodeInputFilter')); ###################### #Are these lines still useful ? @@ -101,51 +117,38 @@ foreach ( $query->param ) { # Deal with the requests.... if ($query->param('WT-itemNumber')){ -updateWrongTransfer ($query->param('WT-itemNumber'),$query->param('WT-waitingAt'),$query->param('WT-From')); + updateWrongTransfer ($query->param('WT-itemNumber'),$query->param('WT-waitingAt'),$query->param('WT-From')); } - if ( $query->param('resbarcode') ) { my $item = $query->param('itemnumber'); my $borrowernumber = $query->param('borrowernumber'); my $resbarcode = $query->param('resbarcode'); my $diffBranchReturned = $query->param('diffBranch'); - # set to waiting.... my $iteminfo = GetBiblioFromItemNumber($item); - my $diffBranchSend; - -# addin in ReserveWaiting the possibility to check if the document is expected in this library or not, -# if not we send a value in reserve waiting for not implementting waiting status - if ($diffBranchReturned) { - $diffBranchSend = $diffBranchReturned; - } - else { - $diffBranchSend = undef; - } - - my $tobranchcd = ReserveWaiting( $item, $borrowernumber,$diffBranchSend); -# check if we have other reservs for this document, if we have a return send the message of transfer - my ( $messages, $nextreservinfo ) = OtherReserves($item); + # fix up item type for display + $iteminfo->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $iteminfo->{'itype'} : $iteminfo->{'itemtype'}; + my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef; +# diffBranchSend tells ModReserveAffect whether document is expected in this library or not, +# i.e., whether to apply waiting status + ModReserveAffect( $item, $borrowernumber, $diffBranchSend); +# check if we have other reserves for this document, if we have a return send the message of transfer + my ( $messages, $nextreservinfo ) = GetOtherReserves($item); - my $branchname = GetBranchName( $messages->{'transfert'} ); my ($borr) = GetMemberDetails( $nextreservinfo, 0 ); - my $borcnum = $borr->{'cardnumber'}; - my $name = - $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'}; - my $slip = $query->param('resslip'); - - + my $name = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'}; if ( $messages->{'transfert'} ) { $template->param( itemtitle => $iteminfo->{'title'}, + itembiblionumber => $iteminfo->{'biblionumber'}, iteminfo => $iteminfo->{'author'}, - tobranchname => $branchname, + tobranchname => GetBranchName($messages->{'transfert'}), name => $name, borrowernumber => $borrowernumber, - borcnum => $borcnum, + borcnum => $borr->{'cardnumber'}, borfirstname => $borr->{'firstname'}, borsurname => $borr->{'surname'}, - diffbranch => 1 + diffbranch => 1, ); } } @@ -154,19 +157,36 @@ my $borrower; my $returned = 0; my $messages; my $issueinformation; -my $barcode = $query->param('barcode'); +my $itemnumber; +my $barcode = $query->param('barcode'); +my $exemptfine = $query->param('exemptfine'); +my $dropboxmode = $query->param('dropboxmode'); +my $dotransfer = $query->param('dotransfer'); +my $calendar = C4::Calendar->new( branchcode => $userenv_branch ); + #dropbox: get last open day (today - 1) +my $today = C4::Dates->new(); +my $today_iso = $today->output('iso'); +my $dropboxdate = $calendar->addDate($today, -1); +if ($dotransfer){ + # An item has been returned to a branch other than the homebranch, and the librarian has chosen to initiate a transfer + my $transferitem = $query->param('transferitem'); + my $tobranch = $query->param('tobranch'); + ModItemTransfer($transferitem, $userenv_branch, $tobranch); +} # actually return book and prepare item table..... if ($barcode) { - # decode cuecat - $barcode = cuecatbarcodedecode($barcode); -# -# save the return -# + $barcode = barcodedecode($barcode) if C4::Context->preference('itemBarcodeInputFilter'); + $itemnumber = GetItemnumberFromBarcode($barcode); + ( $returned, $messages, $issueinformation, $borrower ) = - AddReturn( $barcode, C4::Context->userenv->{'branch'} ); + AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode); # do the return + # get biblio description - my $biblio = GetBiblioFromItemNumber($issueinformation->{'itemnumber'}); + my $biblio = GetBiblioFromItemNumber($itemnumber); + # fix up item type for display + $biblio->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $biblio->{'itype'} : $biblio->{'itemtype'}; + $template->param( title => $biblio->{'title'}, homebranch => $biblio->{'homebranch'}, @@ -176,41 +196,35 @@ if ($barcode) { ccode => $biblio->{'ccode'}, itembiblionumber => $biblio->{'biblionumber'}, ); + + my %input = ( + counter => 0, + first => 1, + barcode => $barcode, + ); + if ($returned) { - $returneditems{0} = $barcode; - $riborrowernumber{0} = $borrower->{'borrowernumber'}; - $riduedate{0} = $issueinformation->{'date_due'}; - my %input; - $input{counter} = 0; - $input{first} = 1; - $input{barcode} = $barcode; - $input{duedate} = $riduedate{0}; - $input{borrowernumber} = $riborrowernumber{0}; + my $duedate = $issueinformation->{'date_due'}; + $returneditems{0} = $barcode; + $riborrowernumber{0} = $borrower->{'borrowernumber'}; + $riduedate{0} = $duedate; + $input{borrowernumber} = $borrower->{'borrowernumber'}; + $input{duedate} = $duedate; + $input{return_overdue} = 1 if ($duedate and $duedate lt $today->output('iso')); push( @inputloop, \%input ); - - # check if the branch is the same as homebranch - # if not, we want to put a message - if ( $biblio->{'homebranch'} ne C4::Context->userenv->{'branch'} ) { - $template->param( homebranch => $biblio->{'homebranch'} ); - } } elsif ( !$messages->{'BadBarcode'} ) { - my %input; - $input{counter} = 0; - $input{first} = 1; - $input{barcode} = $barcode; - $input{duedate} = 0; - + $input{duedate} = 0; $returneditems{0} = $barcode; $riduedate{0} = 0; if ( $messages->{'wthdrawn'} ) { $input{withdrawn} = 1; - $input{borrowernumber} = "Item Cancelled"; + $input{borrowernumber} = 'Item Cancelled'; # FIXME: should be in display layer ? $riborrowernumber{0} = 'Item Cancelled'; } else { - $input{borrowernumber} = " "; - $riborrowernumber{0} = ' '; + $input{borrowernumber} = ' '; # This seems clearly bogus. + $riborrowernumber{0} = ' '; } push( @inputloop, \%input ); } @@ -229,10 +243,23 @@ if ( $messages->{'WasTransfered'} ) { found => 1, transfer => 1, ); +} +if ( $messages->{'NeedsTransfer'} ){ + $template->param( + found => 1, + needstransfer => 1, + itemnumber => $itemnumber, + ); +} + +if ( $messages->{'Wrongbranch'} ){ + $template->param( + wrongbranch => 1, + ); } -# adding a case of wrong transfert, if the document wasn't transfered in the good library (according to branchtransfer (tobranch) BDD) +# case of wrong transfert, if the document wasn't transfered to the right library (according to branchtransfer (tobranch) BDD) if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) { $template->param( @@ -241,110 +268,78 @@ if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) { WrongTransferItem => $messages->{'WrongTransferItem'}, ); - my $reserve = $messages->{'ResFound'}; + my $reserve = $messages->{'ResFound'}; my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'}; my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 ); - my $name = - $borr->{'surname'} . " " . $borr->{'title'} . " " . $borr->{'firstname'}; - $template->param( + my $name = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'}; + $template->param( wname => $name, wborfirstname => $borr->{'firstname'}, wborsurname => $borr->{'surname'}, wbortitle => $borr->{'title'}, wborphone => $borr->{'phone'}, - wboremail => $borr->{'emailaddress'}, - wborstraddress => $borr->{'streetaddress'}, + wboremail => $borr->{'email'}, + wboraddress => $borr->{'address'}, + wboraddress2 => $borr->{'address2'}, wborcity => $borr->{'city'}, wborzip => $borr->{'zipcode'}, wborrowernumber => $reserve->{'borrowernumber'}, wborcnum => $borr->{'cardnumber'}, - wtransfertFrom => C4::Context->userenv->{'branch'}, - ); + wtransfertFrom => $userenv_branch, + ); } - # # reserve found and item arrived at the expected branch # -if ( $messages->{'ResFound'} and not $messages->{'WrongTransfer'}) { - my $reserve = $messages->{'ResFound'}; +if ( $messages->{'ResFound'}) { + my $reserve = $messages->{'ResFound'}; my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'}; my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 ); - if ( $reserve->{'ResFound'} eq "Waiting" ) { - if ( C4::Context->userenv->{'branch'} eq $reserve->{'branchcode'} ) { - $template->param( waiting => 1 ); - } - else { - $template->param( waiting => 0 ); + + if ( $reserve->{'ResFound'} eq "Waiting" or $reserve->{'ResFound'} eq "Reserved" ) { + if ( $reserve->{'ResFound'} eq "Waiting" ) { + $template->param( + waiting => ($userenv_branch eq $reserve->{'branchcode'} ? 1 : 0 ), + ); + } elsif ( $reserve->{'ResFound'} eq "Reserved" ) { + $template->param( + intransit => ($userenv_branch eq $reserve->{'branchcode'} ? 0 : 1 ), + transfertodo => ($userenv_branch eq $reserve->{'branchcode'} ? 0 : 1 ), + resbarcode => $barcode, + reserved => 1, + ); } + # same params for Waiting or Reserved $template->param( found => 1, - name => $borr->{'surname'} . " " . $borr->{'title'} . " " . $borr->{'firstname'}, + currentbranch => $branches->{$userenv_branch}->{'branchname'}, + destbranchname => $branches->{ $reserve->{'branchcode'} }->{'branchname'}, + name => $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'}, borfirstname => $borr->{'firstname'}, borsurname => $borr->{'surname'}, bortitle => $borr->{'title'}, borphone => $borr->{'phone'}, - boremail => $borr->{'emailaddress'}, - borstraddress => $borr->{'streetaddress'}, + boremail => $borr->{'email'}, + boraddress => $borr->{'address'}, + boraddress2 => $borr->{'address2'}, borcity => $borr->{'city'}, borzip => $borr->{'zipcode'}, - borrowernumber => $reserve->{'borrowernumber'}, borcnum => $borr->{'cardnumber'}, debarred => $borr->{'debarred'}, gonenoaddress => $borr->{'gonenoaddress'}, - currentbranch => $branches->{C4::Context->userenv->{'branch'}}->{'branchname'}, - itemnumber => $reserve->{'itemnumber'}, - ); - - } - if ( $reserve->{'ResFound'} eq "Reserved" ) { - my @da = localtime( time() ); - my $todaysdate = - sprintf( "%0.2d", ( $da[3] + 1 ) ) . "/" - . sprintf( "%0.2d", ( $da[4] + 1 ) ) . "/" - . ( $da[5] + 1900 ); - - if ( C4::Context->userenv->{'branch'} eq $reserve->{'branchcode'} ) { - $template->param( intransit => 0 ); - } - else { - $template->param( intransit => 1 ); - } - - $template->param( - found => 1, - currentbranch => $branches->{C4::Context->userenv->{'branch'}}->{'branchname'}, - destbranchname => - $branches->{ $reserve->{'branchcode'} }->{'branchname'}, + barcode => $barcode, destbranch => $reserve->{'branchcode'}, - transfertodo => ( C4::Context->userenv->{'branch'} eq $reserve->{'branchcode'} ? 0 : 1 ), - reserved => 1, - today => $todaysdate, - itemnumber => $reserve->{'itemnumber'}, - borsurname => $borr->{'surname'}, - bortitle => $borr->{'title'}, - borfirstname => $borr->{'firstname'}, - borrowernumber => $reserve->{'borrowernumber'}, - borcnum => $borr->{'cardnumber'}, - borphone => $borr->{'phone'}, - borstraddress => $borr->{'streetaddress'}, - borsub => $borr->{'suburb'}, - borcity => $borr->{'city'}, - borzip => $borr->{'zipcode'}, - boremail => $borr->{'emailaddress'}, - debarred => $borr->{'debarred'}, - gonenoaddress => $borr->{'gonenoaddress'}, - barcode => $barcode + borrowernumber => $reserve->{'borrowernumber'}, + itemnumber => $reserve->{'itemnumber'}, ); - } + } # else { ; } # error? } # Error Messages my @errmsgloop; foreach my $code ( keys %$messages ) { - - # warn $code; my %err; my $exit_required_p = 0; if ( $code eq 'BadBarcode' ) { @@ -372,7 +367,7 @@ foreach my $code ( keys %$messages ) { $exit_required_p = 1; } elsif ( ( $code eq 'IsPermanent' ) && ( not $messages->{'ResFound'} ) ) { - if ( $messages->{'IsPermanent'} ne C4::Context->userenv->{'branch'} ) { + if ( $messages->{'IsPermanent'} ne $userenv_branch ) { $err{ispermanent} = 1; $err{msg} = $branches->{ $messages->{'IsPermanent'} }->{'branchname'}; @@ -384,8 +379,14 @@ foreach my $code ( keys %$messages ) { elsif ( $code eq 'WrongTransferItem' ) { ; # FIXME... anything to do here? } + elsif ( $code eq 'NeedsTransfer' ) { + } + elsif ( $code eq 'Wrongbranch' ) { + } + else { - die "Unknown error code $code"; # XXX + die "Unknown error code $code"; # note we need all the (empty) elsif's above, or we die. + # This forces the issue of staying in sync w/ Circulation.pm } if (%err) { push( @errmsgloop, \%err ); @@ -407,6 +408,7 @@ if ($borrower) { if ( $flag eq 'CHARGES' ) { $flaginfo{msg} = $flag; $flaginfo{charges} = 1; + $flaginfo{chargeamount} = $flags->{$flag}->{amount}; $flaginfo{borrowernumber} = $borrower->{borrowernumber}; } elsif ( $flag eq 'WAITING' ) { @@ -415,16 +417,13 @@ if ($borrower) { my @waitingitemloop; my $items = $flags->{$flag}->{'itemlist'}; foreach my $item (@$items) { - my $biblio = - GetBiblioFromItemNumber( $item->{'itemnumber'}); - my %waitingitem; - $waitingitem{biblionum} = $biblio->{'biblionumber'}; - $waitingitem{barcode} = $biblio->{'barcode'}; - $waitingitem{title} = $biblio->{'title'}; - $waitingitem{brname} = - $branches->{ $biblio->{'holdingbranch'} } - ->{'branchname'}; - push( @waitingitemloop, \%waitingitem ); + my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'}); + push @waitingitemloop, { + biblionum => $biblio->{'biblionumber'}, + barcode => $biblio->{'barcode'}, + title => $biblio->{'title'}, + brname => $branches->{ $biblio->{'holdingbranch'} }->{'branchname'}, + }; } $flaginfo{itemloop} = \@waitingitemloop; } @@ -434,17 +433,14 @@ if ($borrower) { foreach my $item ( sort { $a->{'date_due'} cmp $b->{'date_due'} } @$items ) { - my $biblio = - GetBiblioFromItemNumber( $item->{'itemnumber'}); - my %overdueitem; - $overdueitem{duedate} = format_date( $item->{'date_due'} ); - $overdueitem{biblionum} = $biblio->{'biblionumber'}; - $overdueitem{barcode} = $biblio->{'barcode'}; - $overdueitem{title} = $biblio->{'title'}; - $overdueitem{brname} = - $branches->{ $biblio->{'holdingbranch'} } - ->{'branchname'}; - push( @itemloop, \%overdueitem ); + my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'}); + push @itemloop, { + duedate => format_date($item->{'date_due'}), + biblionum => $biblio->{'biblionumber'}, + barcode => $biblio->{'barcode'}, + title => $biblio->{'title'}, + brname => $branches->{ $biblio->{'holdingbranch'} }->{'branchname'}, + }; } $flaginfo{itemloop} = \@itemloop; $flaginfo{overdue} = 1; @@ -471,7 +467,7 @@ my $count = 0; my @riloop; foreach ( sort { $a <=> $b } keys %returneditems ) { my %ri; - if ( $count < 8 ) { + if ( $count++ < 8 ) { my $barcode = $returneditems{$_}; my $duedate = $riduedate{$_}; my $overduetext; @@ -481,20 +477,16 @@ foreach ( sort { $a <=> $b } keys %returneditems ) { $ri{year} = $tempdate[0]; $ri{month} = $tempdate[1]; $ri{day} = $tempdate[2]; - my $duedatenz = "$tempdate[2]/$tempdate[1]/$tempdate[0]"; - my @datearr = localtime( time() ); - my $todaysdate = - $datearr[5] . '-' - . sprintf( "%0.2d", ( $datearr[4] + 1 ) ) . '-' - . sprintf( "%0.2d", $datearr[3] ); $ri{duedate} = format_date($duedate); - my ($borrower) = - GetMemberDetails( $riborrowernumber{$_}, 0 ); + my ($borrower) = GetMemberDetails( $riborrowernumber{$_}, 0 ); + $ri{return_overdue} = 1 if ($duedate lt $today->output('iso')); $ri{borrowernumber} = $borrower->{'borrowernumber'}; $ri{borcnum} = $borrower->{'cardnumber'}; $ri{borfirstname} = $borrower->{'firstname'}; $ri{borsurname} = $borrower->{'surname'}; $ri{bortitle} = $borrower->{'title'}; + $ri{bornote} = $borrower->{'borrowernotes'}; + $ri{borcategorycode}= $borrower->{'categorycode'}; } else { $ri{borrowernumber} = $riborrowernumber{$_}; @@ -502,31 +494,34 @@ foreach ( sort { $a <=> $b } keys %returneditems ) { # my %ri; my $biblio = GetBiblioFromItemNumber(GetItemnumberFromBarcode($barcode)); + # fix up item type for display + $biblio->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $biblio->{'itype'} : $biblio->{'itemtype'}; $ri{itembiblionumber} = $biblio->{'biblionumber'}; $ri{itemtitle} = $biblio->{'title'}; $ri{itemauthor} = $biblio->{'author'}; $ri{itemtype} = $biblio->{'itemtype'}; + $ri{itemnote} = $biblio->{'itemnotes'}; $ri{ccode} = $biblio->{'ccode'}; + $ri{itemnumber} = $biblio->{'itemnumber'}; $ri{barcode} = $barcode; } else { last; } - $count++; push( @riloop, \%ri ); } -$template->param( riloop => \@riloop ); $template->param( - genbrname => $branches->{C4::Context->userenv->{'branch'}}->{'branchname'}, - genprname => $printers->{$printer}->{'printername'}, - branchname => $branches->{C4::Context->userenv->{'branch'}}->{'branchname'}, - printer => $printer, - errmsgloop => \@errmsgloop, - intranetcolorstylesheet => - C4::Context->preference("intranetcolorstylesheet"), - intranetstylesheet => C4::Context->preference("intranetstylesheet"), - IntranetNav => C4::Context->preference("IntranetNav"), + riloop => \@riloop, + genbrname => $branches->{$userenv_branch}->{'branchname'}, + genprname => $printers->{$printer}->{'printername'}, + branchname => $branches->{$userenv_branch}->{'branchname'}, + printer => $printer, + errmsgloop => \@errmsgloop, + exemptfine => $exemptfine, + dropboxmode => $dropboxmode, + dropboxdate => $dropboxdate->output(), + overduecharges => $overduecharges, ); # actually print the page!