#!/usr/bin/perl
# emails details of NCG PNH cases screened, every 3 months, to specified recipients
use Getopt::Std;
getopts('qtm:'); # query to stdout, test, months
our($opt_m, $opt_t, $opt_q); # warn $opt_m; exit;
use strict;
use warnings;
my $JUST_TESTING = $opt_t || 0; # email to ra.jones only
############ usernames from users table ########################################
my @recipients = qw( detute raj );
################################################################################
use lib '/home/raj/perl5/lib/perl5';
use Data::Printer;
use SQL::Abstract::More;
use FindBin qw($Bin); # warn $Bin;
use lib $Bin . '/../../../lib';
use LIMS::Local::ScriptHelpers;
# get tools from LIMS::Local::ScriptHelpers:
my $tools = LIMS::Local::ScriptHelpers->new();
$tools->test_only($JUST_TESTING);
#-------------------------------------------------------------------------------
my $duration = $opt_m || 3; # months
my $start = $tools->date_subtract( months => $duration ); # date 3 months ago
my $end = $tools->date_subtract( days => 1 ); # yesterday
my $subject = sprintf 'HMDS NCG PNH cases for %s.%s to %s.%s',
$start->month_abbr, $start->year, $end->month_abbr, $end->year; # warn $subject; exit;
#-------------------------------------------------------------------------------
my $sql_lib = $tools->sql_lib();
my $config = $tools->config();
my $dbix = $tools->dbix();
my $sqla = SQL::Abstract::More->new;
# get SQL statements for query:
my ($sql, @bind) = ncg_pnh_query();
my $result = $dbix->query( $sql, @bind );
my @data;
while ( my @row = $result->list ) { # p @row; next;
push @data, join ': ', @row;
}
{ # HTS myeloid tests:
my ($sql, @bind) = ncg_hts_query();
my $i = $dbix->query( $sql, @bind )->list || 0;
push @data, "HTS myeloid: $i";
} # p @data; exit;
# flag to Local::Mail::_verify_service_status() that msg safe to send:
$config->{_safe_message} = 1 if ! $config->{is_in_production_mode};
my %mail = (
config => $config,
subject => $subject,
);
if (@data) {
$mail{message} = join "\n", @data;
}
else {
$mail{message} = 'No NCG PNH cases for 3 months to ' . $end->dmy;
} # p %mail; exit;
$tools->send_mail(\%mail, \@recipients);
sub ncg_pnh_query {
my @cols = ( 's2.sample_code', 'COUNT(s2.sample_code)' );
my @rels = ( 'requests|r' ,
'ris.request_id=r.id' => 'request_initial_screen|ris' ,
'ris.screen_id=s1.id' => 'screens|s1' ,
'rs.request_id=r.id' => 'request_specimen|rs' ,
'rs.specimen_id=s2.id' => 'specimens|s2' ,
q{rh.request_id=r.id, rh.action='screened'},
=> 'request_history|rh' ,
);
my %where = (
-or => [
's1.description' => { -like => 'NCG PNH %' }, # discontinued 03/2019
's1.description' => { -like => 'PNH NCG %' }, # new term
],
's2.sample_code' => { -in => [ qw(PB BMA BMAT) ] },
'DATE(rh.time)' => { '>=' => $start->ymd },
);
my @args = (
-columns => \@cols,
-from => [ -join => @rels ],
-where => \%where,
-group_by => 's2.id',
); # p @args;
my ($sql, @bind) = $sqla->select(@args); # p $sql; p \@bind;
$dbix->dump_query($sql, @bind) if $opt_q; # exit;
return ($sql, @bind);
}
sub ncg_hts_query {
my @cols = ( 'COUNT(*)' );
my @rels = ( 'requests|r' ,
'ris.request_id=r.id' => 'request_initial_screen|ris' ,
'ris.screen_id=s1.id' => 'screens|s1' ,
'ts.request_id=r.id' => 'request_lab_test_status|ts' ,
'ts.lab_test_id=lt.id' => 'lab_tests|lt' ,
q{rh.request_id=r.id, rh.action='screened'},
=> 'request_history|rh' ,
);
my %where = ( # don't care about sample type - only whether test is done
-or => [
's1.description' => { -like => 'NCG PNH %' }, # discontinued 03/2019
's1.description' => { -like => 'PNH NCG %' }, # new term
],
'lt.test_name' => 'hts_myeloid',
'DATE(rh.time)' => { '>=' => $start->ymd },
);
my @args = (
-columns => \@cols,
-from => [ -join => @rels ],
-where => \%where,
); # p @args;
my ($sql, @bind) = SQL::Abstract::More->new->select(@args); # p $sql; p \@bind;
$dbix->dump_query($sql, @bind) if $opt_q; # exit;
return ($sql, @bind);
}