Bug 7016 Followup: Add new GetItemnumberForBiblio subroutine
[koha_gimpoz] / C4 / Items.pm
index 69557aa..59eaa69 100644 (file)
@@ -69,15 +69,20 @@ BEGIN {
         GetItemsByBiblioitemnumber
         GetItemsInfo
        GetItemsLocationInfo
+       GetHostItemsInfo
+        GetItemnumbersForBiblio
         get_itemnumbers_of
+       get_hostitemnumbers_of
         GetItemnumberFromBarcode
         GetBarcodeFromItemnumber
-      GetHiddenItemnumbers
-
+        GetHiddenItemnumbers
                DelItemCheck
                MoveItemFromBiblio 
                GetLatestAcquisitions
         CartToShelf
+
+       GetAnalyticsCount
+        GetItemHolds
     );
 }
 
@@ -397,6 +402,8 @@ Note that only columns that can be directly
 changed from the cataloging and serials
 item editors are included in this hash.
 
+Returns item record
+
 =cut
 
 my %default_values_for_mod_from_marc = (
@@ -446,7 +453,8 @@ sub ModItemFromMarc {
     }
     my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
 
-    return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
+    ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
+    return $item;
 }
 
 =head2 ModItem
@@ -495,6 +503,9 @@ sub ModItem {
     };
 
     $item->{'itemnumber'} = $itemnumber or return undef;
+
+    $item->{onloan} = undef if $item->{itemlost};
+
     _set_derived_columns_for_mod($item);
     _do_column_fixes_for_mod($item);
     # FIXME add checks
@@ -1176,7 +1187,7 @@ sub GetItemsInfo {
            itemtypes.notforloan as notforloan_per_itemtype,
            branchurl
      FROM items
-     LEFT JOIN branches ON items.homebranch = branches.branchcode
+     LEFT JOIN branches ON items.holdingbranch = branches.branchcode
      LEFT JOIN biblio      ON      biblio.biblionumber     = items.biblionumber
      LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
      LEFT JOIN itemtypes   ON   itemtypes.itemtype         = "
@@ -1395,6 +1406,46 @@ sub GetItemsLocationInfo {
        return @results;
 }
 
+=head2 GetHostItemsInfo
+
+       $hostiteminfo = GetHostItemsInfo($hostfield);
+       Returns the iteminfo for items linked to records via a host field
+
+=cut
+
+sub GetHostItemsInfo {
+       my ($record) = @_;
+       my @returnitemsInfo;
+
+       if (C4::Context->preference('marcflavour') eq 'MARC21' ||
+        C4::Context->preference('marcflavour') eq 'NORMARC'){
+           foreach my $hostfield ( $record->field('773') ) {
+               my $hostbiblionumber = $hostfield->subfield("0");
+               my $linkeditemnumber = $hostfield->subfield("9");
+               my @hostitemInfos = GetItemsInfo($hostbiblionumber);
+               foreach my $hostitemInfo (@hostitemInfos){
+                       if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){
+                               push (@returnitemsInfo,$hostitemInfo);
+                               last;
+                       }
+               }
+           }
+       } elsif ( C4::Context->preference('marcflavour') eq 'UNIMARC'){
+           foreach my $hostfield ( $record->field('461') ) {
+               my $hostbiblionumber = $hostfield->subfield("0");
+               my $linkeditemnumber = $hostfield->subfield("9");
+               my @hostitemInfos = GetItemsInfo($hostbiblionumber);
+               foreach my $hostitemInfo (@hostitemInfos){
+                       if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){
+                               push (@returnitemsInfo,$hostitemInfo);
+                               last;
+                       }
+               }
+           }
+       }
+       return @returnitemsInfo;
+}
+
 
 =head2 GetLastAcquisitions
 
@@ -1447,6 +1498,26 @@ sub  GetLastAcquisitions {
        return @results;
 }
 
+=head2 GetItemnumberForBiblio
+
+  my @itemnumbers = GetItemnumbersForBiblio($biblionumber);
+
+Given a single biblionumber, return an array of all the corresponding itemnumbers
+
+=cut
+
+sub GetItemnumbersForBiblio {
+    my $biblionumber = shift;
+    my @items;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?");
+    $sth->execute($biblionumber);
+    while (my $result = $sth->fetchrow_hashref) {
+        push @items, $result->{'itemnumber'};
+    }
+    return \@items;
+}
+
 =head2 get_itemnumbers_of
 
   my @itemnumbers_of = get_itemnumbers_of(@biblionumbers);
@@ -1482,6 +1553,53 @@ sub get_itemnumbers_of {
     return \%itemnumbers_of;
 }
 
+=head2 get_hostitemnumbers_of
+
+  my @itemnumbers_of = get_hostitemnumbers_of($biblionumber);
+
+Given a biblionumber, return the list of corresponding itemnumbers that are linked to it via host fields
+
+Return a reference on a hash where key is a biblionumber and values are
+references on array of itemnumbers.
+
+=cut
+
+
+sub get_hostitemnumbers_of {
+       my ($biblionumber) = @_;
+       my $marcrecord = GetMarcBiblio($biblionumber);
+        my (@returnhostitemnumbers,$tag, $biblio_s, $item_s);
+       
+       my $marcflavor = C4::Context->preference('marcflavour');
+       if ($marcflavor eq 'MARC21' || $marcflavor eq 'NORMARC') {
+        $tag='773';
+        $biblio_s='0';
+        $item_s='9';
+    } elsif ($marcflavor eq 'UNIMARC') {
+        $tag='461';
+        $biblio_s='0';
+        $item_s='9';
+    }
+
+    foreach my $hostfield ( $marcrecord->field($tag) ) {
+        my $hostbiblionumber = $hostfield->subfield($biblio_s);
+        my $linkeditemnumber = $hostfield->subfield($item_s);
+        my @itemnumbers;
+        if (my $itemnumbers = get_itemnumbers_of($hostbiblionumber)->{$hostbiblionumber})
+        {
+            @itemnumbers = @$itemnumbers;
+        }
+        foreach my $itemnumber (@itemnumbers){
+            if ($itemnumber eq $linkeditemnumber){
+                push (@returnhostitemnumbers,$itemnumber);
+                last;
+            }
+        }
+    }
+    return @returnhostitemnumbers;
+}
+
+
 =head2 GetItemnumberFromBarcode
 
   $result = GetItemnumberFromBarcode($barcode);
@@ -2094,35 +2212,39 @@ sub DelItemCheck {
     my ( $dbh, $biblionumber, $itemnumber ) = @_;
     my $error;
 
+        my $countanalytics=GetAnalyticsCount($itemnumber);
+
+
     # check that there is no issue on this item before deletion.
     my $sth=$dbh->prepare("select * from issues i where i.itemnumber=?");
     $sth->execute($itemnumber);
 
     my $item = GetItem($itemnumber);
-    my $onloan = $sth->fetchrow;
-    if ($onloan) {
-        $error = "book_on_loan";
+    my $onloan=$sth->fetchrow;
+
+    if ($onloan){
+        $error = "book_on_loan" 
     }
-    elsif (C4::Context->preference("IndependantBranches") and (C4::Context->userenv->{branch} ne $item->{C4::Context->preference("HomeOrHoldingBranch")||'homebranch'})){
+    elsif ( C4::Context->userenv->{flags} & 1 and
+            C4::Context->preference("IndependantBranches") and
+           (C4::Context->userenv->{branch} ne
+             $item->{C4::Context->preference("HomeOrHoldingBranch")||'homebranch'}) )
+    {
         $error = "not_same_branch";
-    } 
-    else {
-       if ($onloan){ 
-           $error = "book_on_loan" 
-       }
-       else {
-           # check it doesnt have a waiting reserve
-           $sth=$dbh->prepare("SELECT * FROM reserves WHERE (found = 'W' or found = 'T') AND itemnumber = ?");
-           $sth->execute($itemnumber);
-           my $reserve=$sth->fetchrow;
-           if ($reserve) {
-               $error = "book_reserved";
-           } 
-           else {
-               DelItem($dbh, $biblionumber, $itemnumber);
-               return 1;
-           }
-       }
+    }
+       else{
+        # check it doesnt have a waiting reserve
+        $sth=$dbh->prepare("SELECT * FROM reserves WHERE (found = 'W' or found = 'T') AND itemnumber = ?");
+        $sth->execute($itemnumber);
+        my $reserve=$sth->fetchrow;
+        if ($reserve){
+            $error = "book_reserved";
+        } elsif ($countanalytics > 0){
+               $error = "linked_analytics";
+       } else {
+            DelItem($dbh, $biblionumber, $itemnumber);
+            return 1;
+        }
     }
     return $error;
 }
@@ -2339,4 +2461,51 @@ sub  _parse_unlinked_item_subfields_from_xml {
     return $unlinked_subfields;
 }
 
+=head2 GetAnalyticsCount
+
+  $count= &GetAnalyticsCount($itemnumber)
+
+counts Usage of itemnumber in Analytical bibliorecords. 
+
+=cut
+
+sub GetAnalyticsCount {
+    my ($itemnumber) = @_;
+    if (C4::Context->preference('NoZebra')) {
+        # Read the index Koha-Auth-Number for this authid and count the lines
+        my $result = C4::Search::NZanalyse("hi=$itemnumber");
+        my @tab = split /;/,$result;
+        return scalar @tab;
+    } else {
+        ### ZOOM search here
+        my $query;
+        $query= "hi=".$itemnumber;
+                my ($err,$res,$result) = C4::Search::SimpleSearch($query,0,10);
+        return ($result);
+    }
+}
+
+=head2 GetItemHolds
+
+=over 4
+$holds = &GetItemHolds($biblionumber, $itemnumber);
+
+=back
+
+This function return the count of holds with $biblionumber and $itemnumber
+
+=cut
+
+sub GetItemHolds {
+    my ($biblionumber, $itemnumber) = @_;
+    my $holds;
+    my $dbh            = C4::Context->dbh;
+    my $query          = "SELECT count(*)
+        FROM  reserves
+        WHERE biblionumber=? AND itemnumber=?";
+    my $sth = $dbh->prepare($query);
+    $sth->execute($biblionumber, $itemnumber);
+    $holds = $sth->fetchrow;
+    return $holds;
+}
 1;