use vars qw($VERSION @ISA @EXPORT);
BEGIN {
- $VERSION = 1.00;
+ $VERSION = 3.07.00.049;
require Exporter;
@ISA = qw( Exporter );
&GetXmlBiblio
&GetCOinSBiblio
&GetMarcPrice
+ &MungeMarcPrice
&GetMarcQuantity
&GetAuthorisedValueDesc
&ModBiblio
&ModBiblioframework
&ModZebra
+ &UpdateTotalIssues
);
# To delete something
&TransformHtmlToMarc
&TransformHtmlToXml
&GetNoZebraIndexes
+ prepare_host_field
);
}
C4::Serials::DelSubscription( $subscription->{subscriptionid} );
}
+ # We delete any existing holds
+ require C4::Reserves;
+ my ($count, $reserves) = C4::Reserves::GetReservesFromBiblionumber($biblionumber);
+ foreach my $res ( @$reserves ) {
+ C4::Reserves::CancelReserve( $res->{'biblionumber'}, $res->{'itemnumber'}, $res->{'borrowernumber'} );
+ }
+
# Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio
# for at least 2 reasons :
# - we need to read the biblio if NoZebra is set (to remove it from the indexes
}
$sth = $dbh->prepare(
- "SELECT tagfield,tagsubfield,liblibrarian,libopac,tab,mandatory,repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link,defaultvalue
+ "SELECT tagfield,tagsubfield,liblibrarian,libopac,tab,mandatory,repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link,defaultvalue,maxlength
FROM marc_subfield_structure
WHERE frameworkcode=?
ORDER BY tagfield,tagsubfield
my $isurl;
my $link;
my $defaultvalue;
+ my $maxlength;
while (
( $tag, $subfield, $liblibrarian, $libopac, $tab, $mandatory, $repeatable, $authorised_value,
- $authtypecode, $value_builder, $kohafield, $seealso, $hidden, $isurl, $link, $defaultvalue
+ $authtypecode, $value_builder, $kohafield, $seealso, $hidden, $isurl, $link, $defaultvalue,
+ $maxlength
)
= $sth->fetchrow
) {
$res->{$tag}->{$subfield}->{isurl} = $isurl;
$res->{$tag}->{$subfield}->{'link'} = $link;
$res->{$tag}->{$subfield}->{defaultvalue} = $defaultvalue;
+ $res->{$tag}->{$subfield}->{maxlength} = $maxlength;
}
$marc_structure_cache->{$forlibrarian}->{$frameworkcode} = $res;
for my $field ( $record->field(@listtags) ) {
for my $subfield_value ($field->subfield($subfield)){
#check value
+ $subfield_value = MungeMarcPrice( $subfield_value );
return $subfield_value if ($subfield_value);
}
}
return 0; # no price found
}
+=head2 MungeMarcPrice
+
+Return the best guess at what the actual price is from a price field.
+=cut
+
+sub MungeMarcPrice {
+ my ( $price ) = @_;
+
+ return unless ( $price =~ m/\d/ ); ## No digits means no price.
+
+ ## Look for the currency symbol of the active currency, if it's there,
+ ## start the price string right after the symbol. This allows us to prefer
+ ## this native currency price over other currency prices, if possible.
+ my $active_currency = C4::Context->dbh->selectrow_hashref( 'SELECT * FROM currency WHERE active = 1', {} );
+ my $symbol = quotemeta( $active_currency->{'symbol'} );
+ if ( $price =~ m/$symbol/ ) {
+ my @parts = split(/$symbol/, $price );
+ $price = $parts[1];
+ }
+
+ ## Grab the first number in the string ( can use commas or periods for thousands separator and/or decimal separator )
+ ( $price ) = $price =~ m/([\d\,\.]+[[\,\.]\d\d]?)/;
+
+ ## Split price into array on periods and commas
+ my @parts = split(/[\,\.]/, $price);
+
+ ## If the last grouping of digits is more than 2 characters, assume there is no decimal value and put it back.
+ my $decimal = pop( @parts );
+ if ( length( $decimal ) > 2 ) {
+ push( @parts, $decimal );
+ $decimal = '';
+ }
+
+ $price = join('', @parts );
+
+ if ( $decimal ) {
+ $price .= ".$decimal";
+ }
+
+ return $price;
+}
+
+
=head2 GetMarcQuantity
return the quantity of a book. Used in acquisition only, when importing a file an iso2709 from a bookseller
# ignore $9
my @this_link_loop = @link_loop;
- push @subfields_loop, { code => $code, value => $value, link_loop => \@this_link_loop, separator => $separator } unless ( $subject_subfield->[0] eq 9 );
+ push @subfields_loop, { code => $code, value => $value, link_loop => \@this_link_loop, separator => $separator } unless ( $subject_subfield->[0] eq 9 || $subject_subfield->[0] eq '0' );
$counter++;
}
link_loop => \@this_link_loop,
separator => $separator
}
- unless ( $authors_subfield->[0] eq '9' );
+ unless ( $authors_subfield->[0] eq '9' || $authors_subfield->[0] eq '0');
$count_auth++;
}
push @marcauthors, { MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop };
my $db_to_marc = C4::Context->marcfromkohafield;
while ( my ($name, $value) = each %$hash ) {
next unless my $dtm = $db_to_marc->{''}->{$name};
+ next unless ( scalar( @$dtm ) );
my ($tag, $letter) = @$dtm;
foreach my $value ( split(/\s?\|\s?/, $value, -1) ) {
if ( my $field = $record->field($tag) ) {
cn_item = ?,
cn_suffix = ?,
cn_sort = ?,
- totalissues = ?
+ totalissues = ?,
+ ean = ?
where biblioitemnumber = ?
";
my $sth = $dbh->prepare($query);
$biblioitem->{'pages'}, $biblioitem->{'bnotes'}, $biblioitem->{'size'}, $biblioitem->{'place'},
$biblioitem->{'lccn'}, $biblioitem->{'url'}, $biblioitem->{'biblioitems.cn_source'}, $biblioitem->{'cn_class'},
$biblioitem->{'cn_item'}, $biblioitem->{'cn_suffix'}, $cn_sort, $biblioitem->{'totalissues'},
+ $biblioitem->{'ean'},
$biblioitem->{'biblioitemnumber'}
);
if ( $dbh->errstr ) {
cn_item = ?,
cn_suffix = ?,
cn_sort = ?,
- totalissues = ?
+ totalissues = ?,
+ ean = ?
";
my $sth = $dbh->prepare($query);
$sth->execute(
$biblioitem->{'pages'}, $biblioitem->{'bnotes'}, $biblioitem->{'size'}, $biblioitem->{'place'},
$biblioitem->{'lccn'}, $biblioitem->{'marc'}, $biblioitem->{'url'}, $biblioitem->{'biblioitems.cn_source'},
$biblioitem->{'cn_class'}, $biblioitem->{'cn_item'}, $biblioitem->{'cn_suffix'}, $cn_sort,
- $biblioitem->{'totalissues'}
+ $biblioitem->{'totalissues'}, $biblioitem->{'ean'}
);
my $bibitemnum = $dbh->{'mysql_insertid'};
=cut
sub ModBiblioMarc {
-
- # pass the MARC::Record to this function, and it will create the records in the marc field
+ # pass the MARC::Record to this function, and it will create the records in
+ # the marc field
my ( $record, $biblionumber, $frameworkcode ) = @_;
+
+ # Clone record as it gets modified
+ $record = $record->clone();
my $dbh = C4::Context->dbh;
my @fields = $record->fields();
if ( !$frameworkcode ) {
return ($holds);
}
+=head2 prepare_host_field
+
+$marcfield = prepare_host_field( $hostbiblioitem, $marcflavour );
+Generate the host item entry for an analytic child entry
+
+=cut
+
+sub prepare_host_field {
+ my ( $hostbiblio, $marcflavour ) = @_;
+ $marcflavour ||= C4::Context->preference('marcflavour');
+ my $host = GetMarcBiblio($hostbiblio);
+ # unfortunately as_string does not 'do the right thing'
+ # if field returns undef
+ my %sfd;
+ my $field;
+ my $host_field;
+ if ( $marcflavour eq 'MARC21' || $marcflavour eq 'NORMARC' ) {
+ if ( $field = $host->field('100') || $host->field('110') || $host->field('11') ) {
+ my $s = $field->as_string('ab');
+ if ($s) {
+ $sfd{a} = $s;
+ }
+ }
+ if ( $field = $host->field('245') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{t} = $s;
+ }
+ }
+ if ( $field = $host->field('260') ) {
+ my $s = $field->as_string('abc');
+ if ($s) {
+ $sfd{d} = $s;
+ }
+ }
+ if ( $field = $host->field('240') ) {
+ my $s = $field->as_string();
+ if ($s) {
+ $sfd{b} = $s;
+ }
+ }
+ if ( $field = $host->field('022') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{x} = $s;
+ }
+ }
+ if ( $field = $host->field('020') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{z} = $s;
+ }
+ }
+ if ( $field = $host->field('001') ) {
+ $sfd{w} = $field->data(),;
+ }
+ $host_field = MARC::Field->new( 773, '0', ' ', %sfd );
+ return $host_field;
+ }
+ elsif ( $marcflavour eq 'UNIMARC' ) {
+ #author
+ if ( $field = $host->field('700') || $host->field('710') || $host->field('720') ) {
+ my $s = $field->as_string('ab');
+ if ($s) {
+ $sfd{a} = $s;
+ }
+ }
+ #title
+ if ( $field = $host->field('200') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{t} = $s;
+ }
+ }
+ #place of publicaton
+ if ( $field = $host->field('210') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{c} = $s;
+ }
+ }
+ #date of publication
+ if ( $field = $host->field('210') ) {
+ my $s = $field->as_string('d');
+ if ($s) {
+ $sfd{d} = $s;
+ }
+ }
+ #edition statement
+ if ( $field = $host->field('205') ) {
+ my $s = $field->as_string();
+ if ($s) {
+ $sfd{a} = $s;
+ }
+ }
+ #URL
+ if ( $field = $host->field('856') ) {
+ my $s = $field->as_string('u');
+ if ($s) {
+ $sfd{u} = $s;
+ }
+ }
+ #ISSN
+ if ( $field = $host->field('011') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{x} = $s;
+ }
+ }
+ #ISBN
+ if ( $field = $host->field('010') ) {
+ my $s = $field->as_string('a');
+ if ($s) {
+ $sfd{y} = $s;
+ }
+ }
+ if ( $field = $host->field('001') ) {
+ $sfd{0} = $field->data(),;
+ }
+ $host_field = MARC::Field->new( 461, '0', ' ', %sfd );
+ return $host_field;
+ }
+ return;
+}
+
+
+=head2 UpdateTotalIssues
+
+ UpdateTotalIssues($biblionumber, $increase, [$value])
+
+Update the total issue count for a particular bib record.
+
+=over 4
+
+=item C<$biblionumber> is the biblionumber of the bib to update
+
+=item C<$increase> is the amount to increase (or decrease) the total issues count by
+
+=item C<$value> is the absolute value that total issues count should be set to. If provided, C<$increase> is ignored.
+
+=back
+
+=cut
+
+sub UpdateTotalIssues {
+ my ($biblionumber, $increase, $value) = @_;
+ my $totalissues;
+
+ my $data = GetBiblioData($biblionumber);
+
+ if (defined $value) {
+ $totalissues = $value;
+ } else {
+ $totalissues = $data->{'totalissues'} + $increase;
+ }
+ my ($totalissuestag, $totalissuessubfield) = GetMarcFromKohaField('biblioitems.totalissues', $data->{'frameworkcode'});
+
+ my $record = GetMarcBiblio($biblionumber);
+
+ my $field = $record->field($totalissuestag);
+ if (defined $field) {
+ $field->update( $totalissuessubfield => $totalissues );
+ } else {
+ $field = MARC::Field->new($totalissuestag, '0', '0',
+ $totalissuessubfield => $totalissues);
+ $record->insert_grouped_field($field);
+ }
+
+ ModBiblio($record, $biblionumber, $data->{'frameworkcode'});
+ return;
+}
1;
+
__END__
=head1 AUTHOR