#!/usr/bin/perl
=begin -------------------------------------------------------------------------
sends a list of requests (non-trial) where referrer or source unknown; runs daily
and exits unless day is Sunday, date is 1st of month, or last working day before
1st of next month
=cut
#-------------------------------------------------------------------------------
my $JUST_TESTING = 0; # email to ra.jones only
my @recipients = qw(hmds.secure raj); # for non-secure info
#-------------------------------------------------------------------------------
use lib '/home/raj/perl5/lib/perl5';
use Data::Printer alias => 'p';
use DateTime::Format::MySQL;
use SQL::Abstract::More;
use Modern::Perl;
use Config::Auto;
use FindBin qw($Bin); # warn $Bin;
use lib "$Bin/../../../lib";
use LIMS::Local::ScriptHelpers;
use LIMS::Local::Utils;
use constant TODAY => LIMS::Local::Utils::today; # warn TODAY->day_name;
# use constant TODAY => DateTime->new( year => 2016, month => 4, day => 29 );
{ # do we run today? - only Sundays & last working day on or before 1st of month
# get date 1 month ahead:
my $date = TODAY->clone->add( months => 1 ); # say $date->dmy;
# create datetime object for 1st day of next month:
my $first_of_month = DateTime->new(
month => $date->month,
year => $date->year,
day => 1,
); # say $first_of_month->dmy;
# get date of last *working* day before 1st of next month:
my $last_working_date # considers weekends & public hols
= LIMS::Local::Utils::last_working_date($first_of_month);
# say $last_working_date->dmy; say TODAY->dmy;
exit 0 unless
TODAY->day == 1 # run on 1st regardless of day
|| TODAY->day_name eq 'Sunday'
|| TODAY->dmy eq $last_working_date->dmy;
}
#===============================================================================
# to get here it's 1st of month, last working day before 1st of month, or Sunday
#===============================================================================
my $tools = LIMS::Local::ScriptHelpers->new();
$tools->test_only($JUST_TESTING);
my $cfg_file = "$Bin/../lib/settings.cfg";
my $settings = Config::Auto::parse($cfg_file); # warn Dumper $settings;
my $config = $tools->config();
my $dbix = $tools->dbix();
# organisation codes NOT required in activity data:
my $skip_orgs = $settings->{skip_organisation_codes}; # warn Dumper $skip_orgs;
# my $query = $sql_lib->retr( 'national_code_unknown' ); # warn $query;
my ($sql, @bind) = get_query_params(); # p $sql; p @bind;
my $result = $dbix->query($sql, @bind);
my @rows;
while (my $vars = $result->hash) { # p $vars; next;
my $lab_no = sprintf '%s%s/%s',
$config->{lab_number_prefix},
$vars->{request_number},
$vars->{year} - 2000;
my $row = sprintf '%-10s %-12s %s',
$lab_no,
DateTime::Format::MySQL->parse_datetime($vars->{created_at})->dmy,
$vars->{display_name};
$row .= ' [WILL NOT BE BILLED]' if
grep { $vars->{organisation_code} eq $_ } @$skip_orgs;
push @rows, $row;
}
# send message:
my $message_body = @rows
? ( join "\n", @rows )
: 'No unknown national codes so far';
my $subject = do {
my $month_year = ( TODAY->day == 1 )
? TODAY->clone->subtract( months => 1 )->strftime('%B %Y')
: TODAY->strftime('%B %Y');
'Unknown national codes for ' . $month_year;
}; # p $subject;
my %mail = (
config => $config,
subject => $subject,
message => $message_body,
); # warn Dumper \%mail; # next;
$tools->send_mail(\%mail, \@recipients);
sub get_query_params {
my @col_names = qw(
r.request_number
r.year
r.created_at
rs.display_name
rs.organisation_code
);
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' , 'pc.referral_source_id = rs.id' ,
'referral_sources|rs' , '=>rt.request_id = r.id' , # left join
'request_trial|rt'
);
my %where = (
-or => {
'ref.national_code' => { like => '%' . 999998 },
'rs.organisation_code' => { -in => [ qw/X99999 V81999/ ] },
},
'rt.request_id' => undef,
);
# add date restriction to where clause:
my $start_day = ( TODAY->day == 1 ) # if today = 1st of month
? TODAY->clone->subtract( months => 1 ) # 1st of last month
: TODAY->clone->subtract( days => TODAY->day - 1 ); # 1st of this month
$where{'DATE(r.created_at)'} = { '>=' => $start_day->ymd };
my @sort_by = qw(r.year r.request_number);
my ($sql, @bind) = SQL::Abstract::More->new->select(
-columns => \@col_names,
-from => [ -join => @tbl_rels ],
-where => \%where,
-order_by => \@sort_by,
); p $sql; p @bind;
return ($sql, @bind);
}