#!/usr/bin/perl =begin ######################################################################### performs daily print run - creates pdf in /backups/print_run dir (or to /tmp if JUST_TESTING flag set with getopt -t) =cut ########################################################################### BEGIN { use lib '/home/raj/perl5/lib/perl5'; # *must* come before FindBin($Bin) use FindBin qw($Bin); # warn $Bin; exit; use lib $Bin . '/../../../lib'; # override default db test: $ENV{ROSEDB_DEVINIT} = "$Bin/../../../config/rosedb_devinit_prod.pl"; } use autodie; no autovivification; use Getopt::Std; use Modern::Perl; use Config::Auto; use Data::Printer; use SQL::Abstract::More; getopts('t'); # t for testing our ($opt_t); my $JUST_TESTING = $opt_t; # saves pdf to /tmp instead of backup dir use LIMS::Local::Utils; use LIMS::Local::Reports; use LIMS::Local::ScriptHelpers; # get tools from LIMS::Local::ScriptHelpers: my $tools = LIMS::Local::ScriptHelpers->new(); # $tools->test_only($JUST_TESTING); # not relevant my $config = $tools->config(); my $today = $tools->time_now(); my $dbix = $tools->dbix(); #my $start = LIMS::Local::Utils::last_working_date->subtract(days => 27); # p $start; my $start = LIMS::Local::Utils::last_working_date(); # considers public hols # end date is today - 1 day (query uses ymd so includes full day to midnight): my $end = $today->clone->subtract( days => 1 ); # p $start; p $end; exit; # substitutes LIMS methods required by Role::RecordHandler : my $lims = LIMS::Local::Reports->new({ tools => $tools }); # localhost http address - for charts; is_print_request for tt formatting: $lims->tt_params( app_url => 'http://localhost/hilis4', is_print_request => 1, # can't use c.get_current_runmode method ); my $pdf_title = ( $start->ymd eq $end->ymd ) ? sprintf ( 'Print run [%s]', $start->dmy('.') ) : sprintf ( 'Print run [%s - %s]', $start->dmy('.'), $end->dmy('.') ); # p $pdf_title; my $pdf_name = 'printrun_' . $today->ymd . '.pdf'; # p $pdf_name; my $pdf_path = $JUST_TESTING ? '/tmp' : '/backups/print_run'; # p $pdf_path; my $pdf = PDF::API2->new(-file => join '/', $pdf_path, $pdf_name); $pdf->info( Title => $pdf_title ); my ($sql, @bind) = get_query_params(); # $dbix->dump_query($sql, @bind); exit; my $request_ids = $dbix->query($sql, @bind)->flat; # p $request_ids; for my $request_id (@$request_ids) { # warn $request_id; # next; my $req = $lims->get_single_request_data($request_id); # L::C::Roles::RecordHandler add_new_pdf($req); # generate 2nd copy with 'cc' as referrer if copy_to selected: if ( $req->{request_options}->{copy_to}->{is_selected} ) { # p $request_id; my $o = $req->{data}; # $req->{data} is RDBO object $o->referrer_department->referrer->name('cc'); # replace referrer name add_new_pdf($req); } } $pdf->save; #=============================================================================== sub add_new_pdf { my $data = shift; my $pdf_string = $lims->format_print_run_report($data); my $api = PDF::API2->open_scalar($pdf_string); $pdf->importpage($api, $_) for (1 .. $api->pages); } sub get_query_params { my @tbl_rels = ( # table|alias # FK-PK relationship 'requests|r' , 'r.referrer_department_id = rd.id' , 'referrer_department|rd' , 'rd.referrer_id = ref.id' , 'referrers|ref' , 'r.patient_case_id = pc.id' , 'patient_case|pc' , 'rr.request_id = r.id' , 'request_report_view|rr' , 'r.status_option_id = so.id' , 'status_options|so' , 'pc.referral_source_id = rs.id' , 'referral_sources|rs' , 'rs.parent_organisation_id = po.id' , 'parent_organisations|po' ); my %query = ( 'so.description' => { -in => [ qw/authorised complete/ ] } ); $query{'DATE(rr.updated_at)'} = ( $start->ymd eq $end->ymd ) ? $start->ymd # or $end->ymd, both same : { -between => [ $start->ymd, $end->ymd ] }; # exclude any locations which don't require paper copies: if ( my $cfg = $tools->get_yaml_file('skip_paper_reports') ) { # p $cfg; if ( my $org_codes = $cfg->{organisation} ) { # p $org_codes; $query{'po.parent_code'} = { -not_in => $org_codes }; } if ( my $hospitals = $cfg->{hospital} ) { # p $hospitals; $query{'rs.organisation_code'} = { -not_in => $hospitals }; } if ( my $departments = $cfg->{department} ) { # p $departments; for (@$departments) { # eg RWA/823 my ($location, $department) = split '/'; # p $location; p $department; # 5-digits (hospital) or 3-digits (organisation) code: my $site_type = length $location > 3 ? 'rs.organisation_code' : 'po.parent_code'; my %h = ( $site_type => $location, 'rd.hospital_department_code' => $department, ); push @{ $query{-not_bool} }, \%h; } } } # p %query; exit; my @sort_by = qw(ref.name r.year r.request_number); my ($sql, @bind) = SQL::Abstract::More->new->select( -columns => 'r.id', -from => [ -join => @tbl_rels ], -where => \%query, -order_by => \@sort_by, ); # p $sql; p @bind; return ($sql, @bind); }