X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=admin%2Fsmart-rules.pl;h=5a41942050239e8df90e4793ce6c3a6f5e19f29d;hb=dad848a0a7154980d393c595361bde1bafcad9d5;hp=f29093411b89f17ec4ea648daf59e3cdc4e377f3;hpb=408543294e69797d7258621e26b83736474caac8;p=koha.git diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl index f29093411b..5a41942050 100755 --- a/admin/smart-rules.pl +++ b/admin/smart-rules.pl @@ -4,47 +4,58 @@ # # 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 . use strict; -#use warnings; FIXME - Bug 2505 -use CGI; +use warnings; +use CGI qw ( -utf8 ); use C4::Context; use C4::Output; use C4::Auth; use C4::Koha; use C4::Debug; use C4::Branch; # GetBranches -use C4::Dates qw/format_date format_date_in_iso/; +use Koha::DateUtils; +use Koha::Database; -my $input = new CGI; +my $input = CGI->new; my $dbh = C4::Context->dbh; # my $flagsrequired; # $flagsrequired->{circulation}=1; my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "admin/smart-rules.tmpl", + = get_template_and_user({template_name => "admin/smart-rules.tt", query => $input, type => "intranet", authnotrequired => 0, - flagsrequired => {parameters => 1}, + flagsrequired => {parameters => 'manage_circ_rules'}, debug => 1, }); my $type=$input->param('type'); -my $branch = $input->param('branch') || ( C4::Branch::onlymine() ? ( C4::Branch::mybranch() || '*' ) : '*' ); -my $op = $input->param('op'); + +my $branch; +if ( C4::Context->preference('DefaultToLoggedInLibraryCircRules') ) { + $branch = $input->param('branch') || GetBranchesCount() == 1 ? undef : C4::Branch::mybranch(); +} +else { + $branch = $input->param('branch') || ( C4::Branch::onlymine() ? ( C4::Branch::mybranch() || '*' ) : '*' ); +} +$branch = '*' if $branch eq 'NO_LIBRARY_SET'; + +my $op = $input->param('op') || q{}; +my $language = C4::Languages::getlanguage(); if ($op eq 'delete') { my $itemtype = $input->param('itemtype'); @@ -100,43 +111,83 @@ elsif ($op eq 'delete-branch-item') { } # save the values entered elsif ($op eq 'add') { - my $sth_search = $dbh->prepare("SELECT COUNT(*) AS total FROM issuingrules WHERE branchcode=? AND categorycode=? AND itemtype=?"); - my $sth_insert = $dbh->prepare("INSERT INTO issuingrules (branchcode, categorycode, itemtype, maxissueqty, renewalsallowed, reservesallowed, issuelength, hardduedate, hardduedatecompare, fine, finedays, firstremind, chargeperiod,rentaldiscount) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); - my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, reservesallowed=?, issuelength=?, hardduedate=?, hardduedatecompare=?, rentaldiscount=? WHERE branchcode=? AND categorycode=? AND itemtype=?"); - my $br = $branch; # branch my $bor = $input->param('categorycode'); # borrower category - my $cat = $input->param('itemtype'); # item type + my $itemtype = $input->param('itemtype'); # item type my $fine = $input->param('fine'); my $finedays = $input->param('finedays'); + my $maxsuspensiondays = $input->param('maxsuspensiondays'); + $maxsuspensiondays = undef if $maxsuspensiondays eq q||; my $firstremind = $input->param('firstremind'); my $chargeperiod = $input->param('chargeperiod'); + my $chargeperiod_charge_at = $input->param('chargeperiod_charge_at'); my $maxissueqty = $input->param('maxissueqty'); + my $maxonsiteissueqty = $input->param('maxonsiteissueqty'); my $renewalsallowed = $input->param('renewalsallowed'); + my $renewalperiod = $input->param('renewalperiod'); + my $norenewalbefore = $input->param('norenewalbefore'); + $norenewalbefore = undef if $norenewalbefore =~ /^\s*$/; + my $auto_renew = $input->param('auto_renew') eq 'yes' ? 1 : 0; my $reservesallowed = $input->param('reservesallowed'); + my $onshelfholds = $input->param('onshelfholds') || 0; $maxissueqty =~ s/\s//g; $maxissueqty = undef if $maxissueqty !~ /^\d+/; + $maxonsiteissueqty =~ s/\s//g; + $maxonsiteissueqty = undef if $maxonsiteissueqty !~ /^\d+/; my $issuelength = $input->param('issuelength'); - my $hardduedate = $input->param('hardduedate'); - $hardduedate = format_date_in_iso($hardduedate); + my $lengthunit = $input->param('lengthunit'); + my $hardduedate = $input->param('hardduedate') || undef; + $hardduedate = eval { dt_from_string( $input->param('hardduedate') ) } if ( $hardduedate ); + $hardduedate = output_pref( { dt => $hardduedate, dateonly => 1, dateformat => 'iso' } ) if ( $hardduedate ); my $hardduedatecompare = $input->param('hardduedatecompare'); my $rentaldiscount = $input->param('rentaldiscount'); - $debug and warn "Adding $br, $bor, $cat, $fine, $maxissueqty"; + my $opacitemholds = $input->param('opacitemholds') || 0; + my $overduefinescap = $input->param('overduefinescap') || undef; + $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty"; + + my $schema = Koha::Database->new()->schema(); + my $rs = $schema->resultset('Issuingrule'); + + my $params = { + branchcode => $br, + categorycode => $bor, + itemtype => $itemtype, + fine => $fine, + finedays => $finedays, + maxsuspensiondays => $maxsuspensiondays, + firstremind => $firstremind, + chargeperiod => $chargeperiod, + chargeperiod_charge_at => $chargeperiod_charge_at, + maxissueqty => $maxissueqty, + maxonsiteissueqty => $maxonsiteissueqty, + renewalsallowed => $renewalsallowed, + renewalperiod => $renewalperiod, + norenewalbefore => $norenewalbefore, + auto_renew => $auto_renew, + reservesallowed => $reservesallowed, + issuelength => $issuelength, + lengthunit => $lengthunit, + hardduedate => $hardduedate, + hardduedatecompare => $hardduedatecompare, + rentaldiscount => $rentaldiscount, + onshelfholds => $onshelfholds, + opacitemholds => $opacitemholds, + overduefinescap => $overduefinescap, + }; - $sth_search->execute($br,$bor,$cat); - my $res = $sth_search->fetchrow_hashref(); - if ($res->{total}) { - $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, $maxissueqty, $renewalsallowed,$reservesallowed, $issuelength,$hardduedate,$hardduedatecompare,$rentaldiscount, $br,$bor,$cat); - } else { - $sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed,$reservesallowed,$issuelength,$hardduedate,$hardduedatecompare,$fine,$finedays,$firstremind,$chargeperiod,$rentaldiscount); - } -} + $rs->update_or_create($params); + +} elsif ($op eq "set-branch-defaults") { my $categorycode = $input->param('categorycode'); my $maxissueqty = $input->param('maxissueqty'); + my $maxonsiteissueqty = $input->param('maxonsiteissueqty'); my $holdallowed = $input->param('holdallowed'); + my $returnbranch = $input->param('returnbranch'); $maxissueqty =~ s/\s//g; $maxissueqty = undef if $maxissueqty !~ /^\d+/; + $maxonsiteissueqty =~ s/\s//g; + $maxonsiteissueqty = undef if $maxonsiteissueqty !~ /^\d+/; $holdallowed =~ s/\s//g; $holdallowed = undef if $holdallowed !~ /^\d+/; @@ -144,120 +195,144 @@ elsif ($op eq "set-branch-defaults") { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_circ_rules"); my $sth_insert = $dbh->prepare("INSERT INTO default_circ_rules - (maxissueqty, holdallowed) - VALUES (?, ?)"); + (maxissueqty, maxonsiteissueqty, holdallowed, returnbranch) + VALUES (?, ?, ?, ?)"); my $sth_update = $dbh->prepare("UPDATE default_circ_rules - SET maxissueqty = ?, holdallowed = ?"); + SET maxissueqty = ?, maxonsiteissueqty = ?, holdallowed = ?, returnbranch = ?"); $sth_search->execute(); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $holdallowed); + $sth_update->execute($maxissueqty, $maxonsiteissueqty, $holdallowed, $returnbranch); } else { - $sth_insert->execute($maxissueqty, $holdallowed); + $sth_insert->execute($maxissueqty, $maxonsiteissueqty, $holdallowed, $returnbranch); } } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_branch_circ_rules WHERE branchcode = ?"); my $sth_insert = $dbh->prepare("INSERT INTO default_branch_circ_rules - (branchcode, maxissueqty, holdallowed) - VALUES (?, ?, ?)"); + (branchcode, maxissueqty, maxonsiteissueqty, holdallowed, returnbranch) + VALUES (?, ?, ?, ?, ?)"); my $sth_update = $dbh->prepare("UPDATE default_branch_circ_rules - SET maxissueqty = ?, holdallowed = ? + SET maxissueqty = ?, maxonsiteissueqty = ?, holdallowed = ?, returnbranch = ? WHERE branchcode = ?"); $sth_search->execute($branch); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $holdallowed, $branch); + $sth_update->execute($maxissueqty, $maxonsiteissueqty, $holdallowed, $returnbranch, $branch); } else { - $sth_insert->execute($branch, $maxissueqty, $holdallowed); + $sth_insert->execute($branch, $maxissueqty, $maxonsiteissueqty, $holdallowed, $returnbranch); } } } elsif ($op eq "add-branch-cat") { my $categorycode = $input->param('categorycode'); my $maxissueqty = $input->param('maxissueqty'); + my $maxonsiteissueqty = $input->param('maxonsiteissueqty'); $maxissueqty =~ s/\s//g; $maxissueqty = undef if $maxissueqty !~ /^\d+/; + $maxonsiteissueqty =~ s/\s//g; + $maxonsiteissueqty = undef if $maxonsiteissueqty !~ /^\d+/; if ($branch eq "*") { if ($categorycode eq "*") { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_circ_rules"); - my $sth_insert = $dbh->prepare("INSERT INTO default_circ_rules - (maxissueqty) - VALUES (?)"); - my $sth_update = $dbh->prepare("UPDATE default_circ_rules - SET maxissueqty = ?"); + my $sth_insert = $dbh->prepare(q| + INSERT INTO default_circ_rules + (maxissueqty, maxonsiteissueqty) + VALUES (?, ?) + |); + my $sth_update = $dbh->prepare(q| + UPDATE default_circ_rules + SET maxissueqty = ?, + maxonsiteissueqty = ? + |); $sth_search->execute(); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty); + $sth_update->execute($maxissueqty, $maxonsiteissueqty); } else { - $sth_insert->execute($maxissueqty); + $sth_insert->execute($maxissueqty, $maxonsiteissueqty); } } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_borrower_circ_rules WHERE categorycode = ?"); - my $sth_insert = $dbh->prepare("INSERT INTO default_borrower_circ_rules - (categorycode, maxissueqty) - VALUES (?, ?)"); - my $sth_update = $dbh->prepare("UPDATE default_borrower_circ_rules - SET maxissueqty = ? - WHERE categorycode = ?"); + my $sth_insert = $dbh->prepare(q| + INSERT INTO default_borrower_circ_rules + (categorycode, maxissueqty, maxonsiteissueqty) + VALUES (?, ?, ?) + |); + my $sth_update = $dbh->prepare(q| + UPDATE default_borrower_circ_rules + SET maxissueqty = ?, + maxonsiteissueqty = ? + WHERE categorycode = ? + |); $sth_search->execute($branch); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $categorycode); + $sth_update->execute($maxissueqty, $maxonsiteissueqty, $categorycode); } else { - $sth_insert->execute($categorycode, $maxissueqty); + $sth_insert->execute($categorycode, $maxissueqty, $maxonsiteissueqty); } } } elsif ($categorycode eq "*") { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_branch_circ_rules WHERE branchcode = ?"); - my $sth_insert = $dbh->prepare("INSERT INTO default_branch_circ_rules - (branchcode, maxissueqty) - VALUES (?, ?)"); - my $sth_update = $dbh->prepare("UPDATE default_branch_circ_rules - SET maxissueqty = ? - WHERE branchcode = ?"); + my $sth_insert = $dbh->prepare(q| + INSERT INTO default_branch_circ_rules + (branchcode, maxissueqty, maxonsiteissueqty) + VALUES (?, ?, ?) + |); + my $sth_update = $dbh->prepare(q| + UPDATE default_branch_circ_rules + SET maxissueqty = ?, + maxonsiteissueqty = ? + WHERE branchcode = ? + |); $sth_search->execute($branch); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $branch); + $sth_update->execute($maxissueqty, $maxonsiteissueqty, $branch); } else { - $sth_insert->execute($branch, $maxissueqty); + $sth_insert->execute($branch, $maxissueqty, $maxonsiteissueqty); } } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM branch_borrower_circ_rules WHERE branchcode = ? AND categorycode = ?"); - my $sth_insert = $dbh->prepare("INSERT INTO branch_borrower_circ_rules - (branchcode, categorycode, maxissueqty) - VALUES (?, ?, ?)"); - my $sth_update = $dbh->prepare("UPDATE branch_borrower_circ_rules - SET maxissueqty = ? - WHERE branchcode = ? - AND categorycode = ?"); + my $sth_insert = $dbh->prepare(q| + INSERT INTO branch_borrower_circ_rules + (branchcode, categorycode, maxissueqty, maxonsiteissueqty) + VALUES (?, ?, ?, ?) + |); + my $sth_update = $dbh->prepare(q| + UPDATE branch_borrower_circ_rules + SET maxissueqty = ?, + maxonsiteissueqty = ? + WHERE branchcode = ? + AND categorycode = ? + |); $sth_search->execute($branch, $categorycode); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($maxissueqty, $branch, $categorycode); + $sth_update->execute($maxissueqty, $maxonsiteissueqty, $branch, $categorycode); } else { - $sth_insert->execute($branch, $categorycode, $maxissueqty); + $sth_insert->execute($branch, $categorycode, $maxissueqty, $maxonsiteissueqty); } } } elsif ($op eq "add-branch-item") { my $itemtype = $input->param('itemtype'); my $holdallowed = $input->param('holdallowed'); + my $returnbranch = $input->param('returnbranch'); $holdallowed =~ s/\s//g; $holdallowed = undef if $holdallowed !~ /^\d+/; @@ -266,34 +341,34 @@ elsif ($op eq "add-branch-item") { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_circ_rules"); my $sth_insert = $dbh->prepare("INSERT INTO default_circ_rules - (holdallowed) - VALUES (?)"); + (holdallowed, returnbranch) + VALUES (?, ?)"); my $sth_update = $dbh->prepare("UPDATE default_circ_rules - SET holdallowed = ?"); + SET holdallowed = ?, returnbranch = ?"); $sth_search->execute(); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($holdallowed); + $sth_update->execute($holdallowed, $returnbranch); } else { - $sth_insert->execute($holdallowed); + $sth_insert->execute($holdallowed, $returnbranch); } } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total FROM default_branch_item_rules WHERE itemtype = ?"); my $sth_insert = $dbh->prepare("INSERT INTO default_branch_item_rules - (itemtype, holdallowed) - VALUES (?, ?)"); + (itemtype, holdallowed, returnbranch) + VALUES (?, ?, ?)"); my $sth_update = $dbh->prepare("UPDATE default_branch_item_rules - SET holdallowed = ? + SET holdallowed = ?, returnbranch = ? WHERE itemtype = ?"); $sth_search->execute($itemtype); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($holdallowed, $itemtype); + $sth_update->execute($holdallowed, $returnbranch, $itemtype); } else { - $sth_insert->execute($itemtype, $holdallowed); + $sth_insert->execute($itemtype, $holdallowed, $returnbranch); } } } elsif ($itemtype eq "*") { @@ -301,17 +376,17 @@ elsif ($op eq "add-branch-item") { FROM default_branch_circ_rules WHERE branchcode = ?"); my $sth_insert = $dbh->prepare("INSERT INTO default_branch_circ_rules - (branchcode, holdallowed) - VALUES (?, ?)"); + (branchcode, holdallowed, returnbranch) + VALUES (?, ?, ?)"); my $sth_update = $dbh->prepare("UPDATE default_branch_circ_rules - SET holdallowed = ? + SET holdallowed = ?, returnbranch = ? WHERE branchcode = ?"); $sth_search->execute($branch); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($holdallowed, $branch); + $sth_update->execute($holdallowed, $returnbranch, $branch); } else { - $sth_insert->execute($branch, $holdallowed); + $sth_insert->execute($branch, $holdallowed, $returnbranch); } } else { my $sth_search = $dbh->prepare("SELECT count(*) AS total @@ -319,19 +394,19 @@ elsif ($op eq "add-branch-item") { WHERE branchcode = ? AND itemtype = ?"); my $sth_insert = $dbh->prepare("INSERT INTO branch_item_rules - (branchcode, itemtype, holdallowed) - VALUES (?, ?, ?)"); + (branchcode, itemtype, holdallowed, returnbranch) + VALUES (?, ?, ?, ?)"); my $sth_update = $dbh->prepare("UPDATE branch_item_rules - SET holdallowed = ? + SET holdallowed = ?, returnbranch = ? WHERE branchcode = ? AND itemtype = ?"); $sth_search->execute($branch, $itemtype); my $res = $sth_search->fetchrow_hashref(); if ($res->{total}) { - $sth_update->execute($holdallowed, $branch, $itemtype); + $sth_update->execute($holdallowed, $returnbranch, $branch, $itemtype); } else { - $sth_insert->execute($branch, $itemtype, $holdallowed); + $sth_insert->execute($branch, $itemtype, $holdallowed, $returnbranch); } } } @@ -354,25 +429,25 @@ while (my $data=$sth->fetchrow_hashref){ } $sth->finish; -$sth=$dbh->prepare("SELECT description,itemtype FROM itemtypes ORDER BY description"); -$sth->execute; -# $i=0; my @row_loop; -my @itemtypes; -while (my $row=$sth->fetchrow_hashref){ - push @itemtypes,$row; -} +my @itemtypes = @{ GetItemTypes( style => 'array' ) }; my $sth2 = $dbh->prepare(" - SELECT issuingrules.*, itemtypes.description AS humanitemtype, categories.description AS humancategorycode + SELECT issuingrules.*, + itemtypes.description AS humanitemtype, + categories.description AS humancategorycode, + COALESCE( localization.translation, itemtypes.description ) AS translated_description FROM issuingrules LEFT JOIN itemtypes ON (itemtypes.itemtype = issuingrules.itemtype) LEFT JOIN categories ON (categories.categorycode = issuingrules.categorycode) + LEFT JOIN localization ON issuingrules.itemtype = localization.code + AND localization.entity = 'itemtypes' + AND localization.lang = ? WHERE issuingrules.branchcode = ? "); -$sth2->execute($branch); +$sth2->execute($language, $branch); while (my $row = $sth2->fetchrow_hashref) { $row->{'current_branch'} ||= $row->{'branchcode'}; @@ -381,8 +456,9 @@ while (my $row = $sth2->fetchrow_hashref) { $row->{'humancategorycode'} ||= $row->{'categorycode'}; $row->{'default_humancategorycode'} = 1 if $row->{'humancategorycode'} eq '*'; $row->{'fine'} = sprintf('%.2f', $row->{'fine'}); - if ($row->{'hardduedate'} ne '0000-00-00') { - $row->{'hardduedate'} = format_date( $row->{'hardduedate'}); + if ($row->{'hardduedate'} && $row->{'hardduedate'} ne '0000-00-00') { + my $harddue_dt = eval { dt_from_string( $row->{'hardduedate'} ) }; + $row->{'hardduedate'} = eval { output_pref( { dt => $harddue_dt, dateonly => 1 } ) } if ( $harddue_dt ); $row->{'hardduedatebefore'} = 1 if ($row->{'hardduedatecompare'} == -1); $row->{'hardduedateexact'} = 1 if ($row->{'hardduedatecompare'} == 0); $row->{'hardduedateafter'} = 1 if ($row->{'hardduedatecompare'} == 1); @@ -401,7 +477,7 @@ if ($branch eq "*") { SELECT default_borrower_circ_rules.*, categories.description AS humancategorycode FROM default_borrower_circ_rules JOIN categories USING (categorycode) - + "); $sth_branch_cat->execute(); } else { @@ -423,6 +499,7 @@ my @sorted_branch_cat_rules = sort { $a->{'humancategorycode'} cmp $b->{'humanca # note undef maxissueqty so that template can deal with them foreach my $entry (@sorted_branch_cat_rules, @sorted_row_loop) { $entry->{unlimited_maxissueqty} = 1 unless defined($entry->{maxissueqty}); + $entry->{unlimited_maxonsiteissueqty} = 1 unless defined($entry->{maxonsiteissueqty}); } @sorted_row_loop = sort by_category_and_itemtype @row_loop; @@ -484,6 +561,8 @@ if ($defaults) { $template->param(default_holdallowed_same => 1) if($defaults->{holdallowed} == 1); $template->param(default_holdallowed_any => 1) if($defaults->{holdallowed} == 2); $template->param(default_maxissueqty => $defaults->{maxissueqty}); + $template->param(default_maxonsiteissueqty => $defaults->{maxonsiteissueqty}); + $template->param(default_returnbranch => $defaults->{returnbranch}); } $template->param(default_rules => ($defaults ? 1 : 0)); @@ -494,7 +573,7 @@ $template->param(categoryloop => \@category_loop, branchloop => \@branchloop, humanbranch => ($branch ne '*' ? $branches->{$branch}->{branchname} : ''), current_branch => $branch, - definedbranch => scalar(@sorted_row_loop)>0 + definedbranch => scalar(@sorted_row_loop)>0 ); output_html_with_http_headers $input, $cookie, $template->output;