&GetReservesToBranch
&GetReserveCount
&GetReserveFee
- &GetReserveInfo
+ &GetReserveInfo
&GetReserveStatus
&GetOtherReserves
&AlterPriority
&ToggleLowestPriority
+
+ &ReserveSlip
);
@EXPORT_OK = qw( MergeHolds );
}
# Send e-mail to librarian if syspref is active
if(C4::Context->preference("emailLibrarianWhenHoldIsPlaced")){
my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
- my $biblio = GetBiblioData($biblionumber);
- my $letter = C4::Letters::getletter( 'reserves', 'HOLDPLACED');
- my $branchcode = $borrower->{branchcode};
- my $branch_details = C4::Branch::GetBranchDetail($branchcode);
- my $admin_email_address =$branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
-
- my %keys = (%$borrower, %$biblio);
- foreach my $key (keys %keys) {
- my $replacefield = "<<$key>>";
- $letter->{content} =~ s/$replacefield/$keys{$key}/g;
- $letter->{title} =~ s/$replacefield/$keys{$key}/g;
+ my $branch_details = C4::Branch::GetBranchDetail($borrower->{branchcode});
+ if ( my $letter = C4::Letters::GetPreparedLetter (
+ module => 'reserves',
+ letter_code => 'HOLDPLACED',
+ branchcode => $branch,
+ tables => {
+ 'branches' => $branch_details,
+ 'borrowers' => $borrower,
+ 'biblio' => $biblionumber,
+ },
+ ) ) {
+
+ my $admin_email_address =$branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
+
+ C4::Letters::EnqueueLetter(
+ { letter => $letter,
+ borrowernumber => $borrowernumber,
+ message_transport_type => 'email',
+ from_address => $admin_email_address,
+ to_address => $admin_email_address,
+ }
+ );
}
-
- C4::Letters::EnqueueLetter(
- { letter => $letter,
- borrowernumber => $borrowernumber,
- message_transport_type => 'email',
- from_address => $admin_email_address,
- to_address => $admin_email_address,
- }
- );
-
-
}
-
#}
($const eq "o" || $const eq "e") or return; # FIXME: why not have a useful return value?
$query = qq/
sub CancelExpiredReserves {
+ # Cancel reserves that have passed their expiration date.
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare( "
SELECT * FROM reserves WHERE DATE(expirationdate) < DATE( CURDATE() )
AND expirationdate IS NOT NULL
+ AND found IS NULL
" );
$sth->execute();
CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} );
}
+ # Cancel reserves that have been waiting too long
+ if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) {
+ my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay");
+ my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge");
+
+ my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0";
+ $sth = $dbh->prepare( $query );
+ $sth->execute( $max_pickup_delay );
+
+ while (my $res = $sth->fetchrow_hashref ) {
+ if ( $charge ) {
+ manualinvoice($res->{'borrowernumber'}, $res->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
+ }
+
+ CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} );
+ }
+ }
+
}
=head2 CancelReserve
Cancels a reserve.
Use either C<$biblionumber> or C<$itemnumber> to specify the item to
-cancel, but not both: if both are given, C<&CancelReserve> does
-nothing.
+cancel, but not both: if both are given, C<&CancelReserve> uses
+C<$itemnumber>.
C<$borrowernumber> is the borrower number of the patron on whose
behalf the book was reserved.
#first : check if we have a reservation for this item .
my ($itemnumber, $newstatus) = @_;
- my $dbh = C4::Context->dbh;
- my $query = " UPDATE reserves
- SET found=?,waitingdate = now()
- WHERE itemnumber=?
- AND found IS NULL
- AND priority = 0
- ";
+ my $dbh = C4::Context->dbh;
+
+ my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0";
my $sth_set = $dbh->prepare($query);
$sth_set->execute( $newstatus, $itemnumber );
}
else {
# affect the reserve to Waiting as well.
- $query = "
- UPDATE reserves
- SET priority = 0,
- found = 'W',
- waitingdate=now(),
- itemnumber = ?
- WHERE borrowernumber = ?
- AND biblionumber = ?
- ";
+ $query = "
+ UPDATE reserves
+ SET priority = 0,
+ found = 'W',
+ waitingdate = NOW(),
+ itemnumber = ?
+ WHERE borrowernumber = ?
+ AND biblionumber = ?
+ ";
}
$sth = $dbh->prepare($query);
$sth->execute( $itemnumber, $borrowernumber,$biblionumber);
my $admin_email_address = $branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
- my $letter = getletter( 'reserves', $letter_code );
- die "Could not find a letter called '$letter_code' in the 'reserves' module" unless( $letter );
+ my $letter = C4::Letters::GetPreparedLetter (
+ module => 'reserves',
+ letter_code => $letter_code,
+ branchcode => $reserve->{branchcode},
+ tables => {
+ 'branches' => $branch_details,
+ 'borrowers' => $borrower,
+ 'biblio' => $biblionumber,
+ 'reserves' => $reserve,
+ 'items', $reserve->{'itemnumber'},
+ },
+ substitute => { today => C4::Dates->new()->output() },
+ ) or die "Could not find a letter called '$letter_code' in the 'reserves' module";
- C4::Letters::parseletter( $letter, 'branches', $reserve->{'branchcode'} );
- C4::Letters::parseletter( $letter, 'borrowers', $borrowernumber );
- C4::Letters::parseletter( $letter, 'biblio', $biblionumber );
- C4::Letters::parseletter( $letter, 'reserves', $borrowernumber, $biblionumber );
- if ( $reserve->{'itemnumber'} ) {
- C4::Letters::parseletter( $letter, 'items', $reserve->{'itemnumber'} );
- }
- my $today = C4::Dates->new()->output();
- $letter->{'title'} =~ s/<<today>>/$today/g;
- $letter->{'content'} =~ s/<<today>>/$today/g;
- $letter->{'content'} =~ s/<<[a-z0-9_]+\.[a-z0-9]+>>//g; #remove any stragglers
if ( $print_mode ) {
C4::Letters::EnqueueLetter( {
}
}
+=head2 ReserveSlip
+
+ ReserveSlip($branchcode, $borrowernumber, $biblionumber)
+
+ Returns letter hash ( see C4::Letters::GetPreparedLetter ) or undef
+
+=cut
+
+sub ReserveSlip {
+ my ($branch, $borrowernumber, $biblionumber) = @_;
+
+# return unless ( C4::Context->boolean_preference('printreserveslips') );
+
+ my $reserve = GetReserveInfo($borrowernumber,$biblionumber )
+ or return;
+
+ return C4::Letters::GetPreparedLetter (
+ module => 'circulation',
+ letter_code => 'RESERVESLIP',
+ branchcode => $branch,
+ tables => {
+ 'reserves' => $reserve,
+ 'branches' => $reserve->{branchcode},
+ 'borrowers' => $reserve,
+ 'biblio' => $reserve,
+ 'items' => $reserve,
+ },
+ );
+}
=head1 AUTHOR