diff --git a/C4/Overdues.pm b/C4/Overdues.pm index 34c7749f9f..2db419f28b 100644 --- a/C4/Overdues.pm +++ b/C4/Overdues.pm @@ -799,39 +799,6 @@ sub GetOverduesForBranch { } } -=head2 GetOverdueMessageTransportTypes - - my $message_transport_types = GetOverdueMessageTransportTypes( $branchcode, $categorycode, $letternumber); - - return a arrayref with all message_transport_type for given branchcode, categorycode and letternumber(1,2 or 3) - -=cut - -sub GetOverdueMessageTransportTypes { - my ( $branchcode, $categorycode, $letternumber ) = @_; - return unless $categorycode and $letternumber; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( " - SELECT message_transport_type - FROM overduerules odr LEFT JOIN overduerules_transport_types ott USING (overduerules_id) - WHERE branchcode = ? - AND categorycode = ? - AND letternumber = ? - " ); - $sth->execute( $branchcode, $categorycode, $letternumber ); - my @mtts; - while ( my $mtt = $sth->fetchrow ) { - push @mtts, $mtt; - } - - # Put 'print' in first if exists - # It avoids sending a print notice with an email or sms template if no email or sms is defined - @mtts = uniq( 'print', @mtts ) - if grep { $_ eq 'print' } @mtts; - - return \@mtts; -} - =head2 parse_overdues_letter parses the letter template, replacing the placeholders with data diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc index d436580537..279772d220 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc @@ -25,7 +25,7 @@
  • Notices and slips
  • [% END %] [% IF ( CAN_user_tools_edit_notice_status_triggers ) %] -
  • Overdue notice/status triggers
  • +
  • Overdue notice/status triggers
  • [% END %] [% IF ( CAN_user_tools_label_creator ) %]
  • Patron card creator
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/overduerules.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/overduerules.tt deleted file mode 100644 index 9f93de2743..0000000000 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/overduerules.tt +++ /dev/null @@ -1,204 +0,0 @@ -[% USE raw %] -[% USE Asset %] -[% USE Koha %] -[% USE Branches %] -[% PROCESS 'i18n.inc' %] -[% SET footerjs = 1 %] -[% INCLUDE 'doc-head-open.inc' %] -[% FILTER collapse %] - [% t("Overdue notice/status triggers") | html %] - › [% t("Tools") | html %] › [% t("Koha") | html %] - [% END %] -[% INCLUDE 'doc-head-close.inc' %] - - - -[% WRAPPER 'header.inc' %] - [% INCLUDE 'cat-search.inc' %] -[% END %] - -[% WRAPPER 'sub-header.inc' %] - [% WRAPPER breadcrumbs %] - [% WRAPPER breadcrumb_item %] - Tools - [% END %] - [% WRAPPER breadcrumb_item bc_active= 1 %] - Overdue notice/status triggers - [% END %] - [% END #/ WRAPPER breadcrumbs %] -[% END #/ WRAPPER sub-header.inc %] - -[% WRAPPER 'main-container.inc' aside='tools-menu' %] -

    Defining [% IF ( branch ) %]overdue actions for [% Branches.GetName( branch ) | html %][% ELSE %]default overdue actions[% END %]

    -
    -

    Delay is the number of days after a checkout is due before an action is triggered.

    -

    If you want Koha to trigger an action (send a letter or restrict a member), a delay value is required.

    -

    Columns must be filled left to right: if the first column is blank, other columns will be ignored.

    -
    -
    - - - -
    - [% IF ( ERROR ) %] -
    -

    Data error

    -

    The following errors were found. Please correct them and submit again:

    - -
    - [% END %] - [% IF ( table ) %] -
    - [% INCLUDE 'csrf-token.inc' %] - - -

    Rules for overdue actions: [% IF ( branch ) %][% Branches.GetName( branch ) | html %][% ELSE %]default library[% END %]

    - [% IF ( datasaved ) %]
    Changes saved.
    [% END %] - - [% WRAPPER tabs id= "rulestabs" %] - [% WRAPPER tabs_nav %] - [% FOR tab IN tabs %] - [% WRAPPER tab_item tabname= tab.id %] - [% END %] - [% END %] - [% END # /WRAPPER tabs_nav %] - - [% WRAPPER tab_panels %] - [% FOR tab IN tabs %] - [% WRAPPER tab_panel tabname=tab.id %] - - - - - - - - [% FOREACH mtt IN message_transport_types %] - [% NEXT IF mtt == 'itiva' AND !Koha.Preference('TalkingTechItivaPhoneNotification') %] - [% NEXT IF mtt == 'phone' AND !Koha.Preference('PhoneNotification') %] - - [% END %] - - - - [% FOREACH value IN tab.values %] - - - - - - [% FOREACH mtt IN value.message_transport_types %] - [% NEXT IF mtt.value == 'itiva' AND !Koha.Preference('TalkingTechItivaPhoneNotification') %] - [% NEXT IF mtt.value == 'phone' AND !Koha.Preference('PhoneNotification') %] - - [% END # /FOREACH mtt %] - - [% END # /FOREACH value %] - -
    Patron categoryDelayLetterRestrict - [% SWITCH mtt %] - [% CASE 'email' %] - Email - [% CASE 'print' %] - [% tp('Message transport type', 'Print') | html %] - [% CASE 'sms' %] - SMS - [% CASE 'feed' %] - Feed - [% CASE 'itiva' %] - Phone (i-tiva) - [% CASE 'phone' %] - Phone - [% CASE %] - [% mtt | html %] - [% END %] -
    [% value.line | html %] - - - - - [% IF ( value.debarred ) %] - - [% ELSE %] - - [% END %] - - [% IF mtt.selected %] - - [% ELSE %] - [% IF mtt.value == "sms" and not Koha.Preference("SMSSendDriver") %] - - [% ELSE %] - - [% END %] - [% END %] -
    - [% END # /tab_panel# %] - [% END %] - [% END # /WRAPPER tab_panels %] - [% END # /WRAPPER tabs %] - -
    -
    - [% ELSE %] -
    -

    You don't have patron categories defined, or the patron categories are not set to receive overdue notices.

    -

    If this is not what you were expecting, go to patron categories

    -
    - [% END %] -[% END %] - -[% MACRO jsinclude BLOCK %] - [% Asset.js("js/tools-menu.js") | $raw %] - [% INCLUDE 'datatables.inc' %] - -[% END %] - -[% INCLUDE 'intranet-bottom.inc' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt index 6f12d5fc69..7dff11e407 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt @@ -64,7 +64,7 @@ [% END %] [% IF ( CAN_user_tools_edit_notice_status_triggers ) %] -
    Overdue notice/status triggers
    +
    Overdue notice/status triggers
    Set notice/status triggers for overdue items
    [% END %] diff --git a/t/db_dependent/Overdues.t b/t/db_dependent/Overdues.t index 2f6c85a19e..c0c50efe3b 100755 --- a/t/db_dependent/Overdues.t +++ b/t/db_dependent/Overdues.t @@ -12,8 +12,7 @@ use Koha::Libraries; use t::lib::Mocks; use t::lib::TestBuilder; -use_ok( 'C4::Overdues', qw( GetOverdueMessageTransportTypes GetBranchcodesWithOverdueRules UpdateFine ) ); -can_ok( 'C4::Overdues', 'GetOverdueMessageTransportTypes' ); +use_ok( 'C4::Overdues', qw( GetBranchcodesWithOverdueRules UpdateFine ) ); can_ok( 'C4::Overdues', 'GetBranchcodesWithOverdueRules' ); my $schema = Koha::Database->new->schema; @@ -25,75 +24,6 @@ my $dbh = C4::Context->dbh; $dbh->do(q|DELETE FROM letter|); $dbh->do(q|DELETE FROM message_queue|); $dbh->do(q|DELETE FROM message_transport_types|); -$dbh->do(q|DELETE FROM overduerules|); -$dbh->do(q|DELETE FROM overduerules_transport_types|); - -$dbh->do( - q| - INSERT INTO message_transport_types( message_transport_type ) VALUES ('email'), ('phone'), ('print'), ('sms') -| -); - -$dbh->do( - q| - INSERT INTO overduerules ( overduerules_id, branchcode, categorycode ) VALUES - (1, 'CPL', 'PT'), - (2, 'CPL', 'YA'), - (3, '', 'PT'), - (4, '', 'YA') -| -); - -$dbh->do( - q|INSERT INTO overduerules_transport_types (overduerules_id, letternumber, message_transport_type) VALUES - (1, 1, 'email'), - (1, 2, 'sms'), - (1, 3, 'email'), - (2, 3, 'print'), - (3, 1, 'email'), - (3, 2, 'email'), - (3, 2, 'sms'), - (3, 3, 'sms'), - (3, 3, 'email'), - (3, 3, 'print'), - (4, 2, 'sms') -| -); - -my $mtts; - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( 'CPL', 'PT' ); -is( $mtts, undef, 'GetOverdueMessageTransportTypes: returns undef if no letternumber given' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( 'CPL', undef, 1 ); -is( $mtts, undef, 'GetOverdueMessageTransportTypes: returns undef if no categorycode given' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes('CPL'); -is( $mtts, undef, 'GetOverdueMessageTransportTypes: returns undef if no letternumber and categorycode given' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( 'CPL', 'PT', 1 ); -is_deeply( $mtts, ['email'], 'GetOverdueMessageTransportTypes: first overdue is by email for PT (CPL)' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( 'CPL', 'PT', 2 ); -is_deeply( $mtts, ['sms'], 'GetOverdueMessageTransportTypes: second overdue is by sms for PT (CPL)' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( 'CPL', 'PT', 3 ); -is_deeply( $mtts, ['email'], 'GetOverdueMessageTransportTypes: third overdue is by email for PT (CPL)' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( '', 'PT', 1 ); -is_deeply( $mtts, ['email'], 'GetOverdueMessageTransportTypes: first overdue is by email for PT (default)' ); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( '', 'PT', 2 ); -is_deeply( - $mtts, [ 'email', 'sms' ], - 'GetOverdueMessageTransportTypes: second overdue is by email and sms for PT (default)' -); - -$mtts = C4::Overdues::GetOverdueMessageTransportTypes( '', 'PT', 3 ); -is_deeply( - $mtts, [ 'print', 'sms', 'email' ], - 'GetOverdueMessageTransportTypes: third overdue is by print, sms and email for PT (default). With print in first.' -); # Test GetBranchcodesWithOverdueRules $dbh->do(q|DELETE FROM circulation_rules WHERE rule_name LIKE 'overdue_%' |); diff --git a/tools/overduerules.pl b/tools/overduerules.pl deleted file mode 100755 index 1279d51c85..0000000000 --- a/tools/overduerules.pl +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/perl - -# Copyright 2000-2002 Katipo Communications -# -# 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 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. -# -# You should have received a copy of the GNU General Public License -# along with Koha; if not, see . - -use Modern::Perl; -use CGI qw ( -utf8 ); -use C4::Context; -use C4::Output qw( output_html_with_http_headers ); -use C4::Auth qw( get_template_and_user ); -use C4::Letters; -use C4::Members; -use C4::Overdues qw( GetOverdueMessageTransportTypes ); -use Koha::Libraries; - -use Koha::Patron::Categories; - -our $input = CGI->new; -my $dbh = C4::Context->dbh; - -my @patron_categories = Koha::Patron::Categories->search( { overduenoticerequired => { '>' => 0 } } )->as_list; -my @category_codes = map { $_->categorycode } @patron_categories; -our @rule_params = qw(delay letter debarred); - -# blank_row($category_code) - return true if the entire row is blank. -sub blank_row { - my ($category_code) = @_; - for my $rp (@rule_params) { - for my $n ( 1 .. 3 ) { - my $key = "${rp}${n}-$category_code"; - - if ( utf8::is_utf8($key) ) { - utf8::encode($key); - } - - my $value = $input->param($key); - if ($value) { - return 0; - } - } - } - return 1; -} - -my ( $template, $loggedinuser, $cookie ) = get_template_and_user( - { - template_name => "tools/overduerules.tt", - query => $input, - type => "intranet", - flagsrequired => { tools => 'edit_notice_status_triggers' }, - } -); - -my $type = $input->param('type'); - -my $branch = $input->param('branch'); -$branch = - defined $branch ? $branch - : C4::Context->preference('DefaultToLoggedInLibraryOverdueTriggers') ? C4::Context::mybranch() - : Koha::Libraries->search->count() == 1 ? undef - : undef; -$branch ||= q{}; - -my $op = $input->param('op'); -$op ||= q{}; - -my $err = 0; - -# save the values entered into tables -my %temphash; -my $input_saved = 0; -if ( $op eq 'cud-save' ) { - my @names = $input->multi_param(); - my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM overduerules WHERE branchcode=? AND categorycode=?"); - - my $sth_insert = $dbh->prepare( - "INSERT INTO overduerules (branchcode,categorycode, delay1,letter1,debarred1, delay2,letter2,debarred2, delay3,letter3,debarred3) VALUES (?,?,?,?,?,?,?,?,?,?,?)" - ); - my $sth_update = $dbh->prepare( - "UPDATE overduerules SET delay1=?, letter1=?, debarred1=?, delay2=?, letter2=?, debarred2=?, delay3=?, letter3=?, debarred3=? WHERE branchcode=? AND categorycode=?" - ); - my $sth_delete = $dbh->prepare("DELETE FROM overduerules WHERE branchcode=? AND categorycode=?"); - my $sth_insert_mtt = $dbh->prepare( " - INSERT INTO overduerules_transport_types( - overduerules_id, letternumber, message_transport_type - ) VALUES ( - (SELECT overduerules_id FROM overduerules WHERE branchcode = ? AND categorycode = ?), ?, ? - ) - " ); - my $sth_delete_mtt = $dbh->prepare( " - DELETE FROM overduerules_transport_types - WHERE overduerules_id = (SELECT overduerules_id FROM overduerules WHERE branchcode = ? AND categorycode = ?) - " ); - - foreach my $key (@names) { - - # ISSUES - if ( $key =~ /(delay|letter|debarred)([1-3])-(.*)/ ) { - my $type = $1; # data type - my $num = $2; # From 1 to 3 - my $bor = $3; # borrower category - my $value = $input->param($key); - if ( $type eq 'delay' ) { - $temphash{$bor}->{"$type$num"} = ( $value =~ /^\d+$/ && int($value) > 0 ) ? int($value) : ''; - } else { - - # type is letter - $temphash{$bor}->{"$type$num"} = $value if $value ne ''; - } - } - } - - # figure out which rows need to be deleted - my @rows_to_delete = grep { blank_row($_) } @category_codes; - - foreach my $bor ( keys %temphash ) { - - # get category name if we need it for an error message - my $bor_category = Koha::Patron::Categories->find($bor); - my $bor_category_name = $bor_category ? $bor_category->description : $bor; - - # Do some Checking here : delay1 < delay2 {delay1} =~ /[^0-9]/ and $temphash{$bor}->{delay1} ne "" ) { - $template->param( "ERROR" => 1, "ERRORDELAY" => "delay1", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( $temphash{$bor}->{delay2} =~ /[^0-9]/ and $temphash{$bor}->{delay2} ne "" ) { - $template->param( "ERROR" => 1, "ERRORDELAY" => "delay2", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( $temphash{$bor}->{delay3} =~ /[^0-9]/ and $temphash{$bor}->{delay3} ne "" ) { - $template->param( "ERROR" => 1, "ERRORDELAY" => "delay3", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( $temphash{$bor}->{delay1} and not( $temphash{$bor}->{"letter1"} or $temphash{$bor}->{"debarred1"} ) ) - { - $template->param( "ERROR" => 1, "ERRORUSELESSDELAY" => "delay1", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( $temphash{$bor}->{delay2} and not( $temphash{$bor}->{"letter2"} or $temphash{$bor}->{"debarred2"} ) ) - { - $template->param( "ERROR" => 1, "ERRORUSELESSDELAY" => "delay2", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( $temphash{$bor}->{delay3} and not( $temphash{$bor}->{"letter3"} or $temphash{$bor}->{"debarred3"} ) ) - { - $template->param( "ERROR" => 1, "ERRORUSELESSDELAY" => "delay3", "BORERR" => $bor_category_name ); - $err = 1; - } elsif ( - $temphash{$bor}->{delay3} and ( $temphash{$bor}->{delay3} <= $temphash{$bor}->{delay2} - or $temphash{$bor}->{delay3} <= $temphash{$bor}->{delay1} ) - or $temphash{$bor}->{delay2} and ( $temphash{$bor}->{delay2} <= $temphash{$bor}->{delay1} ) - ) - { - $template->param( "ERROR" => 1, "ERRORORDER" => 1, "BORERR" => $bor_category_name ); - $err = 1; - } - unless ($err) { - if ( ( $temphash{$bor}->{delay1} and ( $temphash{$bor}->{"letter1"} or $temphash{$bor}->{"debarred1"} ) ) - or ( $temphash{$bor}->{delay2} and ( $temphash{$bor}->{"letter2"} or $temphash{$bor}->{"debarred2"} ) ) - or ( $temphash{$bor}->{delay3} and ( $temphash{$bor}->{"letter3"} or $temphash{$bor}->{"debarred3"} ) ) - ) - { - $sth_search->execute( $branch, $bor ); - my $res = $sth_search->fetchrow_hashref(); - if ( $res->{'total'} > 0 ) { - $sth_update->execute( - ( $temphash{$bor}->{"delay1"} ? $temphash{$bor}->{"delay1"} : undef ), - ( $temphash{$bor}->{"letter1"} ? $temphash{$bor}->{"letter1"} : "" ), - ( $temphash{$bor}->{"debarred1"} ? $temphash{$bor}->{"debarred1"} : 0 ), - ( $temphash{$bor}->{"delay2"} ? $temphash{$bor}->{"delay2"} : undef ), - ( $temphash{$bor}->{"letter2"} ? $temphash{$bor}->{"letter2"} : "" ), - ( $temphash{$bor}->{"debarred2"} ? $temphash{$bor}->{"debarred2"} : 0 ), - ( $temphash{$bor}->{"delay3"} ? $temphash{$bor}->{"delay3"} : undef ), - ( $temphash{$bor}->{"letter3"} ? $temphash{$bor}->{"letter3"} : "" ), - ( $temphash{$bor}->{"debarred3"} ? $temphash{$bor}->{"debarred3"} : 0 ), - $branch, $bor - ); - } else { - $sth_insert->execute( - $branch, $bor, - ( $temphash{$bor}->{"delay1"} ? $temphash{$bor}->{"delay1"} : 0 ), - ( $temphash{$bor}->{"letter1"} ? $temphash{$bor}->{"letter1"} : "" ), - ( $temphash{$bor}->{"debarred1"} ? $temphash{$bor}->{"debarred1"} : 0 ), - ( $temphash{$bor}->{"delay2"} ? $temphash{$bor}->{"delay2"} : 0 ), - ( $temphash{$bor}->{"letter2"} ? $temphash{$bor}->{"letter2"} : "" ), - ( $temphash{$bor}->{"debarred2"} ? $temphash{$bor}->{"debarred2"} : 0 ), - ( $temphash{$bor}->{"delay3"} ? $temphash{$bor}->{"delay3"} : 0 ), - ( $temphash{$bor}->{"letter3"} ? $temphash{$bor}->{"letter3"} : "" ), - ( $temphash{$bor}->{"debarred3"} ? $temphash{$bor}->{"debarred3"} : 0 ) - ); - } - - $sth_delete_mtt->execute( $branch, $bor ); - for my $letternumber ( 1 .. 3 ) { - my @mtt = $input->multi_param("mtt${letternumber}-$bor"); - next unless @mtt; - for my $mtt (@mtt) { - $sth_insert_mtt->execute( $branch, $bor, $letternumber, $mtt ); - } - } - } - } - } - unless ($err) { - for my $category_code (@rows_to_delete) { - $sth_delete->execute( $branch, $category_code ); - } - $template->param( datasaved => 1 ); - $input_saved = 1; - } -} - -my $letters = C4::Letters::GetLettersAvailableForALibrary( - { - branchcode => $branch, - module => "circulation", - } -); - -my $message_transport_types = C4::Letters::GetMessageTransportTypes(); -my ( @first, @second, @third ); -for my $patron_category (@patron_categories) { - if ( %temphash and not $input_saved ) { - - # if we managed to save the form submission, don't - # reuse %temphash, but take the values from the - # database - this makes it easier to identify - # bugs where the form submission was not correctly saved - for my $i ( 1 .. 3 ) { - my %row = ( - overduename => $patron_category->categorycode, - line => $patron_category->description, - ); - $row{delay} = $temphash{ $patron_category->categorycode }->{"delay$i"}; - $row{debarred} = $temphash{ $patron_category->categorycode }->{"debarred$i"}; - $row{selected_lettercode} = $temphash{ $patron_category->categorycode }->{"letter$i"}; - my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $patron_category->categorycode, $i ) }; - my @mtts; - for my $mtt (@$message_transport_types) { - push @mtts, { - value => $mtt, - selected => ( grep { /$mtt/ } @selected_mtts ) ? 1 : 0, - }; - } - $row{message_transport_types} = \@mtts; - if ( $i == 1 ) { - push @first, \%row; - } elsif ( $i == 2 ) { - push @second, \%row; - } else { - push @third, \%row; - } - } - } else { - - #getting values from table - my $sth2 = $dbh->prepare("SELECT * from overduerules WHERE branchcode=? AND categorycode=?"); - $sth2->execute( $branch, $patron_category->categorycode ); - my $dat = $sth2->fetchrow_hashref; - for my $i ( 1 .. 3 ) { - my %row = ( - overduename => $patron_category->categorycode, - line => $patron_category->description, - ); - - $row{selected_lettercode} = $dat->{"letter$i"}; - - if ( $dat->{"delay$i"} ) { $row{delay} = $dat->{"delay$i"}; } - if ( $dat->{"debarred$i"} ) { $row{debarred} = $dat->{"debarred$i"}; } - my @selected_mtts = @{ GetOverdueMessageTransportTypes( $branch, $patron_category->categorycode, $i ) }; - my @mtts; - for my $mtt (@$message_transport_types) { - push @mtts, { - value => $mtt, - selected => ( grep { /$mtt/ } @selected_mtts ) ? 1 : 0, - }; - } - $row{message_transport_types} = \@mtts; - if ( $i == 1 ) { - push @first, \%row; - } elsif ( $i == 2 ) { - push @second, \%row; - } else { - push @third, \%row; - } - - } - } -} - -my @tabs = ( - { - id => 'first', - number => 1, - values => \@first, - }, - { - id => 'second', - number => 2, - values => \@second, - }, - { - id => 'third', - number => 3, - values => \@third, - }, -); - -$template->param( - table => ( @first or @second or @third ? 1 : 0 ), - branch => $branch, - tabs => \@tabs, - message_transport_types => $message_transport_types, - letters => $letters, -); -output_html_with_http_headers $input, $cookie, $template->output;