Bug 15354: Fix translated itemtype descriptions in circ rules
[srvgit] / admin / itemtypes.pl
index 3219da3..9e2fdfe 100755 (executable)
@@ -4,18 +4,18 @@
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 =head1 admin/itemtypes.pl
 
@@ -42,7 +42,7 @@ written 20/02/2002 by paul.poulain@free.fr
 
 use strict;
 #use warnings; FIXME - Bug 2505
-use CGI;
+use CGI qw ( -utf8 );
 
 use List::Util qw/min/;
 use File::Spec;
@@ -52,32 +52,22 @@ use C4::Context;
 use C4::Auth;
 use C4::Output;
 
-sub StringSearch {
-    my ( $searchstring, $type ) = @_;
-    my $dbh = C4::Context->dbh;
-    $searchstring =~ s/\'/\\\'/g;
-    my @data = split( ' ', $searchstring );
-    my $sth = $dbh->prepare(
-        "SELECT * FROM itemtypes WHERE (description LIKE ?) ORDER BY itemtype"
-       );
-    $sth->execute("$data[0]%");
-    return $sth->fetchall_arrayref({});                # return ref-to-array of ref-to-hashes
-                                                               # like [ fetchrow_hashref(), fetchrow_hashref() ... ]
-}
+use Koha::Localizations;
 
 my $input       = new CGI;
 my $searchfield = $input->param('description');
 my $script_name = "/cgi-bin/koha/admin/itemtypes.pl";
 my $itemtype    = $input->param('itemtype');
-my $op          = $input->param('op');
+my $op          = $input->param('op') // 'list';
+my @messages;
 $searchfield =~ s/\,//g;
 my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
     {
-        template_name   => "admin/itemtypes.tmpl",
+        template_name   => "admin/itemtypes.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
-        flagsrequired   => { parameters => 1 },
+        flagsrequired   => { parameters => 'parameters_remaining_permissions' },
         debug           => 1,
     }
 );
@@ -85,20 +75,41 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
 $template->param(script_name => $script_name);
 if ($op) {
        $template->param($op  => 1); # we show only the TMPL_VAR names $op
-} else {
-    $template->param(else => 1);
 }
 
 my $dbh = C4::Context->dbh;
 
+my $sip_media_type = $input->param('sip_media_type');
+undef($sip_media_type) if defined($sip_media_type) and $sip_media_type =~ /^\s*$/;
+
 ################## ADD_FORM ##################################
 # called by default. Used to create form to add or  modify a record
 if ( $op eq 'add_form' ) {
     #---- if primkey exists, it's a modify action, so read values to modify...
     my $data;
     if ($itemtype) {
-        my $sth = $dbh->prepare("select * from itemtypes where itemtype=?");
-        $sth->execute($itemtype);
+        my $sth = $dbh->prepare(q|
+            SELECT
+                   itemtypes.itemtype,
+                   itemtypes.description,
+                   itemtypes.rentalcharge,
+                   itemtypes.notforloan,
+                   itemtypes.imageurl,
+                   itemtypes.summary,
+                   itemtypes.checkinmsg,
+                   itemtypes.checkinmsgtype,
+                   itemtypes.sip_media_type,
+                   itemtypes.hideinopac,
+                   itemtypes.searchcategory,
+                   COALESCE( localization.translation, itemtypes.description ) AS translated_description
+            FROM   itemtypes
+            LEFT JOIN localization ON itemtypes.itemtype = localization.code
+                AND localization.entity='itemtypes'
+                AND localization.lang = ?
+            WHERE itemtype = ?
+        |);
+        my $language = C4::Languages::getlanguage();
+        $sth->execute($language, $itemtype);
         $data = $sth->fetchrow_hashref;
     }
 
@@ -109,6 +120,8 @@ if ( $op eq 'add_form' ) {
         $remote_image = $data->{imageurl};
     }
 
+    my $searchcategory = GetAuthorisedValues("ITEMTYPECAT", $data->{'searchcategory'});
+
     $template->param(
         itemtype        => $itemtype,
         description     => $data->{'description'},
@@ -117,8 +130,13 @@ if ( $op eq 'add_form' ) {
         imageurl        => $data->{'imageurl'},
         template        => C4::Context->preference('template'),
         summary         => $data->{summary},
+        checkinmsg      => $data->{'checkinmsg'},
+        checkinmsgtype  => $data->{'checkinmsgtype'},
         imagesets       => $imagesets,
         remote_image    => $remote_image,
+        sip_media_type  => $data->{sip_media_type},
+        hideinopac      => $data->{'hideinopac'},
+        searchcategory  => $searchcategory,
     );
 
     # END $OP eq ADD_FORM
@@ -126,14 +144,13 @@ if ( $op eq 'add_form' ) {
     # called by add_form, used to insert/modify data in DB
 }
 elsif ( $op eq 'add_validate' ) {
-    my $query = "
+    my $is_a_modif = $input->param('is_a_modif');
+    my ( $already_exists ) = $dbh->selectrow_array(q|
         SELECT itemtype
         FROM   itemtypes
         WHERE  itemtype = ?
-    ";
-    my $sth = $dbh->prepare($query);
-    $sth->execute($itemtype);
-    if ( $sth->fetchrow ) {            # it's a modification
+    |, undef, $itemtype );
+    if ( $already_exists and $is_a_modif ) { # it's a modification
         my $query2 = '
             UPDATE itemtypes
             SET    description = ?
@@ -141,9 +158,14 @@ elsif ( $op eq 'add_validate' ) {
                  , notforloan = ?
                  , imageurl = ?
                  , summary = ?
+                 , checkinmsg = ?
+                 , checkinmsgtype = ?
+                 , sip_media_type = ?
+                 , hideinopac = ?
+                 , searchcategory = ?
             WHERE itemtype = ?
         ';
-        $sth = $dbh->prepare($query2);
+        my $sth = $dbh->prepare($query2);
         $sth->execute(
             $input->param('description'),
             $input->param('rentalcharge'),
@@ -156,15 +178,20 @@ elsif ( $op eq 'add_validate' ) {
                 )
             ),
             $input->param('summary'),
+            $input->param('checkinmsg'),
+            $input->param('checkinmsgtype'),
+            $sip_media_type,
+            $input->param('hideinopac') ? 1 : 0,
+            $input->param('searchcategory'),
             $input->param('itemtype')
         );
     }
-    else {    # add a new itemtype & not modif an old
+    elsif ( not $already_exists and not $is_a_modif ) {
         my $query = "
             INSERT INTO itemtypes
-                (itemtype,description,rentalcharge, notforloan, imageurl,summary)
+                (itemtype,description,rentalcharge, notforloan, imageurl, summary, checkinmsg, checkinmsgtype, sip_media_type, hideinopac, searchcategory)
             VALUES
-                (?,?,?,?,?,?);
+                (?,?,?,?,?,?,?,?,?,?,?);
             ";
         my $sth = $dbh->prepare($query);
                my $image = $input->param('image');
@@ -177,12 +204,22 @@ elsif ( $op eq 'add_validate' ) {
             $image eq 'remoteImage' ? $input->param('remoteImage') :
             $image,
             $input->param('summary'),
+            $input->param('checkinmsg'),
+            $input->param('checkinmsgtype'),
+            $sip_media_type,
+            $input->param('hideinopac') ? 1 : 0,
+            $input->param('searchcategory'),
         );
     }
+    else {
+        push @messages, {
+            type => 'error',
+            code => 'already_exists',
+        };
+    }
 
-    print $input->redirect('itemtypes.pl');
-    exit;
-
+    $searchfield = '';
+    $op = 'list';
     # END $OP eq ADD_VALIDATE
 ################## DELETE_CONFIRM ##################################
     # called by default form, used to confirm deletion of data in DB
@@ -192,7 +229,7 @@ elsif ( $op eq 'delete_confirm' ) {
     my $sth = $dbh->prepare('
         SELECT COUNT(*) AS total FROM (
             SELECT itemtype AS t FROM biblioitems
-            UNION
+            UNION ALL
             SELECT itype AS t FROM items
         ) AS tmp
         WHERE tmp.t=?
@@ -229,18 +266,34 @@ elsif ( $op eq 'delete_confirmed' ) {
     # END $OP eq DELETE_CONFIRMED
 ################## DEFAULT ##################################
 }
-else {    # DEFAULT
-    my ($results) = StringSearch( $searchfield, 'web' );
+
+if ( $op eq 'list' ) {
+    my $results = C4::Koha::GetItemTypes( style => 'array' );
     my @loop;
     foreach my $itemtype ( @{$results} ) {
         $itemtype->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtype->{imageurl} );
         $itemtype->{rentalcharge} = sprintf( '%.2f', $itemtype->{rentalcharge} );
+
+        my @translated_descriptions = Koha::Localizations->search(
+            {   entity => 'itemtypes',
+                code   => $itemtype->{itemtype},
+            }
+        );
+        $itemtype->{translated_descriptions} = [ map {
+            {
+                lang => $_->lang,
+                translation => $_->translation,
+            }
+        } @translated_descriptions ];
+
         push( @loop, $itemtype );
     }
 
     $template->param(
-        loop           => \@loop,
+        loop     => \@loop,
+        else     => 1,
+        messages => \@messages,
     );
-}    #---- END $OP eq DEFAULT
+}
 
 output_html_with_http_headers $input, $cookie, $template->output;