X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FItems.pm;h=c114e6363fcdfb44f79772e61d794122f0f1a50d;hb=98d8e1609af181fdfc05d748e27ac24f984b22e8;hp=59eaa6963614bf80a6d194b5c21219eeb8f88398;hpb=f84671dce925ef0f5127073520d35b480613e3c1;p=koha_fer
diff --git a/C4/Items.pm b/C4/Items.pm
index 59eaa69636..c114e6363f 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -29,10 +29,6 @@ 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 Data::Dumper; # used as part of logging item record changes, not just for
# debugging; so please don't remove this
@@ -40,7 +36,7 @@ use Data::Dumper; # used as part of logging item record changes, not just for
use vars qw($VERSION @ISA @EXPORT);
BEGIN {
- $VERSION = 3.01;
+ $VERSION = 3.07.00.049;
require Exporter;
@ISA = qw( Exporter );
@@ -52,7 +48,7 @@ BEGIN {
AddItem
AddItemBatchFromMarc
ModItemFromMarc
- Item2Marc
+ Item2Marc
ModItem
ModDateLastSeen
ModItemTransfer
@@ -76,13 +72,20 @@ BEGIN {
GetItemnumberFromBarcode
GetBarcodeFromItemnumber
GetHiddenItemnumbers
- DelItemCheck
- MoveItemFromBiblio
- GetLatestAcquisitions
+ DelItemCheck
+ MoveItemFromBiblio
+ GetLatestAcquisitions
+
CartToShelf
+ ShelfToCart
GetAnalyticsCount
GetItemHolds
+
+ SearchItems
+
+ PrepareItemrecordDisplay
+
);
}
@@ -189,7 +192,30 @@ sub CartToShelf {
}
my $item = GetItem($itemnumber);
- $item->{location} = $item->{permanent_location};
+ if ( $item->{location} eq 'CART' ) {
+ $item->{location} = $item->{permanent_location};
+ ModItem($item, undef, $itemnumber);
+ }
+}
+
+=head2 ShelfToCart
+
+ ShelfToCart($itemnumber);
+
+Set the current shelving location of the item
+to shelving cart ('CART').
+
+=cut
+
+sub ShelfToCart {
+ my ( $itemnumber ) = @_;
+
+ unless ( $itemnumber ) {
+ croak "FAILED ShelfToCart() - no itemnumber supplied";
+ }
+
+ my $item = GetItem($itemnumber);
+ $item->{'location'} = 'CART';
ModItem($item, undef, $itemnumber);
}
@@ -308,7 +334,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'.
@@ -328,6 +354,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",'');
@@ -459,8 +488,7 @@ sub ModItemFromMarc {
=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.
@@ -502,7 +530,7 @@ sub ModItem {
$item->{'more_subfields_xml'} = _get_unlinked_subfields_xml($unlinked_item_subfields);
};
- $item->{'itemnumber'} = $itemnumber or return undef;
+ $item->{'itemnumber'} = $itemnumber or return;
$item->{onloan} = undef if $item->{itemlost};
@@ -539,6 +567,9 @@ sub ModItemTransfer {
my $dbh = C4::Context->dbh;
+ # Remove the 'shelving cart' location status if it is being used.
+ CartToShelf( $itemnumber ) if ( C4::Context->preference("ReturnToShelvingCart") );
+
#new entry in branchtransfers....
my $sth = $dbh->prepare(
"INSERT INTO branchtransfers (itemnumber, frombranch, datesent, tobranch)
@@ -588,6 +619,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");
@@ -637,6 +669,7 @@ item that has a given branch code.
sub CheckItemPreSave {
my $item_ref = shift;
+ require C4::Branch;
my %errors = ();
@@ -653,7 +686,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
@@ -663,7 +696,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
@@ -903,7 +936,8 @@ sub GetLostItems {
my $dbh = C4::Context->dbh;
my $query = "
- SELECT *
+ SELECT title, author, lib, itemlost, authorised_value, barcode, datelastseen, price, replacementprice, homebranch,
+ itype, itemtype, holdingbranch, location, itemnotes, items.biblionumber as biblionumber
FROM items
LEFT JOIN biblio ON (items.biblionumber = biblio.biblionumber)
LEFT JOIN biblioitems ON (items.biblionumber = biblioitems.biblionumber)
@@ -1185,14 +1219,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.holdingbranch = 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.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
my $sth = $dbh->prepare($query);
$sth->execute($biblionumber);
my $i = 0;
@@ -1207,13 +1244,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;
@@ -1227,14 +1264,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 = ?
@@ -1245,76 +1274,21 @@ sub GetItemsInfo {
$data->{'branchname'} = $bdata->{'branchname'};
}
$data->{'datedue'} = $datedue;
- $data->{'count_reserves'} = $count_reserves;
# get notforloan complete status if applicable
- my $sthnflstatus = $dbh->prepare(
- 'SELECT authorised_value
- FROM marc_subfield_structure
- WHERE kohafield="items.notforloan"
- '
- );
-
- $sthnflstatus->execute;
- my ($authorised_valuecode) = $sthnflstatus->fetchrow;
- if ($authorised_valuecode) {
- $sthnflstatus = $dbh->prepare(
- "SELECT lib FROM authorised_values
- WHERE category=?
- AND authorised_value=?"
- );
- $sthnflstatus->execute( $authorised_valuecode,
- $data->{itemnotforloan} );
- my ($lib) = $sthnflstatus->fetchrow;
- $data->{notforloanvalue} = $lib;
+ if ( my $code = C4::Koha::GetAuthValCode( 'items.notforloan', $data->{frameworkcode} ) ) {
+ $data->{notforloanvalue} = C4::Koha::GetAuthorisedValueByCode( $code, $data->{itemnotforloan} );
}
# 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'};
- }
+ if ( my $code = C4::Koha::GetAuthValCode( 'items.restricted', $data->{frameworkcode} ) ) {
+ $data->{restricted} = C4::Koha::GetKohaAuthorisedValueLib( $code, $data->{restricted} );
+ $data->{restrictedopac} = C4::Koha::GetKohaAuthorisedValueLib( $code, $data->{restricted}, 'opac' );
}
# my stack procedures
- my $stackstatus = $dbh->prepare(
- 'SELECT authorised_value
- FROM marc_subfield_structure
- WHERE kohafield="items.stack"
- '
- );
- $stackstatus->execute;
-
- ($authorised_valuecode) = $stackstatus->fetchrow;
- if ($authorised_valuecode) {
- $stackstatus = $dbh->prepare(
- "SELECT lib
- FROM authorised_values
- WHERE category=?
- AND authorised_value=?
- "
- );
- $stackstatus->execute( $authorised_valuecode, $data->{stack} );
- my ($lib) = $stackstatus->fetchrow;
- $data->{stack} = $lib;
+ if ( my $code = C4::Koha::GetAuthValCode( 'items.stack', $data->{frameworkcode} ) ) {
+ $data->{stack} = C4::Koha::GetKohaAuthorisedValueLib( $code, $data->{stack} );
}
# Find the last 3 people who borrowed this item.
my $sth2 = $dbh->prepare("SELECT * FROM old_issues,borrowers
@@ -1498,11 +1472,11 @@ sub GetLastAcquisitions {
return @results;
}
-=head2 GetItemnumberForBiblio
+=head2 GetItemnumbersForBiblio
- my @itemnumbers = GetItemnumbersForBiblio($biblionumber);
+ my $itemnumbers = GetItemnumbersForBiblio($biblionumber);
-Given a single biblionumber, return an array of all the corresponding itemnumbers
+Given a single biblionumber, return an arrayref of all the corresponding itemnumbers
=cut
@@ -1649,41 +1623,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
@@ -2160,10 +2138,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 );
}
@@ -2189,11 +2172,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;
}
@@ -2225,7 +2209,7 @@ sub DelItemCheck {
if ($onloan){
$error = "book_on_loan"
}
- elsif ( C4::Context->userenv->{flags} & 1 and
+ elsif ( !(C4::Context->userenv->{flags} & 1) and
C4::Context->preference("IndependantBranches") and
(C4::Context->userenv->{branch} ne
$item->{C4::Context->preference("HomeOrHoldingBranch")||'homebranch'}) )
@@ -2309,7 +2293,7 @@ sub _koha_delete_item {
# delete from items table
$sth = $dbh->prepare("DELETE FROM items WHERE itemnumber=?");
$sth->execute($itemnum);
- return undef;
+ return;
}
=head2 _marc_from_item_hash
@@ -2448,9 +2432,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) {
@@ -2471,6 +2455,7 @@ counts Usage of itemnumber in Analytical bibliorecords.
sub GetAnalyticsCount {
my ($itemnumber) = @_;
+ require C4::Search;
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");
@@ -2508,4 +2493,309 @@ sub GetItemHolds {
$holds = $sth->fetchrow;
return $holds;
}
+
+# Return the list of the column names of items table
+sub _get_items_columns {
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->column_info(undef, undef, 'items', '%');
+ $sth->execute;
+ my $results = $sth->fetchall_hashref('COLUMN_NAME');
+ return keys %$results;
+}
+
+=head2 SearchItems
+
+ my $items = SearchItems($field, $value);
+
+SearchItems will search for items on a specific given field.
+For instance you can search all items with a specific stocknumber like this:
+
+ my $items = SearchItems('stocknumber', $stocknumber);
+
+=cut
+
+sub SearchItems {
+ my ($field, $value) = @_;
+
+ my $dbh = C4::Context->dbh;
+ my @columns = _get_items_columns;
+ my $results = [];
+ if(0 < grep /^$field$/, @columns) {
+ my $query = "SELECT $field FROM items WHERE $field = ?";
+ my $sth = $dbh->prepare( $query );
+ $sth->execute( $value );
+ $results = $sth->fetchall_arrayref({});
+ }
+ return $results;
+}
+
+
+=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; # make perlcritic happy :)
+ $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;