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/> |