Merge remote-tracking branch 'origin/new/bug_6875'
This commit is contained in:
commit
f7a525fa09
344
C4/Biblio.pm
344
C4/Biblio.pm
|
|
@ -27,7 +27,6 @@ use Carp;
|
|||
use MARC::Record;
|
||||
use MARC::File::USMARC;
|
||||
use MARC::File::XML;
|
||||
use ZOOM;
|
||||
use POSIX qw(strftime);
|
||||
|
||||
use C4::Koha;
|
||||
|
|
@ -35,9 +34,6 @@ use C4::Dates qw/format_date/;
|
|||
use C4::Log; # logaction
|
||||
use C4::ClassSource;
|
||||
use C4::Charset;
|
||||
require C4::Heading;
|
||||
require C4::Serials;
|
||||
require C4::Items;
|
||||
|
||||
use vars qw($VERSION @ISA @EXPORT);
|
||||
|
||||
|
|
@ -131,7 +127,6 @@ BEGIN {
|
|||
&TransformHtmlToMarc2
|
||||
&TransformHtmlToMarc
|
||||
&TransformHtmlToXml
|
||||
&PrepareItemrecordDisplay
|
||||
&GetNoZebraIndexes
|
||||
);
|
||||
}
|
||||
|
|
@ -418,9 +413,10 @@ sub DelBiblio {
|
|||
return $error if $error;
|
||||
|
||||
# We delete attached subscriptions
|
||||
my $subscriptions = &C4::Serials::GetFullSubscriptionsFromBiblionumber($biblionumber);
|
||||
require C4::Serials;
|
||||
my $subscriptions = C4::Serials::GetFullSubscriptionsFromBiblionumber($biblionumber);
|
||||
foreach my $subscription (@$subscriptions) {
|
||||
&C4::Serials::DelSubscription( $subscription->{subscriptionid} );
|
||||
C4::Serials::DelSubscription( $subscription->{subscriptionid} );
|
||||
}
|
||||
|
||||
# Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio
|
||||
|
|
@ -478,6 +474,7 @@ MARC record.
|
|||
=cut
|
||||
|
||||
sub LinkBibHeadingsToAuthorities {
|
||||
require C4::Heading;
|
||||
my $bib = shift;
|
||||
|
||||
my $num_headings_changed = 0;
|
||||
|
|
@ -2450,232 +2447,6 @@ sub TransformMarcToKohaOneField {
|
|||
return $result;
|
||||
}
|
||||
|
||||
=head1 OTHER FUNCTIONS
|
||||
|
||||
|
||||
=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{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?
|
||||
my $index_subfield = int(rand(1000000));
|
||||
$subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
|
||||
$subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255"
|
||||
onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
|
||||
onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
|
||||
<a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
|
||||
$javascript];
|
||||
} else {
|
||||
warn "Plugin Failed: $plugin";
|
||||
$subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" />); # supply default input form
|
||||
}
|
||||
}
|
||||
elsif ( $tag eq '' ) { # it's an hidden field
|
||||
$subfield_data{marc_value} = qq(<input type="hidden" tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />);
|
||||
}
|
||||
elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ?
|
||||
$subfield_data{marc_value} = qq(<input type="text" tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />);
|
||||
}
|
||||
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(<textarea tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255">$defaultvalue</textarea>\n");
|
||||
} else {
|
||||
$subfield_data{marc_value} = "<input type=\"text\" name=\"field_value\" value=\"$defaultvalue\" size=\"50\" maxlength=\"255\" />";
|
||||
}
|
||||
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
|
||||
};
|
||||
}
|
||||
|
||||
#"
|
||||
|
||||
|
|
@ -2839,6 +2610,7 @@ sub EmbedItemsInMarcBiblio {
|
|||
my @item_fields;
|
||||
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
|
||||
while (my ($itemnumber) = $sth->fetchrow_array) {
|
||||
require C4::Items;
|
||||
my $item_marc = C4::Items::GetMarcItem($biblionumber, $itemnumber);
|
||||
push @item_fields, $item_marc->field($itemtag);
|
||||
}
|
||||
|
|
@ -3632,112 +3404,6 @@ sub ModBiblioMarc {
|
|||
return $biblionumber;
|
||||
}
|
||||
|
||||
=head2 z3950_extended_services
|
||||
|
||||
z3950_extended_services($serviceType,$serviceOptions,$record);
|
||||
|
||||
z3950_extended_services is used to handle all interactions with Zebra's extended serices package, which is employed to perform all management of the MARC data stored in Zebra.
|
||||
|
||||
C<$serviceType> one of: itemorder,create,drop,commit,update,xmlupdate
|
||||
|
||||
C<$serviceOptions> a has of key/value pairs. For instance, if service_type is 'update', $service_options should contain:
|
||||
|
||||
action => update action, one of specialUpdate, recordInsert, recordReplace, recordDelete, elementUpdate.
|
||||
|
||||
and maybe
|
||||
|
||||
recordidOpaque => Opaque Record ID (user supplied) or recordidNumber => Record ID number (system number).
|
||||
syntax => the record syntax (transfer syntax)
|
||||
databaseName = Database from connection object
|
||||
|
||||
To set serviceOptions, call set_service_options($serviceType)
|
||||
|
||||
C<$record> the record, if one is needed for the service type
|
||||
|
||||
A record should be in XML. You can convert it to XML from MARC by running it through marc2xml().
|
||||
|
||||
=cut
|
||||
|
||||
sub z3950_extended_services {
|
||||
my ( $server, $serviceType, $action, $serviceOptions ) = @_;
|
||||
|
||||
# get our connection object
|
||||
my $Zconn = C4::Context->Zconn( $server, 0, 1 );
|
||||
|
||||
# create a new package object
|
||||
my $Zpackage = $Zconn->package();
|
||||
|
||||
# set our options
|
||||
$Zpackage->option( action => $action );
|
||||
|
||||
if ( $serviceOptions->{'databaseName'} ) {
|
||||
$Zpackage->option( databaseName => $serviceOptions->{'databaseName'} );
|
||||
}
|
||||
if ( $serviceOptions->{'recordIdNumber'} ) {
|
||||
$Zpackage->option( recordIdNumber => $serviceOptions->{'recordIdNumber'} );
|
||||
}
|
||||
if ( $serviceOptions->{'recordIdOpaque'} ) {
|
||||
$Zpackage->option( recordIdOpaque => $serviceOptions->{'recordIdOpaque'} );
|
||||
}
|
||||
|
||||
# this is an ILL request (Zebra doesn't support it, but Koha could eventually)
|
||||
#if ($serviceType eq 'itemorder') {
|
||||
# $Zpackage->option('contact-name' => $serviceOptions->{'contact-name'});
|
||||
# $Zpackage->option('contact-phone' => $serviceOptions->{'contact-phone'});
|
||||
# $Zpackage->option('contact-email' => $serviceOptions->{'contact-email'});
|
||||
# $Zpackage->option('itemorder-item' => $serviceOptions->{'itemorder-item'});
|
||||
#}
|
||||
|
||||
if ( $serviceOptions->{record} ) {
|
||||
$Zpackage->option( record => $serviceOptions->{record} );
|
||||
|
||||
# can be xml or marc
|
||||
if ( $serviceOptions->{'syntax'} ) {
|
||||
$Zpackage->option( syntax => $serviceOptions->{'syntax'} );
|
||||
}
|
||||
}
|
||||
|
||||
# send the request, handle any exception encountered
|
||||
eval { $Zpackage->send($serviceType) };
|
||||
if ( $@ && $@->isa("ZOOM::Exception") ) {
|
||||
return "error: " . $@->code() . " " . $@->message() . "\n";
|
||||
}
|
||||
|
||||
# free up package resources
|
||||
$Zpackage->destroy();
|
||||
}
|
||||
|
||||
=head2 set_service_options
|
||||
|
||||
my $serviceOptions = set_service_options($serviceType);
|
||||
|
||||
C<$serviceType> itemorder,create,drop,commit,update,xmlupdate
|
||||
|
||||
Currently, we only support 'create', 'commit', and 'update'. 'drop' support will be added as soon as Zebra supports it.
|
||||
|
||||
=cut
|
||||
|
||||
sub set_service_options {
|
||||
my ($serviceType) = @_;
|
||||
my $serviceOptions;
|
||||
|
||||
# FIXME: This needs to be an OID ... if we ever need 'syntax' this sub will need to change
|
||||
# $serviceOptions->{ 'syntax' } = ''; #zebra doesn't support syntaxes other than xml
|
||||
|
||||
if ( $serviceType eq 'commit' ) {
|
||||
|
||||
# nothing to do
|
||||
}
|
||||
if ( $serviceType eq 'create' ) {
|
||||
|
||||
# nothing to do
|
||||
}
|
||||
if ( $serviceType eq 'drop' ) {
|
||||
die "ERROR: 'drop' not currently supported (by Zebra)";
|
||||
}
|
||||
return $serviceOptions;
|
||||
}
|
||||
|
||||
=head2 get_biblio_authorised_values
|
||||
|
||||
find the types and values for all authorised values assigned to this biblio.
|
||||
|
|
|
|||
255
C4/Items.pm
255
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
|
||||
|
|
@ -82,6 +78,10 @@ BEGIN {
|
|||
|
||||
GetAnalyticsCount
|
||||
GetItemHolds
|
||||
|
||||
|
||||
PrepareItemrecordDisplay
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -636,6 +636,7 @@ item that has a given branch code.
|
|||
|
||||
sub CheckItemPreSave {
|
||||
my $item_ref = shift;
|
||||
require C4::Branch;
|
||||
|
||||
my %errors = ();
|
||||
|
||||
|
|
@ -1206,7 +1207,6 @@ 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};
|
||||
|
|
@ -1226,14 +1226,6 @@ sub GetItemsInfo {
|
|||
$ssth->execute($data->{'itemnumber'}) ;
|
||||
($data->{'serialseq'} , $data->{'publisheddate'}) = $ssth->fetchrow_array();
|
||||
$serial = 1;
|
||||
}
|
||||
if ( $datedue eq '' ) {
|
||||
my ( $restype, $reserves, undef ) =
|
||||
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(
|
||||
|
|
@ -1245,7 +1237,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(
|
||||
|
|
@ -2178,11 +2169,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;
|
||||
}
|
||||
|
|
@ -2437,9 +2429,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) {
|
||||
|
|
@ -2497,4 +2489,231 @@ sub GetItemHolds {
|
|||
$holds = $sth->fetchrow;
|
||||
return $holds;
|
||||
}
|
||||
=head1 OTHER FUNCTIONS
|
||||
|
||||
|
||||
=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{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?
|
||||
my $index_subfield = int(rand(1000000));
|
||||
$subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
|
||||
$subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255"
|
||||
onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
|
||||
onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
|
||||
<a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
|
||||
$javascript];
|
||||
} else {
|
||||
warn "Plugin Failed: $plugin";
|
||||
$subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" />); # supply default input form
|
||||
}
|
||||
}
|
||||
elsif ( $tag eq '' ) { # it's an hidden field
|
||||
$subfield_data{marc_value} = qq(<input type="hidden" tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />);
|
||||
}
|
||||
elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ?
|
||||
$subfield_data{marc_value} = qq(<input type="text" tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />);
|
||||
}
|
||||
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(<textarea tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255">$defaultvalue</textarea>\n");
|
||||
} else {
|
||||
$subfield_data{marc_value} = "<input type=\"text\" name=\"field_value\" value=\"$defaultvalue\" size=\"50\" maxlength=\"255\" />";
|
||||
}
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -225,13 +225,14 @@ sub GetSerialInformation {
|
|||
my $queryitem = $dbh->prepare("SELECT itemnumber from serialitems where serialid=?");
|
||||
$queryitem->execute($serialid);
|
||||
my $itemnumbers = $queryitem->fetchall_arrayref( [0] );
|
||||
require C4::Items;
|
||||
if ( scalar(@$itemnumbers) > 0 ) {
|
||||
foreach my $itemnum (@$itemnumbers) {
|
||||
|
||||
#It is ASSUMED that GetMarcItem ALWAYS WORK...
|
||||
#Maybe GetMarcItem should return values on failure
|
||||
$debug and warn "itemnumber :$itemnum->[0], bibnum :" . $data->{'biblionumber'};
|
||||
my $itemprocessed = PrepareItemrecordDisplay( $data->{'biblionumber'}, $itemnum->[0], $data );
|
||||
my $itemprocessed = C4::Items::PrepareItemrecordDisplay( $data->{'biblionumber'}, $itemnum->[0], $data );
|
||||
$itemprocessed->{'itemnumber'} = $itemnum->[0];
|
||||
$itemprocessed->{'itemid'} = $itemnum->[0];
|
||||
$itemprocessed->{'serialid'} = $serialid;
|
||||
|
|
@ -239,7 +240,7 @@ sub GetSerialInformation {
|
|||
push @{ $data->{'items'} }, $itemprocessed;
|
||||
}
|
||||
} else {
|
||||
my $itemprocessed = PrepareItemrecordDisplay( $data->{'biblionumber'}, '', $data );
|
||||
my $itemprocessed = C4::Items::PrepareItemrecordDisplay( $data->{'biblionumber'}, '', $data );
|
||||
$itemprocessed->{'itemid'} = "N$serialid";
|
||||
$itemprocessed->{'serialid'} = $serialid;
|
||||
$itemprocessed->{'biblionumber'} = $data->{'biblionumber'};
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ use C4::Bookseller qw/ GetBookSellerFromId /;
|
|||
use C4::Acquisition;
|
||||
use C4::Suggestions; # GetSuggestion
|
||||
use C4::Biblio; # GetBiblioData
|
||||
use C4::Items; #PrepareItemRecord
|
||||
use C4::Output;
|
||||
use C4::Input;
|
||||
use C4::Koha;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ use C4::Members;
|
|||
use C4::VirtualShelves;
|
||||
use C4::XSLT;
|
||||
use C4::ShelfBrowser;
|
||||
use C4::Reserves;
|
||||
use C4::Charset;
|
||||
use MARC::Record;
|
||||
use MARC::Field;
|
||||
|
|
@ -509,11 +510,9 @@ for my $itm (@items) {
|
|||
$itm->{'lostimageurl'} = $lostimageinfo->{ 'imageurl' };
|
||||
$itm->{'lostimagelabel'} = $lostimageinfo->{ 'label' };
|
||||
}
|
||||
|
||||
if( $itm->{'count_reserves'}){
|
||||
if( $itm->{'count_reserves'} eq "Waiting"){ $itm->{'waiting'} = 1; }
|
||||
if( $itm->{'count_reserves'} eq "Reserved"){ $itm->{'onhold'} = 1; }
|
||||
}
|
||||
my ($reserve_status) = C4::Reserves::CheckReserves($itm->{itemnumber});
|
||||
if( $reserve_status eq "Waiting"){ $itm->{'waiting'} = 1; }
|
||||
if( $reserve_status eq "Reserved"){ $itm->{'onhold'} = 1; }
|
||||
|
||||
my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itm->{itemnumber});
|
||||
if ( defined( $transfertwhen ) && $transfertwhen ne '' ) {
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ sub methods : Test( 1 ) {
|
|||
_disambiguate
|
||||
get_koha_field_from_marc
|
||||
TransformMarcToKohaOneField
|
||||
PrepareItemrecordDisplay
|
||||
ModZebra
|
||||
GetNoZebraIndexes
|
||||
_DelBiblioNoZebra
|
||||
|
|
@ -60,8 +59,6 @@ sub methods : Test( 1 ) {
|
|||
_koha_delete_biblio
|
||||
_koha_delete_biblioitems
|
||||
ModBiblioMarc
|
||||
z3950_extended_services
|
||||
set_service_options
|
||||
get_biblio_authorised_values
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ sub methods : Test( 1 ) {
|
|||
_get_unlinked_item_subfields
|
||||
_get_unlinked_subfields_xml
|
||||
_parse_unlinked_item_subfields_from_xml
|
||||
PrepareItemrecordDisplay
|
||||
);
|
||||
|
||||
can_ok( $self->testing_class, @methods );
|
||||
|
|
|
|||
Loading…
Reference in New Issue