|
Lines 459-465
sub CanItemBeReserved{
Link Here
|
| 459 |
my $dbh = C4::Context->dbh; |
459 |
my $dbh = C4::Context->dbh; |
| 460 |
my $ruleitemtype; # itemtype of the matching issuing rule |
460 |
my $ruleitemtype; # itemtype of the matching issuing rule |
| 461 |
my $allowedreserves = 0; |
461 |
my $allowedreserves = 0; |
| 462 |
|
462 |
|
| 463 |
# we retrieve borrowers and items informations # |
463 |
# we retrieve borrowers and items informations # |
| 464 |
# item->{itype} will come for biblioitems if necessery |
464 |
# item->{itype} will come for biblioitems if necessery |
| 465 |
my $item = GetItem($itemnumber); |
465 |
my $item = GetItem($itemnumber); |
|
Lines 495-502
sub CanItemBeReserved{
Link Here
|
| 495 |
LEFT JOIN borrowers USING (borrowernumber) |
495 |
LEFT JOIN borrowers USING (borrowernumber) |
| 496 |
WHERE borrowernumber = ? |
496 |
WHERE borrowernumber = ? |
| 497 |
"; |
497 |
"; |
| 498 |
|
498 |
|
| 499 |
|
499 |
|
| 500 |
my $branchcode = ""; |
500 |
my $branchcode = ""; |
| 501 |
my $branchfield = "reserves.branchcode"; |
501 |
my $branchfield = "reserves.branchcode"; |
| 502 |
|
502 |
|
|
Lines 507-518
sub CanItemBeReserved{
Link Here
|
| 507 |
$branchfield = "borrowers.branchcode"; |
507 |
$branchfield = "borrowers.branchcode"; |
| 508 |
$branchcode = $borrower->{branchcode}; |
508 |
$branchcode = $borrower->{branchcode}; |
| 509 |
} |
509 |
} |
| 510 |
|
510 |
|
| 511 |
# we retrieve rights |
511 |
# we retrieve rights |
| 512 |
$sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode); |
512 |
$sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode); |
| 513 |
if(my $rights = $sth->fetchrow_hashref()){ |
513 |
if(my $rights = $sth->fetchrow_hashref()){ |
| 514 |
$ruleitemtype = $rights->{itemtype}; |
514 |
$ruleitemtype = $rights->{itemtype}; |
| 515 |
$allowedreserves = $rights->{reservesallowed}; |
515 |
$allowedreserves = $rights->{reservesallowed}; |
| 516 |
}else{ |
516 |
}else{ |
| 517 |
$ruleitemtype = '*'; |
517 |
$ruleitemtype = '*'; |
| 518 |
} |
518 |
} |
|
Lines 520-526
sub CanItemBeReserved{
Link Here
|
| 520 |
# we retrieve count |
520 |
# we retrieve count |
| 521 |
|
521 |
|
| 522 |
$querycount .= "AND $branchfield = ?"; |
522 |
$querycount .= "AND $branchfield = ?"; |
| 523 |
|
523 |
|
| 524 |
# If using item-level itypes, fall back to the record |
524 |
# If using item-level itypes, fall back to the record |
| 525 |
# level itemtype if the hold has no associated item |
525 |
# level itemtype if the hold has no associated item |
| 526 |
$querycount .= |
526 |
$querycount .= |
|
Lines 530-536
sub CanItemBeReserved{
Link Here
|
| 530 |
if ( $ruleitemtype ne "*" ); |
530 |
if ( $ruleitemtype ne "*" ); |
| 531 |
|
531 |
|
| 532 |
my $sthcount = $dbh->prepare($querycount); |
532 |
my $sthcount = $dbh->prepare($querycount); |
| 533 |
|
533 |
|
| 534 |
if($ruleitemtype eq "*"){ |
534 |
if($ruleitemtype eq "*"){ |
| 535 |
$sthcount->execute($borrowernumber, $branchcode); |
535 |
$sthcount->execute($borrowernumber, $branchcode); |
| 536 |
}else{ |
536 |
}else{ |
|
Lines 744-751
sub GetReservesToBranch {
Link Here
|
| 744 |
my $dbh = C4::Context->dbh; |
744 |
my $dbh = C4::Context->dbh; |
| 745 |
my $sth = $dbh->prepare( |
745 |
my $sth = $dbh->prepare( |
| 746 |
"SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp |
746 |
"SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp |
| 747 |
FROM reserves |
747 |
FROM reserves |
| 748 |
WHERE priority='0' |
748 |
WHERE priority='0' |
| 749 |
AND branchcode=?" |
749 |
AND branchcode=?" |
| 750 |
); |
750 |
); |
| 751 |
$sth->execute( $frombranch ); |
751 |
$sth->execute( $frombranch ); |
|
Lines 770-776
sub GetReservesForBranch {
Link Here
|
| 770 |
|
770 |
|
| 771 |
my $query = " |
771 |
my $query = " |
| 772 |
SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate |
772 |
SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate |
| 773 |
FROM reserves |
773 |
FROM reserves |
| 774 |
WHERE priority='0' |
774 |
WHERE priority='0' |
| 775 |
AND found='W' |
775 |
AND found='W' |
| 776 |
"; |
776 |
"; |
|
Lines 1025-1031
sub CancelExpiredReserves {
Link Here
|
| 1025 |
} |
1025 |
} |
| 1026 |
|
1026 |
|
| 1027 |
if ( $do_cancel ) { |
1027 |
if ( $do_cancel ) { |
| 1028 |
CancelReserve({ reserve_id => $res->{'reserve_id'}, charge_cancel_fee => 1 }); |
1028 |
CancelReserve( |
|
|
1029 |
{ |
| 1030 |
reserve_id => $res->{'reserve_id'}, |
| 1031 |
autofill => C4::Context->preference('ExpireReservesAutoFill'), |
| 1032 |
charge_cancel_fee => 1, |
| 1033 |
} |
| 1034 |
); |
| 1029 |
} |
1035 |
} |
| 1030 |
} |
1036 |
} |
| 1031 |
} |
1037 |
} |
|
Lines 1050-1056
sub AutoUnsuspendReserves {
Link Here
|
| 1050 |
|
1056 |
|
| 1051 |
=head2 CancelReserve |
1057 |
=head2 CancelReserve |
| 1052 |
|
1058 |
|
| 1053 |
CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, ] [ charge_cancel_fee => 1 ] }); |
1059 |
CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, charge_cancel_fee => 1, autofill => $autofill ] }); |
| 1054 |
|
1060 |
|
| 1055 |
Cancels a reserve. If C<charge_cancel_fee> is passed and the C<ExpireReservesMaxPickUpDelayCharge> syspref is set, charge that fee to the patron's account. |
1061 |
Cancels a reserve. If C<charge_cancel_fee> is passed and the C<ExpireReservesMaxPickUpDelayCharge> syspref is set, charge that fee to the patron's account. |
| 1056 |
|
1062 |
|
|
Lines 1060-1069
sub CancelReserve {
Link Here
|
| 1060 |
my ( $params ) = @_; |
1066 |
my ( $params ) = @_; |
| 1061 |
|
1067 |
|
| 1062 |
my $reserve_id = $params->{'reserve_id'}; |
1068 |
my $reserve_id = $params->{'reserve_id'}; |
|
|
1069 |
my $autofill = $params->{autofill}; |
| 1070 |
|
| 1063 |
# Filter out only the desired keys; this will insert undefined values for elements missing in |
1071 |
# Filter out only the desired keys; this will insert undefined values for elements missing in |
| 1064 |
# \%params, but GetReserveId filters them out anyway. |
1072 |
# \%params, but GetReserveId filters them out anyway. |
| 1065 |
$reserve_id = GetReserveId( { biblionumber => $params->{'biblionumber'}, borrowernumber => $params->{'borrowernumber'}, itemnumber => $params->{'itemnumber'} } ) unless ( $reserve_id ); |
1073 |
$reserve_id = GetReserveId( { biblionumber => $params->{'biblionumber'}, borrowernumber => $params->{'borrowernumber'}, itemnumber => $params->{'itemnumber'} } ) unless ( $reserve_id ); |
| 1066 |
|
1074 |
|
|
|
1075 |
|
| 1067 |
return unless ( $reserve_id ); |
1076 |
return unless ( $reserve_id ); |
| 1068 |
|
1077 |
|
| 1069 |
my $dbh = C4::Context->dbh; |
1078 |
my $dbh = C4::Context->dbh; |
|
Lines 1103-1108
sub CancelReserve {
Link Here
|
| 1103 |
if ( $charge && $params->{'charge_cancel_fee'} ) { |
1112 |
if ( $charge && $params->{'charge_cancel_fee'} ) { |
| 1104 |
manualinvoice($reserve->{'borrowernumber'}, $reserve->{'itemnumber'}, '', 'HE', $charge); |
1113 |
manualinvoice($reserve->{'borrowernumber'}, $reserve->{'itemnumber'}, '', 'HE', $charge); |
| 1105 |
} |
1114 |
} |
|
|
1115 |
|
| 1116 |
# only attempt to autofill canceled holds that were found and waiting |
| 1117 |
if ( $autofill && $reserve->{itemnumber} && $reserve->{found} && $reserve->{found} eq 'W' ) { |
| 1118 |
my ( undef, $next_hold ) = CheckReserves( $reserve->{'itemnumber'} ); |
| 1119 |
if ($next_hold) { |
| 1120 |
my $is_transfer = $reserve->{branchcode} ne $next_hold->{branchcode}; |
| 1121 |
|
| 1122 |
ModReserveAffect( |
| 1123 |
{ |
| 1124 |
itemnumber => $reserve->{itemnumber}, |
| 1125 |
borrowernumber => $next_hold->{borrowernumber}, |
| 1126 |
is_transfer => $is_transfer, |
| 1127 |
notify_library => 1, |
| 1128 |
} |
| 1129 |
); |
| 1130 |
|
| 1131 |
ModItemTransfer( $reserve->{itemnumber}, $reserve->{branchcode}, $next_hold->{branchcode} ) |
| 1132 |
if $is_transfer; |
| 1133 |
} |
| 1134 |
} |
| 1106 |
} |
1135 |
} |
| 1107 |
|
1136 |
|
| 1108 |
return $reserve; |
1137 |
return $reserve; |
|
Lines 1303-1309
take care of the waiting status
Link Here
|
| 1303 |
=cut |
1332 |
=cut |
| 1304 |
|
1333 |
|
| 1305 |
sub ModReserveAffect { |
1334 |
sub ModReserveAffect { |
| 1306 |
my ( $itemnumber, $borrowernumber,$transferToDo ) = @_; |
1335 |
my ( $params ) = @_; |
|
|
1336 |
|
| 1337 |
my $itemnumber = $params->{itemnumber}; |
| 1338 |
my $borrowernumber = $params->{borrowernumber}; |
| 1339 |
my $transferToDo = $params->{is_transfer}; |
| 1340 |
my $notify_library = $params->{notify_library}; |
| 1341 |
|
| 1307 |
my $dbh = C4::Context->dbh; |
1342 |
my $dbh = C4::Context->dbh; |
| 1308 |
|
1343 |
|
| 1309 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
1344 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
|
Lines 1348-1355
sub ModReserveAffect {
Link Here
|
| 1348 |
} |
1383 |
} |
| 1349 |
$sth = $dbh->prepare($query); |
1384 |
$sth = $dbh->prepare($query); |
| 1350 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1385 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
| 1351 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1386 |
|
|
|
1387 |
_koha_notify_reserve( |
| 1388 |
{ |
| 1389 |
itemnumber => $itemnumber, |
| 1390 |
borrowernumber => $borrowernumber, |
| 1391 |
biblionumber => $biblionumber, |
| 1392 |
notify_library => $notify_library, |
| 1393 |
} |
| 1394 |
) if ( !$transferToDo && !$already_on_shelf ); |
| 1395 |
|
| 1352 |
_FixPriority( { biblionumber => $biblionumber } ); |
1396 |
_FixPriority( { biblionumber => $biblionumber } ); |
|
|
1397 |
|
| 1353 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1398 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
| 1354 |
CartToShelf( $itemnumber ); |
1399 |
CartToShelf( $itemnumber ); |
| 1355 |
} |
1400 |
} |
|
Lines 1394-1400
sub ModReserveMinusPriority {
Link Here
|
| 1394 |
my $dbh = C4::Context->dbh; |
1439 |
my $dbh = C4::Context->dbh; |
| 1395 |
my $query = " |
1440 |
my $query = " |
| 1396 |
UPDATE reserves |
1441 |
UPDATE reserves |
| 1397 |
SET priority = 0 , itemnumber = ? |
1442 |
SET priority = 0 , itemnumber = ? |
| 1398 |
WHERE reserve_id = ? |
1443 |
WHERE reserve_id = ? |
| 1399 |
"; |
1444 |
"; |
| 1400 |
my $sth_upd = $dbh->prepare($query); |
1445 |
my $sth_upd = $dbh->prepare($query); |
|
Lines 1631-1637
sub ToggleLowestPriority {
Link Here
|
| 1631 |
|
1676 |
|
| 1632 |
my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?"); |
1677 |
my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?"); |
| 1633 |
$sth->execute( $reserve_id ); |
1678 |
$sth->execute( $reserve_id ); |
| 1634 |
|
1679 |
|
| 1635 |
_FixPriority({ reserve_id => $reserve_id, rank => '999999' }); |
1680 |
_FixPriority({ reserve_id => $reserve_id, rank => '999999' }); |
| 1636 |
} |
1681 |
} |
| 1637 |
|
1682 |
|
|
Lines 1815-1821
sub _FixPriority {
Link Here
|
| 1815 |
$priority[$j]->{'reserve_id'} |
1860 |
$priority[$j]->{'reserve_id'} |
| 1816 |
); |
1861 |
); |
| 1817 |
} |
1862 |
} |
| 1818 |
|
1863 |
|
| 1819 |
$sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" ); |
1864 |
$sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" ); |
| 1820 |
$sth->execute(); |
1865 |
$sth->execute(); |
| 1821 |
|
1866 |
|
|
Lines 1953-1959
sub _Findgroupreserve {
Link Here
|
| 1953 |
|
1998 |
|
| 1954 |
=head2 _koha_notify_reserve |
1999 |
=head2 _koha_notify_reserve |
| 1955 |
|
2000 |
|
| 1956 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ); |
2001 |
_koha_notify_reserve( |
|
|
2002 |
{ |
| 2003 |
itemnumber => $itemnumber, |
| 2004 |
borrowernumber => $borrowernumber, |
| 2005 |
biblionumber => $biblionumber, |
| 2006 |
notify_library => $notify_library |
| 2007 |
} |
| 2008 |
); |
| 1957 |
|
2009 |
|
| 1958 |
Sends a notification to the patron that their hold has been filled (through |
2010 |
Sends a notification to the patron that their hold has been filled (through |
| 1959 |
ModReserveAffect, _not_ ModReserveFill) |
2011 |
ModReserveAffect, _not_ ModReserveFill) |
|
Lines 1980-1986
The following tables are availalbe witin the notice:
Link Here
|
| 1980 |
=cut |
2032 |
=cut |
| 1981 |
|
2033 |
|
| 1982 |
sub _koha_notify_reserve { |
2034 |
sub _koha_notify_reserve { |
| 1983 |
my ($itemnumber, $borrowernumber, $biblionumber) = @_; |
2035 |
my ( $params ) = @_; |
|
|
2036 |
|
| 2037 |
my $itemnumber = $params->{itemnumber}; |
| 2038 |
my $borrowernumber = $params->{borrowernumber}; |
| 2039 |
my $biblionumber = $params->{biblionumber}; |
| 2040 |
my $notify_library = $params->{notify_library}; |
| 1984 |
|
2041 |
|
| 1985 |
my $dbh = C4::Context->dbh; |
2042 |
my $dbh = C4::Context->dbh; |
| 1986 |
my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber); |
2043 |
my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber); |
|
Lines 2031-2042
sub _koha_notify_reserve {
Link Here
|
| 2031 |
return; |
2088 |
return; |
| 2032 |
} |
2089 |
} |
| 2033 |
|
2090 |
|
| 2034 |
C4::Letters::EnqueueLetter( { |
2091 |
C4::Letters::EnqueueLetter( |
| 2035 |
letter => $letter, |
2092 |
{ |
| 2036 |
borrowernumber => $borrowernumber, |
2093 |
letter => $letter, |
| 2037 |
from_address => $admin_email_address, |
2094 |
borrowernumber => $borrowernumber, |
| 2038 |
message_transport_type => $mtt, |
2095 |
from_address => $admin_email_address, |
| 2039 |
} ); |
2096 |
message_transport_type => $mtt, |
|
|
2097 |
} |
| 2098 |
); |
| 2040 |
}; |
2099 |
}; |
| 2041 |
|
2100 |
|
| 2042 |
while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) { |
2101 |
while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) { |
|
Lines 2053-2059
sub _koha_notify_reserve {
Link Here
|
| 2053 |
if (! $notification_sent) { |
2112 |
if (! $notification_sent) { |
| 2054 |
&$send_notification('print', 'HOLD'); |
2113 |
&$send_notification('print', 'HOLD'); |
| 2055 |
} |
2114 |
} |
| 2056 |
|
2115 |
|
|
|
2116 |
if ($notify_library) { |
| 2117 |
my $letter = C4::Letters::GetPreparedLetter( |
| 2118 |
module => 'reserves', |
| 2119 |
letter_code => 'HOLD_CHANGED', |
| 2120 |
branchcode => $reserve->{branchcode}, |
| 2121 |
substitute => { today => C4::Dates->new()->output() }, |
| 2122 |
tables => { |
| 2123 |
'branches' => $branch_details, |
| 2124 |
'borrowers' => $borrower, |
| 2125 |
'biblio' => $biblionumber, |
| 2126 |
'reserves' => $reserve, |
| 2127 |
'items' => $reserve->{'itemnumber'}, |
| 2128 |
}, |
| 2129 |
); |
| 2130 |
|
| 2131 |
my $email = |
| 2132 |
C4::Context->preference('ExpireReservesAutoFillEmail') |
| 2133 |
|| $branch_details->{'branchemail'} |
| 2134 |
|| C4::Context->preference('KohaAdminEmailAddress'); |
| 2135 |
|
| 2136 |
C4::Letters::EnqueueLetter( |
| 2137 |
{ |
| 2138 |
letter => $letter, |
| 2139 |
borrowernumber => $borrowernumber, |
| 2140 |
message_transport_type => 'email', |
| 2141 |
from_address => $email, |
| 2142 |
to_address => $email, |
| 2143 |
} |
| 2144 |
); |
| 2145 |
} |
| 2057 |
} |
2146 |
} |
| 2058 |
|
2147 |
|
| 2059 |
=head2 _ShiftPriorityByDateAndPriority |
2148 |
=head2 _ShiftPriorityByDateAndPriority |