Bug 5215 - Barcode field not cleared when using "Add and Duplicate" option on additem.pl

The barcode field is not cleared/incremented properly when using the "Add and
Duplicate" option. Rather it is pre-populated with the previously used barcode
which causes additem.pl to return a duplicate barcode error if the cataloger
does not catch the mistake.

The problem is caused by the fact that the current item record is simply
duplicated and re-loaded into the form.

The solution is to add code which either pre-populates with the next barcode
number if the incremental pattern is set or clears the p subfield if one of the
various patterns using the javascript plugin is selected.

In reality C4::Barcodes should be implimented here along with all necessary changes elsewhere.
This commit is contained in:
Chris Nighswonger 2010-09-10 15:20:51 -04:00
parent e58961f689
commit 01247f2fc0

View file

@ -33,6 +33,8 @@ use C4::Dates;
use MARC::File::XML;
my $dbh = C4::Context->dbh;
sub find_value {
my ($tagfield,$insubfield,$record) = @_;
my $result;
@ -69,8 +71,27 @@ sub set_item_default_location {
}
}
# NOTE: This code is subject to change in the future with the implemenation of ajax based autobarcode code
# NOTE: 'incremental' is the ONLY autoBarcode option available to those not using javascript
sub _increment_barcode {
my ($record, $frameworkcode) = @_;
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode",$frameworkcode);
unless ($record->field($tagfield)->subfield($tagsubfield)) {
my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
$sth_barcode->execute;
my ($newbarcode) = $sth_barcode->fetchrow;
$newbarcode++;
# OK, we have the new barcode, now create the entry in MARC record
my $fieldItem = $record->field($tagfield);
$record->delete_field($fieldItem);
$fieldItem->add_subfields($tagsubfield => $newbarcode);
$record->insert_fields_ordered($fieldItem);
}
return $record;
}
my $input = new CGI;
my $dbh = C4::Context->dbh;
my $error = $input->param('error');
my $biblionumber = $input->param('biblionumber');
my $itemnumber = $input->param('itemnumber');
@ -126,22 +147,8 @@ if ($op eq "additem") {
my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit');
my $number_of_copies = $input->param('number_of_copies');
# if autoBarcode is set to 'incremental', calculate barcode...
# NOTE: This code is subject to change in 3.2 with the implemenation of ajax based autobarcode code
# NOTE: 'incremental' is the ONLY autoBarcode option available to those not using javascript
if (C4::Context->preference('autoBarcode') eq 'incremental') {
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode",$frameworkcode);
unless ($record->field($tagfield)->subfield($tagsubfield)) {
my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
$sth_barcode->execute;
my ($newbarcode) = $sth_barcode->fetchrow;
$newbarcode++;
# OK, we have the new barcode, now create the entry in MARC record
my $fieldItem = $record->field($tagfield);
$record->delete_field($fieldItem);
$fieldItem->add_subfields($tagsubfield => $newbarcode);
$record->insert_fields_ordered($fieldItem);
}
$record = _increment_barcode($record, $frameworkcode);
}
my $addedolditem = TransformMarcToKoha($dbh,$record);
@ -164,22 +171,18 @@ if ($op eq "additem") {
# If we have to add & duplicate
if ($add_duplicate_submit) {
# We try to get the next barcode
use C4::Barcodes;
my $barcodeobj = C4::Barcodes->new;
my $barcodevalue = $barcodeobj->next_value($addedolditem->{'barcode'}) if $barcodeobj;
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode",$frameworkcode);
if ($record->field($tagfield)->subfield($tagsubfield)) {
# If we got the next codebar value, we put it in the record
if ($barcodevalue) {
$record->field($tagfield)->update($tagsubfield => $barcodevalue);
# If not, we delete the recently inserted barcode from the record (so the user can input a barcode himself)
} else {
$record->field($tagfield)->update($tagsubfield => '');
}
}
$itemrecord = $record;
if (C4::Context->preference('autoBarcode') eq 'incremental') {
$itemrecord = _increment_barcode($itemrecord, $frameworkcode);
}
else {
# we have to clear the barcode field in the duplicate item record to make way for the new one generated by the javascript plugin
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode",$frameworkcode);
my $fieldItem = $itemrecord->field($tagfield);
$itemrecord->delete_field($fieldItem);
$fieldItem->delete_subfields($tagsubfield);
$itemrecord->insert_fields_ordered($fieldItem);
}
}
# If we have to add multiple copies