# Copyright 2000-2002 Katipo Communications
# 2006 SAN Ouest Provence
-# 2007 BibLibre Paul POULAIN
+# 2007-2010 BibLibre Paul POULAIN
+# 2011 Catalyst IT
#
# This file is part of Koha.
#
use C4::Biblio;
use C4::Members;
use C4::Items;
-use C4::Search;
use C4::Circulation;
use C4::Accounts;
BEGIN {
# set the version for version checking
$VERSION = 3.01;
- require Exporter;
+ require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
&AddReserve
&AlterPriority
&ToggleLowestPriority
);
+ @EXPORT_OK = qw( MergeHolds );
}
=head2 AddReserve
my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
my $biblio = GetBiblioData($biblionumber);
my $letter = C4::Letters::getletter( 'reserves', 'HOLDPLACED');
- my $admin_email_address = C4::Context->preference('KohaAdminEmailAddress');
+ my $branchcode = $borrower->{branchcode};
+ my $branch_details = C4::Branch::GetBranchDetail($branchcode);
+ my $admin_email_address =$branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
my %keys = (%$borrower, %$biblio);
foreach my $key (keys %keys) {
sub CanBookBeReserved{
my ($borrowernumber, $biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $biblio = GetBiblioData($biblionumber);
- my $borrower = C4::Members::GetMember(borrowernumber=>$borrowernumber);
- my $controlbranch = C4::Context->preference('ReservesControlBranch');
- my $itype = C4::Context->preference('item-level_itypes');
- my $reservesrights= 0;
- my $reservescount = 0;
-
- # we retrieve the user rights
- my @args;
- my $rightsquery = "SELECT categorycode, itemtype, branchcode, reservesallowed
- FROM issuingrules
- WHERE categorycode IN (?, '*')";
- push @args,$borrower->{categorycode};
-
- if($controlbranch eq "ItemHomeLibrary"){
- $rightsquery .= " AND branchcode = '*'";
- }elsif($controlbranch eq "PatronLibrary"){
- $rightsquery .= " AND branchcode IN (?,'*')";
- push @args, $borrower->{branchcode};
- }
-
- if(not $itype){
- $rightsquery .= " AND itemtype IN (?,'*')";
- push @args, $biblio->{itemtype};
- }else{
- $rightsquery .= " AND itemtype = '*'";
- }
-
- $rightsquery .= " ORDER BY categorycode DESC, itemtype DESC, branchcode DESC";
- my $sthrights = $dbh->prepare($rightsquery);
- $sthrights->execute(@args);
-
- if(my $row = $sthrights->fetchrow_hashref()){
- $reservesrights = $row->{reservesallowed};
- }
-
- @args = ();
- # we count how many reserves the borrower have
- my $countquery = "SELECT count(*) as count
- FROM reserves
- LEFT JOIN items USING (itemnumber)
- LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
- LEFT JOIN borrowers USING (borrowernumber)
- WHERE borrowernumber = ?
- ";
- push @args, $borrowernumber;
-
- if(not $itype){
- $countquery .= "AND itemtype = ?";
- push @args, $biblio->{itemtype};
- }
-
- if($controlbranch eq "PatronLibrary"){
- $countquery .= " AND borrowers.branchcode = ? ";
- push @args, $borrower->{branchcode};
- }
-
- my $sthcount = $dbh->prepare($countquery);
- $sthcount->execute(@args);
-
- if(my $row = $sthcount->fetchrow_hashref()){
- $reservescount = $row->{count};
+ my @items = get_itemnumbers_of($biblionumber);
+ #get items linked via host records
+ my @hostitems = get_hostitemnumbers_of($biblionumber);
+ if (@hostitems){
+ push (@items,@hostitems);
}
- if($reservescount < $reservesrights){
- return 1;
- }else{
- return 0;
+
+ foreach my $item (@items){
+ return 1 if CanItemBeReserved($borrowernumber, $item);
}
-
+ return 0;
}
=head2 CanItemBeReserved
my ( $item, $barcode ) = @_;
my $dbh = C4::Context->dbh;
my $sth;
- my $select = "
- SELECT items.biblionumber,
+ my $select;
+ if (C4::Context->preference('item-level_itypes')){
+ $select = "
+ SELECT items.biblionumber,
items.biblioitemnumber,
itemtypes.notforloan,
items.notforloan AS itemnotforloan,
items.itemnumber
- FROM items
- LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
- LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype
- ";
-
+ FROM items
+ LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
+ LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype
+ ";
+ }
+ else {
+ $select = "
+ SELECT items.biblionumber,
+ items.biblioitemnumber,
+ itemtypes.notforloan,
+ items.notforloan AS itemnotforloan,
+ items.itemnumber
+ FROM items
+ LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
+ LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype
+ ";
+ }
+
if ($item) {
$sth = $dbh->prepare("$select WHERE itemnumber = ?");
$sth->execute($item);
} else {
# See if this item is more important than what we've got so far
if ( $res->{'priority'} && $res->{'priority'} < $priority ) {
+ my $borrowerinfo=C4::Members::GetMember(borrowernumber => $res->{'borrowernumber'});
+ my $iteminfo=C4::Items::GetItem($itemnumber);
+ my $branch=C4::Circulation::_GetCircControlBranch($iteminfo,$borrowerinfo);
+ my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'});
+ next if ($branchitemrule->{'holdallowed'} == 0);
+ next if (($branchitemrule->{'holdallowed'} == 1) && ($branch ne $borrowerinfo->{'branchcode'}));
$priority = $res->{'priority'};
$highest = $res;
}
$sth->execute( $biblio, $borr );
# now fix the priority on the others....
- _FixPriority( $priority, $biblio );
+ _FixPriority( $biblio, $borr );
}
}
# now fix the priority on the others (if the priority wasn't
# already sorted!)....
unless ( $priority == 0 ) {
- _FixPriority( $priority, $biblionumber );
+ _FixPriority( $biblionumber, $borrowernumber );
}
}
SELECT reserves.biblionumber AS biblionumber,
reserves.borrowernumber AS borrowernumber,
reserves.reservedate AS reservedate,
+ reserves.waitingdate AS waitingdate,
reserves.branchcode AS branchcode,
reserves.cancellationdate AS cancellationdate,
reserves.found AS found,
my $dbh = C4::Context->dbh;
my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
+
+ # Try to get the borrower's email address
+ my $to_address;
+ my $which_address = C4::Context->preference('AutoEmailPrimaryAddress');
+ # If the system preference is set to 'first valid' (value == OFF), look up email address
+ if ($which_address eq 'OFF') {
+ $to_address = C4::Members::GetFirstValidEmailAddress( $borrowernumber );
+ } else {
+ $to_address = $borrower->{$which_address};
+ }
+
my $letter_code;
my $print_mode = 0;
my $messagingprefs;
- if ( $borrower->{'email'} || $borrower->{'smsalertnumber'} ) {
- $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'Hold Filled' } );
+ if ( $to_address || $borrower->{'smsalertnumber'} ) {
+ $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'Hold_Filled' } );
return if ( !defined( $messagingprefs->{'letter_code'} ) );
$letter_code = $messagingprefs->{'letter_code'};
return $new_priority; # so the caller knows what priority they wind up receiving
}
+=head2 MergeHolds
+
+ MergeHolds($dbh,$to_biblio, $from_biblio);
+
+This shifts the holds from C<$from_biblio> to C<$to_biblio> and reorders them by the date they were placed
+
+=cut
+
+sub MergeHolds {
+ my ( $dbh, $to_biblio, $from_biblio ) = @_;
+ my $sth = $dbh->prepare(
+ "SELECT count(*) as reservenumber FROM reserves WHERE biblionumber = ?"
+ );
+ $sth->execute($from_biblio);
+ if ( my $data = $sth->fetchrow_hashref() ) {
+
+ # holds exist on old record, if not we don't need to do anything
+ $sth = $dbh->prepare(
+ "UPDATE reserves SET biblionumber = ? WHERE biblionumber = ?");
+ $sth->execute( $to_biblio, $from_biblio );
+
+ # Reorder by date
+ # don't reorder those already waiting
+
+ $sth = $dbh->prepare(
+"SELECT * FROM reserves WHERE biblionumber = ? AND (found <> ? AND found <> ? OR found is NULL) ORDER BY reservedate ASC"
+ );
+ my $upd_sth = $dbh->prepare(
+"UPDATE reserves SET priority = ? WHERE biblionumber = ? AND borrowernumber = ?
+ AND reservedate = ? AND constrainttype = ? AND (itemnumber = ? or itemnumber is NULL) "
+ );
+ $sth->execute( $to_biblio, 'W', 'T' );
+ my $priority = 1;
+ while ( my $reserve = $sth->fetchrow_hashref() ) {
+ $upd_sth->execute(
+ $priority, $to_biblio,
+ $reserve->{'borrowernumber'}, $reserve->{'reservedate'},
+ $reserve->{'constrainttype'}, $reserve->{'itemnumber'}
+ );
+ $priority++;
+ }
+ }
+}
+
+
=head1 AUTHOR
-Koha Development Team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
=cut