Bug 9701: Configure default indicator
authorJoachim Ganseman <joachim.ganseman@student.ua.ac.be>
Sat, 4 Jun 2016 12:58:36 +0000 (12:58 +0000)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Thu, 12 Apr 2018 13:50:34 +0000 (10:50 -0300)
This patch adds the possibility to define default indicators in
the MARC frameworks. It adds 2 columns in the marc_tag_structure table in
the database in order to accomplish this. All files that reference this
table have also been updated to reflect these added fields.

Test: Add or edit a MARC framework. In the Field list should be 2 extra
columns. It should be possible to add default indicators (1 character)
    in these fields. Nothing else should have changed in the meantime.
    The default indicator values are not yet visible in the cataloguing module.

The default values are also loaded in the cataloguing form.

Test: Define default values in some MARC framework. Go to cataloguing
and create a new record using this framework. Verify that the defined
defaults are visible when set. Verify the default is empty (as before)
    if no default was set. Verify that if the default is changed, the
    record is saved with the manually changed value. Verify that upon
    changing such a new record, the manually set indicator value is used
    and not the default one from the framework.

Don't forget to run database and database schema update

Signed-off-by: Eugene Jose Espinoza <eugenegf@yahoo.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
C4/Biblio.pm
admin/marctagstructure.pl
cataloguing/addbiblio.pl
installer/data/mysql/atomicupdate/bug_9701-add_default_indicators.sql [new file with mode: 0644]
installer/data/mysql/kohastructure.sql
koha-tmpl/intranet-tmpl/prog/en/modules/admin/marctagstructure.tt

index f688534..eaff256 100644 (file)
@@ -906,19 +906,21 @@ sub GetMarcStructure {
 
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare(
-        "SELECT tagfield,liblibrarian,libopac,mandatory,repeatable 
+        "SELECT tagfield,liblibrarian,libopac,mandatory,repeatable,ind1_defaultvalue,ind2_defaultvalue
         FROM marc_tag_structure 
         WHERE frameworkcode=? 
         ORDER BY tagfield"
     );
     $sth->execute($frameworkcode);
-    my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable );
+    my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable, $ind1_defaultvalue, $ind2_defaultvalue );
 
-    while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = $sth->fetchrow ) {
+    while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable, $ind1_defaultvalue, $ind2_defaultvalue ) = $sth->fetchrow ) {
         $res->{$tag}->{lib}        = ( $forlibrarian or !$libopac ) ? $liblibrarian : $libopac;
         $res->{$tag}->{tab}        = "";
         $res->{$tag}->{mandatory}  = $mandatory;
         $res->{$tag}->{repeatable} = $repeatable;
+    $res->{$tag}->{ind1_defaultvalue} = $ind1_defaultvalue;
+    $res->{$tag}->{ind2_defaultvalue} = $ind2_defaultvalue;
     }
 
     $sth = $dbh->prepare(
index 3ca143b..43de4fb 100755 (executable)
@@ -89,7 +89,7 @@ if ($op eq 'add_form') {
        #---- if primkey exists, it's a modify action, so read values to modify...
        my $data;
        if ($searchfield) {
-               $sth=$dbh->prepare("select tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value from marc_tag_structure where tagfield=? and frameworkcode=?");
+        $sth=$dbh->prepare("select tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value,ind1_defaultvalue,ind2_defaultvalue from marc_tag_structure where tagfield=? and frameworkcode=?");
                $sth->execute($searchfield,$frameworkcode);
                $data=$sth->fetchrow_hashref;
        }
@@ -108,6 +108,8 @@ if ($op eq 'add_form') {
             repeatable => $data->{'repeatable'},
             mandatory => $data->{'mandatory'},
             authorised_value => $data->{authorised_value},
+            ind1_defaultvalue => $data->{'ind1_defaultvalue'},
+            ind2_defaultvalue => $data->{'ind2_defaultvalue'},
                        frameworkcode => $frameworkcode,
     );  # FIXME: move checkboxes to presentation layer
                                                                                                        # END $OP eq ADD_FORM
@@ -120,21 +122,25 @@ if ($op eq 'add_form') {
        my $repeatable       = $input->param('repeatable') ? 1 : 0;
        my $mandatory        = $input->param('mandatory')  ? 1 : 0;
        my $authorised_value = $input->param('authorised_value');
+    my $ind1_defaultvalue = $input->param('ind1_defaultvalue');
+    my $ind2_defaultvalue = $input->param('ind2_defaultvalue');
     if ($input->param('modif')) {
         $sth = $dbh->prepare(
-        "UPDATE marc_tag_structure SET liblibrarian=? ,libopac=? ,repeatable=? ,mandatory=? ,authorised_value=? WHERE frameworkcode=? AND tagfield=?"
+        "UPDATE marc_tag_structure SET liblibrarian=? ,libopac=? ,repeatable=? ,mandatory=? ,authorised_value=?, ind1_defaultvalue=?, ind2_defaultvalue=? WHERE frameworkcode=? AND tagfield=?"
         );
         $sth->execute(  $liblibrarian,
                         $libopac,
                         $repeatable,
                         $mandatory,
                         $authorised_value,
+                        $ind1_defaultvalue,
+                        $ind2_defaultvalue,
                         $frameworkcode,
                         $tagfield
         );
     } else {
         $sth = $dbh->prepare(
-        "INSERT INTO marc_tag_structure (tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value,frameworkcode) values (?,?,?,?,?,?,?)"
+        "INSERT INTO marc_tag_structure (tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value,ind1_defaultvalue,ind2_defaultvalue,frameworkcode) values (?,?,?,?,?,?,?,?,?)"
         );
         $sth->execute($tagfield,
                       $liblibrarian,
@@ -142,6 +148,8 @@ if ($op eq 'add_form') {
                       $repeatable,
                       $mandatory,
                       $authorised_value,
+                      $ind1_defaultvalue,
+                      $ind2_defaultvalue,
                       $frameworkcode
         );
     }
@@ -155,7 +163,7 @@ if ($op eq 'add_form') {
 ################## DELETE_CONFIRM ##################################
 # called by default form, used to confirm deletion of data in DB
 } elsif ($op eq 'delete_confirm') {
-       $sth=$dbh->prepare("select tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value from marc_tag_structure where tagfield=? and frameworkcode=?");
+    $sth=$dbh->prepare("select tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value,ind1_defaultvalue,ind2_defaultvalue from marc_tag_structure where tagfield=? and frameworkcode=?");
     $sth->execute($searchfield, $frameworkcode);
     my $data = $sth->fetchrow_hashref;
        $template->param(
@@ -215,6 +223,8 @@ if ($op eq 'add_form') {
                              marc_tag_structure.repeatable as mts_repeatable,
                              marc_tag_structure.mandatory as mts_mandatory,
                              marc_tag_structure.authorised_value as mts_authorized_value,
+                  marc_tag_structure.ind1_defaultvalue as mts_ind1_defaultvalue,
+                  marc_tag_structure.ind1_defaultvalue as mts_ind2_defaultvalue,
                              marc_subfield_structure.*
                 FROM marc_tag_structure 
                 LEFT JOIN marc_subfield_structure ON (marc_tag_structure.tagfield=marc_subfield_structure.tagfield AND marc_tag_structure.frameworkcode=marc_subfield_structure.frameworkcode) WHERE (marc_tag_structure.tagfield >= ? and marc_tag_structure.frameworkcode=?) AND marc_subfield_structure.tab>=0 ORDER BY marc_tag_structure.tagfield,marc_subfield_structure.tagsubfield");
@@ -236,6 +246,8 @@ if ($op eq 'add_form') {
                        $row_data{repeatable}       = $results[$i]->{'mts_repeatable'};
                        $row_data{mandatory}        = $results[$i]->{'mts_mandatory'};
                        $row_data{authorised_value} = $results[$i]->{'mts_authorised_value'};
+            $row_data{ind1_defaultvalue} = $results[$i]->{'mts_ind1_defaultvalue'};
+            $row_data{ind2_defaultvalue} = $results[$i]->{'mts_ind2_defaultvalue'};
                        $row_data{subfield_link} = "marc_subfields_structure.pl?op=add_form&amp;tagfield=".$results[$i]->{'mts_tagfield'}."&amp;frameworkcode=".$frameworkcode;
                        $row_data{edit}          = "$script_name?op=add_form&amp;searchfield="            .$results[$i]->{'mts_tagfield'}."&amp;frameworkcode=".$frameworkcode;
                        $row_data{delete}        = "$script_name?op=delete_confirm&amp;searchfield="      .$results[$i]->{'mts_tagfield'}."&amp;frameworkcode=".$frameworkcode;
@@ -281,6 +293,8 @@ if ($op eq 'add_form') {
                        $row_data{repeatable}       = $results->[$i]{'repeatable'};
                        $row_data{mandatory}        = $results->[$i]{'mandatory'};
                        $row_data{authorised_value} = $results->[$i]{'authorised_value'};
+            $row_data{ind1_defaultvalue} = $results->[$i]{'ind1_defaultvalue'};
+            $row_data{ind2_defaultvalue} = $results->[$i]{'ind2_defaultvalue'};
                        $row_data{subfield_link}    = "marc_subfields_structure.pl?tagfield="          .$results->[$i]{'tagfield'}."&amp;frameworkcode=".$frameworkcode;
                        $row_data{edit}             = "$script_name?op=add_form&amp;searchfield="      .$results->[$i]{'tagfield'}."&amp;frameworkcode=".$frameworkcode;
                        $row_data{delete}           = "$script_name?op=delete_confirm&amp;searchfield=".$results->[$i]{'tagfield'}."&amp;frameworkcode=".$frameworkcode;
@@ -313,7 +327,7 @@ output_html_with_http_headers $input, $cookie, $template->output;
 sub StringSearch  {
        my ($searchstring,$frameworkcode)=@_;
        my $sth = C4::Context->dbh->prepare("
-    SELECT tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value
+    SELECT tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value,ind1_defaultvalue,ind2_defaultvalue
      FROM  marc_tag_structure
      WHERE (tagfield >= ? and frameworkcode=?)
     ORDER BY tagfield
@@ -329,8 +343,8 @@ sub StringSearch  {
 sub duplicate_framework {
        my ($newframeworkcode,$oldframeworkcode) = @_;
        my $dbh = C4::Context->dbh;
-    $dbh->do(q|INSERT INTO marc_tag_structure (tagfield, liblibrarian, libopac, repeatable, mandatory, authorised_value, frameworkcode)
-        SELECT tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value, ? from marc_tag_structure where frameworkcode=?|, undef, $newframeworkcode, $oldframeworkcode );
+    $dbh->do(q|INSERT INTO marc_tag_structure (tagfield, liblibrarian, libopac, repeatable, mandatory, authorised_value, ind1_defaultvalue, ind2_defaultvalue, frameworkcode)
+        SELECT tagfield,liblibrarian,libopac,repeatable,mandatory,authorised_value, ind1_defaultvalue, ind2_defaultvalue, ? from marc_tag_structure where frameworkcode=?|, undef, $newframeworkcode, $oldframeworkcode );
 
     $dbh->do(q|INSERT INTO marc_subfield_structure (frameworkcode,tagfield,tagsubfield,liblibrarian,libopac,repeatable,mandatory,kohafield,tab,authorised_value,authtypecode,value_builder,seealso,hidden)
         SELECT ?,tagfield,tagsubfield,liblibrarian,libopac,repeatable,mandatory,kohafield,tab,authorised_value,authtypecode,value_builder,seealso,hidden from marc_subfield_structure where frameworkcode=?
index 4ecaf69..0f40ecd 100755 (executable)
@@ -657,8 +657,8 @@ sub build_tabs {
                         tag_lib          => $tagslib->{$tag}->{lib},
                         repeatable       => $tagslib->{$tag}->{repeatable},
                         mandatory       => $tagslib->{$tag}->{mandatory},
-                        indicator1       => $indicator1,
-                        indicator2       => $indicator2,
+                        indicator1       => ( $indicator1 || $tagslib->{$tag}->{ind1_defaultvalue} ), #if not set, try to load the default value
+                        indicator2       => ( $indicator2 || $tagslib->{$tag}->{ind2_defaultvalue} ), #use short-circuit operator for efficiency
                         subfield_loop    => \@subfields_data,
                         tagfirstsubfield => $subfields_data[0],
                         fixedfield       => $tag < 10?1:0,
diff --git a/installer/data/mysql/atomicupdate/bug_9701-add_default_indicators.sql b/installer/data/mysql/atomicupdate/bug_9701-add_default_indicators.sql
new file mode 100644 (file)
index 0000000..7cccd91
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE marc_tag_structure
+ADD COLUMN ind2_defaultvalue VARCHAR(1) NOT NULL DEFAULT '' AFTER authorised_value,
+ADD COLUMN ind1_defaultvalue VARCHAR(1) NOT NULL DEFAULT '' AFTER authorised_value;
index 52f0922..6842eb5 100644 (file)
@@ -1141,6 +1141,8 @@ CREATE TABLE `marc_tag_structure` (
   `repeatable` tinyint(4) NOT NULL default 0,
   `mandatory` tinyint(4) NOT NULL default 0,
   `authorised_value` varchar(10) default NULL,
+  `ind1_defaultvalue` varchar(1) NOT NULL default '',
+  `ind2_defaultvalue` varchar(1) NOT NULL default '',
   `frameworkcode` varchar(4) NOT NULL default '',
   PRIMARY KEY  (`frameworkcode`,`tagfield`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
index f4d8023..366e99e 100644 (file)
             <input type="checkbox" name="mandatory" id="mandatory" value="1" />
         [% END %]
     </li>
+    <li><label for="ind1_defaultvalue">First indicator default value: </label>
+        <input id="ind1_defaultvalue" type="text" name="ind1_defaultvalue" value="[% ind1_defaultvalue |html %]" maxlength="1" size="1" />
+    </li>
+    <li><label for="ind2_defaultvalue">Second indicator default value: </label>
+        <input id="ind2_defaultvalue" type="text" name="ind2_defaultvalue" value="[% ind2_defaultvalue |html %]" maxlength="1" size="1" />
+    </li>
     <li><label for="authorised_value">Authorized value: </label>
         <select name="authorised_value" id="authorised_value" size="1">
             <option value=""></option>
         <th>Repeatable</th>
         <th>Mandatory</th>
         <th>Auth value</th>
+        <th>Indicator 1</th>
+        <th>Indicator 2</th>
         <th>&nbsp;</th>
         </tr>
     </thead>
             <td>[% IF ( loo.repeatable ) %]Yes[% ELSE %]No[% END %]</td>
             <td>[% IF ( loo.mandatory ) %]Yes[% ELSE %]No[% END %]</td>
             <td>[% loo.authorised_value %]</td>
+            <td>[% loo.ind1_defaultvalue %]</td>
+            <td>[% loo.ind2_defaultvalue %]</td>
             <td>
                 <div class="dropdown">
                     <a class="btn btn-default btn-xs dropdown-toggle" id="marctagactions[% loo.tagfield %]" role="button" data-toggle="dropdown" href="#">
         <td>[% IF ( loo.repeatable ) %]Yes[% ELSE %]No[% END %]</td>
         <td>[% IF ( loo.mandatory ) %]Yes[% ELSE %]No[% END %]</td>
         <td>[% loo.authorised_value %]</td>
+        <td>[% loo.ind1_defaultvalue %]</td>
+        <td>[% loo.ind2_defaultvalue %]</td>
         <td>
             <div class="dropdown">
                 <a class="btn btn-default btn-xs dropdown-toggle" id="marctagactions[% loo.tagfield %]" role="button" data-toggle="dropdown" href="#">