|
Lines 175-180
sub AddReserve {
Link Here
|
| 175 |
$waitingdate = $resdate; |
175 |
$waitingdate = $resdate; |
| 176 |
} |
176 |
} |
| 177 |
|
177 |
|
|
|
178 |
my $item = C4::Items::GetItem( $checkitem ); |
| 179 |
my $lastpickupdate = GetLastPickupDate( undef, $item ); |
| 180 |
|
| 178 |
#eval { |
181 |
#eval { |
| 179 |
# updates take place here |
182 |
# updates take place here |
| 180 |
if ( $fee > 0 ) { |
183 |
if ( $fee > 0 ) { |
|
Lines 194-209
sub AddReserve {
Link Here
|
| 194 |
my $query = qq/ |
197 |
my $query = qq/ |
| 195 |
INSERT INTO reserves |
198 |
INSERT INTO reserves |
| 196 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
199 |
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype, |
| 197 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate) |
200 |
priority,reservenotes,itemnumber,found,waitingdate,expirationdate,lastpickupdate) |
| 198 |
VALUES |
201 |
VALUES |
| 199 |
(?,?,?,?,?, |
202 |
(?,?,?,?,?, |
| 200 |
?,?,?,?,?,?) |
203 |
?,?,?,?,?,?,?) |
| 201 |
/; |
204 |
/; |
| 202 |
my $sth = $dbh->prepare($query); |
205 |
my $sth = $dbh->prepare($query); |
| 203 |
$sth->execute( |
206 |
$sth->execute( |
| 204 |
$borrowernumber, $biblionumber, $resdate, $branch, |
207 |
$borrowernumber, $biblionumber, $resdate, $branch, |
| 205 |
$const, $priority, $notes, $checkitem, |
208 |
$const, $priority, $notes, $checkitem, |
| 206 |
$found, $waitingdate, $expdate |
209 |
$found, $waitingdate, $expdate, $lastpickupdate |
| 207 |
); |
210 |
); |
| 208 |
|
211 |
|
| 209 |
# Send e-mail to librarian if syspref is active |
212 |
# Send e-mail to librarian if syspref is active |
|
Lines 806-815
sub GetReservesToBranch {
Link Here
|
| 806 |
|
809 |
|
| 807 |
sub GetReservesForBranch { |
810 |
sub GetReservesForBranch { |
| 808 |
my ($frombranch) = @_; |
811 |
my ($frombranch) = @_; |
| 809 |
my $dbh = C4::Context->dbh; |
|
|
| 810 |
|
812 |
|
| 811 |
my $query = " |
813 |
my $dbh = C4::Context->dbh; |
| 812 |
SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate |
814 |
my $query = " |
|
|
815 |
SELECT reserve_id, borrowernumber, reservedate, itemnumber, waitingdate, lastpickupdate |
| 813 |
FROM reserves |
816 |
FROM reserves |
| 814 |
WHERE priority='0' |
817 |
WHERE priority='0' |
| 815 |
AND found='W' |
818 |
AND found='W' |
|
Lines 874-879
sub GetReserveStatus {
Link Here
|
| 874 |
return ''; # empty string here will remove need for checking undef, or less log lines |
877 |
return ''; # empty string here will remove need for checking undef, or less log lines |
| 875 |
} |
878 |
} |
| 876 |
|
879 |
|
|
|
880 |
=head2 GetLastPickupDate |
| 881 |
|
| 882 |
my $lastpickupdate = GetLastPickupDate($reserve, $item); |
| 883 |
my $lastpickupdate = GetLastPickupDate($reserve, $item, $borrower); |
| 884 |
my $lastpickupdate = GetLastPickupDate(undef, $item); |
| 885 |
|
| 886 |
Gets the last pickup date from the issuingrules for the given reserves-row and sets the |
| 887 |
$reserve->{lastpickupdate}.-value. |
| 888 |
If the reserves-row is not passed, function tries to figure it out from the item-row. |
| 889 |
|
| 890 |
Calculating the last pickup date respects Calendar holidays and skips to the next open day. |
| 891 |
|
| 892 |
@PARAM1 koha.reserves-row |
| 893 |
@PARAM2 koha.items-row, If the reserve is not given, an item must be given to be |
| 894 |
able to find a reservation |
| 895 |
@PARAM3 koha.borrowers-row, OPTIONAL |
| 896 |
RETURNS DateTime, depicting the last pickup date. |
| 897 |
=cut |
| 898 |
|
| 899 |
sub GetLastPickupDate { |
| 900 |
my ($reserve, $item, $borrower) = @_; |
| 901 |
|
| 902 |
##Verify parameters |
| 903 |
if ( not defined $reserve and not defined $item ) { |
| 904 |
warn "C4::Reserves::GetMaxPickupDate(), is called without a reserve and a item"; |
| 905 |
return; |
| 906 |
} |
| 907 |
if ( defined $reserve and not defined $item ) { |
| 908 |
$item = C4::Items::GetItem( $reserve->{itemnumber} ); |
| 909 |
} |
| 910 |
unless ( defined $reserve ) { |
| 911 |
my $reserve = GetReservesFromItemnumber( $item->{itemnumber} ); |
| 912 |
} |
| 913 |
|
| 914 |
my $date = $reserve->{waitingdate}; |
| 915 |
unless ( $date ) { #It is possible that a reserve is just caught and it doesn't have a waitingdate yet. |
| 916 |
$date = DateTime->now( time_zone => C4::Context->tz() ); #So default to NOW() |
| 917 |
} |
| 918 |
else { |
| 919 |
$date = (ref $reserve->{waitingdate} eq 'DateTime') ? $reserve->{waitingdate} : dt_from_string($reserve->{waitingdate}); |
| 920 |
} |
| 921 |
$borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} ) unless $borrower; |
| 922 |
|
| 923 |
##Get churning the LastPickupDate |
| 924 |
my $controlbranch = GetReservesControlBranch( $item, $borrower ); |
| 925 |
|
| 926 |
my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch ); |
| 927 |
|
| 928 |
my $holdspickupwait = 0; |
| 929 |
if ( defined($issuingrule) |
| 930 |
and defined $issuingrule->{holdspickupwait} ) { |
| 931 |
$holdspickupwait = $issuingrule->{holdspickupwait} |
| 932 |
} |
| 933 |
$date->add( days => $holdspickupwait ); |
| 934 |
|
| 935 |
my $calendar = Koha::Calendar->new( branchcode => $reserve->{'branchcode'} ); |
| 936 |
my $is_holiday = $calendar->is_holiday( $date ); |
| 937 |
|
| 938 |
while ( $is_holiday ) { |
| 939 |
$date->add( days => 1 ); |
| 940 |
$is_holiday = $calendar->is_holiday( $date ); |
| 941 |
} |
| 942 |
|
| 943 |
$reserve->{lastpickupdate} = $date->ymd(); |
| 944 |
return $date; |
| 945 |
} |
| 946 |
=head2 GetReservesControlBranch |
| 947 |
|
| 948 |
$branchcode = &GetReservesControlBranch($borrower, $item) |
| 949 |
|
| 950 |
Returns the branchcode to consider to check hold rules against |
| 951 |
|
| 952 |
=cut |
| 953 |
|
| 954 |
sub GetReservesControlBranch { |
| 955 |
my ( $borrower, $item ) = @_; |
| 956 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
| 957 |
my $hbr = C4::Context->preference('HomeOrHoldingBranch') || "homebranch"; |
| 958 |
my $branchcode = "*"; |
| 959 |
if ( $controlbranch eq "ItemHomeLibrary" ) { |
| 960 |
$branchcode = $item->{$hbr}; |
| 961 |
} elsif ( $controlbranch eq "PatronLibrary" ) { |
| 962 |
$branchcode = $borrower->{branchcode}; |
| 963 |
} |
| 964 |
return $branchcode; |
| 965 |
} |
| 966 |
|
| 877 |
=head2 CheckReserves |
967 |
=head2 CheckReserves |
| 878 |
|
968 |
|
| 879 |
($status, $reserve, $all_reserves) = &CheckReserves($itemnumber); |
969 |
($status, $reserve, $all_reserves) = &CheckReserves($itemnumber); |
|
Lines 1018-1032
sub CancelExpiredReserves {
Link Here
|
| 1018 |
|
1108 |
|
| 1019 |
# Cancel reserves that have been waiting too long |
1109 |
# Cancel reserves that have been waiting too long |
| 1020 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
1110 |
if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { |
| 1021 |
my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); |
|
|
| 1022 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
1111 |
my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); |
| 1023 |
my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); |
1112 |
my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); |
| 1024 |
|
1113 |
|
| 1025 |
my $today = dt_from_string(); |
1114 |
my $today = dt_from_string(); |
| 1026 |
|
1115 |
|
| 1027 |
my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0"; |
1116 |
my $query = "SELECT * FROM reserves WHERE NOW() > lastpickupdate AND found = 'W' AND priority = 0"; |
| 1028 |
$sth = $dbh->prepare( $query ); |
1117 |
$sth = $dbh->prepare( $query ); |
| 1029 |
$sth->execute( $max_pickup_delay ); |
1118 |
$sth->execute(); |
| 1030 |
|
1119 |
|
| 1031 |
while ( my $res = $sth->fetchrow_hashref ) { |
1120 |
while ( my $res = $sth->fetchrow_hashref ) { |
| 1032 |
my $do_cancel = 1; |
1121 |
my $do_cancel = 1; |
|
Lines 1284-1292
sub ModReserveStatus {
Link Here
|
| 1284 |
my ($itemnumber, $newstatus) = @_; |
1373 |
my ($itemnumber, $newstatus) = @_; |
| 1285 |
my $dbh = C4::Context->dbh; |
1374 |
my $dbh = C4::Context->dbh; |
| 1286 |
|
1375 |
|
| 1287 |
my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0"; |
1376 |
my $now = dt_from_string; |
|
|
1377 |
my $reserve = $dbh->selectrow_hashref(q{ |
| 1378 |
SELECT * |
| 1379 |
FROM reserves |
| 1380 |
WHERE itemnumber = ? |
| 1381 |
AND found IS NULL |
| 1382 |
AND priority = 0 |
| 1383 |
}, {}, $itemnumber); |
| 1384 |
return unless $reserve; |
| 1385 |
|
| 1386 |
my $lastpickupdate = GetLastPickupDate( $reserve ); |
| 1387 |
my $query = q{ |
| 1388 |
UPDATE reserves |
| 1389 |
SET found = ?, |
| 1390 |
waitingdate = ?, |
| 1391 |
maxpickupdate = ? |
| 1392 |
WHERE itemnumber = ? |
| 1393 |
AND found IS NULL |
| 1394 |
AND priority = 0 |
| 1395 |
}; |
| 1288 |
my $sth_set = $dbh->prepare($query); |
1396 |
my $sth_set = $dbh->prepare($query); |
| 1289 |
$sth_set->execute( $newstatus, $itemnumber ); |
1397 |
$sth_set->execute( $newstatus, $now, $lastpickupdate, $itemnumber ); |
| 1290 |
|
1398 |
|
| 1291 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
1399 |
if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) { |
| 1292 |
CartToShelf( $itemnumber ); |
1400 |
CartToShelf( $itemnumber ); |
|
Lines 1331-1359
sub ModReserveAffect {
Link Here
|
| 1331 |
# If we affect a reserve that has to be transfered, don't set to Waiting |
1439 |
# If we affect a reserve that has to be transfered, don't set to Waiting |
| 1332 |
my $query; |
1440 |
my $query; |
| 1333 |
if ($transferToDo) { |
1441 |
if ($transferToDo) { |
| 1334 |
$query = " |
1442 |
$query = " |
| 1335 |
UPDATE reserves |
1443 |
UPDATE reserves |
| 1336 |
SET priority = 0, |
1444 |
SET priority = 0, |
| 1337 |
itemnumber = ?, |
1445 |
itemnumber = ?, |
| 1338 |
found = 'T' |
1446 |
found = 'T' |
| 1339 |
WHERE borrowernumber = ? |
1447 |
WHERE borrowernumber = ? |
| 1340 |
AND biblionumber = ? |
1448 |
AND biblionumber = ? |
| 1341 |
"; |
1449 |
"; |
|
|
1450 |
$sth = $dbh->prepare($query); |
| 1451 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
| 1342 |
} |
1452 |
} |
| 1343 |
else { |
1453 |
else { |
| 1344 |
# affect the reserve to Waiting as well. |
1454 |
# affect the reserve to Waiting as well. |
|
|
1455 |
my $item = C4::Items::GetItem( $itemnumber ); |
| 1456 |
my $lastpickupdate = GetLastPickupDate( $request, $item ); |
| 1345 |
$query = " |
1457 |
$query = " |
| 1346 |
UPDATE reserves |
1458 |
UPDATE reserves |
| 1347 |
SET priority = 0, |
1459 |
SET priority = 0, |
| 1348 |
found = 'W', |
1460 |
found = 'W', |
| 1349 |
waitingdate = NOW(), |
1461 |
waitingdate = NOW(), |
|
|
1462 |
lastpickupdate = ?, |
| 1350 |
itemnumber = ? |
1463 |
itemnumber = ? |
| 1351 |
WHERE borrowernumber = ? |
1464 |
WHERE borrowernumber = ? |
| 1352 |
AND biblionumber = ? |
1465 |
AND biblionumber = ? |
| 1353 |
"; |
1466 |
"; |
|
|
1467 |
$sth = $dbh->prepare($query); |
| 1468 |
$sth->execute( $lastpickupdate, $itemnumber, $borrowernumber,$biblionumber); |
| 1354 |
} |
1469 |
} |
| 1355 |
$sth = $dbh->prepare($query); |
|
|
| 1356 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
| 1357 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1470 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
| 1358 |
_FixPriority( { biblionumber => $biblionumber } ); |
1471 |
_FixPriority( { biblionumber => $biblionumber } ); |
| 1359 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1472 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
|
Lines 1429-1434
sub GetReserveInfo {
Link Here
|
| 1429 |
reserves.biblionumber, |
1542 |
reserves.biblionumber, |
| 1430 |
reserves.branchcode, |
1543 |
reserves.branchcode, |
| 1431 |
reserves.waitingdate, |
1544 |
reserves.waitingdate, |
|
|
1545 |
reserves.lastpickupdate, |
| 1432 |
notificationdate, |
1546 |
notificationdate, |
| 1433 |
reminderdate, |
1547 |
reminderdate, |
| 1434 |
priority, |
1548 |
priority, |
|
Lines 1840-1845
sub _Findgroupreserve {
Link Here
|
| 1840 |
reserves.borrowernumber AS borrowernumber, |
1954 |
reserves.borrowernumber AS borrowernumber, |
| 1841 |
reserves.reservedate AS reservedate, |
1955 |
reserves.reservedate AS reservedate, |
| 1842 |
reserves.branchcode AS branchcode, |
1956 |
reserves.branchcode AS branchcode, |
|
|
1957 |
reserves.lastpickupdate AS maxpickupdate, |
| 1843 |
reserves.cancellationdate AS cancellationdate, |
1958 |
reserves.cancellationdate AS cancellationdate, |
| 1844 |
reserves.found AS found, |
1959 |
reserves.found AS found, |
| 1845 |
reserves.reservenotes AS reservenotes, |
1960 |
reserves.reservenotes AS reservenotes, |
|
Lines 1872-1877
sub _Findgroupreserve {
Link Here
|
| 1872 |
reserves.borrowernumber AS borrowernumber, |
1987 |
reserves.borrowernumber AS borrowernumber, |
| 1873 |
reserves.reservedate AS reservedate, |
1988 |
reserves.reservedate AS reservedate, |
| 1874 |
reserves.branchcode AS branchcode, |
1989 |
reserves.branchcode AS branchcode, |
|
|
1990 |
reserves.lastpickupdate AS maxpickupdate, |
| 1875 |
reserves.cancellationdate AS cancellationdate, |
1991 |
reserves.cancellationdate AS cancellationdate, |
| 1876 |
reserves.found AS found, |
1992 |
reserves.found AS found, |
| 1877 |
reserves.reservenotes AS reservenotes, |
1993 |
reserves.reservenotes AS reservenotes, |
|
Lines 1904-1909
sub _Findgroupreserve {
Link Here
|
| 1904 |
reserves.reservedate AS reservedate, |
2020 |
reserves.reservedate AS reservedate, |
| 1905 |
reserves.waitingdate AS waitingdate, |
2021 |
reserves.waitingdate AS waitingdate, |
| 1906 |
reserves.branchcode AS branchcode, |
2022 |
reserves.branchcode AS branchcode, |
|
|
2023 |
reserves.lastpickupdate AS maxpickupdate, |
| 1907 |
reserves.cancellationdate AS cancellationdate, |
2024 |
reserves.cancellationdate AS cancellationdate, |
| 1908 |
reserves.found AS found, |
2025 |
reserves.found AS found, |
| 1909 |
reserves.reservenotes AS reservenotes, |
2026 |
reserves.reservenotes AS reservenotes, |
|
Lines 2117-2122
sub MoveReserve {
Link Here
|
| 2117 |
} |
2234 |
} |
| 2118 |
} |
2235 |
} |
| 2119 |
|
2236 |
|
|
|
2237 |
=head MoveWaitingdate |
| 2238 |
|
| 2239 |
#Move waitingdate two months and fifteen days forward. |
| 2240 |
my $dateDuration = DateTime::Duration->new( months => 2, days => 15 ); |
| 2241 |
$reserve = MoveWaitingdate( $reserve, $dateDuration); |
| 2242 |
|
| 2243 |
#Move waitingdate one year and eleven days backwards. |
| 2244 |
my $dateDuration = DateTime::Duration->new( years => -1, days => -11 ); |
| 2245 |
$reserve = MoveWaitingdate( $reserve, $dateDuration); |
| 2246 |
|
| 2247 |
Moves the waitingdate and updates the lastpickupdate to match. |
| 2248 |
Is intended to be used from automated tests, because under normal library |
| 2249 |
operations there should be NO REASON to move the waitingdate. |
| 2250 |
|
| 2251 |
@PARAM1 koha.reserves-row, with waitingdate set. |
| 2252 |
@PARAM2 DateTime::Duration, with the desired offset. |
| 2253 |
RETURNS koha.reserve-row, with keys waitingdate and lastpickupdate updated. |
| 2254 |
=cut |
| 2255 |
sub MoveWaitingdate { |
| 2256 |
my ($reserve, $dateDuration) = @_; |
| 2257 |
|
| 2258 |
my $dt = dt_from_string( $reserve->{waitingdate} ); |
| 2259 |
$dt->add_duration( $dateDuration ); |
| 2260 |
$reserve->{waitingdate} = $dateDuration->ymd(); |
| 2261 |
|
| 2262 |
GetLastPickupDate( $reserve ); #Update the $reserve->{lastpickupdate} |
| 2263 |
|
| 2264 |
return $reserve; |
| 2265 |
} |
| 2266 |
|
| 2120 |
=head2 MergeHolds |
2267 |
=head2 MergeHolds |
| 2121 |
|
2268 |
|
| 2122 |
MergeHolds($dbh,$to_biblio, $from_biblio); |
2269 |
MergeHolds($dbh,$to_biblio, $from_biblio); |
|
Lines 2213-2219
sub RevertWaitingStatus {
Link Here
|
| 2213 |
SET |
2360 |
SET |
| 2214 |
priority = 1, |
2361 |
priority = 1, |
| 2215 |
found = NULL, |
2362 |
found = NULL, |
| 2216 |
waitingdate = NULL |
2363 |
waitingdate = NULL, |
|
|
2364 |
lastpickupdate = NULL, |
| 2217 |
WHERE |
2365 |
WHERE |
| 2218 |
reserve_id = ? |
2366 |
reserve_id = ? |
| 2219 |
"; |
2367 |
"; |