From 95f0caed385c845888e50c8f484b3ada6117b33a Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 15 Sep 2015 14:20:22 +0100 Subject: [PATCH] Bug 14828: use Koha::ItemType[s] in admin/itemtypes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Test plan: Add/edit/remove item types from the administration module (admin/itemtypes.pl). You should get message feedback after each action. Don't forget to play with the image and try to remove an item type linked to records (you should not be able to remove it). Signed-off-by: Marc Véron Signed-off-by: Kyle M Hall Signed-off-by: Brendan Gallagher brendan@bywatersolutions.com --- admin/itemtypes.pl | 331 ++++------ .../prog/en/modules/admin/itemtypes.tt | 576 +++++++++--------- 2 files changed, 407 insertions(+), 500 deletions(-) diff --git a/admin/itemtypes.pl b/admin/itemtypes.pl index 9e2fdfeebb..f5182cd4b5 100755 --- a/admin/itemtypes.pl +++ b/admin/itemtypes.pl @@ -1,6 +1,7 @@ #!/usr/bin/perl # Copyright 2000-2002 Katipo Communications +# Copyright 2002 Paul Poulain # # This file is part of Koha. # @@ -19,32 +20,11 @@ =head1 admin/itemtypes.pl -script to administer the categories table -written 20/02/2002 by paul.poulain@free.fr - This software is placed under the gnu General Public License, v2 (http://www.gnu.org/licenses/gpl.html) - - ALGO : - this script use an $op to know what to do. - if $op is empty or none of the above values, - - the default screen is build (with all records, or filtered datas). - - the user can clic on add, modify or delete record. - if $op=add_form - - if primkey exists, this is a modification,so we read the $primkey record - - builds the add/modify form - if $op=add_validate - - the user has just send datas, so we create/modify the record - if $op=delete_form - - we show the record having primkey=$primkey and ask for deletion validation form - if $op=delete_confirm - - we delete the record having primkey=$primkey - =cut -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; use CGI qw ( -utf8 ); -use List::Util qw/min/; use File::Spec; use C4::Koha; @@ -52,18 +32,17 @@ use C4::Context; use C4::Auth; use C4::Output; +use Koha::ItemTypes; 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') // 'list'; +my $input = new CGI; +my $searchfield = $input->param('description'); +my $itemtype_code = $input->param('itemtype'); +my $op = $input->param('op') // 'list'; my @messages; -$searchfield =~ s/\,//g; +$searchfield =~ s/\,//g if $searchfield; my ( $template, $borrowernumber, $cookie ) = get_template_and_user( - { - template_name => "admin/itemtypes.tt", + { template_name => "admin/itemtypes.tt", query => $input, type => "intranet", authnotrequired => 0, @@ -72,228 +51,130 @@ 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 -} - 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(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; - } - - my $imagesets = C4::Koha::getImageSets( checked => $data->{'imageurl'} ); - - my $remote_image = undef; - if ( defined $data->{imageurl} and $data->{imageurl} =~ /^http/i ) { - $remote_image = $data->{imageurl}; - } - - my $searchcategory = GetAuthorisedValues("ITEMTYPECAT", $data->{'searchcategory'}); - + my $itemtype = Koha::ItemTypes->find($itemtype_code); + my $imagesets = C4::Koha::getImageSets( checked => ( $itemtype ? $itemtype->imageurl : undef ) ); + my $searchcategory = GetAuthorisedValues("ITEMTYPECAT", ( $itemtype ? $itemtype->searchcategory : '' ) ); $template->param( - itemtype => $itemtype, - description => $data->{'description'}, - rentalcharge => sprintf( "%.2f", $data->{'rentalcharge'} ), - notforloan => $data->{'notforloan'}, - 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, + itemtype => $itemtype, + imagesets => $imagesets, + searchcategory => $searchcategory, ); - - # END $OP eq ADD_FORM -################## ADD_VALIDATE ################################## - # called by add_form, used to insert/modify data in DB -} -elsif ( $op eq 'add_validate' ) { - my $is_a_modif = $input->param('is_a_modif'); - my ( $already_exists ) = $dbh->selectrow_array(q| - SELECT itemtype - FROM itemtypes - WHERE itemtype = ? - |, undef, $itemtype ); - if ( $already_exists and $is_a_modif ) { # it's a modification - my $query2 = ' - UPDATE itemtypes - SET description = ? - , rentalcharge = ? - , notforloan = ? - , imageurl = ? - , summary = ? - , checkinmsg = ? - , checkinmsgtype = ? - , sip_media_type = ? - , hideinopac = ? - , searchcategory = ? - WHERE itemtype = ? - '; - my $sth = $dbh->prepare($query2); - $sth->execute( - $input->param('description'), - $input->param('rentalcharge'), - ( $input->param('notforloan') ? 1 : 0 ), - ( - $input->param('image') eq 'removeImage' ? '' : ( - $input->param('image') eq 'remoteImage' - ? $input->param('remoteImage') - : $input->param('image') . "" - ) - ), - $input->param('summary'), - $input->param('checkinmsg'), - $input->param('checkinmsgtype'), - $sip_media_type, - $input->param('hideinopac') ? 1 : 0, - $input->param('searchcategory'), - $input->param('itemtype') - ); - } - elsif ( not $already_exists and not $is_a_modif ) { - my $query = " - INSERT INTO itemtypes - (itemtype,description,rentalcharge, notforloan, imageurl, summary, checkinmsg, checkinmsgtype, sip_media_type, hideinopac, searchcategory) - VALUES - (?,?,?,?,?,?,?,?,?,?,?); - "; - my $sth = $dbh->prepare($query); - my $image = $input->param('image'); - $sth->execute( - $input->param('itemtype'), - $input->param('description'), - $input->param('rentalcharge'), - $input->param('notforloan') ? 1 : 0, - $image eq 'removeImage' ? '' : - $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'), +} elsif ( $op eq 'add_validate' ) { + my $is_a_modif = $input->param('is_a_modif'); + my $itemtype = Koha::ItemTypes->find($itemtype_code); + my $description = $input->param('description'); + my $rentalcharge = $input->param('rentalcharge'); + my $image = $input->param('image') || q||; + + my $notforloan = $input->param('notforloan') ? 1 : 0; + my $imageurl = + $image eq 'removeImage' ? '' + : ( + $image eq 'remoteImage' ? $input->param('remoteImage') + : $image + ); + my $summary = $input->param('summary'); + my $checkinmsg = $input->param('checkinmsg'); + my $checkinmsgtype = $input->param('checkinmsgtype'); + my $hideinopac = $input->param('hideinopac') // 0; + my $searchcategory = $input->param('searchcategory'); + + if ( $itemtype and $is_a_modif ) { # it's a modification + $itemtype->description($description); + $itemtype->rentalcharge($rentalcharge); + $itemtype->notforloan($notforloan); + $itemtype->imageurl($imageurl); + $itemtype->summary($summary); + $itemtype->checkinmsg($checkinmsg); + $itemtype->checkinmsgtype($checkinmsgtype); + $itemtype->sip_media_type($sip_media_type); + $itemtype->hideinopac($hideinopac); + $itemtype->searchcategory($searchcategory); + + eval { $itemtype->store; }; + + if ($@) { + push @messages, { type => 'error', code => 'error_on_update' }; + } else { + push @messages, { type => 'message', code => 'success_on_update' }; + } + } elsif ( not $itemtype and not $is_a_modif ) { + my $itemtype = Koha::ItemType->new( + { itemtype => $itemtype_code, + description => $description, + rentalcharge => $rentalcharge, + notforloan => $notforloan, + imageurl => $imageurl, + summary => $summary, + checkinmsg => $checkinmsg, + checkinmsgtype => $checkinmsgtype, + sip_media_type => $sip_media_type, + hideinopac => $hideinopac, + searchcategory => $searchcategory, + } ); - } - else { - push @messages, { - type => 'error', + eval { $itemtype->store; }; + + if ($@) { + push @messages, { type => 'error', code => 'error_on_insert' }; + } else { + push @messages, { type => 'message', code => 'success_on_insert' }; + } + } else { + push @messages, + { type => 'error', code => 'already_exists', - }; + }; } $searchfield = ''; - $op = 'list'; - # END $OP eq ADD_VALIDATE -################## DELETE_CONFIRM ################################## - # called by default form, used to confirm deletion of data in DB -} -elsif ( $op eq 'delete_confirm' ) { + $op = 'list'; +} elsif ( $op eq 'delete_confirm' ) { + # Check both items and biblioitems - my $sth = $dbh->prepare(' + my ($total) = $dbh->selectrow_array( ' SELECT COUNT(*) AS total FROM ( SELECT itemtype AS t FROM biblioitems UNION ALL SELECT itype AS t FROM items ) AS tmp WHERE tmp.t=? - '); - $sth->execute($itemtype); - my $total = $sth->fetchrow_hashref->{'total'}; + ', {}, $itemtype_code ); + + if ($total) { + push @messages, { type => 'error', code => 'cannot_be_deleted', total => $total }; + $op = 'list'; + } else { + my $itemtype = Koha::ItemTypes->find($itemtype_code); + $template->param( itemtype => $itemtype, ); + } - my $sth = - $dbh->prepare( -"select itemtype,description,rentalcharge from itemtypes where itemtype=?" - ); - $sth->execute($itemtype); - my $data = $sth->fetchrow_hashref; - $template->param( - itemtype => $itemtype, - description => $data->{description}, - rentalcharge => sprintf( "%.2f", $data->{rentalcharge} ), - imageurl => $data->{imageurl}, - total => $total - ); +} elsif ( $op eq 'delete_confirmed' ) { + my $itemtype = Koha::ItemTypes->find($itemtype_code); + my $deleted = eval { $itemtype->delete }; + if ( $@ or not $deleted ) { + push @messages, { type => 'error', code => 'error_on_delete' }; + } else { + push @messages, { type => 'message', code => 'success_on_delete' }; + } - # END $OP eq DELETE_CONFIRM -################## DELETE_CONFIRMED ################################## - # called by delete_confirm, used to effectively confirm deletion of data in DB -} -elsif ( $op eq 'delete_confirmed' ) { - my $itemtype = uc( $input->param('itemtype') ); - my $sth = $dbh->prepare("delete from itemtypes where itemtype=?"); - $sth->execute($itemtype); - $sth = $dbh->prepare("delete from issuingrules where itemtype=?"); - $sth->execute($itemtype); - print $input->redirect('itemtypes.pl'); - exit; - # END $OP eq DELETE_CONFIRMED -################## DEFAULT ################################## + $op = 'list'; } 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 ); - } - + my $itemtypes = Koha::ItemTypes->search; $template->param( - loop => \@loop, - else => 1, - messages => \@messages, + itemtypes => $itemtypes, + messages => \@messages, ); } +$template->param( op => $op ); + output_html_with_http_headers $input, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt index 6b2ab05374..33ac762b95 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt @@ -1,20 +1,22 @@ +[% USE Koha %] [% USE AuthorisedValues %] +[% USE Price %] [% INCLUDE 'doc-head-open.inc' %] -Koha › Administration › Item types [% IF ( add_form ) %]› +<title>Koha › Administration › Item types [% IF op == 'add_form' %]› [% IF ( itemtype ) %] -Modify item type '[% itemtype %]' +Modify item type '[% itemtype.itemtype %]' [% ELSE %] Add item type [% END %] [% END %] -[% IF ( delete_confirm ) %]› +[% IF op == 'delete_confirm' %]› [% IF ( total ) %] -Cannot delete item type '[% itemtype %]' +Cannot delete item type '[% itemtype.itemtype %]' [% ELSE %] -Delete item type '[% itemtype %]'? +Delete item type '[% itemtype.itemtype %]'? [% END %] [% END %] -[% IF ( delete_confirmed ) %]› +[% IF op == 'delete_confirmed' %]› Data deleted [% END %] @@ -55,312 +57,336 @@ Data deleted [% INCLUDE 'header.inc' %] [% INCLUDE 'cat-search.inc' %] -