@@ -, +, @@
---
C4/MarcModificationTemplates.pm | 9 +++
Koha/SimpleMARC.pm | 23 +++++++
installer/data/mysql/atomicupdate/bug13560.perl | 6 ++
.../modules/tools/marc_modification_templates.tt | 6 +-
.../prog/js/marc_modification_templates.js | 6 ++
t/db_dependent/MarcModificationTemplates.t | 75 ++++++++++++++++++----
tools/marc_modification_templates.pl | 1 +
7 files changed, 113 insertions(+), 13 deletions(-)
create mode 100644 installer/data/mysql/atomicupdate/bug13560.perl
--- a/C4/MarcModificationTemplates.pm
+++ a/C4/MarcModificationTemplates.pm
@@ -626,6 +626,15 @@ sub ModifyRecordWithTemplate {
field_numbers => $field_numbers,
});
}
+ elsif ( $action eq 'add_field' ) {
+ add_field({
+ record => $record,
+ field => $from_field,
+ subfield => $from_subfield,
+ values => [ $field_value ],
+ field_numbers => $field_numbers,
+ });
+ }
elsif ( $action eq 'update_field' ) {
update_field({
record => $record,
--- a/Koha/SimpleMARC.pm
+++ a/Koha/SimpleMARC.pm
@@ -17,6 +17,7 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
read_field
+ add_field
update_field
copy_field
copy_and_replace_field
@@ -172,6 +173,28 @@ sub update_field {
}
}
+sub add_field {
+ my ( $params ) = @_;
+ my $record = $params->{record};
+ my $fieldName = $params->{field};
+ my $subfieldName = $params->{subfield};
+ my @values = @{ $params->{values} };
+ my $field_numbers = $params->{field_numbers} // [];
+
+ if ( ! ( $record && $fieldName ) ) { return; }
+ if ( $fieldName > 10 ) {
+ foreach my $value ( @values ) {
+ my $field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $value );
+ $record->append_fields( $field );
+ }
+ } else {
+ foreach my $value ( @values ) {
+ my $field = MARC::Field->new( $fieldName, $value );
+ $record->append_fields( $field );
+ }
+ }
+}
+
sub _update_field {
my ( $params ) = @_;
my $record = $params->{record};
--- a/installer/data/mysql/atomicupdate/bug13560.perl
+++ a/installer/data/mysql/atomicupdate/bug13560.perl
@@ -0,0 +1,6 @@
+$DBversion = 'XXX'; # will be replaced by the RM
+if( CheckVersion( $DBversion ) ) {
+ $dbh->do( "ALTER TABLE marc_modification_template_actions CHANGE action action ENUM('delete_field','add_field','update_field','move_field','copy_field','copy_and_replace_field')" );
+ SetVersion( $DBversion );
+ print "Upgrade to $DBversion done (Bug 13560 - need an add option in marc modification templates)\n";
+}
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/marc_modification_templates.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/marc_modification_templates.tt
@@ -132,7 +132,8 @@
[% ActionsLoo.ordering %]
[% IF ( ActionsLoo.action_delete_field ) %] Delete [% END %]
- [% IF ( ActionsLoo.action_update_field ) %] Update [% END %]
+ [% IF ( ActionsLoo.action_add_field ) %] Add new [% END %]
+ [% IF ( ActionsLoo.action_update_field ) %] Update existing or add new [% END %]
[% IF ( ActionsLoo.action_move_field ) %] Move [% END %]
[% IF ( ActionsLoo.action_copy_field ) %] Copy [% END %]
[% IF ( ActionsLoo.action_copy_and_replace_field ) %] Copy and replace [% END %]
@@ -218,7 +219,8 @@
Delete
- Add/Update
+ Add new
+ Update existing or add new
Move
Copy
Copy and replace
--- a/koha-tmpl/intranet-tmpl/prog/js/marc_modification_templates.js
+++ a/koha-tmpl/intranet-tmpl/prog/js/marc_modification_templates.js
@@ -105,6 +105,12 @@ function onActionChange(selectObj) {
hide('to_field_block');
break;
+ case 'add_field':
+ hide('field_number_block');
+ show('with_value_block');
+ hide('to_field_block');
+ break;
+
case 'update_field':
hide('field_number_block');
show('with_value_block');
--- a/t/db_dependent/MarcModificationTemplates.t
+++ a/t/db_dependent/MarcModificationTemplates.t
@@ -1,6 +1,6 @@
use Modern::Perl;
-use Test::More tests => 95;
+use Test::More tests => 114;
use Koha::SimpleMARC;
@@ -42,9 +42,17 @@ is( AddModificationTemplateAction(
'Copy field 606$a to 607$a unless 606$a matches RegEx m^AJAX'
), 1, "Add third action");
+is( AddModificationTemplateAction(
+ $template_id, 'add_field', 0,
+ '650', 'a', 'Additional', '', '',
+ '', '', '',
+ 'unless', '650', 'a', 'exists', '', '',
+ 'Add field 650$aAdditional unless 650$a exists'
+), 1, "Add fourth action");
# Getter
+
my @actions = GetModificationTemplateActions( $template_id );
-is( @actions, 3, "3 actions are insered");
+is( @actions, 4, "4 actions are insered");
for my $action ( @actions ) {
isnt( GetModificationTemplateAction( $action->{mmta_id} ), undef, "action with id $action->{mmta_id} exists" );
@@ -73,7 +81,7 @@ is( $second_action->{conditional_comparison}, 'equals', "test conditional_compar
my $third_action = $actions[2];
is( $third_action->{ordering}, 3, "test ordering for third action" );
-is( $third_action->{action}, 'copy_field', "test factionor third action" );
+is( $third_action->{action}, 'copy_field', "test action for third action" );
is( $third_action->{from_field}, '606', "test from_field for third action" );
is( $third_action->{from_subfield}, 'a', "test from_subfield for third action" );
is( $third_action->{to_field}, '607', "test to_field for third action" );
@@ -84,6 +92,18 @@ is( $third_action->{conditional_subfield}, 'a', "test conditional_subfield for t
is( $third_action->{conditional_comparison}, 'not_equals', "test conditional_comparison for third action" );
is( $third_action->{conditional_value}, '^AJAX', "test conditional_value for third action" );
+my $fourth_action = $actions[3];
+is( $fourth_action->{ordering}, 4, "test ordering for fourth action" );
+is( $fourth_action->{action}, 'add_field', "test action for fourth action" );
+is( $fourth_action->{from_field}, '650', "test from_field for fourth action" );
+is( $fourth_action->{from_subfield}, 'a', "test from_subfield for fourth action" );
+is( $fourth_action->{to_field}, '', "test to_field for fourth action" );
+is( $fourth_action->{to_subfield}, '', "test to_subfield for fourth action" );
+is( $fourth_action->{conditional}, 'unless', "test conditional for fourth action" );
+is( $fourth_action->{conditional_field}, '650', "test conditional_field for fourth action" );
+is( $fourth_action->{conditional_subfield}, 'a', "test conditional_subfield for fourth action" );
+is( $fourth_action->{conditional_comparison}, 'exists', "test conditional_comparison for fourth action" );
+is( $fourth_action->{conditional_value}, '', "test conditional_value for fourth action" );
# Modifications
is( ModModificationTemplateAction(
@@ -111,26 +131,29 @@ is( $second_action->{conditional_comparison}, 'equals', "test conditional_compar
is( MoveModificationTemplateAction( $actions[2]->{mmta_id}, 'top' ), '1', 'Move the third action on top' );
is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'bottom' ), '1', 'Move the first action on bottom' );
-is( GetModificationTemplateAction( $actions[0]->{mmta_id} )->{ordering}, '3', 'First becomes third' );
+is( GetModificationTemplateAction( $actions[0]->{mmta_id} )->{ordering}, '4', 'First becomes fourth' );
is( GetModificationTemplateAction( $actions[1]->{mmta_id} )->{ordering}, '2', 'Second stays second' );
is( GetModificationTemplateAction( $actions[2]->{mmta_id} )->{ordering}, '1', 'Third becomes first' );
+is( GetModificationTemplateAction( $actions[3]->{mmta_id} )->{ordering}, '3', 'Fourth becomes third' );
+is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'up' ), '1', 'Move up the first action (was fourth)' );
is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'up' ), '1', 'Move up the first action (was third)' );
-is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'up' ), '1', 'Move up the first action (was second)' );
-is( MoveModificationTemplateAction( $actions[2]->{mmta_id}, 'down' ), '1', 'Move down the third action (was second)' );
+is( MoveModificationTemplateAction( $actions[2]->{mmta_id}, 'down' ), '1', 'Move down the third action (was first)' );
is( GetModificationTemplateAction( $actions[0]->{mmta_id} )->{ordering}, '1', 'First becomes again first' );
-is( GetModificationTemplateAction( $actions[1]->{mmta_id} )->{ordering}, '2', 'Second stays again second' );
-is( GetModificationTemplateAction( $actions[2]->{mmta_id} )->{ordering}, '3', 'Third becomes again third' );
+is( GetModificationTemplateAction( $actions[1]->{mmta_id} )->{ordering}, '3', 'Second becomes third' );
+is( GetModificationTemplateAction( $actions[2]->{mmta_id} )->{ordering}, '2', 'Third becomes second' );
+is( GetModificationTemplateAction( $actions[3]->{mmta_id} )->{ordering}, '4', 'Fourth becomes again fourth' );
# Cleaning
-is( DelModificationTemplateAction( $actions[0]->{mmta_id} ), 2, "Delete the first action, 2 others are reordered" );
+is( DelModificationTemplateAction( $actions[0]->{mmta_id} ), 3, "Delete the first action, 2 others are reordered" );
is( GetModificationTemplateAction( $actions[0]->{mmta_id} ), undef, "first action does not exist anymore" );
is( DelModificationTemplate( $template_id ), 1, "The template has been deleted" );
is( GetModificationTemplateAction( $actions[1]->{mmta_id} ), undef, "second action does not exist anymore" );
is( GetModificationTemplateAction( $actions[2]->{mmta_id} ), undef, "third action does not exist anymore" );
+is( GetModificationTemplateAction( $actions[3]->{mmta_id} ), undef, "fourth action does not exist anymore" );
is( GetModificationTemplateActions( $template_id ), 0, "There is no action for deleted template" );
@@ -215,8 +238,31 @@ is( AddModificationTemplateAction(
'Update non existent field 999$a with "non existent"'
), 1, 'Add eighth action: update field non existent 999$a with "non existent."');
-my $record = new_record();
+is( AddModificationTemplateAction(
+ $template_id, 'update_field', 0,
+ '999', 'a', 'existent - updated.', '', '',
+ '', '', '',
+ '', '', '', '', '', '',
+ 'Update existent field 999$a with "existent - updated."'
+), 1, 'Add ninth action: update field non existent 999$a with "existent - updated."');
+
+is( AddModificationTemplateAction(
+ $template_id, 'add_field', 0,
+ '999', 'a', 'additional existent.', '', '',
+ '', '', '',
+ '', '', '', '', '', '',
+ 'Add new existent field 999$a with "additional existent"'
+), 1, 'Add tenth action: add additional field existent 999$a with "additional existent."');
+is( AddModificationTemplateAction(
+ $template_id, 'add_field', 0,
+ '007', '', 'vxcdq', '', '',
+ '', '', '',
+ '', '', '', '', '', '',
+ 'Add new existent field 999$a with "additional existent"'
+), 1, 'Add eleventh action: add additional field existent 007');
+
+my $record = new_record();
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
my $expected_record = expected_record_1();
@@ -423,7 +469,14 @@ sub expected_record_1 {
),
MARC::Field->new(
999, ' ', ' ',
- a => 'non existent.',
+ a => 'existent - updated.',
+ ),
+ MARC::Field->new(
+ 999, ' ', ' ',
+ a => 'additional existent.',
+ ),
+ MARC::Field->new(
+ '007', 'vxcdq',
),
);
$record->append_fields(@fields);
--- a/tools/marc_modification_templates.pl
+++ a/tools/marc_modification_templates.pl
@@ -116,6 +116,7 @@ my @templates = GetModificationTemplates( $template_id );
my @actions = GetModificationTemplateActions( $template_id );
foreach my $action ( @actions ) {
$action->{'action_delete_field'} = ( $action->{'action'} eq 'delete_field' );
+ $action->{'action_add_field'} = ( $action->{'action'} eq 'add_field' );
$action->{'action_update_field'} = ( $action->{'action'} eq 'update_field' );
$action->{'action_move_field'} = ( $action->{'action'} eq 'move_field' );
$action->{'action_copy_field'} = ( $action->{'action'} eq 'copy_field' );
--