X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FItems.pm;h=d2936081c243daacbf6466af85bdf99744c705c3;hb=1b57668d7ee0447e799fc2c5cb386363c48083d9;hp=ee6bf3a7ff88eae8e42270bf68a3d4d88c764508;hpb=3b39195500ae82049d8ab1678a85d6755bf49d7e;p=koha_gimpoz diff --git a/C4/Items.pm b/C4/Items.pm index ee6bf3a7ff..d2936081c2 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -1,6 +1,7 @@ package C4::Items; # Copyright 2007 LibLime, Inc. +# Parts Copyright Biblibre 2010 # # This file is part of Koha. # @@ -118,11 +119,7 @@ of C =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 @@ -152,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'} ) { @@ -165,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 @@ -193,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. @@ -222,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. @@ -286,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. @@ -308,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 @@ -393,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 object containing an embedded item field. @@ -426,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, @@ -443,6 +420,7 @@ my %default_values_for_mod_from_marc = ( replacementpricedate => undef, restricted => undef, stack => undef, + stocknumber => undef, uri => undef, wthdrawn => 0, ); @@ -452,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. @@ -544,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. @@ -573,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 @@ -593,11 +560,7 @@ sub ModDateLastSeen { =head2 DelItem -=over 4 - -DelItem($dbh, $biblionumber, $itemnumber); - -=back + DelItem($dbh, $biblionumber, $itemnumber); Exported function (core API) for deleting an item record in Koha. @@ -634,8 +597,6 @@ sub DelItem { =head2 CheckItemPreSave -=over 4 - my $item_ref = TransformMarcToKoha($marc, 'items'); # do stuff my %errors = CheckItemPreSave($item_ref); @@ -649,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 @@ -733,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 field. @@ -752,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 - - - -=back + =cut @@ -833,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 field. @@ -850,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 - - - -=back + =cut @@ -931,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. @@ -959,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 @@ -1006,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. @@ -1026,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 ); @@ -1065,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 ) { @@ -1104,10 +1037,7 @@ END_SQL =head2 GetItemsCount -=over 4 -$count = &GetItemsCount( $biblionumber); - -=back + $count = &GetItemsCount( $biblionumber); This function return count of item with $biblionumber @@ -1127,11 +1057,7 @@ sub GetItemsCount { =head2 GetItemInfosOf -=over 4 - -GetItemInfosOf(@itemnumbers); - -=back + GetItemInfosOf(@itemnumbers); =cut @@ -1148,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 @@ -1204,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. @@ -1272,6 +1190,7 @@ sub GetItemsInfo { biblioitems.url, items.notforloan as itemnotforloan, itemtypes.description, + itemtypes.notforloan as notforloan_per_itemtype, branchurl FROM items LEFT JOIN branches ON items.homebranch = branches.branchcode @@ -1355,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( @@ -1406,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 @@ -1460,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. @@ -1499,11 +1435,7 @@ sub get_itemnumbers_of { =head2 GetItemnumberFromBarcode -=over 4 - -$result = GetItemnumberFromBarcode($barcode); - -=back + $result = GetItemnumberFromBarcode($barcode); =cut @@ -1520,11 +1452,7 @@ sub GetItemnumberFromBarcode { =head2 GetBarcodeFromItemnumber -=over 4 - -$result = GetBarcodeFromItemnumber($itemnumber); - -=back + $result = GetBarcodeFromItemnumber($itemnumber); =cut @@ -1541,12 +1469,11 @@ sub GetBarcodeFromItemnumber { =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, @@ -1562,7 +1489,7 @@ sub GetBarcodeFromItemnumber { '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 @@ -1592,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 @@ -1651,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, @@ -1742,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 @@ -1770,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 @@ -1821,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. @@ -1858,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 row specified by C<$itemnumber>. @@ -1886,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. @@ -1905,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 @@ -1950,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 table. @@ -2000,7 +1897,8 @@ sub _koha_new_item { uri = ?, enumchron = ?, more_subfields_xml = ?, - copynumber = ? + copynumber = ?, + stocknumber = ? "; my $sth = $dbh->prepare($query); $sth->execute( @@ -2037,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 ) { @@ -2047,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; @@ -2123,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. @@ -2141,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 row. Note that this routine accepts a hashref specifying the columns to update. @@ -2198,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 @@ -2233,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 object containing an embedded @@ -2265,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); } } @@ -2284,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 @@ -2311,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 @@ -2380,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 @@ -2414,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 @@ -2440,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