[Koha-patches] [PATCH] (bug #3590) show items in order in search results
Nahuel ANGELINETTI
nahuel.angelinetti at biblibre.com
Tue Sep 8 17:36:19 CEST 2009
This patch add a function in C4::Acquisition that return the number of items in order for a biblionumber.
Then, It permit to show to the user, the number of items in order for "empty" records in search results.
---
C4/Acquisition.pm | 22 +++++-
C4/Search.pm | 261 +++++++++++++++++++++++++++--------------------------
2 files changed, 155 insertions(+), 128 deletions(-)
diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm
index f334edc..0a92d39 100644
--- a/C4/Acquisition.pm
+++ b/C4/Acquisition.pm
@@ -39,7 +39,7 @@ BEGIN {
&GetOrderNumber &GetLateOrders &NewOrder &DelOrder
&SearchOrder &GetHistory &GetRecentAcqui
&ModOrder &ModReceiveOrder &ModOrderBiblioNumber
- &GetParcels &GetParcel
+ &GetParcels &GetParcel &GetOrderItemCountFromBiblionumber
);
}
@@ -1217,6 +1217,26 @@ sub GetRecentAcqui {
return \@results;
}
+=head2 GetOrderItemCountFromBiblionumber
+
+ $count = GetOrderItemCountFromBiblionumber($biblionumber)
+
+ C<$result> is the count of items in order for a biblionumber
+
+=cut
+sub GetOrderItemCountFromBiblionumber{
+ my $biblionumber = shift;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("SELECT quantity FROM aqorders WHERE datereceived IS NULL AND biblionumber = ? ");
+ $sth->execute($biblionumber);
+ if(my $data = $sth->fetchrow_hashref){
+ return $data->{quantity};
+ }else{
+ return 0;
+ }
+}
+
+
1;
__END__
diff --git a/C4/Search.pm b/C4/Search.pm
index 21eb767..da475a5 100644
--- a/C4/Search.pm
+++ b/C4/Search.pm
@@ -19,6 +19,7 @@ use strict;
# use warnings; # FIXME
require Exporter;
use C4::Context;
+use C4::Acquisition qw/GetOrderItemCountFromBiblionumber/;
use C4::Biblio; # GetMarcFromKohaField
use C4::Koha; # getFacets
use C4::Search::PazPar2;
@@ -1251,12 +1252,14 @@ sub searchResults {
# loop through all of the records we've retrieved
for ( my $i = $offset ; $i <= $times - 1 ; $i++ ) {
my $marcrecord = MARC::File::USMARC::decode( $marcresults[$i] );
+ my $biblionumber;
if ($bibliotag<10){
- $fw = GetFrameworkCode($marcrecord->field($bibliotag)->data);
+ $biblionumber = $marcrecord->field($bibliotag)->data;
}else{
- $fw = GetFrameworkCode($marcrecord->subfield($bibliotag,$bibliosubf));
+ $biblionumber = $marcrecord->subfield($bibliotag,$bibliosubf);
}
+ $fw = GetFrameworkCode($biblionumber);
my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, $fw );
$oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord, $fw);
@@ -1395,138 +1398,142 @@ sub searchResults {
? C4::Context->preference('maxItemsinSearchResults') - 1
: 1;
- # loop through every item
- foreach my $field (@fields) {
- my $item;
-
- # populate the items hash
- foreach my $code ( keys %subfieldstosearch ) {
- $item->{$code} = $field->subfield( $subfieldstosearch{$code} );
- }
- my $hbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'homebranch' : 'holdingbranch';
- my $otherbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'holdingbranch' : 'homebranch';
- # set item's branch name, use HomeOrHoldingBranch syspref first, fall back to the other one
- if ($item->{$hbranch}) {
- $item->{'branchname'} = $branches{$item->{$hbranch}};
- }
- elsif ($item->{$otherbranch}) { # Last resort
- $item->{'branchname'} = $branches{$item->{$otherbranch}};
- }
-
- ($item->{'reserved'}) = C4::Reserves::CheckReserves($item->{itemnumber});
-
- my $prefix = $item->{$hbranch} . '--' . $item->{location} . $item->{itype} . $item->{itemcallnumber};
-# For each grouping of items (onloan, available, unavailable), we build a key to store relevant info about that item
- if ( $item->{onloan} or $item->{reserved} ) {
- $onloan_count++;
- my $key = $prefix . $item->{onloan} . $item->{barcode};
- $onloan_items->{$key}->{due_date} = format_date($item->{onloan});
- $onloan_items->{$key}->{count}++ if $item->{$hbranch};
- $onloan_items->{$key}->{branchname} = $item->{branchname};
- $onloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
- $onloan_items->{$key}->{itemcallnumber} = $item->{itemcallnumber};
- $onloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
- $onloan_items->{$key}->{barcode} = $item->{barcode};
- # if something's checked out and lost, mark it as 'long overdue'
- if ( $item->{itemlost} ) {
- $onloan_items->{$prefix}->{longoverdue}++;
- $longoverdue_count++;
- } else { # can place holds as long as item isn't lost
- $can_place_holds = 1;
+ if(not $items_count){
+ $ordered_count = GetOrderItemCountFromBiblionumber($biblionumber);
+ }else{
+ # loop through every item
+ foreach my $field (@fields) {
+ my $item;
+
+ # populate the items hash
+ foreach my $code ( keys %subfieldstosearch ) {
+ $item->{$code} = $field->subfield( $subfieldstosearch{$code} );
}
- }
-
- # items not on loan, but still unavailable ( lost, withdrawn, damaged )
- else {
-
- # item is on order
- if ( $item->{notforloan} == -1 ) {
- $ordered_count++;
+ my $hbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'homebranch' : 'holdingbranch';
+ my $otherbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'holdingbranch' : 'homebranch';
+ # set item's branch name, use HomeOrHoldingBranch syspref first, fall back to the other one
+ if ($item->{$hbranch}) {
+ $item->{'branchname'} = $branches{$item->{$hbranch}};
}
-
- # is item in transit?
- my $transfertwhen = '';
- my ($transfertfrom, $transfertto);
-
- unless ($item->{wthdrawn}
- || $item->{itemlost}
- || $item->{damaged}
- || $item->{notforloan}
- || $items_count > 20) {
-
- # A couple heuristics to limit how many times
- # we query the database for item transfer information, sacrificing
- # accuracy in some cases for speed;
- #
- # 1. don't query if item has one of the other statuses
- # 2. don't check transit status if the bib has
- # more than 20 items
- #
- # FIXME: to avoid having the query the database like this, and to make
- # the in transit status count as unavailable for search limiting,
- # should map transit status to record indexed in Zebra.
- #
- ($transfertwhen, $transfertfrom, $transfertto) = C4::Circulation::GetTransfers($item->{itemnumber});
+ elsif ($item->{$otherbranch}) { # Last resort
+ $item->{'branchname'} = $branches{$item->{$otherbranch}};
}
-
- # item is withdrawn, lost or damaged
- if ( $item->{wthdrawn}
- || $item->{itemlost}
- || $item->{damaged}
- || $item->{notforloan}
- || $item->{reserved}
- || ($transfertwhen ne ''))
- {
- $wthdrawn_count++ if $item->{wthdrawn};
- $itemlost_count++ if $item->{itemlost};
- $itemdamaged_count++ if $item->{damaged};
- $item_in_transit_count++ if $transfertwhen ne '';
- $item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan};
-
- my $key = $prefix . $item->{status};
-
- foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber)) {
- if($item->{notforloan} == 1){
- $notforloan_items->{$key}->{$_} = $item->{$_};
- }else{
- $other_items->{$key}->{$_} = $item->{$_};
- }
- }
-
- if($item->{notforloan} == 1){
- $notforloan_count++;
-
- $notforloan_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
- $notforloan_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
- $notforloan_items->{$key}->{count}++ if $item->{$hbranch};
- $notforloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
- $notforloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
- $notforloan_items->{$key}->{barcode} = $item->{barcode};
- }else{
- $other_count++;
-
- $other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
- $other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
- $other_items->{$key}->{count}++ if $item->{$hbranch};
- $other_items->{$key}->{location} = $shelflocations->{ $item->{location} };
- $other_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
- $other_items->{$key}->{barcode} = $item->{barcode};
+
+ ($item->{'reserved'}) = C4::Reserves::CheckReserves($item->{itemnumber});
+
+ my $prefix = $item->{$hbranch} . '--' . $item->{location} . $item->{itype} . $item->{itemcallnumber};
+ # For each grouping of items (onloan, available, unavailable), we build a key to store relevant info about that item
+ if ( $item->{onloan} or $item->{reserved} ) {
+ $onloan_count++;
+ my $key = $prefix . $item->{onloan} . $item->{barcode};
+ $onloan_items->{$key}->{due_date} = format_date($item->{onloan});
+ $onloan_items->{$key}->{count}++ if $item->{$hbranch};
+ $onloan_items->{$key}->{branchname} = $item->{branchname};
+ $onloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
+ $onloan_items->{$key}->{itemcallnumber} = $item->{itemcallnumber};
+ $onloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $onloan_items->{$key}->{barcode} = $item->{barcode};
+ # if something's checked out and lost, mark it as 'long overdue'
+ if ( $item->{itemlost} ) {
+ $onloan_items->{$prefix}->{longoverdue}++;
+ $longoverdue_count++;
+ } else { # can place holds as long as item isn't lost
+ $can_place_holds = 1;
}
-
}
- # item is available
+
+ # items not on loan, but still unavailable ( lost, withdrawn, damaged )
else {
- $can_place_holds = 1;
- $available_count++;
- $available_items->{$prefix}->{count}++ if $item->{$hbranch};
- foreach (qw(branchname itemcallnumber barcode)) {
- $available_items->{$prefix}->{$_} = $item->{$_};
- }
- $available_items->{$prefix}->{location} = $shelflocations->{ $item->{location} };
- $available_items->{$prefix}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+
+ # item is on order
+ if ( $item->{notforloan} == -1 ) {
+ $ordered_count++;
+ }
+
+ # is item in transit?
+ my $transfertwhen = '';
+ my ($transfertfrom, $transfertto);
+
+ unless ($item->{wthdrawn}
+ || $item->{itemlost}
+ || $item->{damaged}
+ || $item->{notforloan}
+ || $items_count > 20) {
+
+ # A couple heuristics to limit how many times
+ # we query the database for item transfer information, sacrificing
+ # accuracy in some cases for speed;
+ #
+ # 1. don't query if item has one of the other statuses
+ # 2. don't check transit status if the bib has
+ # more than 20 items
+ #
+ # FIXME: to avoid having the query the database like this, and to make
+ # the in transit status count as unavailable for search limiting,
+ # should map transit status to record indexed in Zebra.
+ #
+ ($transfertwhen, $transfertfrom, $transfertto) = C4::Circulation::GetTransfers($item->{itemnumber});
+ }
+
+ # item is withdrawn, lost or damaged
+ if ( $item->{wthdrawn}
+ || $item->{itemlost}
+ || $item->{damaged}
+ || $item->{notforloan}
+ || $item->{reserved}
+ || ($transfertwhen ne ''))
+ {
+ $wthdrawn_count++ if $item->{wthdrawn};
+ $itemlost_count++ if $item->{itemlost};
+ $itemdamaged_count++ if $item->{damaged};
+ $item_in_transit_count++ if $transfertwhen ne '';
+ $item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan};
+
+ my $key = $prefix . $item->{status};
+
+ foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber)) {
+ if($item->{notforloan} == 1){
+ $notforloan_items->{$key}->{$_} = $item->{$_};
+ }else{
+ $other_items->{$key}->{$_} = $item->{$_};
+ }
+ }
+
+ if($item->{notforloan} == 1){
+ $notforloan_count++;
+
+ $notforloan_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+ $notforloan_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
+ $notforloan_items->{$key}->{count}++ if $item->{$hbranch};
+ $notforloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
+ $notforloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $notforloan_items->{$key}->{barcode} = $item->{barcode};
+ }else{
+ $other_count++;
+
+ $other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+ $other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
+ $other_items->{$key}->{count}++ if $item->{$hbranch};
+ $other_items->{$key}->{location} = $shelflocations->{ $item->{location} };
+ $other_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $other_items->{$key}->{barcode} = $item->{barcode};
+ }
+
+ }
+ # item is available
+ else {
+ $can_place_holds = 1;
+ $available_count++;
+ $available_items->{$prefix}->{count}++ if $item->{$hbranch};
+ foreach (qw(branchname itemcallnumber barcode)) {
+ $available_items->{$prefix}->{$_} = $item->{$_};
+ }
+ $available_items->{$prefix}->{location} = $shelflocations->{ $item->{location} };
+ $available_items->{$prefix}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ }
}
- }
- } # notforloan, item level and biblioitem level
+ } # notforloan, item level and biblioitem level
+ }
my ( $availableitemscount, $onloanitemscount, $notforloanitemscount,$otheritemscount );
$maxitems =
( C4::Context->preference('maxItemsinSearchResults') )
--
1.6.0.4
More information about the Koha-patches
mailing list