|
Lines 148-170
BEGIN {
Link Here
|
| 148 |
|
148 |
|
| 149 |
=head2 AddReserve |
149 |
=head2 AddReserve |
| 150 |
|
150 |
|
| 151 |
AddReserve($branch,$borrowernumber,$biblionumber,$bibitems,$priority,$resdate,$expdate,$notes,$title,$checkitem,$found) |
151 |
AddReserve( |
|
|
152 |
$branch, $borrowernumber, $biblionumber, $bibitems, $priority, $resdate, |
| 153 |
$expdate, $notes, $title, $itemnumber, $found |
| 154 |
) |
| 152 |
|
155 |
|
| 153 |
=cut |
156 |
=cut |
| 154 |
|
157 |
|
| 155 |
sub AddReserve { |
158 |
sub AddReserve { |
| 156 |
my ( |
159 |
my ( |
| 157 |
$branch, $borrowernumber, $biblionumber, |
160 |
$branch, $borrowernumber, $biblionumber, $bibitems, $priority, $resdate, |
| 158 |
$bibitems, $priority, $resdate, $expdate, $notes, |
161 |
$expdate, $notes, $title, $itemnumber, $found |
| 159 |
$title, $checkitem, $found |
|
|
| 160 |
) = @_; |
162 |
) = @_; |
| 161 |
|
163 |
|
| 162 |
if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) { |
164 |
# Ensure the holds should be allowed |
| 163 |
carp("AddReserve: borrower $borrowernumber already has a hold for biblionumber $biblionumber"); |
165 |
my $can_reserve = |
|
|
166 |
$itemnumber |
| 167 |
? CanItemBeReserved( $borrowernumber, $itemnumber ) |
| 168 |
: CanBookBeReserved( $borrowernumber, $biblionumber ); |
| 169 |
if ( $can_reserve eq 'maxHoldsForRecord' ) { |
| 170 |
carp("AddReserve: borrower $borrowernumber has already reached the max holds for biblionumber $biblionumber"); |
| 164 |
return; |
171 |
return; |
| 165 |
} |
172 |
} |
| 166 |
|
173 |
|
| 167 |
my $dbh = C4::Context->dbh; |
174 |
my $dbh = C4::Context->dbh; |
| 168 |
|
175 |
|
| 169 |
$resdate = format_date_in_iso( $resdate ) if ( $resdate ); |
176 |
$resdate = format_date_in_iso( $resdate ) if ( $resdate ); |
| 170 |
$resdate = C4::Dates->today( 'iso' ) unless ( $resdate ); |
177 |
$resdate = C4::Dates->today( 'iso' ) unless ( $resdate ); |
|
Lines 197-203
sub AddReserve {
Link Here
|
| 197 |
branchcode => $branch, |
204 |
branchcode => $branch, |
| 198 |
priority => $priority, |
205 |
priority => $priority, |
| 199 |
reservenotes => $notes, |
206 |
reservenotes => $notes, |
| 200 |
itemnumber => $checkitem, |
207 |
itemnumber => $itemnumber, |
| 201 |
found => $found, |
208 |
found => $found, |
| 202 |
waitingdate => $waitingdate, |
209 |
waitingdate => $waitingdate, |
| 203 |
expirationdate => $expdate |
210 |
expirationdate => $expdate |
|
Lines 223-229
sub AddReserve {
Link Here
|
| 223 |
'branches' => $branch_details, |
230 |
'branches' => $branch_details, |
| 224 |
'borrowers' => $borrower, |
231 |
'borrowers' => $borrower, |
| 225 |
'biblio' => $biblionumber, |
232 |
'biblio' => $biblionumber, |
| 226 |
'items' => $checkitem, |
233 |
'items' => $itemnumber, |
| 227 |
}, |
234 |
}, |
| 228 |
) ) { |
235 |
) ) { |
| 229 |
|
236 |
|
|
Lines 465-491
sub CanItemBeReserved {
Link Here
|
| 465 |
|
472 |
|
| 466 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
473 |
my $controlbranch = C4::Context->preference('ReservesControlBranch'); |
| 467 |
|
474 |
|
| 468 |
# we retrieve user rights on this itemtype and branchcode |
475 |
my $querycount = "SELECT COUNT(*) as count |
| 469 |
my $sth = $dbh->prepare( |
476 |
FROM reserves |
| 470 |
"SELECT categorycode, itemtype, branchcode, reservesallowed |
477 |
LEFT JOIN items USING (itemnumber) |
| 471 |
FROM issuingrules |
478 |
LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) |
| 472 |
WHERE (categorycode in (?,'*') ) |
479 |
LEFT JOIN borrowers USING (borrowernumber) |
| 473 |
AND (itemtype IN (?,'*')) |
480 |
WHERE borrowernumber = ?"; |
| 474 |
AND (branchcode IN (?,'*')) |
|
|
| 475 |
ORDER BY |
| 476 |
categorycode DESC, |
| 477 |
itemtype DESC, |
| 478 |
branchcode DESC;" |
| 479 |
); |
| 480 |
|
| 481 |
my $querycount = "SELECT |
| 482 |
count(*) as count |
| 483 |
FROM reserves |
| 484 |
LEFT JOIN items USING (itemnumber) |
| 485 |
LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber) |
| 486 |
LEFT JOIN borrowers USING (borrowernumber) |
| 487 |
WHERE borrowernumber = ? |
| 488 |
"; |
| 489 |
|
481 |
|
| 490 |
my $branchcode = ""; |
482 |
my $branchcode = ""; |
| 491 |
my $branchfield = "reserves.branchcode"; |
483 |
my $branchfield = "reserves.branchcode"; |
|
Lines 499-509
sub CanItemBeReserved {
Link Here
|
| 499 |
$branchcode = $borrower->{branchcode}; |
491 |
$branchcode = $borrower->{branchcode}; |
| 500 |
} |
492 |
} |
| 501 |
|
493 |
|
|
|
494 |
# we retrieve user rights on this itemtype and branchcode |
| 495 |
my $rule = _get_rule( $borrower->{categorycode}, $item->{itype}, $branchcode ); |
| 496 |
|
| 502 |
# we retrieve rights |
497 |
# we retrieve rights |
| 503 |
$sth->execute( $borrower->{'categorycode'}, $item->{'itype'}, $branchcode ); |
498 |
if ( $rule ) { |
| 504 |
if ( my $rights = $sth->fetchrow_hashref() ) { |
499 |
$ruleitemtype = $rule->get_column('itemtype'); |
| 505 |
$ruleitemtype = $rights->{itemtype}; |
500 |
$allowedreserves = $rule->get_column('reservesallowed'); |
| 506 |
$allowedreserves = $rights->{reservesallowed}; |
|
|
| 507 |
} |
501 |
} |
| 508 |
else { |
502 |
else { |
| 509 |
$ruleitemtype = '*'; |
503 |
$ruleitemtype = '*'; |
|
Lines 564-569
sub CanItemBeReserved {
Link Here
|
| 564 |
} |
558 |
} |
| 565 |
} |
559 |
} |
| 566 |
|
560 |
|
|
|
561 |
my $holds_on_record = Koha::Holds->search( |
| 562 |
{ |
| 563 |
borrowernumber => $borrowernumber, |
| 564 |
biblionumber => $item->{biblionumber} |
| 565 |
} |
| 566 |
)->count(); |
| 567 |
return 'maxHoldsForRecord' if ( $holds_on_record >= $rule->holds_per_record ); |
| 568 |
|
| 569 |
if ($itemnumber) { |
| 570 |
my $hold_on_item = Koha::Holds->search( |
| 571 |
{ |
| 572 |
borrowernumber => $borrowernumber, |
| 573 |
itemnumber => $itemnumber |
| 574 |
} |
| 575 |
)->count(); |
| 576 |
return 'itemAlreadyOnHold' if ($hold_on_item); |
| 577 |
} |
| 578 |
|
| 567 |
return 'OK'; |
579 |
return 'OK'; |
| 568 |
} |
580 |
} |
| 569 |
|
581 |
|
|
Lines 1273-1279
sub ModReserveStatus {
Link Here
|
| 1273 |
|
1285 |
|
| 1274 |
=head2 ModReserveAffect |
1286 |
=head2 ModReserveAffect |
| 1275 |
|
1287 |
|
| 1276 |
&ModReserveAffect($itemnumber,$borrowernumber,$diffBranchSend); |
1288 |
&ModReserveAffect( $itemnumber, $borrowernumber, $diffBranchSend, $reserve_id ); |
| 1277 |
|
1289 |
|
| 1278 |
This function affect an item and a status for a given reserve |
1290 |
This function affect an item and a status for a given reserve |
| 1279 |
The itemnumber parameter is used to find the biblionumber. |
1291 |
The itemnumber parameter is used to find the biblionumber. |
|
Lines 1287-1293
take care of the waiting status
Link Here
|
| 1287 |
=cut |
1299 |
=cut |
| 1288 |
|
1300 |
|
| 1289 |
sub ModReserveAffect { |
1301 |
sub ModReserveAffect { |
| 1290 |
my ( $itemnumber, $borrowernumber,$transferToDo ) = @_; |
1302 |
my ( $itemnumber, $borrowernumber, $transferToDo, $reserve_id ) = @_; |
| 1291 |
my $dbh = C4::Context->dbh; |
1303 |
my $dbh = C4::Context->dbh; |
| 1292 |
|
1304 |
|
| 1293 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
1305 |
# we want to attach $itemnumber to $borrowernumber, find the biblionumber |
|
Lines 1298-1307
sub ModReserveAffect {
Link Here
|
| 1298 |
|
1310 |
|
| 1299 |
# get request - need to find out if item is already |
1311 |
# get request - need to find out if item is already |
| 1300 |
# waiting in order to not send duplicate hold filled notifications |
1312 |
# waiting in order to not send duplicate hold filled notifications |
| 1301 |
my $reserve_id = GetReserveId({ |
1313 |
$reserve_id ||= GetReserveId( |
| 1302 |
borrowernumber => $borrowernumber, |
1314 |
{ |
| 1303 |
biblionumber => $biblionumber, |
1315 |
borrowernumber => $borrowernumber, |
| 1304 |
}); |
1316 |
biblionumber => $biblionumber, |
|
|
1317 |
} |
| 1318 |
); |
| 1305 |
return unless defined $reserve_id; |
1319 |
return unless defined $reserve_id; |
| 1306 |
my $request = GetReserveInfo($reserve_id); |
1320 |
my $request = GetReserveInfo($reserve_id); |
| 1307 |
my $already_on_shelf = ($request && $request->{found} eq 'W') ? 1 : 0; |
1321 |
my $already_on_shelf = ($request && $request->{found} eq 'W') ? 1 : 0; |
|
Lines 1314-1321
sub ModReserveAffect {
Link Here
|
| 1314 |
SET priority = 0, |
1328 |
SET priority = 0, |
| 1315 |
itemnumber = ?, |
1329 |
itemnumber = ?, |
| 1316 |
found = 'T' |
1330 |
found = 'T' |
| 1317 |
WHERE borrowernumber = ? |
1331 |
WHERE reserve_id = ? |
| 1318 |
AND biblionumber = ? |
|
|
| 1319 |
"; |
1332 |
"; |
| 1320 |
} |
1333 |
} |
| 1321 |
else { |
1334 |
else { |
|
Lines 1326-1337
sub ModReserveAffect {
Link Here
|
| 1326 |
found = 'W', |
1339 |
found = 'W', |
| 1327 |
waitingdate = NOW(), |
1340 |
waitingdate = NOW(), |
| 1328 |
itemnumber = ? |
1341 |
itemnumber = ? |
| 1329 |
WHERE borrowernumber = ? |
1342 |
WHERE reserve_id = ? |
| 1330 |
AND biblionumber = ? |
|
|
| 1331 |
"; |
1343 |
"; |
| 1332 |
} |
1344 |
} |
| 1333 |
$sth = $dbh->prepare($query); |
1345 |
$sth = $dbh->prepare($query); |
| 1334 |
$sth->execute( $itemnumber, $borrowernumber,$biblionumber); |
1346 |
$sth->execute( $itemnumber, $reserve_id ); |
| 1335 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
1347 |
_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf ); |
| 1336 |
_FixPriority( { biblionumber => $biblionumber } ); |
1348 |
_FixPriority( { biblionumber => $biblionumber } ); |
| 1337 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
1349 |
if ( C4::Context->preference("ReturnToShelvingCart") ) { |
|
Lines 2435-2440
sub IsItemOnHoldAndFound {
Link Here
|
| 2435 |
return $found; |
2447 |
return $found; |
| 2436 |
} |
2448 |
} |
| 2437 |
|
2449 |
|
|
|
2450 |
sub _get_rule { |
| 2451 |
my ( $categorycode, $itemtype, $branchcode ) = @_; |
| 2452 |
|
| 2453 |
my $schema = Koha::Database->new()->schema(); |
| 2454 |
|
| 2455 |
my $rule = $schema->resultset('Issuingrule')->search( |
| 2456 |
{ |
| 2457 |
categorycode => { -in => $categorycode ? [ $categorycode, '*' ] : ['*'] }, |
| 2458 |
itemtype => { -in => $itemtype ? [ $itemtype, '*' ] : ['*'] }, |
| 2459 |
branchcode => { -in => $branchcode ? [ $branchcode, '*' ] : ['*'] }, |
| 2460 |
|
| 2461 |
}, |
| 2462 |
{ order_by => { -desc => [ 'categorycode', 'itemtype', 'branchcode' ] } } |
| 2463 |
)->next(); |
| 2464 |
|
| 2465 |
return $rule; |
| 2466 |
} |
| 2467 |
|
| 2438 |
=head1 AUTHOR |
2468 |
=head1 AUTHOR |
| 2439 |
|
2469 |
|
| 2440 |
Koha Development Team <http://koha-community.org/> |
2470 |
Koha Development Team <http://koha-community.org/> |