use Encode qw( decode );
use URI::Escape;
use File::Temp;
-use C4::Reports::Guided;
+use C4::Reports::Guided qw( delete_report get_report_areas convert_sql update_sql get_saved_reports get_results ValidateSQLParameters format_results get_report_types get_columns get_from_dictionary get_criteria build_query save_report execute_query nb_rows get_report_groups );
use Koha::Reports;
-use C4::Auth qw/:DEFAULT get_session/;
-use C4::Output;
-use C4::Debug;
+use C4::Auth qw( get_template_and_user get_session );
+use C4::Output qw( pagination_bar output_html_with_http_headers );
use C4::Context;
use Koha::Caches;
-use C4::Log;
-use Koha::DateUtils qw/dt_from_string output_pref/;
+use C4::Log qw( logaction );
use Koha::AuthorisedValue;
use Koha::AuthorisedValues;
use Koha::BiblioFrameworks;
use Koha::Libraries;
use Koha::Patron::Categories;
use Koha::SharedContent;
-use Koha::Util::OpenDocument;
+use Koha::Util::OpenDocument qw( generate_ods );
+use C4::ClassSource qw( GetClassSources );
=head1 NAME
query => $input,
type => "intranet",
flagsrequired => { reports => $flagsrequired },
- debug => 1,
}
);
-my $session = $cookie ? get_session($cookie->value) : undef;
+my $session_id = $input->cookie('CGISESSID');
+my $session = $session_id ? get_session($session_id) : undef;
my $filter;
if ( $input->param("filter_set") or $input->param('clear_filters') ) {
}
elsif ( $phase eq 'Delete Saved') {
-
+
# delete a report from the saved reports list
my $ids = $input->param('reports');
delete_report($ids);
print $input->redirect("/cgi-bin/koha/reports/guided_reports.pl?phase=Use%20saved");
exit;
-}
+}
elsif ( $phase eq 'Show SQL'){
-
+
my $id = $input->param('reports');
my $report = Koha::Reports->find($id);
$template->param(
'notes' => $report->notes,
'sql' => $report->savedsql,
'showsql' => 1,
- 'mana_success' => $input->param('mana_success'),
'mana_success' => scalar $input->param('mana_success'),
'mana_id' => $report->{mana_id},
'mana_comments' => $report->{comments}
my $report = Koha::Reports->find($id);
my $group = $report->report_group;
my $subgroup = $report->report_subgroup;
+ my $tables = get_tables();
$template->param(
'sql' => $report->savedsql,
'reportname' => $report->report_name,
'usecache' => $usecache,
'editsql' => 1,
'mana_id' => $report->{mana_id},
- 'mana_comments' => $report->{comments}
+ 'mana_comments' => $report->{comments},
+ 'tables' => $tables
);
}
my $public = $input->param('public');
my $save_anyway = $input->param('save_anyway');
my @errors;
+ my $tables = get_tables();
# if we have the units, then we came from creating a report from SQL and thus need to handle converting units
if( $cache_expiry_units ){
create_non_existing_group_and_subgroup($input, $group, $subgroup);
- push(@errors, @{Koha::Reports->validate_sql($sql)});
+ my ( $is_sql_valid, $validation_errors ) = Koha::Report->new({ savedsql => $sql })->is_sql_valid;
+ push(@errors, @$validation_errors) unless $is_sql_valid;
if (@errors) {
$template->param(
'public' => $public,
'problematic_authvals' => $problematic_authvals,
'warn_authval_problem' => 1,
- 'phase_update' => 1
+ 'phase_update' => 1,
);
} else {
'cache_expiry' => $cache_expiry,
'public' => $public,
'usecache' => $usecache,
+ 'tables' => $tables
);
logaction( "REPORTS", "MODIFY", $id, "$reportname | $sql" ) if C4::Context->preference("ReportsLog");
}
# If value is not defined, then it may be range values
if (!defined $value) {
-
my $fromvalue = $input->param( "from_" . $crit . "_value" );
my $tovalue = $input->param( "to_" . $crit . "_value" );
- # If the range values are dates
- my $fromvalue_dt;
- $fromvalue_dt = eval { dt_from_string( $fromvalue ); } if ( $fromvalue );
- my $tovalue_dt;
- $tovalue_dt = eval { dt_from_string( $tovalue ); } if ($tovalue);
- if ( $fromvalue_dt && $tovalue_dt ) {
- $fromvalue = output_pref( { dt => dt_from_string( $fromvalue_dt ), dateonly => 1, dateformat => 'iso' } );
- $tovalue = output_pref( { dt => dt_from_string( $tovalue_dt ), dateonly => 1, dateformat => 'iso' } );
- }
-
if ($fromvalue && $tovalue) {
$query_criteria .= " AND $crit >= '$fromvalue' AND $crit <= '$tovalue'";
}
-
} else {
-
- # If value is a date
- my $value_dt;
- $value_dt = eval { dt_from_string( $value ); } if ( $value );
- if ( $value_dt ) {
- $value = output_pref( { dt => dt_from_string( $value_dt ), dateonly => 1, dateformat => 'iso' } );
- }
# don't escape runtime parameters, they'll be at runtime
if ($value =~ /<<.*>>/) {
$query_criteria .= " AND $crit=$value";
my $cache_expiry_units = $input->param('cache_expiry_units');
my $public = $input->param('public');
my $save_anyway = $input->param('save_anyway');
+ my $tables = get_tables();
# if we have the units, then we came from creating a report from SQL and thus need to handle converting units
create_non_existing_group_and_subgroup($input, $group, $subgroup);
## FIXME this is AFTER entering a name to save the report under
- push(@errors, @{Koha::Reports->validate_sql($sql)});
+ my ( $is_sql_valid, $validation_errors ) = Koha::Report->new({ savedsql => $sql })->is_sql_valid;
+ push(@errors, @$validation_errors) unless $is_sql_valid;
if (@errors) {
$template->param(
'cache_expiry' => $cache_expiry,
'public' => $public,
'usecache' => $usecache,
+ 'tables' => $tables
);
}
}
}
}
elsif ( $authorised_value eq "biblio_framework" ) {
- my @frameworks = Koha::BiblioFrameworks->search({}, { order_by => ['frameworktext'] });
+ my @frameworks = Koha::BiblioFrameworks->search({}, { order_by => ['frameworktext'] })->as_list;
my $default_source = '';
push @authorised_values,$default_source;
$authorised_lib{$default_source} = 'Default';
}
}
elsif ( $authorised_value eq "categorycode" ) {
- my @patron_categories = Koha::Patron::Categories->search({}, { order_by => ['description']});
+ my @patron_categories = Koha::Patron::Categories->search({}, { order_by => ['description']})->as_list;
%authorised_lib = map { $_->categorycode => $_->description } @patron_categories;
push @authorised_values, $_->categorycode for @patron_categories;
}
+ elsif ( $authorised_value eq "cash_registers" ) {
+ my $sth = $dbh->prepare("SELECT id, name FROM cash_registers ORDER BY description");
+ $sth->execute;
+ while ( my ( $id, $name ) = $sth->fetchrow_array ) {
+ push @authorised_values, $id;
+ $authorised_lib{$id} = $name;
+ }
+ }
+ elsif ( $authorised_value eq "debit_types" ) {
+ my $sth = $dbh->prepare("SELECT code, description FROM account_debit_types ORDER BY code");
+ $sth->execute;
+ while ( my ( $code, $description ) = $sth->fetchrow_array ) {
+ push @authorised_values, $code;
+ $authorised_lib{$code} = $description;
+ }
+ }
+ elsif ( $authorised_value eq "credit_types" ) {
+ my $sth = $dbh->prepare("SELECT code, description FROM account_credit_types ORDER BY code");
+ $sth->execute;
+ while ( my ( $code, $description ) = $sth->fetchrow_array ) {
+ push @authorised_values, $code;
+ $authorised_lib{$code} = $description;
+ }
+ }
else {
if ( Koha::AuthorisedValues->search({ category => $authorised_value })->count ) {
my $query = '
} else {
my ($sql,$header_types) = $report->prep_report( \@param_names, \@sql_params );
$template->param(header_types => $header_types);
- my ( $sth, $errors ) = execute_query( $sql, $offset, $limit, undef, $report_id );
- my $total = nb_rows($sql) || 0;
- unless ($sth) {
+ my ( $sth, $errors ) = execute_query(
+ {
+ sql => $sql,
+ offset => $offset,
+ limit => $limit,
+ report_id => $report_id,
+ }
+ );
+ my $total;
+ if (!$sth) {
die "execute_query failed to return sth for report $report_id: $sql";
- } else {
+ } elsif ( !$errors ) {
+ $total = nb_rows($sql) || 0;
my $headers = header_cell_loop($sth);
$template->param(header_row => $headers);
while (my $row = $sth->fetchrow_arrayref()) {
push @rows, { cells => \@cells };
}
if( $want_full_chart ){
- my ($sth2, $errors2) = execute_query($sql);
+ my ( $sth2, $errors2 ) = execute_query( { sql => $sql, report_id => $report_id } );
while (my $row = $sth2->fetchrow_arrayref()) {
my @cells = map { +{ cell => $_ } } @$row;
push @allrows, { cells => \@cells };
}
}
- }
- my $totpages = int($total/$limit) + (($total % $limit) > 0 ? 1 : 0);
- my $url = "/cgi-bin/koha/reports/guided_reports.pl?reports=$report_id&phase=Run%20this%20report&limit=$limit&want_full_chart=$want_full_chart";
- if (@param_names) {
- $url = join('&param_name=', $url, map { URI::Escape::uri_escape_utf8($_) } @param_names);
- }
- if (@sql_params) {
- $url = join('&sql_params=', $url, map { URI::Escape::uri_escape_utf8($_) } @sql_params);
- }
+ my $totpages = int($total/$limit) + (($total % $limit) > 0 ? 1 : 0);
+ my $url = "/cgi-bin/koha/reports/guided_reports.pl?reports=$report_id&phase=Run%20this%20report&limit=$limit&want_full_chart=$want_full_chart";
+ if (@param_names) {
+ $url = join('&param_name=', $url, map { URI::Escape::uri_escape_utf8($_) } @param_names);
+ }
+ if (@sql_params) {
+ $url = join('&sql_params=', $url, map { URI::Escape::uri_escape_utf8($_) } @sql_params);
+ }
+ $template->param(
+ 'results' => \@rows,
+ 'allresults' => \@allrows,
+ 'pagination_bar' => pagination_bar($url, $totpages, scalar $input->param('page')),
+ 'unlimited_total' => $total,
+ );
+ }
$template->param(
- 'results' => \@rows,
- 'allresults' => \@allrows,
- 'sql' => $sql,
- original_sql => $original_sql,
- 'id' => $report_id,
- 'execute' => 1,
- 'name' => $name,
- 'notes' => $notes,
- 'errors' => defined($errors) ? [ $errors ] : undef,
- 'pagination_bar' => pagination_bar($url, $totpages, scalar $input->param('page')),
- 'unlimited_total' => $total,
- 'sql_params' => \@sql_params,
- 'param_names' => \@param_names,
+ 'sql' => $sql,
+ original_sql => $original_sql,
+ 'id' => $report_id,
+ 'execute' => 1,
+ 'name' => $name,
+ 'notes' => $notes,
+ 'errors' => defined($errors) ? [$errors] : undef,
+ 'sql_params' => \@sql_params,
+ 'param_names' => \@param_names,
);
}
}
my $reportfilename = $reportname ? "$reportname-reportresults.$format" : "reportresults.$format" ;
($sql, undef) = $report->prep_report( \@param_names, \@sql_params );
- my ($sth, $q_errors) = execute_query($sql);
+ my ( $sth, $q_errors ) = execute_query( { sql => $sql, report_id => $report_id } );
unless ($q_errors and @$q_errors) {
my ( $type, $content );
if ($format eq 'tab') {
$content .= join("\t", map { $_ // '' } @$row) . "\n";
}
} else {
- my $delimiter = C4::Context->preference('CSVDelimiter') || ',';
if ( $format eq 'csv' ) {
- $delimiter = "\t" if $delimiter eq 'tabulation';
+ my $delimiter = C4::Context->csv_delimiter;
$type = 'application/csv';
my $csv = Text::CSV::Encoded->new({ encoding_out => 'UTF-8', sep_char => $delimiter});
$csv or die "Text::CSV::Encoded->new({binary => 1}) FAILED: " . Text::CSV::Encoded->error_diag();
$notes = $report->notes // '';
}
+ my $tables = get_tables();
+
$template->param(
sql => $sql,
reportname => $reportname,
'public' => '0',
'cache_expiry' => 300,
'usecache' => $usecache,
+ 'tables' => $tables,
);
}
return \@headers;
}
+#get a list of available tables for auto-complete
+sub get_tables {
+ my $result = {};
+ my $cache = Koha::Caches->get_instance();
+ my $tables = $cache->get_from_cache("Reports-SQL_tables-for-autocomplete");
+
+ return $tables
+ if $tables;
+
+ $tables = C4::Reports::Guided->get_all_tables();
+ for my $table (@{$tables}) {
+ my $sql = "SHOW COLUMNS FROM $table";
+ my $rows = C4::Context->dbh->selectall_arrayref($sql, { Slice => {} });
+ for my $row (@{$rows}) {
+ push @{$result->{$table}}, $row->{Field};
+ }
+ }
+ $cache->set_in_cache("Reports-SQL_tables-for-autocomplete",$result);
+ return $result;
+}
+
foreach (1..6) {
$template->{VARS}->{'build' . $_} and last;
}