From 329989f388cd752f78201af27b90fd706a680508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nu=C3=B1o=20L=C3=B3pez=20Ans=C3=B3tegui?= Date: Wed, 19 Jun 2013 14:35:41 +0200 Subject: [PATCH] Bug 9921 - Make it possible to force 001 = biblionumber Field 001 is controlled by a system preference, which will have three options: The option "biblionumber" will set field 001 to the biblionumber when you save the record. The option "1,2,3" uses preference incrementalControlNumber to generate the next sequential number. The option "not generated automatically" allows for manual entry. --- C4/Biblio.pm | 43 ++++++++++++ cataloguing/value_builder/marc21_field_001.pl | 76 ++++++++++++++++++++++ installer/data/mysql/atomicupdate/bug_9921.perl | 28 ++++++++ installer/data/mysql/mandatory/sysprefs.sql | 2 + .../en/modules/admin/preferences/cataloguing.pref | 13 ++++ 5 files changed, 162 insertions(+) create mode 100755 cataloguing/value_builder/marc21_field_001.pl create mode 100644 installer/data/mysql/atomicupdate/bug_9921.perl diff --git a/C4/Biblio.pm b/C4/Biblio.pm index b482a99814..6bb0d7194a 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -283,6 +283,28 @@ sub AddBiblio { # update MARC subfield that stores biblioitems.cn_sort _koha_marc_update_biblioitem_cn_sort( $record, $olddata, $frameworkcode ); + # update the control number (001) in MARC + if(C4::Context->preference('autoControlNumber') eq 'biblionumber'){ + unless($record->field('001')){ + $record->insert_fields_ordered(MARC::Field->new('001', $biblionumber)); + }elsif($record->field('001')->data() eq 'biblionumber'){ + $record->field('001')->update($biblionumber); + } + }elsif(C4::Context->preference('autoControlNumber') eq 'incremental'){ + if(!defined($record->field('001')) or (defined($record->field('001')) and $record->field('001')->data() eq 'incremental')){ + my $sth = $dbh->prepare(q{UPDATE systempreferences SET value = value+1 WHERE variable = 'incrementalControlNumber'}); + $sth->execute(); + $sth->finish(); + my $incrementalCN=C4::Context->preference('incrementalControlNumber')-1; + unless($record->field('001')){ + $record->insert_fields_ordered(MARC::Field->new('001', $incrementalCN)); + }else{ + $record->field('001')->update($incrementalCN); + } + } + } + + # now add the record ModBiblioMarc( $record, $biblionumber ) unless $defer_marc_save; @@ -376,6 +398,27 @@ sub ModBiblio { # update MARC subfield that stores biblioitems.cn_sort _koha_marc_update_biblioitem_cn_sort( $record, $oldbiblio, $frameworkcode ); + # update the control number (001) in MARC + if(C4::Context->preference('autoControlNumber') eq 'biblionumber'){ + unless($record->field('001')){ + $record->insert_fields_ordered(MARC::Field->new('001', $biblionumber)); + }elsif($record->field('001')->data() eq 'biblionumber'){ + $record->field('001')->update($biblionumber); + } + }elsif(C4::Context->preference('autoControlNumber') eq 'incremental'){ + if(!defined($record->field('001')) or (defined($record->field('001')) and $record->field('001')->data() eq 'incremental')){ + my $sth = $dbh->prepare(q{UPDATE systempreferences SET value = value+1 WHERE variable = 'incrementalControlNumber'}); + $sth->execute(); + $sth->finish(); + my $incrementalCN=C4::Context->preference('incrementalControlNumber')-1; + unless($record->field('001')){ + $record->insert_fields_ordered(MARC::Field->new('001', $incrementalCN)); + }else{ + $record->field('001')->update($incrementalCN); + } + } + } + # update the MARC record (that now contains biblio and items) with the new record data &ModBiblioMarc( $record, $biblionumber ); diff --git a/cataloguing/value_builder/marc21_field_001.pl b/cataloguing/value_builder/marc21_field_001.pl new file mode 100755 index 0000000000..5eca9c7050 --- /dev/null +++ b/cataloguing/value_builder/marc21_field_001.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl + +# Copyright 2013 Spanish Ministry of Education, Culture and Sport +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use C4::Context; + +# This is a new style cataloging plugin, using $building_plugin + +our $building_plugin; +if(defined $building_plugin) { + marc21_field001_plugin_javascript(); +} +else { #nothing to do (no popup) +} + +#------------------------------------------------------------------------------- + +sub marc21_field001_plugin_javascript { + my $field_number= $building_plugin->{subfieldid}; + my $function_name= $field_number; + + #depending on preference, adjust Focus function + my $autoControlNumber = C4::Context->preference('autoControlNumber'); + my $focusline=''; + if( $autoControlNumber ne 'OFF' ) { + $focusline= "document.getElementById(\"$field_number\").value='$autoControlNumber';\n"; + } + $focusline.='return 1;'; + + #build the actual javascript + my $res = " + +"; + + #return to caller via global hash + $building_plugin->{function}= $function_name; + $building_plugin->{javascript}= $res; +} + +1; diff --git a/installer/data/mysql/atomicupdate/bug_9921.perl b/installer/data/mysql/atomicupdate/bug_9921.perl new file mode 100644 index 0000000000..7322f81d48 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_9921.perl @@ -0,0 +1,28 @@ +$DBversion = 'XXX'; # will be replaced by the RM +if( CheckVersion( $DBversion ) ) { + # $dbh->do( "ALTER TABLE biblio ADD COLUMN badtaste int" ); + $dbh->do( + q{INSERT INTO systempreferences (variable, value, options, explanation, type) VALUES ('autoControlNumber','OFF','incremental|biblionumber|OFF', + 'Used to autogenerate a Control Number: incremental will be of the form 1, 2, 3; biblionumber will be as biblionumber;','Choice');} + ); + $dbh->do( + q{INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('incrementalControlNumber', '1', 'Set the number + (controlnumber) of the next bibliographic record.',NULL,'');} + ); + if (C4::Context->preference("marcflavour") eq 'MARC21') { + my $sth = $dbh->prepare( + q{SELECT * FROM marc_subfield_structure WHERE tagfield = '001' AND tagsubfield = '@' + AND (value_builder IS NOT NULL AND value_builder != '') LIMIT 1;} + ); + $sth->execute; + unless($sth->fetchrow){ + $dbh->do( + q{UPDATE marc_subfield_structure SET value_builder = 'marc21_field_001.pl' WHERE tagfield = '001' AND tagsubfield = '@';} + ); + print "WARNING: Your frameworks have been updated, field 001 will filled in through marc21_field_001.pl plugin.\n"; + } + } + + # Always end with this (adjust the bug info) + NewVersion( $DBversion, 9921, "Make it possible to force 001 = biblionumbe"); +} diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql index b513bd37bd..fcb3b6acce 100644 --- a/installer/data/mysql/mandatory/sysprefs.sql +++ b/installer/data/mysql/mandatory/sysprefs.sql @@ -69,6 +69,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('AuthoritySeparator','--','10','Used to separate a list of authorities in a display. Usually --','free'), ('AuthSuccessLog','0',NULL,'If enabled, log successful authentications','YesNo'), ('autoBarcode','OFF','incremental|annual|hbyymmincr|EAN13|OFF','Used to autogenerate a barcode: incremental will be of the form 1, 2, 3; annual of the form 2007-0001, 2007-0002; hbyymmincr of the form HB08010001 where HB=Home Branch','Choice'), +('autoControlNumber','OFF','incremental|biblionumber|OFF','Used to autogenerate a Control Number: incremental will be of the form 1, 2, 3; biblionumber will be as biblionumber;','Choice'), ('AutoCreateAuthorities','0',NULL,'Automatically create authorities that do not exist when cataloging records.','YesNo'), ('AutoCreditNumber', '', '', 'Automatically generate a number for account credits', 'Choice'), ('AutoEmailOpacUser','0',NULL,'Sends notification emails containing new account details to patrons - when account is created.','YesNo'), @@ -255,6 +256,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('ILS-DI:AuthorizedIPs','','Restricts usage of ILS-DI to some IPs','.','Free'), ('ImageLimit','5','','Limit images stored in the database by the Patron Card image manager to this number.','Integer'), ('IncludeSeeFromInSearches','0','','Include see-from references in searches.','YesNo'), +('incrementalControlNumber', '1', 'Set the number (controlnumber) of the next bibliographic record.',NULL,''), ('IndependentBranches','0',NULL,'If ON, increases security between libraries','YesNo'), ('IndependentBranchesPatronModifications','0', NULL, 'Show only modification request for the logged in branch','YesNo'), ('IndependentBranchesTransfers','0', NULL, 'Allow non-superlibrarians to transfer items between libraries','YesNo'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref index bee04d5922..ff61f1a3bc 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref @@ -158,6 +158,19 @@ Cataloging: - and record's last modifier name in MARC subfield - pref: MarcFieldForModifierName - ".
NOTE: Use a dollar sign between field and subfield like 123$a." + - + - Control Number (001) is + - pref: autoControlNumber + choices: + biblionumber: generated as biblionumber. + incremental: generated in the form 1, 2, 3. + "OFF": not generated automatically. + - (You should fill in a value in incrementalControlNumber preference.) + - + - Use Control Number (001) + - pref: incrementalControlNumber + class: integer + - as incremental number. (This requires generated in the form 1, 2, 3 in autoControlNumber preference.) Display: - - 'Separate main entry and subdivisions with ' -- 2.11.0