X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FItems.pm;h=52423a27d5153ec51ceb1ae213b7d3fa2813e73c;hb=bd1d643fadb1f867881ca455bb1709cfae54cd61;hp=bc36dd14bab8d46c448d8ae931daec66ff4f481e;hpb=2bb9904ab3379812e75c0fb5681e43ea530046af;p=koha_gimpoz diff --git a/C4/Items.pm b/C4/Items.pm index bc36dd14ba..52423a27d5 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -29,11 +29,8 @@ use C4::Dates qw/format_date format_date_in_iso/; use MARC::Record; use C4::ClassSource; use C4::Log; -use C4::Branch; -require C4::Reserves; -use C4::Charset; -use C4::Acquisition; use List::MoreUtils qw/any/; +use C4::Search; use Data::Dumper; # used as part of logging item record changes, not just for # debugging; so please don't remove this @@ -69,15 +66,24 @@ BEGIN { GetItemsByBiblioitemnumber GetItemsInfo GetItemsLocationInfo + GetHostItemsInfo + GetItemnumbersForBiblio get_itemnumbers_of + get_hostitemnumbers_of GetItemnumberFromBarcode GetBarcodeFromItemnumber - GetHiddenItemnumbers - + GetHiddenItemnumbers DelItemCheck MoveItemFromBiblio GetLatestAcquisitions CartToShelf + + GetAnalyticsCount + GetItemHolds + + + PrepareItemrecordDisplay + ); } @@ -303,7 +309,7 @@ Sequence number of original item tag in the MARC record. Item barcode, provide to assist in the construction of useful error messages. -=item error_condition +=item error_code Code representing the error condition. Can be 'duplicate_barcode', 'invalid_homebranch', or 'invalid_holdingbranch'. @@ -323,6 +329,9 @@ sub AddItemBatchFromMarc { my @errors = (); my $dbh = C4::Context->dbh; + # We modify the record, so lets work on a clone so we don't change the + # original. + $record = $record->clone(); # loop through the item tags and start creating items my @bad_item_fields = (); my ($itemtag, $itemsubfield) = &GetMarcFromKohaField("items.itemnumber",''); @@ -397,6 +406,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,13 +457,13 @@ 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 - ModItem({ column => $newvalue }, $biblionumber, - $itemnumber[, $original_item_marc]); + ModItem({ column => $newvalue }, $biblionumber, $itemnumber); Change one or more columns in an item record and update the MARC representation of the item. @@ -495,6 +506,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 @@ -577,6 +591,7 @@ sub DelItem { # backup the record my $copy2deleted = $dbh->prepare("UPDATE deleteditems SET marc=? WHERE itemnumber=?"); $copy2deleted->execute( $record->as_usmarc(), $itemnumber ); + # This last update statement makes that the timestamp column in deleteditems is updated too. If you remove these lines, please add a line to update the timestamp separately. See Bugzilla report 7146 and Biblio.pm (DelBiblio). #search item field code logaction("CATALOGUING", "DELETE", $itemnumber, "item") if C4::Context->preference("CataloguingLog"); @@ -626,6 +641,7 @@ item that has a given branch code. sub CheckItemPreSave { my $item_ref = shift; + require C4::Branch; my %errors = (); @@ -642,7 +658,7 @@ sub CheckItemPreSave { # check for valid home branch if (exists $item_ref->{'homebranch'} and defined $item_ref->{'homebranch'}) { - my $branch_name = GetBranchName($item_ref->{'homebranch'}); + my $branch_name = C4::Branch::GetBranchName($item_ref->{'homebranch'}); unless (defined $branch_name) { # relies on fact that branches.branchname is a non-NULL column, # so GetBranchName returns undef only if branch does not exist @@ -652,7 +668,7 @@ sub CheckItemPreSave { # check for valid holding branch if (exists $item_ref->{'holdingbranch'} and defined $item_ref->{'holdingbranch'}) { - my $branch_name = GetBranchName($item_ref->{'holdingbranch'}); + my $branch_name = C4::Branch::GetBranchName($item_ref->{'holdingbranch'}); unless (defined $branch_name) { # relies on fact that branches.branchname is a non-NULL column, # so GetBranchName returns undef only if branch does not exist @@ -1174,14 +1190,17 @@ sub GetItemsInfo { items.notforloan as itemnotforloan, itemtypes.description, itemtypes.notforloan as notforloan_per_itemtype, - branchurl + holding.branchurl, + holding.branchname, + holding.opac_info as branch_opac_info FROM items - LEFT JOIN branches ON items.homebranch = branches.branchcode + LEFT JOIN branches AS holding ON items.holdingbranch = holding.branchcode + LEFT JOIN branches AS home ON items.homebranch=home.branchcode LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber LEFT JOIN itemtypes ON itemtypes.itemtype = " . (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype'); - $query .= " WHERE items.biblionumber = ? ORDER BY branches.branchname,items.dateaccessioned desc" ; + $query .= " WHERE items.biblionumber = ? ORDER BY home.branchname,items.dateaccessioned desc" ; my $sth = $dbh->prepare($query); $sth->execute($biblionumber); my $i = 0; @@ -1196,13 +1215,13 @@ sub GetItemsInfo { my $ssth = $dbh->prepare("SELECT serialseq,publisheddate from serialitems left join serial on serialitems.serialid=serial.serialid where serialitems.itemnumber=? "); while ( my $data = $sth->fetchrow_hashref ) { my $datedue = ''; - my $count_reserves; $isth->execute( $data->{'itemnumber'} ); if ( my $idata = $isth->fetchrow_hashref ) { $data->{borrowernumber} = $idata->{borrowernumber}; $data->{cardnumber} = $idata->{cardnumber}; $data->{surname} = $idata->{surname}; $data->{firstname} = $idata->{firstname}; + $data->{lastreneweddate} = $idata->{lastreneweddate}; $datedue = $idata->{'date_due'}; if (C4::Context->preference("IndependantBranches")){ my $userenv = C4::Context->userenv; @@ -1216,14 +1235,6 @@ sub GetItemsInfo { ($data->{'serialseq'} , $data->{'publisheddate'}) = $ssth->fetchrow_array(); $serial = 1; } - if ( $datedue eq '' ) { - my ( $restype, $reserves ) = - C4::Reserves::CheckReserves( $data->{'itemnumber'} ); -# Previous conditional check with if ($restype) is not needed because a true -# result for one item will result in subsequent items defaulting to this true -# value. - $count_reserves = $restype; - } #get branch information..... my $bsth = $dbh->prepare( "SELECT * FROM branches WHERE branchcode = ? @@ -1234,7 +1245,6 @@ sub GetItemsInfo { $data->{'branchname'} = $bdata->{'branchname'}; } $data->{'datedue'} = $datedue; - $data->{'count_reserves'} = $count_reserves; # get notforloan complete status if applicable my $sthnflstatus = $dbh->prepare( @@ -1395,6 +1405,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 +1497,26 @@ sub GetLastAcquisitions { return @results; } +=head2 GetItemnumbersForBiblio + + my $itemnumbers = GetItemnumbersForBiblio($biblionumber); + +Given a single biblionumber, return an arrayref 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 +1552,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); @@ -1531,41 +1648,45 @@ sub GetHiddenItemnumbers { my @resultitems; my $yaml = C4::Context->preference('OpacHiddenItems'); + $yaml = "$yaml\n\n"; # YAML is anal on ending \n. Surplus does not hurt my $hidingrules; eval { - $hidingrules = YAML::Load($yaml); + $hidingrules = YAML::Load($yaml); }; if ($@) { - warn "Unable to parse OpacHiddenItems syspref : $@"; - return (); - } else { + warn "Unable to parse OpacHiddenItems syspref : $@"; + return (); + } my $dbh = C4::Context->dbh; - # For each item - foreach my $item (@items) { + # 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; + # We check each rule + foreach my $field (keys %$hidingrules) { + my $val; + if (exists $item->{$field}) { + $val = $item->{$field}; + } + else { + my $query = "SELECT $field from items where itemnumber = ?"; + $val = $dbh->selectrow_array($query, undef, $item->{'itemnumber'}); + } + $val = '' unless defined $val; - # If the results matches the values in the yaml file - if (any { $result eq $_ } @{$hidingrules->{$field}}) { + # If the results matches the values in the yaml file + if (any { $val eq $_ } @{$hidingrules->{$field}}) { - # We add the itemnumber to the list - push @resultitems, $item->{'itemnumber'}; + # 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; + # If at least one rule matched for an item, no need to test the others + last; + } + } } - - } + return @resultitems; +} =head3 get_item_authorised_values @@ -1971,9 +2092,9 @@ sub _koha_new_item { homebranch = ?, price = ?, replacementprice = ?, - replacementpricedate = NOW(), + replacementpricedate = ?, datelastborrowed = ?, - datelastseen = NOW(), + datelastseen = ?, stack = ?, notforloan = ?, damaged = ?, @@ -2002,6 +2123,7 @@ sub _koha_new_item { stocknumber = ? "; my $sth = $dbh->prepare($query); + my $today = C4::Dates->today('iso'); $sth->execute( $item->{'biblionumber'}, $item->{'biblioitemnumber'}, @@ -2011,7 +2133,9 @@ sub _koha_new_item { $item->{'homebranch'}, $item->{'price'}, $item->{'replacementprice'}, + $item->{'replacementpricedate'} || $today, $item->{datelastborrowed}, + $item->{datelastseen} || $today, $item->{stack}, $item->{'notforloan'}, $item->{'damaged'}, @@ -2039,10 +2163,15 @@ sub _koha_new_item { $item->{'copynumber'}, $item->{'stocknumber'}, ); - my $itemnumber = $dbh->{'mysql_insertid'}; + + my $itemnumber; if ( defined $sth->errstr ) { $error.="ERROR in _koha_new_item $query".$sth->errstr; } + else { + $itemnumber = $dbh->{'mysql_insertid'}; + } + return ( $itemnumber, $error ); } @@ -2068,11 +2197,12 @@ sub MoveItemFromBiblio { ModZebra( $tobiblio, "specialUpdate", "biblioserver", undef, undef ); ModZebra( $frombiblio, "specialUpdate", "biblioserver", undef, undef ); # Checking if the item we want to move is in an order - my $order = GetOrderFromItemnumber($itemnumber); + require C4::Acquisition; + my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber); if ($order) { # Replacing the biblionumber within the order if necessary $order->{'biblionumber'} = $tobiblio; - ModOrder($order); + C4::Acquisition::ModOrder($order); } return $tobiblio; } @@ -2091,35 +2221,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; } @@ -2323,9 +2457,9 @@ sub _get_unlinked_subfields_xml { sub _parse_unlinked_item_subfields_from_xml { my $xml = shift; - + require C4::Charset; return unless defined $xml and $xml ne ""; - my $marc = MARC::Record->new_from_xml(StripNonXmlChars($xml),'UTF-8'); + my $marc = MARC::Record->new_from_xml(C4::Charset::StripNonXmlChars($xml),'UTF-8'); my $unlinked_subfields = []; my @fields = $marc->fields(); if ($#fields > -1) { @@ -2336,4 +2470,316 @@ 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; +} +=head1 OTHER FUNCTIONS + +=head2 _find_value + + ($indicators, $value) = _find_value($tag, $subfield, $record,$encoding); + +Find the given $subfield in the given $tag in the given +MARC::Record $record. If the subfield is found, returns +the (indicators, value) pair; otherwise, (undef, undef) is +returned. + +PROPOSITION : +Such a function is used in addbiblio AND additem and serial-edit and maybe could be used in Authorities. +I suggest we export it from this module. + +=cut + +sub _find_value { + my ( $tagfield, $insubfield, $record, $encoding ) = @_; + my @result; + my $indicator; + if ( $tagfield < 10 ) { + if ( $record->field($tagfield) ) { + push @result, $record->field($tagfield)->data(); + } else { + push @result, ""; + } + } else { + foreach my $field ( $record->field($tagfield) ) { + my @subfields = $field->subfields(); + foreach my $subfield (@subfields) { + if ( @$subfield[0] eq $insubfield ) { + push @result, @$subfield[1]; + $indicator = $field->indicator(1) . $field->indicator(2); + } + } + } + } + return ( $indicator, @result ); +} + + +=head2 PrepareItemrecordDisplay + + PrepareItemrecordDisplay($itemrecord,$bibnum,$itemumber,$frameworkcode); + +Returns a hash with all the fields for Display a given item data in a template + +The $frameworkcode returns the item for the given frameworkcode, ONLY if bibnum is not provided + +=cut + +sub PrepareItemrecordDisplay { + + my ( $bibnum, $itemnum, $defaultvalues, $frameworkcode ) = @_; + + my $dbh = C4::Context->dbh; + $frameworkcode = &GetFrameworkCode($bibnum) if $bibnum; + my ( $itemtagfield, $itemtagsubfield ) = &GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); + my $tagslib = &GetMarcStructure( 1, $frameworkcode ); + + # return nothing if we don't have found an existing framework. + return q{} unless $tagslib; + my $itemrecord; + if ($itemnum) { + $itemrecord = C4::Items::GetMarcItem( $bibnum, $itemnum ); + } + my @loop_data; + my $authorised_values_sth = $dbh->prepare( "SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib" ); + foreach my $tag ( sort keys %{$tagslib} ) { + my $previous_tag = ''; + if ( $tag ne '' ) { + + # loop through each subfield + my $cntsubf; + foreach my $subfield ( sort keys %{ $tagslib->{$tag} } ) { + next if ( subfield_is_koha_internal_p($subfield) ); + next if ( $tagslib->{$tag}->{$subfield}->{'tab'} ne "10" ); + my %subfield_data; + $subfield_data{tag} = $tag; + $subfield_data{subfield} = $subfield; + $subfield_data{countsubfield} = $cntsubf++; + $subfield_data{kohafield} = $tagslib->{$tag}->{$subfield}->{'kohafield'}; + $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".int(rand(1000000)); + + # $subfield_data{marc_lib}=$tagslib->{$tag}->{$subfield}->{lib}; + $subfield_data{marc_lib} = $tagslib->{$tag}->{$subfield}->{lib}; + $subfield_data{mandatory} = $tagslib->{$tag}->{$subfield}->{mandatory}; + $subfield_data{repeatable} = $tagslib->{$tag}->{$subfield}->{repeatable}; + $subfield_data{hidden} = "display:none" + if $tagslib->{$tag}->{$subfield}->{hidden}; + my ( $x, $defaultvalue ); + if ($itemrecord) { + ( $x, $defaultvalue ) = _find_value( $tag, $subfield, $itemrecord ); + } + $defaultvalue = $tagslib->{$tag}->{$subfield}->{defaultvalue} unless $defaultvalue; + if ( !defined $defaultvalue ) { + $defaultvalue = q||; + } + $defaultvalue =~ s/"/"/g; + + # search for itemcallnumber if applicable + if ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' + && C4::Context->preference('itemcallnumber') ) { + my $CNtag = substr( C4::Context->preference('itemcallnumber'), 0, 3 ); + my $CNsubfield = substr( C4::Context->preference('itemcallnumber'), 3, 1 ); + if ($itemrecord) { + my $temp = $itemrecord->field($CNtag); + if ($temp) { + $defaultvalue = $temp->subfield($CNsubfield); + } + } + } + if ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' + && $defaultvalues + && $defaultvalues->{'callnumber'} ) { + my $temp; + if ($itemrecord) { + $temp = $itemrecord->field($subfield); + } + unless ($temp) { + $defaultvalue = $defaultvalues->{'callnumber'} if $defaultvalues; + } + } + if ( ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.holdingbranch' || $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.homebranch' ) + && $defaultvalues + && $defaultvalues->{'branchcode'} ) { + my $temp; + if ($itemrecord) { + $temp = $itemrecord->field($subfield); + } + unless ($temp) { + $defaultvalue = $defaultvalues->{branchcode} if $defaultvalues; + } + } + if ( ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.location' ) + && $defaultvalues + && $defaultvalues->{'location'} ) { + my $temp = $itemrecord->field($subfield) if ($itemrecord); + unless ($temp) { + $defaultvalue = $defaultvalues->{location} if $defaultvalues; + } + } + if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) { + my @authorised_values; + my %authorised_lib; + + # builds list, depending on authorised value... + #---- branch + if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { + if ( ( C4::Context->preference("IndependantBranches") ) + && ( C4::Context->userenv->{flags} % 2 != 1 ) ) { + my $sth = $dbh->prepare( "SELECT branchcode,branchname FROM branches WHERE branchcode = ? ORDER BY branchname" ); + $sth->execute( C4::Context->userenv->{branch} ); + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + while ( my ( $branchcode, $branchname ) = $sth->fetchrow_array ) { + push @authorised_values, $branchcode; + $authorised_lib{$branchcode} = $branchname; + } + } else { + my $sth = $dbh->prepare( "SELECT branchcode,branchname FROM branches ORDER BY branchname" ); + $sth->execute; + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + while ( my ( $branchcode, $branchname ) = $sth->fetchrow_array ) { + push @authorised_values, $branchcode; + $authorised_lib{$branchcode} = $branchname; + } + } + + #----- itemtypes + } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { + my $sth = $dbh->prepare( "SELECT itemtype,description FROM itemtypes ORDER BY description" ); + $sth->execute; + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { + push @authorised_values, $itemtype; + $authorised_lib{$itemtype} = $description; + } + #---- class_sources + } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { + push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + + my $class_sources = GetClassSources(); + my $default_source = C4::Context->preference("DefaultClassificationSource"); + + foreach my $class_source (sort keys %$class_sources) { + next unless $class_sources->{$class_source}->{'used'} or + ($class_source eq $default_source); + push @authorised_values, $class_source; + $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'}; + } + + #---- "true" authorised value + } else { + $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value} ); + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { + push @authorised_values, $value; + $authorised_lib{$value} = $lib; + } + } + $subfield_data{marc_value} = CGI::scrolling_list( + -name => 'field_value', + -values => \@authorised_values, + -default => "$defaultvalue", + -labels => \%authorised_lib, + -size => 1, + -tabindex => '', + -multiple => 0, + ); + } elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { + # opening plugin + my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; + if (do $plugin) { + my $temp; + my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, undef ); + my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, undef ); + $subfield_data{random} = int(rand(1000000)); # why do we need 2 different randoms? + $subfield_data{marc_value} = qq[ + ... + $javascript]; + } else { + warn "Plugin Failed: $plugin"; + $subfield_data{marc_value} = qq(); # supply default input form + } + } + elsif ( $tag eq '' ) { # it's an hidden field + $subfield_data{marc_value} = qq(); + } + elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ? + $subfield_data{marc_value} = qq(); + } + elsif ( length($defaultvalue) > 100 + or (C4::Context->preference("marcflavour") eq "UNIMARC" and + 300 <= $tag && $tag < 400 && $subfield eq 'a' ) + or (C4::Context->preference("marcflavour") eq "MARC21" and + 500 <= $tag && $tag < 600 ) + ) { + # oversize field (textarea) + $subfield_data{marc_value} = qq(\n"); + } else { + $subfield_data{marc_value} = ""; + } + push( @loop_data, \%subfield_data ); + } + } + } + my $itemnumber; + if ( $itemrecord && $itemrecord->field($itemtagfield) ) { + $itemnumber = $itemrecord->subfield( $itemtagfield, $itemtagsubfield ); + } + return { + 'itemtagfield' => $itemtagfield, + 'itemtagsubfield' => $itemtagsubfield, + 'itemnumber' => $itemnumber, + 'iteminformation' => \@loop_data + }; +} + 1;