X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FCirculation.pm;h=4b02a26b3d83a576b0dad4e18a64aeb76cce67c9;hb=bfec1aa5ae116b5ec5159d68be1c25e15f3c9430;hp=372b5e8e7feba0167af03e9884fde8b0a0e38c19;hpb=1301705150193531eeabcfaa7a12a4faa588d3b8;p=koha.git diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 372b5e8e7f..4b02a26b3d 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -30,6 +30,8 @@ use C4::Members; use C4::Dates; use C4::Calendar; use C4::Accounts; +use C4::ItemCirculationAlertPreference; +use C4::Message; use Date::Calc qw( Today Today_and_Now @@ -277,13 +279,13 @@ sub transferbook { # if using Branch Transfer Limits if ( C4::Context->preference("UseBranchTransferLimits") == 1 ) { - if ( C4::Context->preference("item-level_itypes") ) { + if ( C4::Context->preference("item-level_itypes") && C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ) { if ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) ) { $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{'itype'}; $dotransfer = 0; } - } elsif ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itemtype'} ) ) { - $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{'itemtype'}; + } elsif ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{ C4::Context->preference("BranchTransferLimitsType") } ) ) { + $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{ C4::Context->preference("BranchTransferLimitsType") }; $dotransfer = 0; } } @@ -792,7 +794,7 @@ sub CanBookBeIssued { elsif ($issue->{borrowernumber}) { # issued to someone else - my $currborinfo = GetMemberDetails( $issue->{borrowernumber} ); + my $currborinfo = C4::Members::GetMemberDetails( $issue->{borrowernumber} ); # warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})"; $needsconfirmation{ISSUED_TO_ANOTHER} = @@ -849,17 +851,18 @@ Calculated if empty. Defaults to today. Unlike C<$datedue>, NOT a C4::Dates object, unfortunately. 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) - - renewal YES = Calculate Charge & renew - - renewal NO = - * BOOK ACTUALLY ISSUED ? do a return if book is actually issued (but to someone else) - * RESERVE PLACED ? - - fill reserve if reserve to this patron - - cancel reserve or not, otherwise - * TRANSFERT PENDING ? - - complete the transfert - * ISSUE THE BOOK + + - step 01: check that there is a borrowernumber & a barcode provided + - check for RENEWAL (book issued & being issued to the same patron) + - renewal YES = Calculate Charge & renew + - renewal NO = + * BOOK ACTUALLY ISSUED ? do a return if book is actually issued (but to someone else) + * RESERVE PLACED ? + - fill reserve if reserve to this patron + - cancel reserve or not, otherwise + * TRANSFERT PENDING ? + - complete the transfert + * ISSUE THE BOOK =back @@ -994,7 +997,7 @@ sub AddIssue { onloan => $datedue->output('iso'), }, $item->{'biblionumber'}, $item->{'itemnumber'}); ModDateLastSeen( $item->{'itemnumber'} ); - + # If it costs to borrow this book, charge it to the patron's account. my ( $charge, $itemtype ) = GetIssuingCharges( $item->{'itemnumber'}, @@ -1015,8 +1018,25 @@ sub AddIssue { ($sipmode ? "SIP-$sipmode" : ''), $item->{'itemnumber'}, $item->{'itype'}, $borrower->{'borrowernumber'} ); + + # Send a checkout slip. + my $circulation_alert = 'C4::ItemCirculationAlertPreference'; + my %conditions = ( + branchcode => $branch, + categorycode => $borrower->{categorycode}, + item_type => $item->{itype}, + notification => 'CHECKOUT', + ); + if ($circulation_alert->is_enabled_for(\%conditions)) { + SendCirculationAlert({ + type => 'CHECKOUT', + item => $item, + borrower => $borrower, + branch => $branch, + }); + } } - + logaction("CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'}) if C4::Context->preference("IssueLog"); } @@ -1498,6 +1518,23 @@ sub AddReturn { $biblio->{'itemtype'}, $borrower->{'borrowernumber'} ); + + # Send a check-in slip. + my $circulation_alert = 'C4::ItemCirculationAlertPreference'; + my %conditions = ( + branchcode => $branch, + categorycode => $borrower->{categorycode}, + item_type => $iteminformation->{itype}, + notification => 'CHECKIN', + ); + if ($doreturn && $circulation_alert->is_enabled_for(\%conditions)) { + SendCirculationAlert({ + type => 'CHECKIN', + item => $iteminformation, + borrower => $borrower, + branch => $branch, + }); + } logaction("CIRCULATION", "RETURN", $iteminformation->{borrowernumber}, $iteminformation->{'biblionumber'}) if C4::Context->preference("ReturnLog"); @@ -1510,7 +1547,7 @@ sub AddReturn { ModItemTransfer($iteminformation->{'itemnumber'}, C4::Context->userenv->{'branch'}, $iteminformation->{'homebranch'}); $messages->{'WasTransfered'} = 1; } elsif ( C4::Context->preference("UseBranchTransferLimits") == 1 - && ! IsTransferAllowed( $branch, $iteminformation->{'homebranch'}, $iteminformation->{'itemtype'} ) + && ! IsTransferAllowed( $branch, $iteminformation->{'homebranch'}, $iteminformation->{ C4::Context->preference("BranchTransferLimitsType") } ) ) { ModItemTransfer($iteminformation->{'itemnumber'}, C4::Context->userenv->{'branch'}, $iteminformation->{'homebranch'}); $messages->{'WasTransfered'} = 1; @@ -2086,7 +2123,7 @@ sub AddRenewal { # Update the renewal count on the item, and tell zebra to reindex $renews = $biblio->{'renewals'} + 1; - ModItem({ renewals => $renews }, $biblio->{'biblionumber'}, $itemnumber); + ModItem({ renewals => $renews, onloan => $datedue->output('iso') }, $biblio->{'biblionumber'}, $itemnumber); # Charge a new rental fee, if applicable? my ( $charge, $type ) = GetIssuingCharges( $itemnumber, $borrowernumber ); @@ -2251,7 +2288,6 @@ sub GetTransfers { return @row; } - =head2 GetTransfersFromTo @results = GetTransfersFromTo($frombranch,$tobranch); @@ -2326,6 +2362,77 @@ sub AnonymiseIssueHistory { return $rows_affected; } +=head2 SendCirculationAlert + +Send out a C or C alert using the messaging system. + +B: + +=over 4 + +=item type + +Valid values for this parameter are: C and C. + +=item item + +Hashref of information about the item being checked in or out. + +=item borrower + +Hashref of information about the borrower of the item. + +=item branch + +The branchcode from where the checkout or check-in took place. + +=back + +B: + + SendCirculationAlert({ + type => 'CHECKOUT', + item => $item, + borrower => $borrower, + branch => $branch, + }); + +=cut + +sub SendCirculationAlert { + my ($opts) = @_; + my ($type, $item, $borrower, $branch) = + ($opts->{type}, $opts->{item}, $opts->{borrower}, $opts->{branch}); + my %message_name = ( + CHECKIN => 'Item Check-in', + CHECKOUT => 'Item Checkout', + ); + my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences({ + borrowernumber => $borrower->{borrowernumber}, + message_name => $message_name{$type}, + }); + my $letter = C4::Letters::getletter('circulation', $type); + C4::Letters::parseletter($letter, 'biblio', $item->{biblionumber}); + C4::Letters::parseletter($letter, 'biblioitems', $item->{biblionumber}); + C4::Letters::parseletter($letter, 'borrowers', $borrower->{borrowernumber}); + C4::Letters::parseletter($letter, 'branches', $branch); + my @transports = @{ $borrower_preferences->{transports} }; + # warn "no transports" unless @transports; + for (@transports) { + # warn "transport: $_"; + my $message = C4::Message->find_last_message($borrower, $type, $_); + if (!$message) { + #warn "create new message"; + C4::Message->enqueue($letter, $borrower, $_); + } else { + #warn "append to old message"; + $message->append($letter); + $message->update; + } + } + $letter; +} + =head2 updateWrongTransfer $items = updateWrongTransfer($itemNumber,$borrowernumber,$waitingAtLibrary,$FromLibrary); @@ -2523,19 +2630,22 @@ return $exist; =head2 IsBranchTransferAllowed -$allowed = IsBranchTransferAllowed( $toBranch, $fromBranch, $itemtype ); +$allowed = IsBranchTransferAllowed( $toBranch, $fromBranch, $code ); + +Code is either an itemtype or collection doe depending on the pref BranchTransferLimitsType =cut sub IsBranchTransferAllowed { - my ( $toBranch, $fromBranch, $itemtype ) = @_; - + my ( $toBranch, $fromBranch, $code ) = @_; + if ( $toBranch eq $fromBranch ) { return 1; } ## Short circuit for speed. + my $limitType = C4::Context->preference("BranchTransferLimitsType"); my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare('SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND itemtype = ?'); - $sth->execute( $toBranch, $fromBranch, $itemtype ); + my $sth = $dbh->prepare("SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND $limitType = ?"); + $sth->execute( $toBranch, $fromBranch, $code ); my $limit = $sth->fetchrow_hashref(); ## If a row is found, then that combination is not allowed, if no matching row is found, then the combination *is allowed* @@ -2548,17 +2658,21 @@ sub IsBranchTransferAllowed { =head2 CreateBranchTransferLimit -CreateBranchTransferLimit( $toBranch, $fromBranch, $itemtype ); +CreateBranchTransferLimit( $toBranch, $fromBranch, $code ); + +$code is either itemtype or collection code depending on what the pref BranchTransferLimitsType is set to. =cut sub CreateBranchTransferLimit { - my ( $toBranch, $fromBranch, $itemtype ) = @_; + my ( $toBranch, $fromBranch, $code ) = @_; + + my $limitType = C4::Context->preference("BranchTransferLimitsType"); my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( itemtype, toBranch, fromBranch ) VALUES ( ?, ?, ? )"); - $sth->execute( $itemtype, $toBranch, $fromBranch ); + my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( $limitType, toBranch, fromBranch ) VALUES ( ?, ?, ? )"); + $sth->execute( $code, $toBranch, $fromBranch ); } =head2 DeleteBranchTransferLimits