Lines 23-28
package C4::Reserves;
Link Here
|
23 |
|
23 |
|
24 |
use strict; |
24 |
use strict; |
25 |
#use warnings; FIXME - Bug 2505 |
25 |
#use warnings; FIXME - Bug 2505 |
|
|
26 |
use Date::Calc qw( Add_Delta_Days ); |
26 |
use C4::Context; |
27 |
use C4::Context; |
27 |
use C4::Biblio; |
28 |
use C4::Biblio; |
28 |
use C4::Members; |
29 |
use C4::Members; |
Lines 116-122
BEGIN {
Link Here
|
116 |
|
117 |
|
117 |
&CheckReserves |
118 |
&CheckReserves |
118 |
&CanBookBeReserved |
119 |
&CanBookBeReserved |
119 |
&CanItemBeReserved |
120 |
&CanItemBeReserved |
120 |
&CancelReserve |
121 |
&CancelReserve |
121 |
&CancelExpiredReserves |
122 |
&CancelExpiredReserves |
122 |
|
123 |
|
Lines 130-135
BEGIN {
Link Here
|
130 |
&ReserveSlip |
131 |
&ReserveSlip |
131 |
&ToggleSuspend |
132 |
&ToggleSuspend |
132 |
&SuspendAll |
133 |
&SuspendAll |
|
|
134 |
&GetReservesControlBranch |
133 |
); |
135 |
); |
134 |
@EXPORT_OK = qw( MergeHolds ); |
136 |
@EXPORT_OK = qw( MergeHolds ); |
135 |
} |
137 |
} |
Lines 169-203
sub AddReserve {
Link Here
|
169 |
$waitingdate = $resdate; |
171 |
$waitingdate = $resdate; |
170 |
} |
172 |
} |
171 |
|
173 |
|
|
|
174 |
my $item = C4::Items::GetItem( $checkitem ); |
175 |
my $maxpickupdate = GetMaxPickupDate( undef, $item ); |
176 |
|
172 |
#eval { |
177 |
#eval { |
173 |
# updates take place here |
178 |
# updates take place here |
174 |
if ( $fee > 0 ) { |
179 |
if ( $fee > 0 ) { |
175 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
180 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
176 |
my $query = qq/ |
181 |
my $query = q{ |
177 |
INSERT INTO accountlines |
182 |
INSERT INTO accountlines |
178 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
183 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
179 |
VALUES |
184 |
VALUES |
180 |
(?,?,now(),?,?,'Res',?) |
185 |
(?,?,now(),?,?,'Res',?) |
181 |
/; |
186 |
}; |
182 |
my $usth = $dbh->prepare($query); |
187 |
my $usth = $dbh->prepare($query); |
183 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
188 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
184 |
"Reserve Charge - $title", $fee ); |
189 |
"Reserve Charge - $title", $fee ); |
185 |
} |
190 |
} |
186 |
|
191 |
|
187 |
#if ($const eq 'a'){ |
192 |
#if ($const eq 'a'){ |
188 |
my $query = qq/ |
193 |
my $query = q{ |
189 |
INSERT INTO reserves |
194 |
INSERT INTO reserves |
190 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
195 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
191 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate) |
196 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate,maxpickupdate) |
192 |
VALUES |
197 |
VALUES |
193 |
(?,?,?,?,?, |
198 |
(?,?,?,?,?, |
194 |
?,?,?,?,?,?) |
199 |
?,?,?,?,?,?,?) |
195 |
/; |
200 |
}; |
196 |
my $sth = $dbh->prepare($query); |
201 |
my $sth = $dbh->prepare($query); |
197 |
$sth->execute( |
202 |
$sth->execute( |
198 |
$borrowernumber, $biblionumber, $resdate, $branch, |
203 |
$borrowernumber, $biblionumber, $resdate, $branch, |
199 |
$const, $priority, $notes, $checkitem, |
204 |
$const, $priority, $notes, $checkitem, |
200 |
$found, $waitingdate, $expdate |
205 |
$found, $waitingdate, $expdate, $maxpickupdate |
201 |
); |
206 |
); |
202 |
|
207 |
|
203 |
# Send e-mail to librarian if syspref is active |
208 |
# Send e-mail to librarian if syspref is active |
Lines 497-502
sub CanItemBeReserved{
Link Here
|
497 |
return 0; |
502 |
return 0; |
498 |
} |
503 |
} |
499 |
} |
504 |
} |
|
|
505 |
|
506 |
=head2 GetMaxPickupDate |
507 |
|
508 |
$maxpickupdate = &GetMaxPickupDate($reserve [, $item]); |
509 |
$reserve->{waitingdate} is a string or a DateTime. |
510 |
|
511 |
this function returns the max pickup date (DateTime format). |
512 |
(e.g. : the date after which the hold will be considered cancelled) |
513 |
|
514 |
=cut |
515 |
|
516 |
sub GetMaxPickupDate { |
517 |
my ( $reserve, $item ) = @_; |
518 |
|
519 |
if ( not defined $reserve and not defined $item->{itemnumber} ) { |
520 |
warn "ERROR: GetMaxPickupDate is called without reserve and without itemnumber"; |
521 |
return; |
522 |
} |
523 |
|
524 |
if ( defined $reserve and not defined $item ) { |
525 |
$item = C4::Items::GetItem( $reserve->{itemnumber} ); |
526 |
} |
527 |
|
528 |
unless ( defined $reserve ) { |
529 |
my $reserve = GetReservesFromItemnumber( $item->{itemnumber} ); |
530 |
} |
531 |
return unless $reserve->{waitingdate}; |
532 |
|
533 |
my $borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} ); |
534 |
|
535 |
my $controlbranch = GetReservesControlBranch( $borrower, $item ); |
536 |
|
537 |
my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch ); |
538 |
|
539 |
my $date = ref $reserve->{waitingdate} eq 'DateTime' |
540 |
? $reserve->{waitingdate} |
541 |
: dt_from_string $reserve->{waitingdate}; |
542 |
|
543 |
my $holdspickupdelay = 0; |
544 |
if ( defined($issuingrule) |
545 |
and defined $issuingrule->{holdspickupdelay} ) { |
546 |
$holdspickupdelay = $issuingrule->{holdspickupdelay} |
547 |
} |
548 |
|
549 |
$date->add( days => $holdspickupdelay ); |
550 |
|
551 |
return $date; |
552 |
} |
553 |
|
554 |
=head2 GetReservesControlBranch |
555 |
|
556 |
$branchcode = &GetReservesControlBranch($borrower, $item) |
557 |
|
558 |
Returns the branchcode to consider to check hold rules against |
559 |
|
560 |
=cut |
561 |
|
562 |
sub GetReservesControlBranch { |
563 |
my ( $borrower, $item ) = @_; |
564 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
565 |
my $hbr = C4::Context->preference('HomeOrHoldingBranch') || "homebranch"; |
566 |
my $branchcode = "*"; |
567 |
if ( $controlbranch eq "ItemHomeLibrary" ) { |
568 |
$branchcode = $item->{$hbr}; |
569 |
} elsif ( $controlbranch eq "PatronLibrary" ) { |
570 |
$branchcode = $borrower->{branchcode}; |
571 |
} |
572 |
return $branchcode; |
573 |
} |
574 |
|
500 |
#-------------------------------------------------------------------------------- |
575 |
#-------------------------------------------------------------------------------- |
501 |
=head2 GetReserveCount |
576 |
=head2 GetReserveCount |
502 |
|
577 |
|
Lines 711-717
sub GetReservesToBranch {
Link Here
|
711 |
sub GetReservesForBranch { |
786 |
sub GetReservesForBranch { |
712 |
my ($frombranch) = @_; |
787 |
my ($frombranch) = @_; |
713 |
my $dbh = C4::Context->dbh; |
788 |
my $dbh = C4::Context->dbh; |
714 |
my $query = "SELECT borrowernumber,reservedate,itemnumber,waitingdate |
789 |
my $query = "SELECT borrowernumber,reservedate,itemnumber,waitingdate,maxpickupdate |
715 |
FROM reserves |
790 |
FROM reserves |
716 |
WHERE priority='0' |
791 |
WHERE priority='0' |
717 |
AND found='W' "; |
792 |
AND found='W' "; |
Lines 906-920
sub CancelExpiredReserves {
Link Here
|
906 |
while ( my $res = $sth->fetchrow_hashref() ) { |
981 |
while ( my $res = $sth->fetchrow_hashref() ) { |
907 |
CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} ); |
982 |
CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} ); |
908 |
} |
983 |
} |
909 |
|
984 |
|
910 |
# Cancel reserves that have been waiting too long |
985 |
# Cancel reserves that have been waiting too long |
911 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
986 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
912 |
my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); |
|
|
913 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
987 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
914 |
|
988 |
|
915 |
my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0"; |
989 |
my $query = "SELECT * FROM reserves WHERE NOW() > maxpickupdate AND found = 'W' AND priority = 0"; |
916 |
$sth = $dbh->prepare( $query ); |
990 |
$sth = $dbh->prepare( $query ); |
917 |
$sth->execute( $max_pickup_delay ); |
991 |
$sth->execute(); |
918 |
|
992 |
|
919 |
while (my $res = $sth->fetchrow_hashref ) { |
993 |
while (my $res = $sth->fetchrow_hashref ) { |
920 |
if ( $charge ) { |
994 |
if ( $charge ) { |
Lines 1221-1229
sub ModReserveStatus {
Link Here
|
1221 |
my ($itemnumber, $newstatus) = @_; |
1295 |
my ($itemnumber, $newstatus) = @_; |
1222 |
my $dbh = C4::Context->dbh; |
1296 |
my $dbh = C4::Context->dbh; |
1223 |
|
1297 |
|
1224 |
my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0"; |
1298 |
my $now = dt_from_string; |
|
|
1299 |
my $reserve = $dbh->selectrow_hashref(q{ |
1300 |
SELECT * |
1301 |
FROM reserves |
1302 |
WHERE itemnumber = ? |
1303 |
AND found IS NULL |
1304 |
AND priority = 0 |
1305 |
}, {}, $itemnumber); |
1306 |
return unless $reserve; |
1307 |
|
1308 |
my $maxpickupdate = GetMaxPickupDate( $reserve ); |
1309 |
my $query = q{ |
1310 |
UPDATE reserves |
1311 |
SET found = ?, |
1312 |
waitingdate = ?, |
1313 |
maxpickupdate = ? |
1314 |
WHERE itemnumber = ? |
1315 |
AND found IS NULL |
1316 |
AND priority = 0 |
1317 |
}; |
1225 |
my $sth_set = $dbh->prepare($query); |
1318 |
my $sth_set = $dbh->prepare($query); |
1226 |
$sth_set->execute( $newstatus, $itemnumber ); |
1319 |
$sth_set->execute( $newstatus, $now, $maxpickupdate, $itemnumber ); |
1227 |
|
1320 |
|
1228 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1321 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1229 |
CartToShelf( $itemnumber ); |
1322 |
CartToShelf( $itemnumber ); |
Lines 1271-1291
sub ModReserveAffect {
Link Here
|
1271 |
WHERE borrowernumber = ? |
1364 |
WHERE borrowernumber = ? |
1272 |
AND biblionumber = ? |
1365 |
AND biblionumber = ? |
1273 |
"; |
1366 |
"; |
|
|
1367 |
$sth = $dbh->prepare($query); |
1368 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1274 |
} |
1369 |
} |
1275 |
else { |
1370 |
else { |
1276 |
# affect the reserve to Waiting as well. |
1371 |
# affect the reserve to Waiting as well. |
|
|
1372 |
my $item = C4::Items::GetItem( $itemnumber ); |
1373 |
my $maxpickupdate = GetMaxPickupDate( undef, $item ); |
1277 |
$query = " |
1374 |
$query = " |
1278 |
UPDATE reserves |
1375 |
UPDATE reserves |
1279 |
SET priority = 0, |
1376 |
SET priority = 0, |
1280 |
found = 'W', |
1377 |
found = 'W', |
1281 |
waitingdate = NOW(), |
1378 |
waitingdate = NOW(), |
|
|
1379 |
maxpickupdate = ?, |
1282 |
itemnumber = ? |
1380 |
itemnumber = ? |
1283 |
WHERE borrowernumber = ? |
1381 |
WHERE borrowernumber = ? |
1284 |
AND biblionumber = ? |
1382 |
AND biblionumber = ? |
1285 |
"; |
1383 |
"; |
|
|
1384 |
$sth = $dbh->prepare($query); |
1385 |
$sth->execute( $maxpickupdate, $itemnumber, $borrowernumber,$biblionumber); |
1286 |
} |
1386 |
} |
1287 |
$sth = $dbh->prepare($query); |
|
|
1288 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1289 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1387 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1290 |
|
1388 |
|
1291 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1389 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
Lines 1361-1366
sub GetReserveInfo {
Link Here
|
1361 |
reserves.biblionumber, |
1459 |
reserves.biblionumber, |
1362 |
reserves.branchcode, |
1460 |
reserves.branchcode, |
1363 |
reserves.waitingdate, |
1461 |
reserves.waitingdate, |
|
|
1462 |
reserves.maxpickupdate, |
1364 |
notificationdate, |
1463 |
notificationdate, |
1365 |
reminderdate, |
1464 |
reminderdate, |
1366 |
priority, |
1465 |
priority, |
Lines 1815-1820
sub _Findgroupreserve {
Link Here
|
1815 |
reserves.borrowernumber AS borrowernumber, |
1914 |
reserves.borrowernumber AS borrowernumber, |
1816 |
reserves.reservedate AS reservedate, |
1915 |
reserves.reservedate AS reservedate, |
1817 |
reserves.waitingdate AS waitingdate, |
1916 |
reserves.waitingdate AS waitingdate, |
|
|
1917 |
reserves.maxpickupdate AS maxpickupdate, |
1818 |
reserves.branchcode AS branchcode, |
1918 |
reserves.branchcode AS branchcode, |
1819 |
reserves.cancellationdate AS cancellationdate, |
1919 |
reserves.cancellationdate AS cancellationdate, |
1820 |
reserves.found AS found, |
1920 |
reserves.found AS found, |
Lines 2130-2136
sub RevertWaitingStatus {
Link Here
|
2130 |
SET |
2230 |
SET |
2131 |
priority = 1, |
2231 |
priority = 1, |
2132 |
found = NULL, |
2232 |
found = NULL, |
2133 |
waitingdate = NULL |
2233 |
waitingdate = NULL, |
|
|
2234 |
maxpickupdate = NULL, |
2134 |
WHERE |
2235 |
WHERE |
2135 |
reserve_id = ? |
2236 |
reserve_id = ? |
2136 |
"; |
2237 |
"; |