X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=tools%2Fletter.pl;h=94fc2f5879ac5216a6feaa9611ea8b0ca10acb20;hb=f3b0a7aa89d6995908ec23f5bf5dc28b6ef849ed;hp=f585708dc81aa105de5cd5c76bbbc502d8126377;hpb=2e4a11773c0a4aa172b5debdee4db831a13adf26;p=koha.git diff --git a/tools/letter.pl b/tools/letter.pl index f585708dc8..94fc2f5879 100755 --- a/tools/letter.pl +++ b/tools/letter.pl @@ -21,315 +21,307 @@ 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 is empty or none of the values listed below, + - the default screen is built (with all or filtered (if search string is set) records). + - the user can click on add, modify or delete record. + - filtering is done on the code field if $op=add_form - - if primkey exists, this is a modification,so we read the $primkey record + - if primary key (module + code) exists, this is a modification,so we read the required record - builds the add/modify form if $op=add_validate - - the user has just send datas, so we create/modify the record + - the user has just send data, so we create/modify the record if $op=delete_form - - we show the record having primkey=$primkey and ask for deletion validation form + - we show the record selected and ask for confirmation if $op=delete_confirm - - we delete the record having primkey=$primkey + - we delete the designated record =cut +# TODO This script drives the CRUD operations on the letter table +# The DB interaction should be handled by calls to C4/Letters.pm use strict; +use warnings; use CGI; -use C4::Date; use C4::Auth; use C4::Context; use C4::Output; -sub StringSearch { - my ( $searchstring, $type ) = @_; +# letter_exists($module, $code) +# - return true if a letter with the given $module and $code exists +sub letter_exists { + my ($module, $code) = @_; my $dbh = C4::Context->dbh; - $searchstring =~ s/\'/\\\'/g; - my @data = split( ' ', $searchstring ); - my $count = @data; - my $sth = - $dbh->prepare( - "Select * from letter where (code like ?) order by module,code"); - $sth->execute("$data[0]%"); - my @results; - my $cnt = 0; - - while ( my $data = $sth->fetchrow_hashref ) { - push( @results, $data ); - $cnt++; - } + my $letters = $dbh->selectall_arrayref(q{SELECT name FROM letter WHERE module = ? AND code = ?}, undef, $module, $code); + return @{$letters}; +} - # $sth->execute; - $sth->finish; - return ( $cnt, \@results ); +# $protected_letters = protected_letters() +# - return a hashref of letter_codes representing letters that should never be deleted +sub protected_letters { + my $dbh = C4::Context->dbh; + my $codes = $dbh->selectall_arrayref(q{SELECT DISTINCT letter_code FROM message_transports}); + return { map { $_->[0] => 1 } @{$codes} }; } my $input = new CGI; my $searchfield = $input->param('searchfield'); -my $offset = $input->param('offset'); -my $script_name = "/cgi-bin/koha/tools/letter.pl"; +my $script_name = '/cgi-bin/koha/tools/letter.pl'; my $code = $input->param('code'); my $module = $input->param('module'); my $content = $input->param('content'); -my $pagesize = 20; my $op = $input->param('op'); -$searchfield =~ s/\,//g; my $dbh = C4::Context->dbh; +if (!defined $module ) { + $module = q{}; +} my ( $template, $borrowernumber, $cookie ) = get_template_and_user( { - template_name => "tools/letter.tmpl", + template_name => 'tools/letter.tmpl', query => $input, - type => "intranet", + type => 'intranet', authnotrequired => 0, - flagsrequired => { tools => 1 }, + flagsrequired => { tools => 'edit_notices' }, debug => 1, } ); -if ($op) { - $template->param( - script_name => $script_name, - $op => 1 - ); # we show only the TMPL_VAR names $op +if (!defined $op) { + $op = q{}; # silence errors from eq +} +# we show only the TMPL_VAR names $op + +$template->param( + script_name => $script_name, + action => $script_name +); + +if ($op eq 'add_form') { + add_form($module, $code); +} +elsif ( $op eq 'add_validate' ) { + add_validate(); + $op = q{}; # next operation is to return to default screen +} +elsif ( $op eq 'delete_confirm' ) { + delete_confirm($module, $code); +} +elsif ( $op eq 'delete_confirmed' ) { + delete_confirmed($module, $code); + $op = q{}; # next operation is to return to default screen } else { - $template->param( - script_name => $script_name, - else => 1 - ); # we show only the TMPL_VAR names $op + default_display($searchfield); } -$template->param( action => $script_name ); -################## ADD_FORM ################################## -# called by default. Used to create form to add or modify a record -if ( $op eq 'add_form' ) { +# Do this last as delete_confirmed resets +if ($op) { + $template->param($op => 1); +} else { + $template->param(no_op_set => 1); +} + +output_html_with_http_headers $input, $cookie, $template->output; + +sub add_form { + my ($module, $code ) = @_; - #---- if primkey exists, it's a modify action, so read values to modify... my $letter; + # if code has been passed we can identify letter and its an update action if ($code) { - my $sth = - $dbh->prepare("select * from letter where module=? and code=?"); - $sth->execute( $module, $code ); - $letter = $sth->fetchrow_hashref; - $sth->finish; + $letter = $dbh->selectrow_hashref(q{SELECT module, code, name, title, content FROM letter WHERE module=? AND code=?}, + undef, $module, $code); + $template->param( modify => 1 ); + $template->param( code => $letter->{code} ); + } + else { # initialize the new fields + $letter = { + module => $module, + code => q{}, + name => q{}, + title => q{}, + content => q{}, + }; + $template->param( adding => 1 ); } # build field list - my @SQLfieldname; - my %line = ( 'value' => "LibrarianFirstname", 'text' => 'LibrarianFirstname' ); - push @SQLfieldname, \%line; - my %line = ( 'value' => "LibrarianSurname", 'text' => 'LibrarianSurname' ); - push @SQLfieldname, \%line; - my %line = ( 'value' => "LibrarianEmailaddress", 'text' => 'LibrarianEmailaddress' ); - push @SQLfieldname, \%line; - my $sth2 = $dbh->prepare("SHOW COLUMNS from branches"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BRANCHES---' ); - push @SQLfieldname, \%line; - - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( 'value' => "branches." . $field, 'text' => "branches." . $field ); - push @SQLfieldname, \%line; + my $field_selection = [ + { + value => 'LibrarianFirstname', + text => 'LibrarianFirstname', + }, + { + value => 'LibrarianSurname', + text => 'LibrarianSurname', + }, + { + value => 'LibrarianEmailaddress', + text => 'LibrarianEmailaddress', } - - # add acquisition specific tables - if ( index( $module, "acquisition" ) > 0 ) { - my $sth2 = $dbh->prepare("SHOW COLUMNS from aqbooksellers"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BOOKSELLERS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "aqbooksellers." . $field, - 'text' => "aqbooksellers." . $field - ); - push @SQLfieldname, \%line; - } - my $sth2 = $dbh->prepare("SHOW COLUMNS from aqorders"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---ORDERS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "aqorders." . $field, - 'text' => "aqorders." . $field - ); - push @SQLfieldname, \%line; - } - - # add issues specific tables + ]; + push @{$field_selection}, add_fields('branches'); + if ($module eq 'reserves') { + push @{$field_selection}, add_fields('borrowers', 'reserves', 'biblio', 'items'); } - elsif ( index( $module, "issues" ) > 0 ) { - my $sth2 = $dbh->prepare("SHOW COLUMNS from aqbooksellers"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BOOKSELLERS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "aqbooksellers." . $field, - 'text' => "aqbooksellers." . $field - ); - push @SQLfieldname, \%line; - } - my $sth2 = $dbh->prepare("SHOW COLUMNS from serial"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---SERIALS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( 'value' => "serial." . $field, 'text' => "serial." . $field ); - push @SQLfieldname, \%line; - } - my $sth2 = $dbh->prepare("SHOW COLUMNS from subscription"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---SUBSCRIPTION---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "subscription." . $field, - 'text' => "subscription." . $field - ); - push @SQLfieldname, \%line; - } - - # add biblio specific tables. + elsif ($module eq 'claimacquisition') { + push @{$field_selection}, add_fields('aqbooksellers', 'aqorders'); } - else { - my $sth2 = $dbh->prepare("SHOW COLUMNS from biblio"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BIBLIO---' ); - - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - -# note : %line is redefined, otherwise \%line contains the same value for every entry of the list - my %line = ( 'value' => "biblio." . $field, 'text' => "biblio." . $field ); - push @SQLfieldname, \%line; - } - my $sth2 = $dbh->prepare("SHOW COLUMNS from biblioitems"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BIBLIOITEMS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "biblioitems." . $field, - 'text' => "biblioitems." . $field - ); - push @SQLfieldname, \%line; - } - my %line = ( 'value' => "", 'text' => '---ITEMS---' ); - push @SQLfieldname, \%line; - my %line = ( 'value' => "items.content", 'text' => 'items.content' ); - push @SQLfieldname, \%line; - - my $sth2 = $dbh->prepare("SHOW COLUMNS from borrowers"); - $sth2->execute; - my %line = ( 'value' => "", 'text' => '---BORROWERS---' ); - push @SQLfieldname, \%line; - while ( ( my $field ) = $sth2->fetchrow_array ) { - my %line = ( - 'value' => "borrowers." . $field, - 'text' => "borrowers." . $field - ); - push @SQLfieldname, \%line; + elsif ($module eq 'claimissues') { + push @{$field_selection}, add_fields('aqbooksellers', 'serial', 'subscription'); + push @{$field_selection}, + { + value => q{}, + text => '---BIBLIO---' + }; + foreach(qw(title author serial)) { + push @{$field_selection}, {value => "biblio.$_", text => ucfirst $_ }; } } - if ($code) { - $template->param( modify => 1 ); - $template->param( code => $letter->{code} ); - } else { - $template->param( adding => 1 ); + push @{$field_selection}, add_fields('biblio','biblioitems'), + {value => q{}, text => '---ITEMS---' }, + {value => 'items.content', text => 'items.content'}, + add_fields('borrowers'); } + $template->param( name => $letter->{name}, title => $letter->{title}, - content => ( $content ? $content : $letter->{content} ), - ( $module ? $module : $letter->{module} ) => 1, - SQLfieldname => \@SQLfieldname, + content => $letter->{content}, + $module => 1, + SQLfieldname => $field_selection, ); - - # END $OP eq ADD_FORM -################## ADD_VALIDATE ################################## - # called by add_form, used to insert/modify data in DB + return; } -elsif ( $op eq 'add_validate' ) { - my $dbh = C4::Context->dbh; - my $sth = - $dbh->prepare( - "replace letter (module,code,name,title,content) values (?,?,?,?,?)"); - $sth->execute( - $input->param('module'), $input->param('code'), - $input->param('name'), $input->param('title'), - $input->param('content') - ); - $sth->finish; - print $input->redirect("letter.pl"); - exit; - # END $OP eq ADD_VALIDATE -################## DELETE_CONFIRM ################################## - # called by default form, used to confirm deletion of data in DB +sub add_validate { + my $dbh = C4::Context->dbh; + my $module = $input->param('module'); + my $code = $input->param('code'); + my $name = $input->param('name'); + my $title = $input->param('title'); + my $content = $input->param('content'); + if (letter_exists($module, $code)) { + $dbh->do( + q{UPDATE letter SET module = ?, code = ?, name = ?, title = ?, content = ? WHERE module = ? AND code = ?}, + undef, + $module, $code, $name, $title, $content, + $module, $code + ); + } else { + $dbh->do( + q{INSERT INTO letter (module,code,name,title,content) VALUES (?,?,?,?,?)}, + undef, + $module, $code, $name, $title, $content + ); + } + # set up default display + default_display(); + return; } -elsif ( $op eq 'delete_confirm' ) { - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("select * from letter where code=?"); - $sth->execute($code); - my $data = $sth->fetchrow_hashref; - $sth->finish; - $template->param( module => $data->{module} ); - $template->param( code => $code ); - $template->param( name => $data->{'name'} ); - $template->param( content => $data->{'content'} ); - # END $OP eq DELETE_CONFIRM -################## DELETE_CONFIRMED ################################## - # called by delete_confirm, used to effectively confirm deletion of data in DB +sub delete_confirm { + my ($module, $code) = @_; + my $dbh = C4::Context->dbh; + my $letter = $dbh->selectrow_hashref(q|SELECT name FROM letter WHERE module = ? AND code = ?|, + { Slice => {} }, + $module, $code); + $template->param( code => $code ); + $template->param( module => $module); + $template->param( name => $letter->{name}); + return; } -elsif ( $op eq 'delete_confirmed' ) { + +sub delete_confirmed { + my ($module, $code) = @_; my $dbh = C4::Context->dbh; - my $code = uc( $input->param('code') ); - my $module = $input->param('module'); - my $sth = $dbh->prepare("delete from letter where module=? and code=?"); - $sth->execute( $module, $code ); - $sth->finish; - print $input->redirect("/cgi-bin/koha/tools/letter.pl"); + $dbh->do('DELETE FROM letter WHERE module=? AND code=?',{},$module,$code); + # setup default display for screen + default_display(); return; +} - # END $OP eq DELETE_CONFIRMED -################## DEFAULT ################################## +sub retrieve_letters { + my $searchstring = shift; + my $dbh = C4::Context->dbh; + if ($searchstring) { + if ($searchstring=~m/(\S+)/) { + $searchstring = $1 . q{%}; + return $dbh->selectall_arrayref('SELECT module, code, name FROM letter WHERE code LIKE ? ORDER BY module, code', + { Slice => {} }, $searchstring); + } + } + else { + return $dbh->selectall_arrayref('SELECT module, code, name FROM letter ORDER BY module, code', { Slice => {} }); + } + return; } -else { # DEFAULT - if ( $searchfield ne '' ) { + +sub default_display { + my $searchfield = shift; + my $results; + if ( $searchfield ) { $template->param( search => 1 ); $template->param( searchfield => $searchfield ); + $results = retrieve_letters($searchfield); + } else { + $results = retrieve_letters(); } - my ( $count, $results ) = StringSearch( $searchfield, 'web' ); - my $toggle = 0; - my @loop_data = (); - for ( - my $i = $offset ; - $i < ( $offset + $pagesize < $count ? $offset + $pagesize : $count ) ; - $i++ - ) - { - if ( $toggle ) { - $toggle = 0; - } - else { - $toggle = 1; - } - my %row_data; - $row_data{toggle} = $toggle; - $row_data{module} = $results->[$i]{'module'}; - $row_data{code} = $results->[$i]{'code'}; - $row_data{name} = $results->[$i]{'name'}; - push( @loop_data, \%row_data ); + my $loop_data = []; + my $protected_letters = protected_letters(); + foreach my $row (@{$results}) { + $row->{protected} = $protected_letters->{ $row->{code}}; + push @{$loop_data}, $row; + } - $template->param( letter => \@loop_data ); -} #---- END $OP eq DEFAULT + $template->param( letter => $loop_data ); + return; +} -output_html_with_http_headers $input, $cookie, $template->output; +sub add_fields { + my @tables = @_; + my @fields = (); + for my $table (@tables) { + push @fields, get_columns_for($table); + + } + return @fields; +} + +sub get_columns_for { + my $table = shift; +# FIXME untranslateable + my %column_map = ( + aqbooksellers => '---BOOKSELLERS---', + aqorders => '---ORDERS---', + serial => '---SERIALS---', + reserves => '---HOLDS---', + ); + my @fields = (); + if (exists $column_map{$table} ) { + push @fields, { + value => q{}, + text => $column_map{$table} , + }; + } + else { + my $tlabel = '---' . uc $table; + $tlabel.= '---'; + push @fields, { + value => q{}, + text => $tlabel, + }; + } + my $sql = "SHOW COLUMNS FROM $table";# TODO not db agnostic + my $table_prefix = $table . q|.|; + my $rows = C4::Context->dbh->selectall_arrayref($sql, { Slice => {} }); + for my $row (@{$rows}) { + push @fields, { + value => $table_prefix . $row->{Field}, + text => $table_prefix . $row->{Field}, + } + } + return @fields; +}