X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FCirculation.pm;h=5d936c3e7fdfc2863def5294a7db7386276d7f6e;hb=b31859946b90ac1ea5f5914477bd382f2025151e;hp=ca52e2764b39c4d2c29f270759979c6e351c23c7;hpb=1157ed9457849e7475c8bad48d48fe8cd9b93f58;p=koha_gimpoz diff --git a/C4/Circulation.pm b/C4/Circulation.pm index ca52e2764b..5d936c3e7f 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -66,6 +66,7 @@ BEGIN { &AddRenewal &GetRenewCount &GetItemIssue + &GetOpenIssue &GetItemIssues &GetBorrowerIssues &GetIssuingCharges @@ -306,94 +307,6 @@ sub transferbook { return ( $dotransfer, $messages, $biblio ); } -=head2 CanBookBeIssued - -Check if a book can be issued. - -my ($issuingimpossible,$needsconfirmation) = CanBookBeIssued($borrower,$barcode,$year,$month,$day); - -=over 4 - -=item C<$borrower> hash with borrower informations (from GetMemberDetails) - -=item C<$barcode> is the bar code of the book being issued. - -=item C<$year> C<$month> C<$day> contains the date of the return (in case it's forced by "stickyduedate". - -=back - -Returns : - -=over 4 - -=item C<$issuingimpossible> a reference to a hash. It contains reasons why issuing is impossible. -Possible values are : - -=back - -=head3 INVALID_DATE - -sticky due date is invalid - -=head3 GNA - -borrower gone with no address - -=head3 CARD_LOST - -borrower declared it's card lost - -=head3 DEBARRED - -borrower debarred - -=head3 UNKNOWN_BARCODE - -barcode unknown - -=head3 NOT_FOR_LOAN - -item is not for loan - -=head3 WTHDRAWN - -item withdrawn. - -=head3 RESTRICTED - -item is restricted (set by ??) - -C<$issuingimpossible> a reference to a hash. It contains reasons why issuing is impossible. -Possible values are : - -=head3 DEBT - -borrower has debts. - -=head3 RENEW_ISSUE - -renewing, not issuing - -=head3 ISSUED_TO_ANOTHER - -issued to someone else. - -=head3 RESERVED - -reserved for someone else. - -=head3 INVALID_DATE - -sticky due date is invalid - -=head3 TOO_MANY - -if the borrower borrows to much things - -=cut - -# check if a book can be issued. - sub TooMany { my $borrower = shift; @@ -635,11 +548,92 @@ sub itemissues { =head2 CanBookBeIssued -( $issuingimpossible, $needsconfirmation ) = - CanBookBeIssued( $borrower, $barcode, $duedatespec, $inprocess ); -C<$duedatespec> is a C4::Dates object. +Check if a book can be issued. + +( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $borrower, $barcode, $duedatespec, $inprocess ); + C<$issuingimpossible> and C<$needsconfirmation> are some hashref. +=over 4 + +=item C<$borrower> hash with borrower informations (from GetMemberDetails) + +=item C<$barcode> is the bar code of the book being issued. + +=item C<$duedatespec> is a C4::Dates object. + +=item C<$inprocess> + +=back + +Returns : + +=over 4 + +=item C<$issuingimpossible> a reference to a hash. It contains reasons why issuing is impossible. +Possible values are : + +=back + +=head3 INVALID_DATE + +sticky due date is invalid + +=head3 GNA + +borrower gone with no address + +=head3 CARD_LOST + +borrower declared it's card lost + +=head3 DEBARRED + +borrower debarred + +=head3 UNKNOWN_BARCODE + +barcode unknown + +=head3 NOT_FOR_LOAN + +item is not for loan + +=head3 WTHDRAWN + +item withdrawn. + +=head3 RESTRICTED + +item is restricted (set by ??) + +C<$issuingimpossible> a reference to a hash. It contains reasons why issuing is impossible. +Possible values are : + +=head3 DEBT + +borrower has debts. + +=head3 RENEW_ISSUE + +renewing, not issuing + +=head3 ISSUED_TO_ANOTHER + +issued to someone else. + +=head3 RESERVED + +reserved for someone else. + +=head3 INVALID_DATE + +sticky due date is invalid + +=head3 TOO_MANY + +if the borrower borrows to much things + =cut sub CanBookBeIssued { @@ -827,6 +821,10 @@ Issue a book. Does no check, they are done in CanBookBeIssued. If we reach this =item C<$date> contains the max date of return. calculated if empty. +=item C<$cancelreserve> + +=item C<$issuedate> the date to issue the item in iso format (YYYY-MM-DD). Defaults to today. + AddIssue does the following things : - step 01: check that there is a borrowernumber & a barcode provided - check for RENEWAL (book issued & being issued to the same patron) @@ -845,13 +843,17 @@ AddIssue does the following things : =cut sub AddIssue { - my ( $borrower, $barcode, $date, $cancelreserve ) = @_; + my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate ) = @_; my $dbh = C4::Context->dbh; my $barcodecheck=CheckValidBarcode($barcode); + + # $issuedate defaults to today. + if ( ! defined $issuedate ) { + $issuedate = strftime( "%Y-%m-%d", localtime ); + } if ($borrower and $barcode and $barcodecheck ne '0'){ # find which item we issue my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort. - my $datedue; my $branch; # Get which branchcode we need if (C4::Context->preference('CircControl') eq 'PickupLibrary'){ @@ -879,7 +881,8 @@ sub AddIssue { $borrower->{'borrowernumber'}, $item->{'itemnumber'}, $branch, - $date + $datedue, + $issuedate, ); } @@ -909,18 +912,11 @@ sub AddIssue { # warn "Waiting"; # The item is on reserve and waiting, but has been # reserved by some other patron. - my ( $resborrower ) = GetMemberDetails( $resbor, 0 ); - my $branches = GetBranches(); - my $branchname = - $branches->{ $res->{'branchcode'} }->{'branchname'}; } elsif ( $restype eq "Reserved" ) { # warn "Reserved"; # The item is reserved by someone else. - my ( $resborrower ) = GetMemberDetails( $resbor, 0 ); - my $branches = GetBranches(); - my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'}; if ($cancelreserve) { # cancel reserves on this item CancelReserve( 0, $res->{'itemnumber'}, $res->{'borrowernumber'} ); @@ -963,27 +959,26 @@ sub AddIssue { (borrowernumber, itemnumber,issuedate, date_due, branchcode) VALUES (?,?,?,?,?)" ); - my $dateduef; - if ($date) { - $dateduef = $date; + my $dateduef; + if ($datedue) { + $dateduef = $datedue; } else { - my $itype=(C4::Context->preference('item-level_itypes')) ? $biblio->{'itype'} : $biblio->{'itemtype'} ; - my $loanlength = GetLoanLength( - $borrower->{'categorycode'}, - $itype, - $branch - ); - $dateduef = CalcDateDue(C4::Dates->new(),$loanlength,$branch); - # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate - if ( C4::Context->preference('ReturnBeforeExpiry') && $dateduef->output('iso') gt $borrower->{dateexpiry} ) { - $dateduef = C4::Dates->new($borrower->{dateexpiry},'iso'); - } - }; - $sth->execute( - $borrower->{'borrowernumber'}, - $item->{'itemnumber'}, - strftime( "%Y-%m-%d", localtime ),$dateduef->output('iso'), C4::Context->userenv->{'branch'} - ); + my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'}; + my $loanlength = GetLoanLength( $borrower->{'categorycode'}, $itype, $branch ); + $dateduef = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $loanlength, $branch ); + + # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate + if ( C4::Context->preference('ReturnBeforeExpiry') && $dateduef->output('iso') gt $borrower->{dateexpiry} ) { + $dateduef = C4::Dates->new( $borrower->{dateexpiry}, 'iso' ); + } + } + $sth->execute( + $borrower->{'borrowernumber'}, # borrowernumber + $item->{'itemnumber'}, # itemnumber + $issuedate, # issuedate + $dateduef->output('iso'), # date_due + C4::Context->userenv->{'branch'} # branchcode + ); $sth->finish; $item->{'issues'}++; ModItem({ issues => $item->{'issues'}, @@ -1233,13 +1228,22 @@ sub GetBranchBorrowerCircRule { Returns a book. -C<$barcode> is the bar code of the book being returned. C<$branch> is -the code of the branch where the book is being returned. C<$exemptfine> -indicates that overdue charges for the item will be removed. C<$dropbox> -indicates that the check-in date is assumed to be yesterday, or the last -non-holiday as defined in C4::Calendar . If overdue -charges are applied and C<$dropbox> is true, the last charge will be removed. -This assumes that the fines accrual script has run for _today_. +=over 4 + +=item C<$barcode> is the bar code of the book being returned. + +=item C<$branch> is the code of the branch where the book is being returned. + +=item C<$exemptfine> indicates that overdue charges for the item will be +removed. + +=item C<$dropbox> indicates that the check-in date is assumed to be +yesterday, or the last non-holiday as defined in C4::Calendar . If +overdue charges are applied and C<$dropbox> is true, the last charge +will be removed. This assumes that the fines accrual script has run +for _today_. + +=back C<&AddReturn> returns a list of four items: @@ -1448,7 +1452,7 @@ sub AddReturn { =over 4 -MarkIssueReturned($borrowernumber, $itemnumber, $dropbox_branch); +MarkIssueReturned($borrowernumber, $itemnumber, $dropbox_branch, $returndate); =back @@ -1456,9 +1460,12 @@ Unconditionally marks an issue as being returned by moving the C row to C and setting C to the current date, or the last non-holiday date of the branccode specified in -C . Assumes you've already checked that +C . Assumes you've already checked that it's safe to do this, i.e. last non-holiday > issuedate. +if C<$returndate> is specified (in iso format), it is used as the date +of the return. It is ignored when a dropbox_branch is passed in. + Ideally, this function would be internal to C, not exported, but it is currently needed by one routine in C. @@ -1466,19 +1473,23 @@ routine in C. =cut sub MarkIssueReturned { - my ($borrowernumber, $itemnumber, $dropbox_branch ) = @_; - my $dbh = C4::Context->dbh; - my $query = "UPDATE issues SET returndate="; - my @bind = ($borrowernumber,$itemnumber); - if($dropbox_branch) { - my $calendar = C4::Calendar->new( branchcode => $dropbox_branch ); - my $dropboxdate = $calendar->addDate(C4::Dates->new(), -1 ); - unshift @bind, $dropboxdate->output('iso') ; - $query .= " ? " - } else { - $query .= " now() "; - } - $query .= " WHERE borrowernumber = ? AND itemnumber = ?"; + my ( $borrowernumber, $itemnumber, $dropbox_branch, $returndate ) = @_; + my $dbh = C4::Context->dbh; + my $query = "UPDATE issues SET returndate="; + my @bind; + if ($dropbox_branch) { + my $calendar = C4::Calendar->new( branchcode => $dropbox_branch ); + my $dropboxdate = $calendar->addDate( C4::Dates->new(), -1 ); + $query .= " ? "; + push @bind, $dropboxdate->output('iso'); + } elsif ($returndate) { + $query .= " ? "; + push @bind, $returndate; + } else { + $query .= " now() "; + } + $query .= " WHERE borrowernumber = ? AND itemnumber = ?"; + push @bind, $borrowernumber, $itemnumber; # FIXME transaction my $sth_upd = $dbh->prepare($query); $sth_upd->execute(@bind); @@ -1656,6 +1667,15 @@ C<$itemnumber> is the itemnumber Returns an array of hashes +FIXME: Though the above says that this function returns nothing if the +item is not issued, this actually returns a hasref that looks like +this: + { + itemnumber => 1, + overdue => 1 + } + + =cut sub GetItemIssue { @@ -1684,6 +1704,28 @@ sub GetItemIssue { return ($data); } +=head2 GetOpenIssue + +$issue = GetOpenIssue( $itemnumber ); + +Returns the row from the issues table if the item is currently issued, undef if the item is not currently issued + +C<$itemnumber> is the item's itemnumber + +Returns a hashref + +=cut + +sub GetOpenIssue { + my ( $itemnumber ) = @_; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare( "SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL" ); + $sth->execute( $itemnumber ); + my $issue = $sth->fetchrow_hashref(); + return $issue; +} + =head2 GetItemIssues $issues = &GetItemIssues($itemnumber, $history); @@ -1758,7 +1800,7 @@ sub GetBiblioIssues { LEFT JOIN borrowers ON borrowers.borrowernumber = issues.borrowernumber LEFT JOIN items ON issues.itemnumber = items.itemnumber LEFT JOIN biblioitems ON items.itemnumber = biblioitems.biblioitemnumber - LEFT JOIN biblio ON biblio.biblionumber = items.biblioitemnumber + LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber WHERE biblio.biblionumber = ? UNION ALL SELECT old_issues.*,items.barcode,biblio.biblionumber,biblio.title, biblio.author,borrowers.cardnumber,borrowers.surname,borrowers.firstname @@ -1766,7 +1808,7 @@ sub GetBiblioIssues { LEFT JOIN borrowers ON borrowers.borrowernumber = old_issues.borrowernumber LEFT JOIN items ON old_issues.itemnumber = items.itemnumber LEFT JOIN biblioitems ON items.itemnumber = biblioitems.biblioitemnumber - LEFT JOIN biblio ON biblio.biblionumber = items.biblioitemnumber + LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber WHERE biblio.biblionumber = ? ORDER BY timestamp "; @@ -1892,7 +1934,7 @@ sub CanBookBeRenewed { =head2 AddRenewal -&AddRenewal($borrowernumber, $itemnumber, $branch, [$datedue]); +&AddRenewal($borrowernumber, $itemnumber, $branch, [$datedue], [$issuedate]); Renews a loan. @@ -1905,6 +1947,8 @@ C<$branch> is the library branch. Defaults to the homebranch of the ITEM. C<$datedue> can be a C4::Dates object used to set the due date. +C<$issuedate> can be a iso formatted date to use for the issuedate. + If C<$datedue> is the empty string, C<&AddRenewal> will calculate the due date automatically from the book's item type. @@ -1916,10 +1960,11 @@ sub AddRenewal { my $item = GetItem($itemnumber) or return undef; my $biblio = GetBiblioFromItemNumber($itemnumber) or return undef; my $branch = (@_) ? shift : $item->{homebranch}; # opac-renew doesn't send branch - my $datedue; + my $datedue = shift; + my $issuedate = shift; # If the due date wasn't specified, calculate it by adding the # book's loan length to today's date. - unless (@_ and $datedue = shift and $datedue->output('iso')) { + unless ($datedue && $datedue->output('iso')) { my $borrower = C4::Members::GetMemberDetails( $borrowernumber, 0 ) or return undef; my $loanlength = GetLoanLength( @@ -1946,11 +1991,11 @@ sub AddRenewal { # Update the issues record to have the new due date, and a new count # of how many times it has been renewed. my $renews = $issuedata->{'renewals'} + 1; - $sth = $dbh->prepare("UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = CURRENT_DATE + $sth = $dbh->prepare("UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = CURRENT_DATE, issuedate = ? WHERE borrowernumber=? AND itemnumber=?" ); - $sth->execute( $datedue->output('iso'), $renews, $borrowernumber, $itemnumber ); + $sth->execute( $datedue->output('iso'), $renews, $issuedate, $borrowernumber, $itemnumber ); $sth->finish; # Update the renewal count on the item, and tell zebra to reindex