Lines 131-138
BEGIN {
Link Here
|
131 |
&ReserveSlip |
131 |
&ReserveSlip |
132 |
&ToggleSuspend |
132 |
&ToggleSuspend |
133 |
&SuspendAll |
133 |
&SuspendAll |
134 |
&GetMaxPickupDelay |
|
|
135 |
&GetMaxPickupDate |
136 |
&GetReservesControlBranch |
134 |
&GetReservesControlBranch |
137 |
); |
135 |
); |
138 |
@EXPORT_OK = qw( MergeHolds ); |
136 |
@EXPORT_OK = qw( MergeHolds ); |
Lines 173-207
sub AddReserve {
Link Here
|
173 |
$waitingdate = $resdate; |
171 |
$waitingdate = $resdate; |
174 |
} |
172 |
} |
175 |
|
173 |
|
|
|
174 |
my $maxpickupdate = GetMaxPickupDate({ |
175 |
waitingdate => $waitingdate, |
176 |
itemnumber => $checkitem, |
177 |
borrowernumber => $borrowernumber |
178 |
}); |
179 |
|
176 |
#eval { |
180 |
#eval { |
177 |
# updates take place here |
181 |
# updates take place here |
178 |
if ( $fee > 0 ) { |
182 |
if ( $fee > 0 ) { |
179 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
183 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
180 |
my $query = qq/ |
184 |
my $query = q{ |
181 |
INSERT INTO accountlines |
185 |
INSERT INTO accountlines |
182 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
186 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
183 |
VALUES |
187 |
VALUES |
184 |
(?,?,now(),?,?,'Res',?) |
188 |
(?,?,now(),?,?,'Res',?) |
185 |
/; |
189 |
}; |
186 |
my $usth = $dbh->prepare($query); |
190 |
my $usth = $dbh->prepare($query); |
187 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
191 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
188 |
"Reserve Charge - $title", $fee ); |
192 |
"Reserve Charge - $title", $fee ); |
189 |
} |
193 |
} |
190 |
|
194 |
|
191 |
#if ($const eq 'a'){ |
195 |
#if ($const eq 'a'){ |
192 |
my $query = qq/ |
196 |
my $query = q{ |
193 |
INSERT INTO reserves |
197 |
INSERT INTO reserves |
194 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
198 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
195 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate) |
199 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate,maxpickupdate) |
196 |
VALUES |
200 |
VALUES |
197 |
(?,?,?,?,?, |
201 |
(?,?,?,?,?, |
198 |
?,?,?,?,?,?) |
202 |
?,?,?,?,?,?,?) |
199 |
/; |
203 |
}; |
200 |
my $sth = $dbh->prepare($query); |
204 |
my $sth = $dbh->prepare($query); |
201 |
$sth->execute( |
205 |
$sth->execute( |
202 |
$borrowernumber, $biblionumber, $resdate, $branch, |
206 |
$borrowernumber, $biblionumber, $resdate, $branch, |
203 |
$const, $priority, $notes, $checkitem, |
207 |
$const, $priority, $notes, $checkitem, |
204 |
$found, $waitingdate, $expdate |
208 |
$found, $waitingdate, $expdate, $maxpickupdate |
205 |
); |
209 |
); |
206 |
|
210 |
|
207 |
# Send e-mail to librarian if syspref is active |
211 |
# Send e-mail to librarian if syspref is active |
Lines 502-555
sub CanItemBeReserved{
Link Here
|
502 |
} |
506 |
} |
503 |
} |
507 |
} |
504 |
|
508 |
|
505 |
=item GetMaxPickupDelay |
509 |
=item GetMaxPickupDate |
506 |
|
510 |
|
507 |
$resallowed = &GetMaxPickupDelay($borrowernumber, $item) |
511 |
$maxpickupdate = &GetMaxPickupDate($reserve [, $item]); |
|
|
512 |
$reserve->{waitingdate} is a string or a DateTime. |
508 |
|
513 |
|
509 |
this function return the max delay for an hold |
514 |
this function returns the max pickup date (DateTime format). |
|
|
515 |
(e.g. : the date after which the hold will be considered cancelled) |
510 |
|
516 |
|
511 |
=cut |
517 |
=cut |
512 |
|
518 |
|
513 |
sub GetMaxPickupDelay { |
519 |
sub GetMaxPickupDate { |
514 |
my ( $borrowernumber, $item ) = @_; |
520 |
my ( $reserve, $item ) = @_; |
515 |
|
|
|
516 |
my $dbh = C4::Context->dbh; |
517 |
my $allowedreserves = 0; |
518 |
|
519 |
my $borrower = C4::Members::GetMember( 'borrowernumber' => $borrowernumber ); |
520 |
|
521 |
my $controlbranch = GetReservesControlBranch( $borrower, $item ); |
522 |
|
521 |
|
523 |
my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch ); |
522 |
if ( not defined $reserve and not defined $item->{itemnumber} ) { |
|
|
523 |
warn "ERROR: GetMaxPickupDate is called without reserve and without itemnumber"; |
524 |
return; |
525 |
} |
524 |
|
526 |
|
525 |
return $issuingrule->{holdspickupdelay} |
527 |
if ( defined $reserve and not defined $item ) { |
526 |
if defined($issuingrule) |
528 |
$item = C4::Items::GetItem( $reserve->{itemnumber} ); |
527 |
and defined $issuingrule->{holdspickupdelay}; |
529 |
} |
528 |
|
530 |
|
529 |
# if nothing found, return the syspref value |
531 |
unless ( defined $reserve ) { |
530 |
return C4::Context->preference("ReservesMaxPickUpDelay") || 0; |
532 |
my $reserve = GetReservesFromItemnumber( $item->{itemnumber} ); |
531 |
} |
533 |
} |
|
|
534 |
return unless $reserve->{waitingdate}; |
532 |
|
535 |
|
533 |
=item GetMaxPickupDate |
536 |
my $borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} ); |
534 |
|
537 |
|
535 |
$maxpickupdate = &GetMaxPickupDate($item, $borrowernumber); |
538 |
my $controlbranch = GetReservesControlBranch( $borrower, $item ); |
536 |
$item->{waitingdate} is a string or a DateTime. |
|
|
537 |
|
539 |
|
538 |
this function returns the max pickup date (DateTime format). |
540 |
my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch ); |
539 |
(e.g. : the date after which the hold will be considered cancelled) |
|
|
540 |
|
541 |
|
541 |
=cut |
542 |
my $date = ref $reserve->{waitingdate} eq 'DateTime' |
|
|
543 |
? $reserve->{waitingdate} |
544 |
: dt_from_string $reserve->{waitingdate}; |
542 |
|
545 |
|
543 |
sub GetMaxPickupDate { |
546 |
my $holdspickupdelay = 0; |
544 |
my ( $item, $borrowernumber ) = @_; |
547 |
if ( defined($issuingrule) |
545 |
return unless $item->{waitingdate}; |
548 |
and defined $issuingrule->{holdspickupdelay} ) { |
|
|
549 |
$holdspickupdelay = $issuingrule->{holdspickupdelay} |
550 |
} |
546 |
|
551 |
|
547 |
my $date = ref $item->{waitingdate} eq 'DateTime' |
552 |
$date->add( days => $holdspickupdelay ); |
548 |
? $item->{waitingdate} |
|
|
549 |
: dt_from_string $item->{waitingdate}; |
550 |
|
553 |
|
551 |
my $delay = GetMaxPickupDelay( $borrowernumber, $item ); |
|
|
552 |
$date->add( days => $delay ); |
553 |
return $date; |
554 |
return $date; |
554 |
} |
555 |
} |
555 |
|
556 |
|
Lines 788-794
sub GetReservesToBranch {
Link Here
|
788 |
sub GetReservesForBranch { |
789 |
sub GetReservesForBranch { |
789 |
my ($frombranch) = @_; |
790 |
my ($frombranch) = @_; |
790 |
my $dbh = C4::Context->dbh; |
791 |
my $dbh = C4::Context->dbh; |
791 |
my $query = "SELECT borrowernumber,reservedate,itemnumber,waitingdate |
792 |
my $query = "SELECT borrowernumber,reservedate,itemnumber,waitingdate,maxpickupdate |
792 |
FROM reserves |
793 |
FROM reserves |
793 |
WHERE priority='0' |
794 |
WHERE priority='0' |
794 |
AND found='W' "; |
795 |
AND found='W' "; |
Lines 961-975
sub CancelExpiredReserves {
Link Here
|
961 |
} |
962 |
} |
962 |
|
963 |
|
963 |
# Cancel reserves that have been waiting too long |
964 |
# Cancel reserves that have been waiting too long |
964 |
# FIXME The only way I see to do this job with the issuingrules.holdspickupdelay value would be to |
|
|
965 |
# get all reserves and to get the related borrower and item. So we could call GetMaxPickupDelay for each reserve. |
966 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
965 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
967 |
my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); |
|
|
968 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
966 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
969 |
|
967 |
|
970 |
my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0"; |
968 |
my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > maxpickupdate AND found = 'W' AND priority = 0"; |
971 |
$sth = $dbh->prepare( $query ); |
969 |
$sth = $dbh->prepare( $query ); |
972 |
$sth->execute( $max_pickup_delay ); |
970 |
$sth->execute(); |
973 |
|
971 |
|
974 |
while (my $res = $sth->fetchrow_hashref ) { |
972 |
while (my $res = $sth->fetchrow_hashref ) { |
975 |
if ( $charge ) { |
973 |
if ( $charge ) { |
Lines 1276-1284
sub ModReserveStatus {
Link Here
|
1276 |
my ($itemnumber, $newstatus) = @_; |
1274 |
my ($itemnumber, $newstatus) = @_; |
1277 |
my $dbh = C4::Context->dbh; |
1275 |
my $dbh = C4::Context->dbh; |
1278 |
|
1276 |
|
1279 |
my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0"; |
1277 |
my $now = dt_from_string; |
|
|
1278 |
my $reserve = $dbh->selectrow_hashref(q{ |
1279 |
SELECT * |
1280 |
FROM reserves |
1281 |
WHERE itemnumber = ? |
1282 |
AND found IS NULL |
1283 |
AND priority = 0 |
1284 |
}); |
1285 |
return unless $reserve; |
1286 |
|
1287 |
my $maxpickupdate = GetMaxPickupDate( $reserve ); |
1288 |
my $query = q{ |
1289 |
UPDATE reserves |
1290 |
SET found = ?, |
1291 |
waitingdate = ?, |
1292 |
maxpickupdate = ? |
1293 |
WHERE itemnumber = ? |
1294 |
AND found IS NULL |
1295 |
AND priority = 0 |
1296 |
}; |
1280 |
my $sth_set = $dbh->prepare($query); |
1297 |
my $sth_set = $dbh->prepare($query); |
1281 |
$sth_set->execute( $newstatus, $itemnumber ); |
1298 |
$sth_set->execute( $newstatus, $itemnumber, $now, $maxpickupdate ); |
1282 |
|
1299 |
|
1283 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1300 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1284 |
CartToShelf( $itemnumber ); |
1301 |
CartToShelf( $itemnumber ); |
Lines 1326-1346
sub ModReserveAffect {
Link Here
|
1326 |
WHERE borrowernumber = ? |
1343 |
WHERE borrowernumber = ? |
1327 |
AND biblionumber = ? |
1344 |
AND biblionumber = ? |
1328 |
"; |
1345 |
"; |
|
|
1346 |
$sth = $dbh->prepare($query); |
1347 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1329 |
} |
1348 |
} |
1330 |
else { |
1349 |
else { |
1331 |
# affect the reserve to Waiting as well. |
1350 |
# affect the reserve to Waiting as well. |
|
|
1351 |
my $maxpickupdate = GetMaxPickupDate({ |
1352 |
waitingdate => dt_from_string, |
1353 |
itemnumber => $itemnumber, |
1354 |
borrowernumber => $borrowernumber |
1355 |
}); |
1332 |
$query = " |
1356 |
$query = " |
1333 |
UPDATE reserves |
1357 |
UPDATE reserves |
1334 |
SET priority = 0, |
1358 |
SET priority = 0, |
1335 |
found = 'W', |
1359 |
found = 'W', |
1336 |
waitingdate = NOW(), |
1360 |
waitingdate = NOW(), |
|
|
1361 |
maxpickupdate = ?, |
1337 |
itemnumber = ? |
1362 |
itemnumber = ? |
1338 |
WHERE borrowernumber = ? |
1363 |
WHERE borrowernumber = ? |
1339 |
AND biblionumber = ? |
1364 |
AND biblionumber = ? |
1340 |
"; |
1365 |
"; |
|
|
1366 |
$sth = $dbh->prepare($query); |
1367 |
$sth->execute( $maxpickupdate, $itemnumber, $borrowernumber,$biblionumber); |
1341 |
} |
1368 |
} |
1342 |
$sth = $dbh->prepare($query); |
|
|
1343 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1344 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1369 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1345 |
|
1370 |
|
1346 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1371 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
Lines 1416-1421
sub GetReserveInfo {
Link Here
|
1416 |
reserves.biblionumber, |
1441 |
reserves.biblionumber, |
1417 |
reserves.branchcode, |
1442 |
reserves.branchcode, |
1418 |
reserves.waitingdate, |
1443 |
reserves.waitingdate, |
|
|
1444 |
reserves.maxpickupdate, |
1419 |
notificationdate, |
1445 |
notificationdate, |
1420 |
reminderdate, |
1446 |
reminderdate, |
1421 |
priority, |
1447 |
priority, |
Lines 1870-1875
sub _Findgroupreserve {
Link Here
|
1870 |
reserves.borrowernumber AS borrowernumber, |
1896 |
reserves.borrowernumber AS borrowernumber, |
1871 |
reserves.reservedate AS reservedate, |
1897 |
reserves.reservedate AS reservedate, |
1872 |
reserves.waitingdate AS waitingdate, |
1898 |
reserves.waitingdate AS waitingdate, |
|
|
1899 |
reserves.maxpickupdate AS maxpickupdate, |
1873 |
reserves.branchcode AS branchcode, |
1900 |
reserves.branchcode AS branchcode, |
1874 |
reserves.cancellationdate AS cancellationdate, |
1901 |
reserves.cancellationdate AS cancellationdate, |
1875 |
reserves.found AS found, |
1902 |
reserves.found AS found, |
Lines 2192-2198
sub RevertWaitingStatus {
Link Here
|
2192 |
SET |
2219 |
SET |
2193 |
priority = 1, |
2220 |
priority = 1, |
2194 |
found = NULL, |
2221 |
found = NULL, |
2195 |
waitingdate = NULL |
2222 |
waitingdate = NULL, |
|
|
2223 |
maxpickupdate = NULL |
2196 |
WHERE |
2224 |
WHERE |
2197 |
reserve_id = ? |
2225 |
reserve_id = ? |
2198 |
"; |
2226 |
"; |