|
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 |
"; |