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 117-123
BEGIN {
Link Here
|
117 |
|
118 |
|
118 |
&CheckReserves |
119 |
&CheckReserves |
119 |
&CanBookBeReserved |
120 |
&CanBookBeReserved |
120 |
&CanItemBeReserved |
121 |
&CanItemBeReserved |
121 |
&CancelReserve |
122 |
&CancelReserve |
122 |
&CancelExpiredReserves |
123 |
&CancelExpiredReserves |
123 |
|
124 |
|
Lines 131-136
BEGIN {
Link Here
|
131 |
&ReserveSlip |
132 |
&ReserveSlip |
132 |
&ToggleSuspend |
133 |
&ToggleSuspend |
133 |
&SuspendAll |
134 |
&SuspendAll |
|
|
135 |
&GetReservesControlBranch |
134 |
); |
136 |
); |
135 |
@EXPORT_OK = qw( MergeHolds ); |
137 |
@EXPORT_OK = qw( MergeHolds ); |
136 |
} |
138 |
} |
Lines 170-204
sub AddReserve {
Link Here
|
170 |
$waitingdate = $resdate; |
172 |
$waitingdate = $resdate; |
171 |
} |
173 |
} |
172 |
|
174 |
|
|
|
175 |
my $item = C4::Items::GetItem( $checkitem ); |
176 |
my $maxpickupdate = GetMaxPickupDate( undef, $item ); |
177 |
|
173 |
#eval { |
178 |
#eval { |
174 |
# updates take place here |
179 |
# updates take place here |
175 |
if ( $fee > 0 ) { |
180 |
if ( $fee > 0 ) { |
176 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
181 |
my $nextacctno = &getnextacctno( $borrowernumber ); |
177 |
my $query = qq/ |
182 |
my $query = q{ |
178 |
INSERT INTO accountlines |
183 |
INSERT INTO accountlines |
179 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
184 |
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding) |
180 |
VALUES |
185 |
VALUES |
181 |
(?,?,now(),?,?,'Res',?) |
186 |
(?,?,now(),?,?,'Res',?) |
182 |
/; |
187 |
}; |
183 |
my $usth = $dbh->prepare($query); |
188 |
my $usth = $dbh->prepare($query); |
184 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
189 |
$usth->execute( $borrowernumber, $nextacctno, $fee, |
185 |
"Reserve Charge - $title", $fee ); |
190 |
"Reserve Charge - $title", $fee ); |
186 |
} |
191 |
} |
187 |
|
192 |
|
188 |
#if ($const eq 'a'){ |
193 |
#if ($const eq 'a'){ |
189 |
my $query = qq/ |
194 |
my $query = q{ |
190 |
INSERT INTO reserves |
195 |
INSERT INTO reserves |
191 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
196 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
192 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate) |
197 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate,maxpickupdate) |
193 |
VALUES |
198 |
VALUES |
194 |
(?,?,?,?,?, |
199 |
(?,?,?,?,?, |
195 |
?,?,?,?,?,?) |
200 |
?,?,?,?,?,?,?) |
196 |
/; |
201 |
}; |
197 |
my $sth = $dbh->prepare($query); |
202 |
my $sth = $dbh->prepare($query); |
198 |
$sth->execute( |
203 |
$sth->execute( |
199 |
$borrowernumber, $biblionumber, $resdate, $branch, |
204 |
$borrowernumber, $biblionumber, $resdate, $branch, |
200 |
$const, $priority, $notes, $checkitem, |
205 |
$const, $priority, $notes, $checkitem, |
201 |
$found, $waitingdate, $expdate |
206 |
$found, $waitingdate, $expdate, $maxpickupdate |
202 |
); |
207 |
); |
203 |
|
208 |
|
204 |
# Send e-mail to librarian if syspref is active |
209 |
# Send e-mail to librarian if syspref is active |
Lines 527-532
sub CanItemBeReserved{
Link Here
|
527 |
|
532 |
|
528 |
return 1; |
533 |
return 1; |
529 |
} |
534 |
} |
|
|
535 |
|
536 |
=head2 GetMaxPickupDate |
537 |
|
538 |
$maxpickupdate = &GetMaxPickupDate($reserve [, $item]); |
539 |
$reserve->{waitingdate} is a string or a DateTime. |
540 |
|
541 |
this function returns the max pickup date (DateTime format). |
542 |
(e.g. : the date after which the hold will be considered cancelled) |
543 |
|
544 |
=cut |
545 |
|
546 |
sub GetMaxPickupDate { |
547 |
my ( $reserve, $item ) = @_; |
548 |
|
549 |
if ( not defined $reserve and not defined $item->{itemnumber} ) { |
550 |
warn "ERROR: GetMaxPickupDate is called without reserve and without itemnumber"; |
551 |
return; |
552 |
} |
553 |
|
554 |
if ( defined $reserve and not defined $item ) { |
555 |
$item = C4::Items::GetItem( $reserve->{itemnumber} ); |
556 |
} |
557 |
|
558 |
unless ( defined $reserve ) { |
559 |
my $reserve = GetReservesFromItemnumber( $item->{itemnumber} ); |
560 |
} |
561 |
return unless $reserve->{waitingdate}; |
562 |
|
563 |
my $borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} ); |
564 |
|
565 |
my $controlbranch = GetReservesControlBranch( $borrower, $item ); |
566 |
|
567 |
my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch ); |
568 |
|
569 |
my $date = ref $reserve->{waitingdate} eq 'DateTime' |
570 |
? $reserve->{waitingdate} |
571 |
: dt_from_string $reserve->{waitingdate}; |
572 |
|
573 |
my $holdspickupdelay = 0; |
574 |
if ( defined($issuingrule) |
575 |
and defined $issuingrule->{holdspickupdelay} ) { |
576 |
$holdspickupdelay = $issuingrule->{holdspickupdelay} |
577 |
} |
578 |
|
579 |
$date->add( days => $holdspickupdelay ); |
580 |
|
581 |
return $date; |
582 |
} |
583 |
|
584 |
=head2 GetReservesControlBranch |
585 |
|
586 |
$branchcode = &GetReservesControlBranch($borrower, $item) |
587 |
|
588 |
Returns the branchcode to consider to check hold rules against |
589 |
|
590 |
=cut |
591 |
|
592 |
sub GetReservesControlBranch { |
593 |
my ( $borrower, $item ) = @_; |
594 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
595 |
my $hbr = C4::Context->preference('HomeOrHoldingBranch') || "homebranch"; |
596 |
my $branchcode = "*"; |
597 |
if ( $controlbranch eq "ItemHomeLibrary" ) { |
598 |
$branchcode = $item->{$hbr}; |
599 |
} elsif ( $controlbranch eq "PatronLibrary" ) { |
600 |
$branchcode = $borrower->{branchcode}; |
601 |
} |
602 |
return $branchcode; |
603 |
} |
604 |
|
530 |
#-------------------------------------------------------------------------------- |
605 |
#-------------------------------------------------------------------------------- |
531 |
=head2 GetReserveCount |
606 |
=head2 GetReserveCount |
532 |
|
607 |
|
Lines 738-747
sub GetReservesToBranch {
Link Here
|
738 |
|
813 |
|
739 |
sub GetReservesForBranch { |
814 |
sub GetReservesForBranch { |
740 |
my ($frombranch) = @_; |
815 |
my ($frombranch) = @_; |
741 |
my $dbh = C4::Context->dbh; |
|
|
742 |
|
816 |
|
743 |
my $query = " |
817 |
my $dbh = C4::Context->dbh; |
744 |
SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate |
818 |
my $query = " |
|
|
819 |
SELECT reserve_id, borrowernumber, reservedate, itemnumber, waitingdate, maxpickupdate |
745 |
FROM reserves |
820 |
FROM reserves |
746 |
WHERE priority='0' |
821 |
WHERE priority='0' |
747 |
AND found='W' |
822 |
AND found='W' |
Lines 940-954
sub CancelExpiredReserves {
Link Here
|
940 |
while ( my $res = $sth->fetchrow_hashref() ) { |
1015 |
while ( my $res = $sth->fetchrow_hashref() ) { |
941 |
CancelReserve({ reserve_id => $res->{'reserve_id'} }); |
1016 |
CancelReserve({ reserve_id => $res->{'reserve_id'} }); |
942 |
} |
1017 |
} |
943 |
|
1018 |
|
944 |
# Cancel reserves that have been waiting too long |
1019 |
# Cancel reserves that have been waiting too long |
945 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
1020 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
946 |
my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); |
|
|
947 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
1021 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
948 |
|
1022 |
|
949 |
my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0"; |
1023 |
my $query = "SELECT * FROM reserves WHERE NOW() > maxpickupdate AND found = 'W' AND priority = 0"; |
950 |
$sth = $dbh->prepare( $query ); |
1024 |
$sth = $dbh->prepare( $query ); |
951 |
$sth->execute( $max_pickup_delay ); |
1025 |
$sth->execute(); |
952 |
|
1026 |
|
953 |
while (my $res = $sth->fetchrow_hashref ) { |
1027 |
while (my $res = $sth->fetchrow_hashref ) { |
954 |
if ( $charge ) { |
1028 |
if ( $charge ) { |
Lines 1215-1223
sub ModReserveStatus {
Link Here
|
1215 |
my ($itemnumber, $newstatus) = @_; |
1289 |
my ($itemnumber, $newstatus) = @_; |
1216 |
my $dbh = C4::Context->dbh; |
1290 |
my $dbh = C4::Context->dbh; |
1217 |
|
1291 |
|
1218 |
my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0"; |
1292 |
my $now = dt_from_string; |
|
|
1293 |
my $reserve = $dbh->selectrow_hashref(q{ |
1294 |
SELECT * |
1295 |
FROM reserves |
1296 |
WHERE itemnumber = ? |
1297 |
AND found IS NULL |
1298 |
AND priority = 0 |
1299 |
}, {}, $itemnumber); |
1300 |
return unless $reserve; |
1301 |
|
1302 |
my $maxpickupdate = GetMaxPickupDate( $reserve ); |
1303 |
my $query = q{ |
1304 |
UPDATE reserves |
1305 |
SET found = ?, |
1306 |
waitingdate = ?, |
1307 |
maxpickupdate = ? |
1308 |
WHERE itemnumber = ? |
1309 |
AND found IS NULL |
1310 |
AND priority = 0 |
1311 |
}; |
1219 |
my $sth_set = $dbh->prepare($query); |
1312 |
my $sth_set = $dbh->prepare($query); |
1220 |
$sth_set->execute( $newstatus, $itemnumber ); |
1313 |
$sth_set->execute( $newstatus, $now, $maxpickupdate, $itemnumber ); |
1221 |
|
1314 |
|
1222 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1315 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1223 |
CartToShelf( $itemnumber ); |
1316 |
CartToShelf( $itemnumber ); |
Lines 1265-1285
sub ModReserveAffect {
Link Here
|
1265 |
WHERE borrowernumber = ? |
1358 |
WHERE borrowernumber = ? |
1266 |
AND biblionumber = ? |
1359 |
AND biblionumber = ? |
1267 |
"; |
1360 |
"; |
|
|
1361 |
$sth = $dbh->prepare($query); |
1362 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1268 |
} |
1363 |
} |
1269 |
else { |
1364 |
else { |
1270 |
# affect the reserve to Waiting as well. |
1365 |
# affect the reserve to Waiting as well. |
|
|
1366 |
my $item = C4::Items::GetItem( $itemnumber ); |
1367 |
my $maxpickupdate = GetMaxPickupDate( undef, $item ); |
1271 |
$query = " |
1368 |
$query = " |
1272 |
UPDATE reserves |
1369 |
UPDATE reserves |
1273 |
SET priority = 0, |
1370 |
SET priority = 0, |
1274 |
found = 'W', |
1371 |
found = 'W', |
1275 |
waitingdate = NOW(), |
1372 |
waitingdate = NOW(), |
|
|
1373 |
maxpickupdate = ?, |
1276 |
itemnumber = ? |
1374 |
itemnumber = ? |
1277 |
WHERE borrowernumber = ? |
1375 |
WHERE borrowernumber = ? |
1278 |
AND biblionumber = ? |
1376 |
AND biblionumber = ? |
1279 |
"; |
1377 |
"; |
|
|
1378 |
$sth = $dbh->prepare($query); |
1379 |
$sth->execute( $maxpickupdate, $itemnumber, $borrowernumber,$biblionumber); |
1280 |
} |
1380 |
} |
1281 |
$sth = $dbh->prepare($query); |
|
|
1282 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1283 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1381 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1284 |
|
1382 |
|
1285 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1383 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
Lines 1355-1360
sub GetReserveInfo {
Link Here
|
1355 |
reserves.biblionumber, |
1453 |
reserves.biblionumber, |
1356 |
reserves.branchcode, |
1454 |
reserves.branchcode, |
1357 |
reserves.waitingdate, |
1455 |
reserves.waitingdate, |
|
|
1456 |
reserves.maxpickupdate, |
1358 |
notificationdate, |
1457 |
notificationdate, |
1359 |
reminderdate, |
1458 |
reminderdate, |
1360 |
priority, |
1459 |
priority, |
Lines 1791-1796
sub _Findgroupreserve {
Link Here
|
1791 |
reserves.borrowernumber AS borrowernumber, |
1890 |
reserves.borrowernumber AS borrowernumber, |
1792 |
reserves.reservedate AS reservedate, |
1891 |
reserves.reservedate AS reservedate, |
1793 |
reserves.waitingdate AS waitingdate, |
1892 |
reserves.waitingdate AS waitingdate, |
|
|
1893 |
reserves.maxpickupdate AS maxpickupdate, |
1794 |
reserves.branchcode AS branchcode, |
1894 |
reserves.branchcode AS branchcode, |
1795 |
reserves.cancellationdate AS cancellationdate, |
1895 |
reserves.cancellationdate AS cancellationdate, |
1796 |
reserves.found AS found, |
1896 |
reserves.found AS found, |
Lines 2109-2115
sub RevertWaitingStatus {
Link Here
|
2109 |
SET |
2209 |
SET |
2110 |
priority = 1, |
2210 |
priority = 1, |
2111 |
found = NULL, |
2211 |
found = NULL, |
2112 |
waitingdate = NULL |
2212 |
waitingdate = NULL, |
|
|
2213 |
maxpickupdate = NULL, |
2113 |
WHERE |
2214 |
WHERE |
2114 |
reserve_id = ? |
2215 |
reserve_id = ? |
2115 |
"; |
2216 |
"; |