Bug 22456: Add waiting_hold_cancellation circulation rule
[koha-ffzg.git] / admin / marc_subfields_structure.pl
index 22ebcce..6f14212 100755 (executable)
@@ -18,8 +18,9 @@
 # along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use Modern::Perl;
-use C4::Output;
-use C4::Auth;
+use Encode qw( encode_utf8 );
+use C4::Output qw( output_html_with_http_headers );
+use C4::Auth qw( get_template_and_user );
 use CGI qw ( -utf8 );
 use C4::Context;
 
@@ -29,38 +30,6 @@ use Koha::Filter::MARC::ViewPolicy;
 
 use List::MoreUtils qw( uniq );
 
-sub string_search {
-    my ( $searchstring, $frameworkcode ) = @_;
-    my $dbh = C4::Context->dbh;
-    $searchstring =~ s/\'/\\\'/g;
-    my @data  = split( ' ', $searchstring );
-    my $count = @data;
-    my $sth   =
-      $dbh->prepare(
-"Select * from marc_subfield_structure where (tagfield like ? and frameworkcode=?) order by tagfield, display_order"
-      );
-    $sth->execute( "$searchstring%", $frameworkcode );
-    my @results;
-    my $cnt = 0;
-    my $u   = 1;
-
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-        $cnt++;
-        $u++;
-    }
-    $sth->finish;
-    return ( $cnt, \@results );
-}
-
-sub marc_subfield_structure_exists {
-    my ($tagfield, $tagsubfield, $frameworkcode) = @_;
-    my $dbh  = C4::Context->dbh;
-    my $sql  = "select tagfield from marc_subfield_structure where tagfield = ? and tagsubfield = ? and frameworkcode = ?";
-    my $rows = $dbh->selectall_arrayref($sql, {}, $tagfield, $tagsubfield, $frameworkcode);
-    return @$rows > 0;
-}
-
 my $input         = CGI->new;
 my $tagfield      = $input->param('tagfield');
 my $tagsubfield   = $input->param('tagsubfield');
@@ -76,7 +45,6 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
         query           => $input,
         type            => "intranet",
         flagsrequired   => { parameters => 'manage_marc_frameworks' },
-        debug           => 1,
     }
 );
 my $cache = Koha::Caches->get_instance();
@@ -130,11 +98,10 @@ if ( $op eq 'add_form' ) {
     $sth2->finish;
     $sth2 = $dbh->prepare("select distinct category from authorised_values");
     $sth2->execute;
-    my @av_cat = Koha::AuthorisedValueCategories->search;
-    my @authorised_values = map { $_->category_name } @av_cat;
+    my @authorised_values= Koha::AuthorisedValueCategories->search->get_column('category_name');
 
     # build thesaurus categories list
-    my @authtypes = uniq( "", map { $_->authtypecode } Koha::Authority::Types->search );
+    my @authtypes = uniq( "", map { $_->authtypecode } Koha::Authority::Types->search->as_list );
 
     # build value_builder list
     my @value_builder = ('');
@@ -159,42 +126,24 @@ if ( $op eq 'add_form' ) {
     closedir DIR;
 
     # build values list
-    my $sth =
-      $dbh->prepare(
-"select * from marc_subfield_structure where tagfield=? and frameworkcode=? order by display_order"
-      );    # and tagsubfield='$tagsubfield'");
-    $sth->execute( $tagfield, $frameworkcode );
+    my $mss = Koha::MarcSubfieldStructures->search(
+        { tagfield => $tagfield, frameworkcode => $frameworkcode },
+        { order_by => 'display_order' }
+    )->unblessed;
     my @loop_data = ();
     my $i         = 0;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        my %row_data;    # get a fresh hash for the row data
-        $row_data{defaultvalue}      = $data->{defaultvalue};
-        $row_data{maxlength}         = $data->{maxlength};
-        $row_data{tab}               = $data->{tab};
-        $row_data{tagsubfield}       = $data->{tagsubfield};
-        $row_data{subfieldcode}      = $data->{'tagsubfield'};
+    for my $m ( @$mss ) {
+        my %row_data = %$m;    # get a fresh hash for the row data
+        $row_data{subfieldcode}      = $m->{tagsubfield};
         $row_data{urisubfieldcode}   = $row_data{subfieldcode} eq '%' ? 'pct' : $row_data{subfieldcode};
-        $row_data{liblibrarian}      = $data->{'liblibrarian'};
-        $row_data{libopac}           = $data->{'libopac'};
-        $row_data{seealso}           = $data->{'seealso'};
         $row_data{kohafields}        = \@kohafields;
-        $row_data{kohafield}         = $data->{kohafield};
         $row_data{authorised_values} = \@authorised_values;
-        $row_data{authorised_value}  = $data->{authorised_value};
         $row_data{value_builders}    = \@value_builder;
-        $row_data{value_builder}     = $data->{'value_builder'};
         $row_data{authtypes}         = \@authtypes;
-        $row_data{authtypecode}      = $data->{'authtypecode'};
-        $row_data{repeatable}        = $data->{repeatable};
-        $row_data{mandatory}         = $data->{mandatory};
-        $row_data{important}         = $data->{important};
-        $row_data{hidden}            = $data->{hidden};
-        $row_data{isurl}             = $data->{isurl};
         $row_data{row}               = $i;
-        $row_data{link}              = $data->{'link'};
 
-        if ( defined $data->{kohafield}
-            and $data->{kohafield} eq 'biblio.biblionumber' )
+        if ( defined $m->{kohafield}
+            and $m->{kohafield} eq 'biblio.biblionumber' )
         {
             my $hidden_opac = Koha::Filter::MARC::ViewPolicy->should_hide_marc(
                     {
@@ -251,6 +200,7 @@ if ( $op eq 'add_form' ) {
     $template->param(
         action   => "Edit subfields",
         tagfield => $tagfield,
+        tagsubfield => $tagsubfield,
         loop           => \@loop_data,
         more_tag       => $tagfield
     );
@@ -262,74 +212,54 @@ if ( $op eq 'add_form' ) {
 elsif ( $op eq 'add_validate' ) {
     my $dbh = C4::Context->dbh;
     $template->param( tagfield => "$input->param('tagfield')" );
-    my $sth_update = $dbh->prepare(qq{
-        update marc_subfield_structure set tagfield=?, tagsubfield=?, liblibrarian=?, libopac=?, repeatable=?, mandatory=?, important=?, kohafield=?, tab=?, seealso=?, authorised_value=?, authtypecode=?, value_builder=?, hidden=?, isurl=?, frameworkcode=?,  link=?, defaultvalue=?, maxlength=?, display_order=?
-        where tagfield=? and tagsubfield=? and frameworkcode=?
-    });
-    my @tagsubfield       = $input->multi_param('tagsubfield');
-    my @liblibrarian      = $input->multi_param('liblibrarian');
-    my @libopac           = $input->multi_param('libopac');
-    my @kohafield         = $input->multi_param('kohafield');
-    my @tab               = $input->multi_param('tab');
-    my @seealso           = $input->multi_param('seealso');
-    my @hidden            = $input->multi_param('hidden');
-    my @authorised_values = $input->multi_param('authorised_value');
-    my @authtypecodes     = $input->multi_param('authtypecode');
-    my @value_builder     = $input->multi_param('value_builder');
-    my @link              = $input->multi_param('link');
-    my @defaultvalue      = $input->multi_param('defaultvalue');
-    my @maxlength         = $input->multi_param('maxlength');
+    my $tagfield    = $input->param('tagfield');
+    my @tagsubfield = $input->multi_param('tagsubfield');
+    my @tab_ids     = $input->multi_param('tab_id');
 
     my $display_order;
-    for ( my $i = 0 ; $i <= $#tagsubfield ; $i++ ) {
-        my $tagfield    = $input->param('tagfield');
-        my $tagsubfield = $tagsubfield[$i];
+    for my $tagsubfield ( @tagsubfield ) {
         $tagsubfield = "@" unless $tagsubfield ne '';
-        my $liblibrarian     = $liblibrarian[$i];
-        my $libopac          = $libopac[$i];
-        my $repeatable       = $input->param("repeatable$i") ? 1 : 0;
-        my $mandatory        = $input->param("mandatory$i") ? 1 : 0;
-        my $important        = $input->param("important$i") ? 1 : 0;
-        my $kohafield        = $kohafield[$i];
-        my $tab              = $tab[$i];
-        my $seealso          = $seealso[$i];
-        my $authorised_value = $authorised_values[$i];
-        my $authtypecode     = $authtypecodes[$i];
-        my $value_builder    = $value_builder[$i];
-        my $hidden = $hidden[$i];                     #input->param("hidden$i");
-        my $isurl  = $input->param("isurl$i") ? 1 : 0;
-        my $link   = $link[$i];
-        my $defaultvalue = $defaultvalue[$i];
-        my $maxlength = $maxlength[$i] ? $maxlength[$i] : 9999;
-        
+        my $id = shift @tab_ids;
+        my $liblibrarian     = $input->param("liblibrarian_$id");
+        my $libopac          = $input->param("libopac_$id");
+        my $repeatable       = $input->param("repeatable_$id") ? 1 : 0;
+        my $mandatory        = $input->param("mandatory_$id") ? 1 : 0;
+        my $important        = $input->param("important_$id") ? 1 : 0;
+        my $kohafield        = $input->param("kohafield_$id");
+        my $tab              = $input->param("tab_$id");
+        my $seealso          = $input->param("seealso_$id");
+        my $authorised_value = $input->param("authorised_values_$id");
+        my $authtypecode     = $input->param("authtypecodes_$id");
+        my $value_builder    = $input->param("value_builder_$id");
+        my $hidden = $input->param("hidden_$id");
+        my $isurl  = $input->param("isurl_$id") ? 1 : 0;
+        my $link   = $input->param("link_$id");
+        my $defaultvalue = $input->param("defaultvalue_$id");
+        my $maxlength = $input->param("maxlength_$id") || 9999;
+
         if (defined($liblibrarian) && $liblibrarian ne "") {
-            if (marc_subfield_structure_exists($tagfield, $tagsubfield, $frameworkcode)) {
-                $sth_update->execute(
-                    $tagfield,
-                    $tagsubfield,
-                    $liblibrarian,
-                    $libopac,
-                    $repeatable,
-                    $mandatory,
-                    $important,
-                    $kohafield,
-                    $tab,
-                    $seealso,
-                    $authorised_value,
-                    $authtypecode,
-                    $value_builder,
-                    $hidden,
-                    $isurl,
-                    $frameworkcode,
-                    $link,
-                    $defaultvalue,
-                    $maxlength,
-                    $display_order->{$tagfield} || 0,
-                    (
-                        $tagfield,
-                        $tagsubfield,
-                        $frameworkcode,
-                    )
+            my $mss = Koha::MarcSubfieldStructures->find({tagfield => $tagfield, tagsubfield => $tagsubfield, frameworkcode => $frameworkcode });
+            if ($mss) {
+                $mss->update(
+                    {
+                        liblibrarian     => $liblibrarian,
+                        libopac          => $libopac,
+                        repeatable       => $repeatable,
+                        mandatory        => $mandatory,
+                        important        => $important,
+                        kohafield        => $kohafield,
+                        tab              => $tab,
+                        seealso          => $seealso,
+                        authorised_value => $authorised_value,
+                        authtypecode     => $authtypecode,
+                        value_builder    => $value_builder,
+                        hidden           => $hidden,
+                        isurl            => $isurl,
+                        link             => $link,
+                        defaultvalue     => $defaultvalue,
+                        maxlength        => $maxlength,
+                        display_order    => $display_order->{$tagfield} || 0
+                    }
                 );
             } else {
                 if( $frameworkcode ne q{} ) {
@@ -365,11 +295,11 @@ elsif ( $op eq 'add_validate' ) {
             $display_order->{$tagfield}++;
         }
     }
-    $sth_update->finish;
     $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
     $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
     $cache->clear_from_cache("default_value_for_mod_marc-");
     $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
+    $cache->clear_from_cache("MarcCodedFields-$frameworkcode");
 
     print $input->redirect("/cgi-bin/koha/admin/marc_subfields_structure.pl?tagfield=$tagfield&amp;frameworkcode=$frameworkcode");
     exit;
@@ -379,22 +309,16 @@ elsif ( $op eq 'add_validate' ) {
     # called by default form, used to confirm deletion of data in DB
 }
 elsif ( $op eq 'delete_confirm' ) {
-    my $dbh = C4::Context->dbh;
-    my $sth =
-      $dbh->prepare(
-"select * from marc_subfield_structure where tagfield=? and tagsubfield=? and frameworkcode=?"
-      );
-
-    $sth->execute( $tagfield, $tagsubfield, $frameworkcode );
-    my $data = $sth->fetchrow_hashref;
-    $sth->finish;
+    my $mss = Koha::MarcSubfieldStructures->find(
+        {
+            tagfield      => $tagfield,
+            tagsubfield   => $tagsubfield,
+            frameworkcode => $frameworkcode
+        }
+    );
     $template->param(
-        liblibrarian  => $data->{'liblibrarian'},
-        tagsubfield   => $data->{'tagsubfield'},
+        mss => $mss,
         delete_link   => $script_name,
-        tagfield      => $tagfield,
-        tagsubfield   => $tagsubfield,
-        frameworkcode => $frameworkcode,
     );
 
     # END $OP eq DELETE_CONFIRM
@@ -402,17 +326,19 @@ elsif ( $op eq 'delete_confirm' ) {
   # called by delete_confirm, used to effectively confirm deletion of data in DB
 }
 elsif ( $op eq 'delete_confirmed' ) {
-    my $dbh = C4::Context->dbh;
-    my $sth =
-      $dbh->prepare(
-"delete from marc_subfield_structure where tagfield=? and tagsubfield=? and frameworkcode=?"
-      );
-    $sth->execute( $tagfield, $tagsubfield, $frameworkcode );
-    $sth->finish;
+    Koha::MarcSubfieldStructures->find(
+        {
+            tagfield      => $tagfield,
+            tagsubfield   => $tagsubfield,
+            frameworkcode => $frameworkcode
+        }
+    )->delete;
+
     $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
     $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
     $cache->clear_from_cache("default_value_for_mod_marc-");
     $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
+    $cache->clear_from_cache("MarcCodedFields-$frameworkcode");
     print $input->redirect("/cgi-bin/koha/admin/marc_subfields_structure.pl?tagfield=$tagfield&amp;frameworkcode=$frameworkcode");
     exit;
 
@@ -420,33 +346,15 @@ elsif ( $op eq 'delete_confirmed' ) {
 ################## DEFAULT ##################################
 }
 else {    # DEFAULT
-    my ( $count, $results ) = string_search( $tagfield, $frameworkcode );
-    my @loop_data = ();
-    for ( my $i = 0; $i < $count; $i++ ) {
-        my %row_data;    # get a fresh hash for the row data
-        $row_data{tagfield}         = $results->[$i]{'tagfield'};
-        $row_data{tagsubfield}      = $results->[$i]{'tagsubfield'};
-        $row_data{liblibrarian}     = $results->[$i]{'liblibrarian'};
-        $row_data{kohafield}        = $results->[$i]{'kohafield'};
-        $row_data{repeatable}       = $results->[$i]{'repeatable'};
-        $row_data{mandatory}        = $results->[$i]{'mandatory'};
-        $row_data{important}        = $results->[$i]{'important'};
-        $row_data{tab}              = $results->[$i]{'tab'};
-        $row_data{seealso}          = $results->[$i]{'seealso'};
-        $row_data{authorised_value} = $results->[$i]{'authorised_value'};
-        $row_data{authtypecode}     = $results->[$i]{'authtypecode'};
-        $row_data{value_builder}    = $results->[$i]{'value_builder'};
-        $row_data{hidden}           = $results->[$i]{'hidden'};
-        $row_data{isurl}            = $results->[$i]{'isurl'};
-        $row_data{link}             = $results->[$i]{'link'};
-
-        if ( $row_data{tab} eq -1 ) {
-            $row_data{subfield_ignored} = 1;
-        }
+    my $mss = Koha::MarcSubfieldStructures->search(
+        {
+            tagfield      => { -like => "$tagfield%" },
+            frameworkcode => $frameworkcode
+        },
+        { order_by => [ 'tagfield', 'display_order' ] }
+    )->unblessed;
 
-        push( @loop_data, \%row_data );
-    }
-    $template->param( loop => \@loop_data );
+    $template->param( loop => $mss );
     $template->param(
         edit_tagfield      => $tagfield,
         edit_frameworkcode => $frameworkcode