Permalink
Browse files

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.

By default, all subfields are prefilled when the PrefillItem syspref is on, unless you specify which fields
you want to prefill in the SubfieldsToUseWhenPrefill syspref.
With a value of "f u v", only the $f, $u and $v will be prefilled, for example.

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Rebased and QAed.
  • Loading branch information...
1 parent 7e6690f commit 245d6634fe446d76ad16494ed8e75ff5fe7687e5 @veggiematts veggiematts committed with PaulPoulain Jan 6, 2012
View
112 cataloguing/additem.pl
@@ -33,6 +33,9 @@
use C4::Dates;
use List::MoreUtils qw/any/;
use C4::Search;
+use Storable qw(thaw freeze);
+use URI::Escape;
+
use MARC::File::XML;
use URI::Escape;
@@ -277,6 +280,33 @@ sub generate_subfield_form {
return \%subfield_data;
}
+# Removes some subfields when prefilling items
+# This function will remove any subfield that is not in the SubfieldsToUseWhenPrefill syspref
+sub removeFieldsForPrefill {
+
+ my $item = shift;
+
+ # Getting item tag
+ my ($tag, $subtag) = GetMarcFromKohaField("items.barcode", '');
+
+ # Getting list of subfields to keep
+ my $subfieldsToUseWhenPrefill = C4::Context->preference('SubfieldsToUseWhenPrefill');
+
+ # Removing subfields that are not in the syspref
+ if ($tag && $subfieldsToUseWhenPrefill) {
+ my $field = $item->field($tag);
+ my @subfieldsToUse= split(/ /,$subfieldsToUseWhenPrefill);
+ foreach my $subfield ($field->subfields()) {
+ if (!grep { $subfield->[0] eq $_ } @subfieldsToUse) {
+ $field->delete_subfield(code => $subfield->[0]);
+ }
+
+ }
+ }
+
+ return $item;
+
+}
my $input = new CGI;
my $error = $input->param('error');
@@ -315,9 +345,26 @@ sub generate_subfield_form {
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 +381,55 @@ sub generate_subfield_form {
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...
+ if ( C4::Context->preference('autoBarcode') eq 'incremental' ) {
+ $record = _increment_barcode($record, $frameworkcode);
+ }
+
+
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_utf8( freeze( $record ) ),
+ -expires => ''
+ );
+
+ $cookie = [ $cookie, $itemcookie ];
+ }
+
+ }
+ $nextop = "additem";
+ if ($exist_itemnumber) {
+ $itemrecord = $record;
+ }
}
# If we have to add & duplicate
@@ -370,6 +446,7 @@ sub generate_subfield_form {
$fieldItem->delete_subfields($tagsubfield);
$itemrecord->insert_fields_ordered($fieldItem);
}
+ $itemrecord = removeFieldsForPrefill($itemrecord) if ($prefillitem);
}
# If we have to add multiple copies
@@ -696,6 +773,11 @@ sub generate_subfield_form {
}
# 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);
View
2 installer/data/mysql/sysprefs.sql
@@ -367,3 +367,5 @@ INSERT INTO systempreferences (variable,value,explanation,type) VALUES('EnableBo
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UpdateTotalIssuesOnCirc','0','Whether to update the totalissues field in the biblio on each circ.',NULL,'YesNo');
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IntranetSlipPrinterJS','','Use this JavaScript for printing slips. Define at least function printThenClose(). For use e.g. with Firefox PlugIn jsPrintSetup, see http://jsprintsetup.mozdev.org/','','Free');
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacSuppressionByIPRange','','Restrict the suppression to IP adresses outside of the IP range','','free');
+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');
+INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SubfieldsToUseWhenPrefill','','Define a list of subfields to use when prefilling items (separated by space)','','Free');
View
14 installer/data/mysql/updatedatabase.pl
@@ -5669,6 +5669,18 @@ sub stocknumber_checker { #code reused later on
$dbh->do("UPDATE auth_subfield_structure SET frameworkcode = 'PERSO_NAME' WHERE frameworkcode = 'PERSO_CODE'");
$dbh->do("UPDATE auth_subfield_structure SET frameworkcode = 'CORPO_NAME' WHERE frameworkcode = 'ORGO_CODE'");
print "Upgrade to $DBversion done (Bug 8207: correct typo in authority types)\n";
+ SetVersion ($DBversion);
+}
+
+$DBversion = "3.09.00.035";
+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');
+ ");
+ $dbh->do(
+ "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SubfieldsToUseWhenPrefill','','Define a list of subfields to use when prefilling items (separated by space)','','Free');
+ ");
+ print "Upgrade to $DBversion done (Adding PrefillItem and SubfieldsToUseWhenPrefill sysprefs)\n";
SetVersion($DBversion);
}
@@ -5694,8 +5706,6 @@ =head2 DropAllForeignKeys($table)
Drop all foreign keys of the table $table
=cut
-
-
sub DropAllForeignKeys {
my ($table) = @_;
# get the table description
View
10 koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref
@@ -95,6 +95,16 @@ Cataloging:
hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
EAN13: incremental EAN-13 barcodes
"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
+ -
+ - Define a list of subfields to use when prefilling items (separated by space)
+ - pref: SubfieldsToUseWhenPrefill
+
Display:
-
- 'Separate multiple displayed authors, series or subjects with '

0 comments on commit 245d663

Please sign in to comment.