X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;ds=sidebyside;f=tools%2Fletter.pl;h=c19d995d534a2bc32e4f5938959199a0b0dcfc6d;hb=5d6c092921919526ade501facb1220f8a108a08f;hp=04cd7d2a434b35593e5068cd746eee341125d899;hpb=81cf767b17994c39dc83930305d4d9d65423db35;p=koha_fer diff --git a/tools/letter.pl b/tools/letter.pl index 04cd7d2a43..c19d995d53 100755 --- a/tools/letter.pl +++ b/tools/letter.pl @@ -46,16 +46,38 @@ use CGI; use C4::Auth; use C4::Context; use C4::Output; +use C4::Branch; # GetBranches +use C4::Letters; +use C4::Members::Attributes; -# 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; - my $letters = $dbh->selectall_arrayref(q{SELECT name FROM letter WHERE module = ? AND code = ?}, undef, $module, $code); - return @{$letters}; +# _letter_from_where($branchcode,$module, $code, $mtt) +# - return FROM WHERE clause and bind args for a letter +sub _letter_from_where { + my ($branchcode, $module, $code, $mtt) = @_; + my $sql = q{FROM letter WHERE branchcode = ? AND module = ? AND code = ?}; + $sql .= q{ AND message_transport_type = ?} if $mtt ne '*'; + my @args = ( $branchcode || '', $module, $code, ($mtt ne '*' ? $mtt : ()) ); +# Mysql is retarded. cause branchcode is part of the primary key it cannot be null. How does that +# work with foreign key constraint I wonder... + +# if ($branchcode) { +# $sql .= " AND branchcode = ?"; +# push @args, $branchcode; +# } else { +# $sql .= " AND branchcode IS NULL"; +# } + + return ($sql, \@args); } +# get_letters($branchcode,$module, $code, $mtt) +# - return letters with the given $branchcode, $module, $code and $mtt exists +sub get_letters { + my ($sql, $args) = _letter_from_where(@_); + my $dbh = C4::Context->dbh; + my $letter = $dbh->selectall_hashref("SELECT * $sql", 'message_transport_type', undef, @$args); + return $letter; +} # $protected_letters = protected_letters() # - return a hashref of letter_codes representing letters that should never be deleted sub protected_letters { @@ -64,19 +86,17 @@ sub protected_letters { return { map { $_->[0] => 1 } @{$codes} }; } -my $input = new CGI; +our $input = new CGI; my $searchfield = $input->param('searchfield'); my $script_name = '/cgi-bin/koha/tools/letter.pl'; +our $branchcode = $input->param('branchcode'); my $code = $input->param('code'); -my $module = $input->param('module'); +my $module = $input->param('module') || ''; my $content = $input->param('content'); -my $op = $input->param('op'); +my $op = $input->param('op') || ''; my $dbh = C4::Context->dbh; -if (!defined $module ) { - $module = q{}; -} -my ( $template, $borrowernumber, $cookie ) = get_template_and_user( +our ( $template, $borrowernumber, $cookie, $staffflags ) = get_template_and_user( { template_name => 'tools/letter.tmpl', query => $input, @@ -87,32 +107,50 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( } ); -if (!defined $op) { - $op = q{}; # silence errors from eq -} +our $my_branch = C4::Context->preference("IndependentBranches") && !$staffflags->{'superlibrarian'} + ? C4::Context->userenv()->{'branch'} + : undef; # we show only the TMPL_VAR names $op $template->param( + independant_branch => $my_branch, script_name => $script_name, + searchfield => $searchfield, + branchcode => $branchcode, action => $script_name ); -if ($op eq 'add_form') { - add_form($module, $code); -} -elsif ( $op eq 'add_validate' ) { +if ( $op eq 'add_validate' or $op eq 'copy_validate' ) { add_validate(); - $op = q{}; # next operation is to return to default screen + $op = q{}; # we return to the default screen for the next operation +} +if ($op eq 'copy_form') { + my $oldbranchcode = $input->param('oldbranchcode') || q||; + my $branchcode = $input->param('branchcode') || q||; + my $oldcode = $input->param('oldcode') || $input->param('code'); + add_form($oldbranchcode, $module, $code); + $template->param( + oldbranchcode => $oldbranchcode, + branchcode => $branchcode, + branchloop => _branchloop($branchcode), + oldcode => $oldcode, + copying => 1, + modify => 0, + ); +} +elsif ( $op eq 'add_form' ) { + add_form($branchcode, $module, $code); } elsif ( $op eq 'delete_confirm' ) { - delete_confirm($module, $code); + delete_confirm($branchcode, $module, $code); } elsif ( $op eq 'delete_confirmed' ) { - delete_confirmed($module, $code); + my $mtt = $input->param('message_transport_type'); + delete_confirmed($branchcode, $module, $code, $mtt); $op = q{}; # next operation is to return to default screen } else { - default_display($searchfield); + default_display($branchcode,$searchfield); } # Do this last as delete_confirmed resets @@ -125,27 +163,59 @@ if ($op) { output_html_with_http_headers $input, $cookie, $template->output; sub add_form { - my ($module, $code ) = @_; + my ( $branchcode,$module, $code ) = @_; - my $letter; + my $letters; # if code has been passed we can identify letter and its an update action if ($code) { - $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} ); + $letters = get_letters($branchcode,$module, $code, '*'); + } + + my $message_transport_types = GetMessageTransportTypes(); + my @letter_loop; + if ($letters) { + $template->param( + modify => 1, + code => $code, + branchcode => $branchcode, + ); + my $first_flag = 1; + # The letter name is contained into each mtt row. + # So we can only sent the first one to the template. + for my $mtt ( @$message_transport_types ) { + # The letter_name + if ( $first_flag and $letters->{$mtt}{name} ) { + $template->param( + letter_name=> $letters->{$mtt}{name}, + ); + $first_flag = 0; + } + + push @letter_loop, { + message_transport_type => $mtt, + is_html => $letters->{$mtt}{is_html}, + title => $letters->{$mtt}{title}, + content => $letters->{$mtt}{content}//'', + }; + } } else { # initialize the new fields - $letter = { - module => $module, - code => q{}, - name => q{}, - title => q{}, - content => q{}, - }; + for my $mtt ( @$message_transport_types ) { + push @letter_loop, { + message_transport_type => $mtt, + } + } + $template->param( + branchcode => $branchcode, + module => $module, + ); $template->param( adding => 1 ); } + $template->param( + letters => \@letter_loop, + ); + my $field_selection; push @{$field_selection}, add_fields('branches'); if ($module eq 'reserves') { @@ -170,17 +240,25 @@ sub add_form { } else { push @{$field_selection}, add_fields('biblio','biblioitems'), - {value => q{}, text => '---ITEMS---' }, + add_fields('items'), {value => 'items.content', text => 'items.content'}, - add_fields('issues','borrowers'); + {value => 'items.fine', text => 'items.fine'}, + add_fields('borrowers'); + if ($module eq 'circulation') { + push @{$field_selection}, add_fields('opac_news'); + + } + + if ( $module eq 'circulation' && $code eq "CHECKIN" ) { + push @{$field_selection}, add_fields('old_issues'); + } else { + push @{$field_selection}, add_fields('issues'); + } } $template->param( - name => $letter->{name}, - title => $letter->{title}, - content => $letter->{content}, - module => $module, - $module => 1, + module => $module, + branchloop => _branchloop($branchcode), SQLfieldname => $field_selection, ); return; @@ -188,87 +266,140 @@ sub add_form { sub add_validate { my $dbh = C4::Context->dbh; - my $module = $input->param('module'); - my $oldmodule = $input->param('oldmodule'); - my $code = $input->param('code'); - my $name = $input->param('name'); - my $title = $input->param('title'); - my $content = $input->param('content'); - if (letter_exists($oldmodule, $code)) { - $dbh->do( - q{UPDATE letter SET module = ?, code = ?, name = ?, title = ?, content = ? WHERE module = ? AND code = ?}, - undef, - $module, $code, $name, $title, $content, - $oldmodule, $code - ); - } else { - $dbh->do( - q{INSERT INTO letter (module,code,name,title,content) VALUES (?,?,?,?,?)}, - undef, - $module, $code, $name, $title, $content - ); + my $branchcode = $input->param('branchcode') || ''; + my $module = $input->param('module'); + my $oldmodule = $input->param('oldmodule'); + my $code = $input->param('code'); + my $name = $input->param('name'); + my @mtt = $input->param('message_transport_type'); + my @title = $input->param('title'); + my @content = $input->param('content'); + for my $mtt ( @mtt ) { + my $is_html = $input->param("is_html_$mtt"); + my $title = shift @title; + my $content = shift @content; + my $letter = get_letters($branchcode,$oldmodule, $code, $mtt); + unless ( $title and $content ) { + delete_confirmed( $branchcode, $oldmodule, $code, $mtt ); + next; + } + elsif ( exists $letter->{$mtt} ) { + $dbh->do( + q{ + UPDATE letter + SET branchcode = ?, module = ?, name = ?, is_html = ?, title = ?, content = ? + WHERE branchcode = ? AND module = ? AND code = ? AND message_transport_type = ? + }, + undef, + $branchcode, $module, $name, $is_html || 0, $title, $content, + $branchcode, $oldmodule, $code, $mtt + ); + } else { + $dbh->do( + q{INSERT INTO letter (branchcode,module,code,name,is_html,title,content,message_transport_type) VALUES (?,?,?,?,?,?,?,?)}, + undef, + $branchcode, $module, $code, $name, $is_html || 0, $title, $content, $mtt + ); + } } # set up default display - default_display(); - return; + default_display($branchcode); + return 1; } sub delete_confirm { - my ($module, $code) = @_; + my ($branchcode, $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}); + my $letter = get_letters($branchcode, $module, $code, '*'); + my @values = values %$letter; + $template->param( + branchcode => $branchcode, + branchname => GetBranchName($branchcode), + code => $code, + module => $module, + name => $values[0]->{name}, + ); return; } sub delete_confirmed { - my ($module, $code) = @_; + my ($branchcode, $module, $code, $mtt) = @_; + my ($sql, $args) = _letter_from_where($branchcode, $module, $code, $mtt); my $dbh = C4::Context->dbh; - $dbh->do('DELETE FROM letter WHERE module=? AND code=?',{},$module,$code); + $dbh->do("DELETE $sql", undef, @$args); # setup default display for screen - default_display(); + default_display($branchcode); return; } sub retrieve_letters { - my $searchstring = shift; + my ($branchcode, $searchstring) = @_; + + $branchcode = $my_branch if $branchcode && $my_branch; + 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); - } + my ($sql, @where, @args); + $sql = "SELECT branchcode, module, code, name, branchname + FROM letter + LEFT OUTER JOIN branches USING (branchcode) + "; + if ($searchstring && $searchstring=~m/(\S+)/) { + $searchstring = $1 . q{%}; + push @where, 'code LIKE ?'; + push @args, $searchstring; } - else { - return $dbh->selectall_arrayref('SELECT module, code, name FROM letter ORDER BY module, code', { Slice => {} }); + elsif ($branchcode) { + push @where, 'branchcode = ?'; + push @args, $branchcode || ''; } - return; + elsif ($my_branch) { + push @where, "(branchcode = ? OR branchcode = '')"; + push @args, $my_branch; + } + + $sql .= " WHERE ".join(" AND ", @where) if @where; + $sql .= " GROUP BY branchcode,module,code"; + $sql .= " ORDER BY module, code, branchcode"; + + return $dbh->selectall_arrayref($sql, { Slice => {} }, @args); } sub default_display { - my $searchfield = shift; - my $results; + my ($branchcode, $searchfield) = @_; + if ( $searchfield ) { $template->param( search => 1 ); - $template->param( searchfield => $searchfield ); - $results = retrieve_letters($searchfield); - } else { - $results = retrieve_letters(); } + my $results = retrieve_letters($branchcode,$searchfield); + my $loop_data = []; my $protected_letters = protected_letters(); foreach my $row (@{$results}) { - $row->{protected} = $protected_letters->{ $row->{code}}; + $row->{protected} = !$row->{branchcode} && $protected_letters->{ $row->{code} }; push @{$loop_data}, $row; } - $template->param( letter => $loop_data ); - return; + + $template->param( + letter => $loop_data, + branchloop => _branchloop($branchcode), + ); +} + +sub _branchloop { + my ($branchcode) = @_; + + my $branches = GetBranches(); + my @branchloop; + for my $thisbranch (sort { $branches->{$a}->{branchname} cmp $branches->{$b}->{branchname} } keys %$branches) { + push @branchloop, { + value => $thisbranch, + selected => $branchcode && $thisbranch eq $branchcode, + branchname => $branches->{$thisbranch}->{'branchname'}, + }; + } + + return \@branchloop; } sub add_fields { @@ -307,6 +438,7 @@ sub get_columns_for { 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 => {} }); @@ -317,5 +449,15 @@ sub get_columns_for { text => $table_prefix . $row->{Field}, } } + if ($table eq 'borrowers') { + if ( my $attributes = C4::Members::Attributes::GetAttributes() ) { + foreach (@$attributes) { + push @fields, { + value => "borrower-attribute:$_", + text => "attribute:$_", + } + } + } + } return @fields; }