Bug 5928 follow up patch catching missing sysprefs
[koha.git] / C4 / Items.pm
index 7a6182d..d293608 100644 (file)
@@ -1,6 +1,7 @@
 package C4::Items;
 
 # Copyright 2007 LibLime, Inc.
+# Parts Copyright Biblibre 2010
 #
 # This file is part of Koha.
 #
@@ -13,11 +14,12 @@ package C4::Items;
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
+#use warnings; FIXME - Bug 2505
 
 use Carp;
 use C4::Context;
@@ -65,6 +67,7 @@ BEGIN {
         GetItemsInfo
         get_itemnumbers_of
         GetItemnumberFromBarcode
+        GetBarcodeFromItemnumber
 
                DelItemCheck
                MoveItemFromBiblio 
@@ -116,11 +119,7 @@ of C<C4::Items>
 
 =head2 GetItem
 
-=over 4
-
-$item = GetItem($itemnumber,$barcode,$serial);
-
-=back
+  $item = GetItem($itemnumber,$barcode,$serial);
 
 Return item information, for a given itemnumber or barcode.
 The return value is a hashref mapping item column
@@ -150,7 +149,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'} ) {
@@ -163,11 +161,7 @@ sub GetItem {
 
 =head2 CartToShelf
 
-=over 4
-
-CartToShelf($itemnumber);
-
-=back
+  CartToShelf($itemnumber);
 
 Set the current shelving location of the item record
 to its stored permanent shelving location.  This is
@@ -191,12 +185,8 @@ sub CartToShelf {
 
 =head2 AddItemFromMarc
 
-=over 4
-
-my ($biblionumber, $biblioitemnumber, $itemnumber) 
-    = AddItemFromMarc($source_item_marc, $biblionumber);
-
-=back
+  my ($biblionumber, $biblioitemnumber, $itemnumber) 
+      = AddItemFromMarc($source_item_marc, $biblionumber);
 
 Given a MARC::Record object containing an embedded item
 record and a biblionumber, create a new item record.
@@ -220,12 +210,8 @@ sub AddItemFromMarc {
 
 =head2 AddItem
 
-=over 4
-
-my ($biblionumber, $biblioitemnumber, $itemnumber) 
-    = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
-
-=back
+  my ($biblionumber, $biblioitemnumber, $itemnumber) 
+      = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
 
 Given a hash containing item column names as keys,
 create a new Koha item record.
@@ -284,11 +270,8 @@ sub AddItem {
 
 =head2 AddItemBatchFromMarc
 
-=over 4
-
-($itemnumber_ref, $error_ref) = AddItemBatchFromMarc($record, $biblionumber, $biblioitemnumber, $frameworkcode);
-
-=back
+  ($itemnumber_ref, $error_ref) = AddItemBatchFromMarc($record, 
+             $biblionumber, $biblioitemnumber, $frameworkcode);
 
 Efficiently create item records from a MARC biblio record with
 embedded item fields.  This routine is suitable for batch jobs.
@@ -306,7 +289,7 @@ This function returns an arrayref of new itemsnumbers and an arrayref of item
 errors encountered during the processing.  Each entry in the errors
 list is a hashref containing the following keys:
 
-=over 2
+=over
 
 =item item_sequence
 
@@ -391,11 +374,7 @@ sub AddItemBatchFromMarc {
 
 =head2 ModItemFromMarc
 
-=over 4
-
-ModItemFromMarc($item_marc, $biblionumber, $itemnumber);
-
-=back
+  ModItemFromMarc($item_marc, $biblionumber, $itemnumber);
 
 This function updates an item record based on a supplied
 C<MARC::Record> object containing an embedded item field.
@@ -424,7 +403,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, 
@@ -441,6 +420,7 @@ my %default_values_for_mod_from_marc = (
     replacementpricedate => undef, 
     restricted           => undef, 
     stack                => undef, 
+    stocknumber          => undef, 
     uri                  => undef, 
     wthdrawn             => 0,
 );
@@ -450,28 +430,25 @@ 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); 
 }
 
 =head2 ModItem
 
-=over 4
-
-ModItem({ column => $newvalue }, $biblionumber, $itemnumber[, $original_item_marc]);
-
-=back
+  ModItem({ column => $newvalue }, $biblionumber, 
+                  $itemnumber[, $original_item_marc]);
 
 Change one or more columns in an item record and update
 the MARC representation of the item.
@@ -542,11 +519,7 @@ sub ModItem {
 
 =head2 ModItemTransfer
 
-=over 4
-
-ModItemTransfer($itenumber, $frombranch, $tobranch);
-
-=back
+  ModItemTransfer($itenumber, $frombranch, $tobranch);
 
 Marks an item as being transferred from one branch
 to another.
@@ -571,11 +544,7 @@ sub ModItemTransfer {
 
 =head2 ModDateLastSeen
 
-=over 4
-
-ModDateLastSeen($itemnum);
-
-=back
+  ModDateLastSeen($itemnum);
 
 Mark item as seen. Is called when an item is issued, returned or manually marked during inventory/stocktaking.
 C<$itemnum> is the item number
@@ -591,11 +560,7 @@ sub ModDateLastSeen {
 
 =head2 DelItem
 
-=over 4
-
-DelItem($biblionumber, $itemnumber);
-
-=back
+  DelItem($dbh, $biblionumber, $itemnumber);
 
 Exported function (core API) for deleting an item record in Koha.
 
@@ -632,8 +597,6 @@ sub DelItem {
 
 =head2 CheckItemPreSave
 
-=over 4
-
     my $item_ref = TransformMarcToKoha($marc, 'items');
     # do stuff
     my %errors = CheckItemPreSave($item_ref);
@@ -647,8 +610,6 @@ sub DelItem {
         print "item is OK";
     }
 
-=back
-
 Given a hashref containing item fields, determine if it can be
 inserted or updated in the database.  Specifically, checks for
 database integrity issues, and returns a hash containing any
@@ -731,11 +692,7 @@ has copy-and-paste work.
 
 =head2 GetItemStatus
 
-=over 4
-
-$itemstatushash = GetItemStatus($fwkcode);
-
-=back
+  $itemstatushash = GetItemStatus($fwkcode);
 
 Returns a list of valid values for the
 C<items.notforloan> field.
@@ -750,32 +707,24 @@ Create a status selector with the following code
 
 =head3 in PERL SCRIPT
 
-=over 4
-
-my $itemstatushash = getitemstatus;
-my @itemstatusloop;
-foreach my $thisstatus (keys %$itemstatushash) {
-    my %row =(value => $thisstatus,
-                statusname => $itemstatushash->{$thisstatus}->{'statusname'},
-            );
-    push @itemstatusloop, \%row;
-}
-$template->param(statusloop=>\@itemstatusloop);
-
-=back
+ my $itemstatushash = getitemstatus;
+ my @itemstatusloop;
+ foreach my $thisstatus (keys %$itemstatushash) {
+     my %row =(value => $thisstatus,
+                 statusname => $itemstatushash->{$thisstatus}->{'statusname'},
+             );
+     push @itemstatusloop, \%row;
+ }
+ $template->param(statusloop=>\@itemstatusloop);
 
 =head3 in TEMPLATE
 
-=over 4
-
-<select name="statusloop">
-    <option value="">Default</option>
-<!-- TMPL_LOOP name="statusloop" -->
-    <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="statusname" --></option>
-<!-- /TMPL_LOOP -->
-</select>
-
-=back
+ <select name="statusloop">
+     <option value="">Default</option>
+ <!-- TMPL_LOOP name="statusloop" -->
+     <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="statusname" --></option>
+ <!-- /TMPL_LOOP -->
+ </select>
 
 =cut
 
@@ -831,11 +780,7 @@ sub GetItemStatus {
 
 =head2 GetItemLocation
 
-=over 4
-
-$itemlochash = GetItemLocation($fwk);
-
-=back
+  $itemlochash = GetItemLocation($fwk);
 
 Returns a list of valid values for the
 C<items.location> field.
@@ -848,34 +793,26 @@ Create a location selector with the following code
 
 =head3 in PERL SCRIPT
 
-=over 4
-
-my $itemlochash = getitemlocation;
-my @itemlocloop;
-foreach my $thisloc (keys %$itemlochash) {
-    my $selected = 1 if $thisbranch eq $branch;
-    my %row =(locval => $thisloc,
-                selected => $selected,
-                locname => $itemlochash->{$thisloc},
-            );
-    push @itemlocloop, \%row;
-}
-$template->param(itemlocationloop => \@itemlocloop);
-
-=back
+  my $itemlochash = getitemlocation;
+  my @itemlocloop;
+  foreach my $thisloc (keys %$itemlochash) {
+      my $selected = 1 if $thisbranch eq $branch;
+      my %row =(locval => $thisloc,
+                  selected => $selected,
+                  locname => $itemlochash->{$thisloc},
+               );
+      push @itemlocloop, \%row;
+  }
+  $template->param(itemlocationloop => \@itemlocloop);
 
 =head3 in TEMPLATE
 
-=over 4
-
-<select name="location">
-    <option value="">Default</option>
-<!-- TMPL_LOOP name="itemlocationloop" -->
-    <option value="<!-- TMPL_VAR name="locval" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="locname" --></option>
-<!-- /TMPL_LOOP -->
-</select>
-
-=back
+  <select name="location">
+      <option value="">Default</option>
+  <!-- TMPL_LOOP name="itemlocationloop" -->
+      <option value="<!-- TMPL_VAR name="locval" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="locname" --></option>
+  <!-- /TMPL_LOOP -->
+  </select>
 
 =cut
 
@@ -929,11 +866,7 @@ sub GetItemLocation {
 
 =head2 GetLostItems
 
-=over 4
-
-$items = GetLostItems( $where, $orderby );
-
-=back
+  $items = GetLostItems( $where, $orderby );
 
 This function gets a list of lost items.
 
@@ -957,9 +890,9 @@ from the "items" table as keys.
 
 =item usage in the perl script:
 
-my $where = { barcode => '0001548' };
-my $items = GetLostItems( $where, "homebranch" );
-$template->param( itemsloop => $items );
+  my $where = { barcode => '0001548' };
+  my $items = GetLostItems( $where, "homebranch" );
+  $template->param( itemsloop => $items );
 
 =back
 
@@ -1004,11 +937,9 @@ sub GetLostItems {
 
 =head2 GetItemsForInventory
 
-=over 4
-
-$itemlist = GetItemsForInventory($minlocation, $maxlocation, $location, $itemtype $datelastseen, $branch, $offset, $size, $statushash);
-
-=back
+  $itemlist = GetItemsForInventory($minlocation, $maxlocation, 
+                 $location, $itemtype $datelastseen, $branch, 
+                 $offset, $size, $statushash);
 
 Retrieve a list of title/authors/barcode/callnumber, for biblio inventory.
 
@@ -1024,7 +955,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 );
 
@@ -1063,10 +994,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 ) {
@@ -1102,10 +1037,7 @@ END_SQL
 
 =head2 GetItemsCount
 
-=over 4
-$count = &GetItemsCount( $biblionumber);
-
-=back
+  $count = &GetItemsCount( $biblionumber);
 
 This function return count of item with $biblionumber
 
@@ -1125,11 +1057,7 @@ sub GetItemsCount {
 
 =head2 GetItemInfosOf
 
-=over 4
-
-GetItemInfosOf(@itemnumbers);
-
-=back
+  GetItemInfosOf(@itemnumbers);
 
 =cut
 
@@ -1146,11 +1074,7 @@ sub GetItemInfosOf {
 
 =head2 GetItemsByBiblioitemnumber
 
-=over 4
-
-GetItemsByBiblioitemnumber($biblioitemnumber);
-
-=back
+  GetItemsByBiblioitemnumber($biblioitemnumber);
 
 Returns an arrayref of hashrefs suitable for use in a TMPL_LOOP
 Called by C<C4::XISBN>
@@ -1202,11 +1126,7 @@ sub GetItemsByBiblioitemnumber {
 
 =head2 GetItemsInfo
 
-=over 4
-
-@results = GetItemsInfo($biblionumber, $type);
-
-=back
+  @results = GetItemsInfo($biblionumber, $type);
 
 Returns information about books with the given biblionumber.
 
@@ -1269,7 +1189,9 @@ sub GetItemsInfo {
            biblioitems.lccn,
            biblioitems.url,
            items.notforloan as itemnotforloan,
-           itemtypes.description
+           itemtypes.description,
+           itemtypes.notforloan as notforloan_per_itemtype,
+           branchurl
      FROM items
      LEFT JOIN branches ON items.homebranch = branches.branchcode
      LEFT JOIN biblio      ON      biblio.biblionumber     = items.biblionumber
@@ -1352,7 +1274,31 @@ sub GetItemsInfo {
             my ($lib) = $sthnflstatus->fetchrow;
             $data->{notforloanvalue} = $lib;
         }
-               $data->{itypenotforloan} = $data->{notforloan} if (C4::Context->preference('item-level_itypes'));
+
+        # 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(
@@ -1403,11 +1349,8 @@ sub GetItemsInfo {
 
 =head2 GetLastAcquisitions
 
-=over 4
-
-my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), 'itemtypes' => ('BK','BD')}, 10);
-
-=back
+  my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), 
+                                    'itemtypes' => ('BK','BD')}, 10);
 
 =cut
 
@@ -1457,11 +1400,7 @@ sub  GetLastAcquisitions {
 
 =head2 get_itemnumbers_of
 
-=over 4
-
-my @itemnumbers_of = get_itemnumbers_of(@biblionumbers);
-
-=back
+  my @itemnumbers_of = get_itemnumbers_of(@biblionumbers);
 
 Given a list of biblionumbers, return the list of corresponding itemnumbers
 for each biblionumber.
@@ -1496,11 +1435,7 @@ sub get_itemnumbers_of {
 
 =head2 GetItemnumberFromBarcode
 
-=over 4
-
-$result = GetItemnumberFromBarcode($barcode);
-
-=back
+  $result = GetItemnumberFromBarcode($barcode);
 
 =cut
 
@@ -1515,14 +1450,30 @@ sub GetItemnumberFromBarcode {
     return ($result);
 }
 
+=head2 GetBarcodeFromItemnumber
+
+  $result = GetBarcodeFromItemnumber($itemnumber);
+
+=cut
+
+sub GetBarcodeFromItemnumber {
+    my ($itemnumber) = @_;
+    my $dbh = C4::Context->dbh;
+
+    my $rq =
+      $dbh->prepare("SELECT barcode FROM items WHERE items.itemnumber=?");
+    $rq->execute($itemnumber);
+    my ($result) = $rq->fetchrow;
+    return ($result);
+}
+
 =head3 get_item_authorised_values
 
-  find the types and values for all authorised values assigned to this item.
+find the types and values for all authorised values assigned to this item.
 
-  parameters:
-    itemnumber
+parameters: itemnumber
 
-  returns: a hashref malling the authorised value to the value set for this itemnumber
+returns: a hashref malling the authorised value to the value set for this itemnumber
 
     $authorised_values = {
              'CCODE'      => undef,
@@ -1538,7 +1489,7 @@ sub GetItemnumberFromBarcode {
              'itemtypes'  => 'SER',
            };
 
-   Notes: see C4::Biblio::get_biblio_authorised_values for a similar method at the biblio level.
+Notes: see C4::Biblio::get_biblio_authorised_values for a similar method at the biblio level.
 
 =cut
 
@@ -1568,25 +1519,24 @@ sub get_item_authorised_values {
 
 =head3 get_authorised_value_images
 
-  find a list of icons that are appropriate for display based on the
-  authorised values for a biblio.
+find a list of icons that are appropriate for display based on the
+authorised values for a biblio.
 
-  parameters: listref of authorised values, such as comes from
-    get_item_authorised_values or
-    from C4::Biblio::get_biblio_authorised_values
+parameters: listref of authorised values, such as comes from
+get_item_authorised_values or
+from C4::Biblio::get_biblio_authorised_values
 
-  returns: listref of hashrefs for each image. Each hashref looks like
-    this:
+returns: listref of hashrefs for each image. Each hashref looks like this:
 
       { imageurl => '/intranet-tmpl/prog/img/itemtypeimg/npl/WEB.gif',
         label    => '',
         category => '',
         value    => '', }
 
-  Notes: Currently, I put on the full path to the images on the staff
-  side. This should either be configurable or not done at all. Since I
-  have to deal with 'intranet' or 'opac' in
-  get_biblio_authorised_values, perhaps I should be passing it in.
+Notes: Currently, I put on the full path to the images on the staff
+side. This should either be configurable or not done at all. Since I
+have to deal with 'intranet' or 'opac' in
+get_biblio_authorised_values, perhaps I should be passing it in.
 
 =cut
 
@@ -1627,11 +1577,7 @@ without careful thought.
 
 =head2 GetMarcItem
 
-=over 4
-
-my $item_marc = GetMarcItem($biblionumber, $itemnumber);
-
-=back
+  my $item_marc = GetMarcItem($biblionumber, $itemnumber);
 
 Returns MARC::Record of the item passed in parameter.
 This function is meant for use only in C<cataloguing/additem.pl>,
@@ -1718,11 +1664,7 @@ my %derived_columns = (
 
 =head2 _set_derived_columns_for_add 
 
-=over 4
-
-_set_derived_column_for_add($item);
-
-=back
+  _set_derived_column_for_add($item);
 
 Given an item hash representing a new item to be added,
 calculate any derived columns.  Currently the only
@@ -1746,11 +1688,7 @@ sub _set_derived_columns_for_add {
 
 =head2 _set_derived_columns_for_mod 
 
-=over 4
-
-_set_derived_column_for_mod($item);
-
-=back
+  _set_derived_column_for_mod($item);
 
 Given an item hash representing a new item to be modified.
 calculate any derived columns.  Currently the only
@@ -1797,11 +1735,7 @@ sub _set_derived_columns_for_mod {
 
 =head2 _do_column_fixes_for_mod
 
-=over 4
-
-_do_column_fixes_for_mod($item);
-
-=back
+  _do_column_fixes_for_mod($item);
 
 Given an item hashref containing one or more
 columns to modify, fix up certain values.
@@ -1834,15 +1768,14 @@ 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
 
-=over 4
-
-_get_single_item_column($column, $itemnumber);
-
-=back
+  _get_single_item_column($column, $itemnumber);
 
 Retrieves the value of a single column from an C<items>
 row specified by C<$itemnumber>.
@@ -1862,11 +1795,7 @@ sub _get_single_item_column {
 
 =head2 _calc_items_cn_sort
 
-=over 4
-
-_calc_items_cn_sort($item, $source_values);
-
-=back
+  _calc_items_cn_sort($item, $source_values);
 
 Helper routine to calculate C<items.cn_sort>.
 
@@ -1881,11 +1810,7 @@ sub _calc_items_cn_sort {
 
 =head2 _set_defaults_for_add 
 
-=over 4
-
-_set_defaults_for_add($item_hash);
-
-=back
+  _set_defaults_for_add($item_hash);
 
 Given an item hash representing an item to be added, set
 correct default values for columns whose default value
@@ -1926,11 +1851,7 @@ sub _set_defaults_for_add {
 
 =head2 _koha_new_item
 
-=over 4
-
-my ($itemnumber,$error) = _koha_new_item( $item, $barcode );
-
-=back
+  my ($itemnumber,$error) = _koha_new_item( $item, $barcode );
 
 Perform the actual insert into the C<items> table.
 
@@ -1976,7 +1897,8 @@ sub _koha_new_item {
             uri = ?,
             enumchron           = ?,
             more_subfields_xml  = ?,
-            copynumber          = ?
+            copynumber          = ?,
+            stocknumber         = ?
           ";
     my $sth = $dbh->prepare($query);
    $sth->execute(
@@ -2013,6 +1935,7 @@ sub _koha_new_item {
             $item->{'enumchron'},
             $item->{'more_subfields_xml'},
             $item->{'copynumber'},
+            $item->{'stocknumber'},
     );
     my $itemnumber = $dbh->{'mysql_insertid'};
     if ( defined $sth->errstr ) {
@@ -2023,16 +1946,14 @@ sub _koha_new_item {
 
 =head2 MoveItemFromBiblio
 
-=over 4
-
-MoveItemFromBiblio($itenumber, $frombiblio, $tobiblio);
-
-=back
+  MoveItemFromBiblio($itenumber, $frombiblio, $tobiblio);
 
 Moves an item from a biblio to another
 
 Returns undef if the move failed or the biblionumber of the destination record otherwise
+
 =cut
+
 sub MoveItemFromBiblio {
     my ($itemnumber, $frombiblio, $tobiblio) = @_;
     my $dbh = C4::Context->dbh;
@@ -2099,11 +2020,7 @@ sub MoveItemFromBiblio {
 
 =head2 DelItemCheck
 
-=over 4
-
-DelItemCheck($dbh, $biblionumber, $itemnumber);
-
-=back
+   DelItemCheck($dbh, $biblionumber, $itemnumber);
 
 Exported function (core API) for deleting an item record in Koha if there no current issue.
 
@@ -2117,32 +2034,38 @@ 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;
 }
 
 =head2 _koha_modify_item
 
-=over 4
-
-my ($itemnumber,$error) =_koha_modify_item( $item );
-
-=back
+  my ($itemnumber,$error) =_koha_modify_item( $item );
 
 Perform the actual update of the C<items> row.  Note that this
 routine accepts a hashref specifying the columns to update.
@@ -2174,11 +2097,7 @@ sub _koha_modify_item {
 
 =head2 _koha_delete_item
 
-=over 4
-
-_koha_delete_item( $dbh, $itemnum );
-
-=back
+  _koha_delete_item( $dbh, $itemnum );
 
 Internal function to delete an item record from the koha tables
 
@@ -2209,11 +2128,7 @@ sub _koha_delete_item {
 
 =head2 _marc_from_item_hash
 
-=over 4
-
-my $item_marc = _marc_from_item_hash($item, $frameworkcode[, $unlinked_item_subfields]);
-
-=back
+  my $item_marc = _marc_from_item_hash($item, $frameworkcode[, $unlinked_item_subfields]);
 
 Given an item hash representing a complete item record,
 create a C<MARC::Record> object containing an embedded
@@ -2241,17 +2156,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);
         }
     }
 
@@ -2260,11 +2178,7 @@ sub _marc_from_item_hash {
 
 =head2 _add_item_field_to_biblio
 
-=over 4
-
-_add_item_field_to_biblio($item_marc, $biblionumber, $frameworkcode);
-
-=back
+  _add_item_field_to_biblio($item_marc, $biblionumber, $frameworkcode);
 
 Adds the fields from a MARC record containing the
 representation of a Koha item record to the MARC
@@ -2287,11 +2201,7 @@ sub _add_item_field_to_biblio {
 
 =head2 _replace_item_field_in_biblio
 
-=over
-
-&_replace_item_field_in_biblio($item_marc, $biblionumber, $itemnumber, $frameworkcode)
-
-=back
+  &_replace_item_field_in_biblio($item_marc, $biblionumber, $itemnumber, $frameworkcode)
 
 Given a MARC::Record C<$item_marc> containing one tag with the MARC 
 representation of the item, examine the biblio MARC
@@ -2356,11 +2266,7 @@ sub _repack_item_errors {
 
 =head2 _get_unlinked_item_subfields
 
-=over 4
-
-my $unlinked_item_subfields = _get_unlinked_item_subfields($original_item_marc, $frameworkcode);
-
-=back
+  my $unlinked_item_subfields = _get_unlinked_item_subfields($original_item_marc, $frameworkcode);
 
 =cut
 
@@ -2390,11 +2296,7 @@ sub _get_unlinked_item_subfields {
 
 =head2 _get_unlinked_subfields_xml
 
-=over 4
-
-my $unlinked_subfields_xml = _get_unlinked_subfields_xml($unlinked_item_subfields);
-
-=back
+  my $unlinked_subfields_xml = _get_unlinked_subfields_xml($unlinked_item_subfields);
 
 =cut
 
@@ -2416,11 +2318,7 @@ sub _get_unlinked_subfields_xml {
 
 =head2 _parse_unlinked_item_subfields_from_xml
 
-=over 4
-
-my $unlinked_item_subfields = _parse_unlinked_item_subfields_from_xml($whole_item->{'more_subfields_xml'}):
-
-=back
+  my $unlinked_item_subfields = _parse_unlinked_item_subfields_from_xml($whole_item->{'more_subfields_xml'}):
 
 =cut