Bug 6154: Default sorting by title doesn't work
[koha_fer] / C4 / Items.pm
index 96f60f0..01509c2 100644 (file)
@@ -1,6 +1,7 @@
 package C4::Items;
 
 # Copyright 2007 LibLime, Inc.
+# Parts Copyright Biblibre 2010
 #
 # This file is part of Koha.
 #
@@ -32,6 +33,7 @@ use C4::Branch;
 require C4::Reserves;
 use C4::Charset;
 use C4::Acquisition;
+use List::MoreUtils qw/any/;
 
 use vars qw($VERSION @ISA @EXPORT);
 
@@ -64,9 +66,11 @@ BEGIN {
         GetItemInfosOf
         GetItemsByBiblioitemnumber
         GetItemsInfo
+       GetItemsLocationInfo
         get_itemnumbers_of
         GetItemnumberFromBarcode
         GetBarcodeFromItemnumber
+      GetHiddenItemnumbers
 
                DelItemCheck
                MoveItemFromBiblio 
@@ -148,7 +152,6 @@ sub GetItem {
     my $ssth = $dbh->prepare("SELECT serialseq,publisheddate from serialitems left join serial on serialitems.serialid=serial.serialid where serialitems.itemnumber=?");
         $ssth->execute($data->{'itemnumber'}) ;
         ($data->{'serialseq'} , $data->{'publisheddate'}) = $ssth->fetchrow_array();
-               warn $data->{'serialseq'} , $data->{'publisheddate'};
     }
        #if we don't have an items.itype, use biblioitems.itemtype.
        if( ! $data->{'itype'} ) {
@@ -403,7 +406,7 @@ my %default_values_for_mod_from_marc = (
     'items.cn_source'    => undef, 
     copynumber           => undef, 
     damaged              => 0,
-    dateaccessioned      => undef, 
+#    dateaccessioned      => undef,
     enumchron            => undef, 
     holdingbranch        => undef, 
     homebranch           => undef, 
@@ -430,18 +433,18 @@ sub ModItemFromMarc {
     my $biblionumber = shift;
     my $itemnumber = shift;
 
-    my $dbh = C4::Context->dbh;
-    my $frameworkcode = GetFrameworkCode( $biblionumber );
-       my ($itemtag,$itemsubfield)=GetMarcFromKohaField("items.itemnumber",$frameworkcode);
-       
-       my $localitemmarc=MARC::Record->new;
-       $localitemmarc->append_fields($item_marc->field($itemtag));
-    my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode, 'items');
-    foreach my $item_field (keys %default_values_for_mod_from_marc) {
-        $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless exists $item->{$item_field};
+    my $dbh           = C4::Context->dbh;
+    my $frameworkcode = GetFrameworkCode($biblionumber);
+    my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
+
+    my $localitemmarc = MARC::Record->new;
+    $localitemmarc->append_fields( $item_marc->field($itemtag) );
+    my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode, 'items' );
+    foreach my $item_field ( keys %default_values_for_mod_from_marc ) {
+        $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless (exists $item->{$item_field});
     }
-    my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode);
-   
+    my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
+
     return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
 }
 
@@ -955,7 +958,7 @@ $statushash requires a hashref that has the authorized values fieldname (intems.
 =cut
 
 sub GetItemsForInventory {
-    my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branch, $offset, $size, $statushash ) = @_;
+    my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branchcode, $branch, $offset, $size, $statushash ) = @_;
     my $dbh = C4::Context->dbh;
     my ( @bind_params, @where_strings );
 
@@ -994,10 +997,14 @@ END_SQL
         push @where_strings, 'items.location = ?';
         push @bind_params, $location;
     }
-    
-    if ( $branch ) {
+
+    if ( $branchcode ) {
+        if($branch eq "homebranch"){
         push @where_strings, 'items.homebranch = ?';
-        push @bind_params, $branch;
+        }else{
+            push @where_strings, 'items.holdingbranch = ?';
+        }
+        push @bind_params, $branchcode;
     }
     
     if ( $itemtype ) {
@@ -1271,6 +1278,31 @@ sub GetItemsInfo {
             $data->{notforloanvalue} = $lib;
         }
 
+        # get restricted status and description if applicable
+        my $restrictedstatus = $dbh->prepare(
+            'SELECT authorised_value
+            FROM   marc_subfield_structure
+            WHERE  kohafield="items.restricted"
+        '
+        );
+
+        $restrictedstatus->execute;
+        ($authorised_valuecode) = $restrictedstatus->fetchrow;
+        if ($authorised_valuecode) {
+            $restrictedstatus = $dbh->prepare(
+                "SELECT lib,lib_opac FROM authorised_values
+                 WHERE  category=?
+                 AND authorised_value=?"
+            );
+            $restrictedstatus->execute( $authorised_valuecode,
+                $data->{restricted} );
+
+            if ( my $rstdata = $restrictedstatus->fetchrow_hashref ) {
+                $data->{restricted} = $rstdata->{'lib'};
+                $data->{restrictedopac} = $rstdata->{'lib_opac'};
+            }
+        }
+
         # my stack procedures
         my $stackstatus = $dbh->prepare(
             'SELECT authorised_value
@@ -1318,6 +1350,72 @@ sub GetItemsInfo {
        }
 }
 
+=head2 GetItemsLocationInfo
+
+  my @itemlocinfo = GetItemsLocationInfo($biblionumber);
+
+Returns the branch names, shelving location and itemcallnumber for each item attached to the biblio in question
+
+C<GetItemsInfo> returns a list of references-to-hash. Data returned:
+
+=over 2
+
+=item C<$data-E<gt>{homebranch}>
+
+Branch Name of the item's homebranch
+
+=item C<$data-E<gt>{holdingbranch}>
+
+Branch Name of the item's holdingbranch
+
+=item C<$data-E<gt>{location}>
+
+Item's shelving location code
+
+=item C<$data-E<gt>{location_intranet}>
+
+The intranet description for the Shelving Location as set in authorised_values 'LOC'
+
+=item C<$data-E<gt>{location_opac}>
+
+The OPAC description for the Shelving Location as set in authorised_values 'LOC'.  Falls back to intranet description if no OPAC 
+description is set.
+
+=item C<$data-E<gt>{itemcallnumber}>
+
+Item's itemcallnumber
+
+=item C<$data-E<gt>{cn_sort}>
+
+Item's call number normalized for sorting
+
+=back
+  
+=cut
+
+sub GetItemsLocationInfo {
+        my $biblionumber = shift;
+        my @results;
+
+       my $dbh = C4::Context->dbh;
+       my $query = "SELECT a.branchname as homebranch, b.branchname as holdingbranch, 
+                           location, itemcallnumber, cn_sort
+                    FROM items, branches as a, branches as b
+                    WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode 
+                    AND biblionumber = ?
+                    ORDER BY cn_sort ASC";
+       my $sth = $dbh->prepare($query);
+        $sth->execute($biblionumber);
+
+        while ( my $data = $sth->fetchrow_hashref ) {
+             $data->{location_intranet} = GetKohaAuthorisedValueLib('LOC', $data->{location});
+             $data->{location_opac}= GetKohaAuthorisedValueLib('LOC', $data->{location}, 1);
+            push @results, $data;
+       }
+       return @results;
+}
+
+
 =head2 GetLastAcquisitions
 
   my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), 
@@ -1438,6 +1536,57 @@ sub GetBarcodeFromItemnumber {
     return ($result);
 }
 
+=head2 GetHiddenItemnumbers
+
+=over 4
+
+$result = GetHiddenItemnumbers(@items);
+
+=back
+
+=cut
+
+sub GetHiddenItemnumbers {
+    my (@items) = @_;
+    my @resultitems;
+
+    my $yaml = C4::Context->preference('OpacHiddenItems');
+    my $hidingrules;
+    eval {
+       $hidingrules = YAML::Load($yaml);
+    };
+    if ($@) {
+       warn "Unable to parse OpacHiddenItems syspref : $@";
+       return ();
+    } else {
+    my $dbh = C4::Context->dbh;
+
+       # For each item
+       foreach my $item (@items) {
+
+           # We check each rule
+           foreach my $field (keys %$hidingrules) {
+               my $query = "SELECT $field from items where itemnumber = ?";
+               my $sth = $dbh->prepare($query);        
+               $sth->execute($item->{'itemnumber'});
+               my ($result) = $sth->fetchrow;
+
+               # If the results matches the values in the yaml file
+               if (any { $result eq $_ } @{$hidingrules->{$field}}) {
+
+                   # We add the itemnumber to the list
+                   push @resultitems, $item->{'itemnumber'};       
+
+                   # If at least one rule matched for an item, no need to test the others
+                   last;
+               }
+           }
+       }
+       return @resultitems;
+    }
+
+ }
+
 =head3 get_item_authorised_values
 
 find the types and values for all authorised values assigned to this item.
@@ -1739,6 +1888,9 @@ sub _do_column_fixes_for_mod {
     if (exists $item->{'location'} && !exists $item->{'permanent_location'}) {
         $item->{'permanent_location'} = $item->{'location'};
     }
+    if (exists $item->{'timestamp'}) {
+        delete $item->{'timestamp'};
+    }
 }
 
 =head2 _get_single_item_column
@@ -1865,7 +2017,8 @@ sub _koha_new_item {
             uri = ?,
             enumchron           = ?,
             more_subfields_xml  = ?,
-            copynumber          = ?
+            copynumber          = ?,
+            stocknumber         = ?
           ";
     my $sth = $dbh->prepare($query);
    $sth->execute(
@@ -1902,6 +2055,7 @@ sub _koha_new_item {
             $item->{'enumchron'},
             $item->{'more_subfields_xml'},
             $item->{'copynumber'},
+            $item->{'stocknumber'},
     );
     my $itemnumber = $dbh->{'mysql_insertid'};
     if ( defined $sth->errstr ) {
@@ -2000,21 +2154,31 @@ sub DelItemCheck {
     my $sth=$dbh->prepare("select * from issues i where i.itemnumber=?");
     $sth->execute($itemnumber);
 
-    my $onloan=$sth->fetchrow;
-
-    if ($onloan){
-        $error = "book_on_loan" 
-    }else{
-        # check it doesnt have a waiting reserve
-        $sth=$dbh->prepare("SELECT * FROM reserves WHERE found = 'W' AND itemnumber = ?");
-        $sth->execute($itemnumber);
-        my $reserve=$sth->fetchrow;
-        if ($reserve){
-            $error = "book_reserved";
-        }else{
-            DelItem($dbh, $biblionumber, $itemnumber);
-            return 1;
-        }
+    my $item = GetItem($itemnumber);
+    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'})){
+        $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;
+           }
+       }
     }
     return $error;
 }
@@ -2112,17 +2276,20 @@ sub _marc_from_item_hash {
                                 : ()  } keys %{ $item } }; 
 
     my $item_marc = MARC::Record->new();
-    foreach my $item_field (keys %{ $mungeditem }) {
-        my ($tag, $subfield) = GetMarcFromKohaField($item_field, $frameworkcode);
-        next unless defined $tag and defined $subfield; # skip if not mapped to MARC field
-        if (my $field = $item_marc->field($tag)) {
-            $field->add_subfields($subfield => $mungeditem->{$item_field});
-        } else {
-            my $add_subfields = [];
-            if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) {
-                $add_subfields = $unlinked_item_subfields;
+    foreach my $item_field ( keys %{$mungeditem} ) {
+        my ( $tag, $subfield ) = GetMarcFromKohaField( $item_field, $frameworkcode );
+        next unless defined $tag and defined $subfield;    # skip if not mapped to MARC field
+        my @values = split(/\s?\|\s?/, $mungeditem->{$item_field}, -1);
+        foreach my $value (@values){
+            if ( my $field = $item_marc->field($tag) ) {
+                    $field->add_subfields( $subfield => $value );
+            } else {
+                my $add_subfields = [];
+                if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) {
+                    $add_subfields = $unlinked_item_subfields;
+            }
+            $item_marc->add_fields( $tag, " ", " ", $subfield => $value, @$add_subfields );
             }
-            $item_marc->add_fields( $tag, " ", " ", $subfield =>  $mungeditem->{$item_field}, @$add_subfields);
         }
     }