Lines 147-169
BEGIN {
Link Here
|
147 |
|
147 |
|
148 |
=head2 AddReserve |
148 |
=head2 AddReserve |
149 |
|
149 |
|
150 |
AddReserve($branch,$borrowernumber,$biblionumber,$bibitems,$priority,$resdate,$expdate,$notes,$title,$checkitem,$found) |
150 |
AddReserve( |
|
|
151 |
$branch, $borrowernumber, $biblionumber, $bibitems, $priority, $resdate, |
152 |
$expdate, $notes, $title, $itemnumber, $found |
153 |
) |
151 |
|
154 |
|
152 |
=cut |
155 |
=cut |
153 |
|
156 |
|
154 |
sub AddReserve { |
157 |
sub AddReserve { |
155 |
my ( |
158 |
my ( |
156 |
$branch, $borrowernumber, $biblionumber, |
159 |
$branch, $borrowernumber, $biblionumber, $bibitems, $priority, $resdate, |
157 |
$bibitems, $priority, $resdate, $expdate, $notes, |
160 |
$expdate, $notes, $title, $itemnumber, $found |
158 |
$title, $checkitem, $found |
|
|
159 |
) = @_; |
161 |
) = @_; |
160 |
|
162 |
|
161 |
if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) { |
163 |
# Ensure the holds should be allowed |
162 |
carp("AddReserve: borrower $borrowernumber already has a hold for biblionumber $biblionumber"); |
164 |
my $can_reserve = |
|
|
165 |
$itemnumber |
166 |
? CanItemBeReserved( $borrowernumber, $itemnumber ) |
167 |
: CanBookBeReserved( $borrowernumber, $biblionumber ); |
168 |
if ( $can_reserve eq 'maxHoldsForRecord' ) { |
169 |
carp("AddReserve: borrower $borrowernumber has already reached the max holds for biblionumber $biblionumber"); |
163 |
return; |
170 |
return; |
164 |
} |
171 |
} |
165 |
|
172 |
|
166 |
my $dbh = C4::Context->dbh; |
173 |
my $dbh = C4::Context->dbh; |
167 |
|
174 |
|
168 |
$resdate = output_pref( { str => dt_from_string( $resdate ), dateonly => 1, dateformat => 'iso' }) |
175 |
$resdate = output_pref( { str => dt_from_string( $resdate ), dateonly => 1, dateformat => 'iso' }) |
169 |
or output_pref({ dt => dt_from_string, dateonly => 1, dateformat => 'iso' }); |
176 |
or output_pref({ dt => dt_from_string, dateonly => 1, dateformat => 'iso' }); |
Lines 192-198
sub AddReserve {
Link Here
|
192 |
branchcode => $branch, |
199 |
branchcode => $branch, |
193 |
priority => $priority, |
200 |
priority => $priority, |
194 |
reservenotes => $notes, |
201 |
reservenotes => $notes, |
195 |
itemnumber => $checkitem, |
202 |
itemnumber => $itemnumber, |
196 |
found => $found, |
203 |
found => $found, |
197 |
waitingdate => $waitingdate, |
204 |
waitingdate => $waitingdate, |
198 |
expirationdate => $expdate |
205 |
expirationdate => $expdate |
Lines 218-224
sub AddReserve {
Link Here
|
218 |
'branches' => $branch_details, |
225 |
'branches' => $branch_details, |
219 |
'borrowers' => $borrower, |
226 |
'borrowers' => $borrower, |
220 |
'biblio' => $biblionumber, |
227 |
'biblio' => $biblionumber, |
221 |
'items' => $checkitem, |
228 |
'items' => $itemnumber, |
222 |
}, |
229 |
}, |
223 |
) ) { |
230 |
) ) { |
224 |
|
231 |
|
Lines 460-486
sub CanItemBeReserved {
Link Here
|
460 |
|
467 |
|
461 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
468 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
462 |
|
469 |
|
463 |
# we retrieve user rights on this itemtype and branchcode |
470 |
my $querycount = "SELECT COUNT(*) as count |
464 |
my $sth = $dbh->prepare( |
471 |
FROM reserves |
465 |
"SELECT categorycode, itemtype, branchcode, reservesallowed |
472 |
LEFT JOIN items USING (itemnumber) |
466 |
FROM issuingrules |
473 |
LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) |
467 |
WHERE (categorycode in (?,'*') ) |
474 |
LEFT JOIN borrowers USING (borrowernumber) |
468 |
AND (itemtype IN (?,'*')) |
475 |
WHERE borrowernumber = ?"; |
469 |
AND (branchcode IN (?,'*')) |
|
|
470 |
ORDER BY |
471 |
categorycode DESC, |
472 |
itemtype DESC, |
473 |
branchcode DESC;" |
474 |
); |
475 |
|
476 |
my $querycount = "SELECT |
477 |
count(*) as count |
478 |
FROM reserves |
479 |
LEFT JOIN items USING (itemnumber) |
480 |
LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) |
481 |
LEFT JOIN borrowers USING (borrowernumber) |
482 |
WHERE borrowernumber = ? |
483 |
"; |
484 |
|
476 |
|
485 |
my $branchcode = ""; |
477 |
my $branchcode = ""; |
486 |
my $branchfield = "reserves.branchcode"; |
478 |
my $branchfield = "reserves.branchcode"; |
Lines 494-504
sub CanItemBeReserved {
Link Here
|
494 |
$branchcode = $borrower->{branchcode}; |
486 |
$branchcode = $borrower->{branchcode}; |
495 |
} |
487 |
} |
496 |
|
488 |
|
|
|
489 |
# we retrieve user rights on this itemtype and branchcode |
490 |
my $rule = _get_rule( $borrower->{categorycode}, $item->{itype}, $branchcode ); |
491 |
|
497 |
# we retrieve rights |
492 |
# we retrieve rights |
498 |
$sth->execute( $borrower->{'categorycode'}, $item->{'itype'}, $branchcode ); |
493 |
if ( $rule ) { |
499 |
if ( my $rights = $sth->fetchrow_hashref() ) { |
494 |
$ruleitemtype = $rule->get_column('itemtype'); |
500 |
$ruleitemtype = $rights->{itemtype}; |
495 |
$allowedreserves = $rule->get_column('reservesallowed'); |
501 |
$allowedreserves = $rights->{reservesallowed}; |
|
|
502 |
} |
496 |
} |
503 |
else { |
497 |
else { |
504 |
$ruleitemtype = '*'; |
498 |
$ruleitemtype = '*'; |
Lines 559-564
sub CanItemBeReserved {
Link Here
|
559 |
} |
553 |
} |
560 |
} |
554 |
} |
561 |
|
555 |
|
|
|
556 |
my $holds_on_record = Koha::Holds->search( |
557 |
{ |
558 |
borrowernumber => $borrowernumber, |
559 |
biblionumber => $item->{biblionumber} |
560 |
} |
561 |
)->count(); |
562 |
return 'maxHoldsForRecord' if ( $holds_on_record >= $rule->holds_per_record ); |
563 |
|
564 |
if ($itemnumber) { |
565 |
my $hold_on_item = Koha::Holds->search( |
566 |
{ |
567 |
borrowernumber => $borrowernumber, |
568 |
itemnumber => $itemnumber |
569 |
} |
570 |
)->count(); |
571 |
return 'itemAlreadyOnHold' if ($hold_on_item); |
572 |
} |
573 |
|
562 |
return 'OK'; |
574 |
return 'OK'; |
563 |
} |
575 |
} |
564 |
|
576 |
|
Lines 1268-1274
sub ModReserveStatus {
Link Here
|
1268 |
|
1280 |
|
1269 |
=head2 ModReserveAffect |
1281 |
=head2 ModReserveAffect |
1270 |
|
1282 |
|
1271 |
&ModReserveAffect($itemnumber,$borrowernumber,$diffBranchSend); |
1283 |
&ModReserveAffect( $itemnumber, $borrowernumber, $diffBranchSend, $reserve_id ); |
1272 |
|
1284 |
|
1273 |
This function affect an item and a status for a given reserve |
1285 |
This function affect an item and a status for a given reserve |
1274 |
The itemnumber parameter is used to find the biblionumber. |
1286 |
The itemnumber parameter is used to find the biblionumber. |
Lines 1282-1288
take care of the waiting status
Link Here
|
1282 |
=cut |
1294 |
=cut |
1283 |
|
1295 |
|
1284 |
sub ModReserveAffect { |
1296 |
sub ModReserveAffect { |
1285 |
my ( $itemnumber, $borrowernumber,$transferToDo ) = @_; |
1297 |
my ( $itemnumber, $borrowernumber, $transferToDo, $reserve_id ) = @_; |
1286 |
my $dbh = C4::Context->dbh; |
1298 |
my $dbh = C4::Context->dbh; |
1287 |
|
1299 |
|
1288 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
1300 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
Lines 1293-1302
sub ModReserveAffect {
Link Here
|
1293 |
|
1305 |
|
1294 |
# get request - need to find out if item is already |
1306 |
# get request - need to find out if item is already |
1295 |
# waiting in order to not send duplicate hold filled notifications |
1307 |
# waiting in order to not send duplicate hold filled notifications |
1296 |
my $reserve_id = GetReserveId({ |
1308 |
$reserve_id ||= GetReserveId( |
1297 |
borrowernumber => $borrowernumber, |
1309 |
{ |
1298 |
biblionumber => $biblionumber, |
1310 |
borrowernumber => $borrowernumber, |
1299 |
}); |
1311 |
biblionumber => $biblionumber, |
|
|
1312 |
} |
1313 |
); |
1300 |
return unless defined $reserve_id; |
1314 |
return unless defined $reserve_id; |
1301 |
my $request = GetReserveInfo($reserve_id); |
1315 |
my $request = GetReserveInfo($reserve_id); |
1302 |
my $already_on_shelf = ($request && $request->{found} eq 'W') ? 1 : 0; |
1316 |
my $already_on_shelf = ($request && $request->{found} eq 'W') ? 1 : 0; |
Lines 1309-1316
sub ModReserveAffect {
Link Here
|
1309 |
SET priority = 0, |
1323 |
SET priority = 0, |
1310 |
itemnumber = ?, |
1324 |
itemnumber = ?, |
1311 |
found = 'T' |
1325 |
found = 'T' |
1312 |
WHERE borrowernumber = ? |
1326 |
WHERE reserve_id = ? |
1313 |
AND biblionumber = ? |
|
|
1314 |
"; |
1327 |
"; |
1315 |
} |
1328 |
} |
1316 |
else { |
1329 |
else { |
Lines 1321-1332
sub ModReserveAffect {
Link Here
|
1321 |
found = 'W', |
1334 |
found = 'W', |
1322 |
waitingdate = NOW(), |
1335 |
waitingdate = NOW(), |
1323 |
itemnumber = ? |
1336 |
itemnumber = ? |
1324 |
WHERE borrowernumber = ? |
1337 |
WHERE reserve_id = ? |
1325 |
AND biblionumber = ? |
|
|
1326 |
"; |
1338 |
"; |
1327 |
} |
1339 |
} |
1328 |
$sth = $dbh->prepare($query); |
1340 |
$sth = $dbh->prepare($query); |
1329 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1341 |
$sth->execute( $itemnumber, $reserve_id ); |
1330 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1342 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1331 |
_FixPriority( { biblionumber => $biblionumber } ); |
1343 |
_FixPriority( { biblionumber => $biblionumber } ); |
1332 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1344 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
Lines 2431-2436
sub IsItemOnHoldAndFound {
Link Here
|
2431 |
return $found; |
2443 |
return $found; |
2432 |
} |
2444 |
} |
2433 |
|
2445 |
|
|
|
2446 |
sub _get_rule { |
2447 |
my ( $categorycode, $itemtype, $branchcode ) = @_; |
2448 |
|
2449 |
my $schema = Koha::Database->new()->schema(); |
2450 |
|
2451 |
my $rule = $schema->resultset('Issuingrule')->search( |
2452 |
{ |
2453 |
categorycode => { -in => $categorycode ? [ $categorycode, '*' ] : ['*'] }, |
2454 |
itemtype => { -in => $itemtype ? [ $itemtype, '*' ] : ['*'] }, |
2455 |
branchcode => { -in => $branchcode ? [ $branchcode, '*' ] : ['*'] }, |
2456 |
|
2457 |
}, |
2458 |
{ order_by => { -desc => [ 'categorycode', 'itemtype', 'branchcode' ] } } |
2459 |
)->next(); |
2460 |
|
2461 |
return $rule; |
2462 |
} |
2463 |
|
2434 |
=head1 AUTHOR |
2464 |
=head1 AUTHOR |
2435 |
|
2465 |
|
2436 |
Koha Development Team <http://koha-community.org/> |
2466 |
Koha Development Team <http://koha-community.org/> |