=cut
use strict;
+use warnings;
use C4::Branch; # GetBranches get_branchinfos_of
use CGI;
use List::MoreUtils qw/uniq/;
-use Date::Calc qw/Today Date_to_Days/;
+use Date::Calc qw/Date_to_Days/;
use C4::Output;
use C4::Auth;
use C4::Reserves;
use C4::Biblio;
+use C4::Items;
use C4::Koha;
use C4::Circulation;
use C4::Dates qw/format_date/;
use C4::Members;
+use C4::Search; # enabled_staff_search_views
my $dbh = C4::Context->dbh;
my $sth;
my $cardnumber = $input->param('cardnumber');
my $borrowerslist;
my $messageborrower;
+my $warnings;
+my $messages;
-my $date = sprintf( '%04d-%02d-%02d', Today() );
+my $date = C4::Dates->today('iso');
if ($findborrower) {
my ( $count, $borrowers ) =
if ($cardnumber) {
my $borrowerinfo = GetMemberDetails( 0, $cardnumber );
- my $expiry;
my $diffbranch;
my @getreservloop;
my $count_reserv = 0;
GetReserveCount( $borrowerinfo->{'borrowernumber'} );
if ( $number_reserves > C4::Context->preference('maxreserves') ) {
+ $warnings = 1;
$maxreserves = 1;
}
- # we check the date expiricy of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
- if ($borrowerinfo->{'dateexpiry'} ne '0000-00-00') {
- my $warning = (Date_to_Days(split /-/,$date) > Date_to_Days( split /-/,$borrowerinfo->{'dateexpiry'}));
- if ( $warning > 0 ) {
- $expiry = 1;
- }
- } else {
- $expiry = 1;
+ # we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
+ my $expiry_date = $borrowerinfo->{dateexpiry};
+ my $expiry = 0; # flag set if patron account has expired
+ if ($expiry_date and $expiry_date ne '0000-00-00' and
+ Date_to_Days(split (/-/,$date)) > Date_to_Days(split (/-/,$expiry_date))) {
+ $messages = $expiry = 1;
+ }else{
+ $expiry = 0;
}
-
+
# check if the borrower make the reserv in a different branch
if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
+ $messages = 1;
$diffbranch = 1;
}
borrowerreservs => $count_reserv,
maxreserves => $maxreserves,
expiry => $expiry,
- diffbranch => $diffbranch
+ diffbranch => $diffbranch,
+ messages => $messages,
+ warnings => $warnings
);
}
'%s, %s ... (%s - %s) ... %s',
$borrower->{surname}, $borrower->{firstname},
$borrower->{cardnumber}, $borrower->{categorycode},
- $borrower->{streetaddress},
+ $borrower->{address},
);
}
}
if ( $borrowerinfo->{borrowernumber} eq $res->{borrowernumber} ) {
+ $warnings = 1;
$alreadyreserved = 1;
}
}
-$template->param( alreadyreserved => $alreadyreserved );
+$template->param( alreadyreserved => $alreadyreserved,
+ messages => $messages,
+ warnings => $warnings );
# FIXME think @optionloop, is maybe obsolete, or must be switchable by a systeme preference fixed rank or not
# make priorities options
my @branchcodes;
my %itemnumbers_of_biblioitem;
-my @itemnumbers = @{ get_itemnumbers_of($biblionumber)->{$biblionumber} };
+my @itemnumbers;
+
+if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
+ @itemnumbers = @$items;
+}
+else {
+ $template->param('noitems' => 1);
+}
+
my $iteminfos_of = GetItemInfosOf(@itemnumbers);
foreach my $itemnumber (@itemnumbers) {
foreach my $biblioitemnumber (@biblioitemnumbers) {
my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
+ my $num_available;
+ my $num_override;
+
$biblioitem->{description} =
$itemtypes->{ $biblioitem->{itemtype} }{description};
- foreach
- my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } )
- {
+ foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ){
my $item = $iteminfos_of->{$itemnumber};
- $item->{itypename} = $itemtypes->{ $item->{itype} }{description};
- $item->{imageurl} = getitemtypeimagesrc() . "/".$itemtypes->{ $item->{itype} }{imageurl};
- $item->{homebranchname} =
- $branches->{ $item->{homebranch} }{branchname};
+ unless (C4::Context->preference('item-level_itypes')) {
+ $item->{itype} = $biblioitem->{itemtype};
+ }
+
+ $item->{itypename} = $itemtypes->{ $item->{itype} }{description};
+ $item->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtypes->{ $item->{itype} }{imageurl} );
+ $item->{homebranchname} = $branches->{ $item->{homebranch} }{branchname};
# if the holdingbranch is different than the homebranch, we show the
# holdingbranch of the document too
$branches->{ $item->{holdingbranch} }{branchname};
}
-# add information
- $item->{itemcallnumber} = $item->{itemcallnumber};
+ # add information
+ $item->{itemcallnumber} = $item->{itemcallnumber};
# if the item is currently on loan, we display its return date and
# change the background color
# If there is no loan, return and transfer, we show a checkbox.
$item->{notforloan} = $item->{notforloan} || 0;
- # if independent branches is on we need to check if the person can reserve
- # for branches they arent logged in to
- if ( C4::Context->preference("IndependantBranches") ) {
- if (! C4::Context->preference("canreservefromotherbranches")){
- # cant reserve items so need to check if item homebranch and userenv branch match if not we cant reserve
- my $userenv = C4::Context->userenv;
- if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
- $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} );
- }
+ # if independent branches is on we need to check if the person can reserve
+ # for branches they arent logged in to
+ if ( C4::Context->preference("IndependantBranches") ) {
+ if (! C4::Context->preference("canreservefromotherbranches")){
+ # cant reserve items so need to check if item homebranch and userenv branch match if not we cant reserve
+ my $userenv = C4::Context->userenv;
+ if ( ($userenv) && ( $userenv->{flags} %2 != 1 ) ) {
+ $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} );
+ }
+ }
}
- }
- # FIXME: every library will define this differently
- # An item is available only if:
- if (
- not defined $reservedate # not reserved yet
- and $issues->{'date_due'} eq '' # not currently on loan
- and not $item->{itemlost} # not lost
- and not $item->{notforloan} # not forbidden to loan
- and not $item->{cantreserve}
- and $transfertwhen eq '' # not currently on transfert
- )
- {
- $item->{available} = 1;
+ my $branch = C4::Circulation::_GetCircControlBranch($item, $borrowerinfo);
+
+ my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} );
+ my $policy_holdallowed = 1;
+
+ $item->{'holdallowed'} = $branchitemrule->{'holdallowed'};
+
+ if ( $branchitemrule->{'holdallowed'} == 0 ||
+ ( $branchitemrule->{'holdallowed'} == 1 && $borrowerinfo->{'branchcode'} ne $item->{'homebranch'} ) ) {
+ $policy_holdallowed = 0;
}
- # FIXME: move this to a pm
- my $sth2 = $dbh->prepare("SELECT * FROM reserves WHERE borrowernumber=? AND itemnumber=? AND found='W' AND cancellationdate IS NULL");
- $sth2->execute($item->{ReservedForBorrowernumber},$item->{itemnumber});
- while (my $wait_hashref = $sth2->fetchrow_hashref) {
- $item->{waitingdate} = format_date($wait_hashref->{waitingdate});
- }
+ if (IsAvailableForItemLevelRequest($itemnumber) and not $item->{cantreserve}) {
+ if ( not $policy_holdallowed and C4::Context->preference( 'AllowHoldPolicyOverride' ) ) {
+ $item->{override} = 1;
+ $num_override++;
+ } elsif ( $policy_holdallowed ) {
+ $item->{available} = 1;
+ $num_available++;
+ }
+ }
+ # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked
+
+ # FIXME: move this to a pm
+ my $sth2 = $dbh->prepare("SELECT * FROM reserves WHERE borrowernumber=? AND itemnumber=? AND found='W'");
+ $sth2->execute($item->{ReservedForBorrowernumber},$item->{itemnumber});
+ while (my $wait_hashref = $sth2->fetchrow_hashref) {
+ $item->{waitingdate} = format_date($wait_hashref->{waitingdate});
+ }
push @{ $biblioitem->{itemloop} }, $item;
}
+ if ( $num_override == scalar( @{ $biblioitem->{itemloop} } ) ) { # That is, if all items require an override
+ $template->param( override_required => 1 );
+ } elsif ( $num_available == 0 ) {
+ $template->param( none_available => 1 );
+ $template->param( warnings => 1 );
+ }
+
push @bibitemloop, $biblioitem;
}
}
# set found to 1 if reserve is waiting for patron pickup
$reserve{'found'} = 1 if $res->{'found'} eq 'W';
+ } elsif ($res->{priority} > 0) {
+ if (defined($res->{itemnumber})) {
+ my $item = GetItem($res->{itemnumber});
+ $reserve{'itemnumber'} = $res->{'itemnumber'};
+ $reserve{'barcodenumber'} = $item->{'barcode'};
+ $reserve{'item_level_hold'} = 1;
+ }
}
# get borrowers reserve info
my @values;
my %label_of;
-foreach my $branchcode ( keys %{$branches} ) {
+foreach my $branchcode (sort keys %{$branches} ) {
push @values, $branchcode;
$label_of{$branchcode} = $branches->{$branchcode}->{branchname};
}
cardnumber => $cardnumber,
CGIselectborrower => $CGIselectborrower,
title => $dat->{title},
- author => $dat->{author}
+ author => $dat->{author},
+ holdsview => 1,
+ borrower_branchname => $branches->{$borrowerinfo->{'branchcode'}}->{'branchname'},
+ borrower_branchcode => $borrowerinfo->{'branchcode'},
);
# printout the page