From 5bcbe33fc0b87118aef2a63e92a8be1db8474491 Mon Sep 17 00:00:00 2001 From: Matthias Meusburger Date: Fri, 6 Jan 2012 14:55:45 +0100 Subject: [PATCH] Bug 7412: Pre-filling items in cataloguing Pre-filling of items: remember what was in the previous item filled, to be able to create multiple items quickly. --- cataloguing/additem.pl | 119 +++++++++++++++++--- installer/data/mysql/sysprefs.sql | 2 +- installer/data/mysql/updatedatabase.pl | 11 ++- .../en/modules/admin/preferences/cataloguing.pref | 6 + 4 files changed, 120 insertions(+), 18 deletions(-) diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index a734d0f..4acfda3 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -32,6 +32,10 @@ use C4::Branch; # XXX subfield_is_koha_internal_p use C4::ClassSource; use C4::Dates; use List::MoreUtils qw/any/; +use Storable qw(thaw freeze); +use URI::Escape; + + use MARC::File::XML; use URI::Escape; @@ -275,6 +279,25 @@ sub generate_subfield_form { return \%subfield_data; } +sub removeFieldsForPrefill { + #FIXME: this is not generic enough. We could define fields to remove in a syspref. + my $item = shift; + # Getting item tag + my ($tag, $subtag) = GetMarcFromKohaField("items.barcode", ''); + if ($tag) { + my $field = $item->field($tag); + if ($field) { + $field->delete_subfield(code => 'f'); + $field->delete_subfield(code => 'k'); + $field->delete_subfield(code => 'u'); + $field->delete_subfield(code => 'v'); + $field->delete_subfield(code => 'x'); + $field->delete_subfield(code => 'z'); + } + } + return $item; + +} my $input = new CGI; my $error = $input->param('error'); @@ -315,9 +338,26 @@ my $oldrecord = TransformMarcToKoha($dbh,$record); my $itemrecord; my $nextop="additem"; my @errors; # store errors found while checking data BEFORE saving item. + +# Getting last created item cookie +my $prefillitem = C4::Context->preference('PrefillItem'); +my $justaddeditem; +my $cookieitemrecord; +if ($prefillitem) { + my $lastitemcookie = $input->cookie('LastCreatedItem'); + if ($lastitemcookie) { + $lastitemcookie = uri_unescape($lastitemcookie); + if ( thaw($lastitemcookie) ) { + $cookieitemrecord = thaw($lastitemcookie) ; + $cookieitemrecord = removeFieldsForPrefill($cookieitemrecord); + } + } +} + #------------------------------------------------------------------------------- if ($op eq "additem") { -#------------------------------------------------------------------------------- + + #------------------------------------------------------------------------------- # rebuild my @tags = $input->param('tag'); my @subfields = $input->param('subfield'); @@ -334,26 +374,69 @@ if ($op eq "additem") { my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit'); my $number_of_copies = $input->param('number_of_copies'); + # This is a bit tricky : if there is a cookie for the last created item and + # we just added an item, the cookie value is not correct yet (it will be updated + # next page). To prevent the form from being filled with outdated values, we + # force the use of "add and duplicate" feature, so the form will be filled with + # correct values. + $add_duplicate_submit = 1 if ($prefillitem); + $justaddeditem = 1; + + # 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); + } + } + + if (C4::Context->preference('autoBarcode') eq 'incremental') { $record = _increment_barcode($record, $frameworkcode); } - my $addedolditem = TransformMarcToKoha($dbh,$record); + my $addedolditem = TransformMarcToKoha( $dbh, $record ); # If we have to add or add & duplicate, we add the item - if ($add_submit || $add_duplicate_submit) { - # check for item barcode # being unique - my $exist_itemnumber = get_item_from_barcode($addedolditem->{'barcode'}); - push @errors,"barcode_not_unique" if($exist_itemnumber); - # if barcode exists, don't create, but report The problem. - unless ($exist_itemnumber) { - my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber); - set_item_default_location($oldbibitemnum); - } - $nextop = "additem"; - if ($exist_itemnumber) { - $itemrecord = $record; - } + if ( $add_submit || $add_duplicate_submit ) { + + # check for item barcode # being unique + my $exist_itemnumber = get_item_from_barcode( $addedolditem->{'barcode'} ); + push @errors, "barcode_not_unique" if ($exist_itemnumber); + + # if barcode exists, don't create, but report The problem. + unless ($exist_itemnumber) { + my ( $oldbiblionumber, $oldbibnum, $oldbibitemnum ) = AddItemFromMarc( $record, $biblionumber ); + set_item_default_location($oldbibitemnum); + + # Pushing the last created item cookie back + if ($prefillitem && defined $record) { + my $itemcookie = $input->cookie( + -name => 'LastCreatedItem', + # We uri_escape the whole freezed structure so we're sure we won't have any encoding problems + -value => uri_escape( freeze( $record ) ), + -expires => '' + ); + + $cookie = ( $cookie, $itemcookie ); + } + + } + $nextop = "additem"; + if ($exist_itemnumber) { + $itemrecord = $record; + } } # If we have to add & duplicate @@ -370,6 +453,7 @@ if ($op eq "additem") { $fieldItem->delete_subfields($tagsubfield); $itemrecord->insert_fields_ordered($fieldItem); } + $itemrecord = removeFieldsForPrefill($itemrecord) if ($prefillitem); } # If we have to add multiple copies @@ -698,6 +782,11 @@ if($itemrecord){ } # and now we add fields that are empty +# Using last created item if it exists + +$itemrecord = $cookieitemrecord if ($prefillitem and not $justaddeditem and $op ne "edititem"); + +# We generate form, and fill with values if defined foreach my $tag ( keys %{$tagslib}){ foreach my $subtag (keys %{$tagslib->{$tag}}){ next if subfield_is_koha_internal_p($subtag); diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 128c9b2..84e85de 100755 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -328,4 +328,4 @@ INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES(' INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OpacKohaUrl','1',"Show 'Powered by Koha' text on OPAC footer.",NULL,NULL); INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('EasyAnalyticalRecords','0','If on, display in the catalogue screens tools to easily setup analytical record relationships','','YesNo'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacShowRecentComments',0,'If ON a link to recent comments will appear in the OPAC masthead',NULL,'YesNo'); - +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('PrefillItem','0','When a new item is added, should it be prefilled with last created item values?','','YesNo'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 67708fa..9c44dfa 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -4585,6 +4585,15 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.06.03.002"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do(" + INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('PrefillItem','0','When a new item is added, should it be prefilled with last created item values?','','YesNo'); + "); + print "Upgrade to $DBversion done (Adding PrefillItem syspref)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 DropAllForeignKeys($table) @@ -4592,8 +4601,6 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { Drop all foreign keys of the table $table =cut - - sub DropAllForeignKeys { my ($table) = @_; # get the table description 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 10e1d13..993d735 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 @@ -90,6 +90,12 @@ Cataloging: annual: generated in the form <year>-0001, <year>-0002. hbyymmincr: generated in the form <branchcode>yymm0001. "OFF": not generated automatically. + - + - When a new item is added, should it be prefilled with last created item values? + - pref: PrefillItem + choices: + yes: the new item is prefilled with last created item values + no: the new item is not prefilled with last created item values Display: - - 'Separate multiple displayed authors, series or subjects with ' -- 1.7.5.4