RSS Git Download  Clone
Raw Blame History
#!/usr/bin/env perl

=begin -------------------------------------------------------------------------
emails XL list of outreach requests with non-CMP sample type for previous month
from Feb 2018 requires xlsx file format
--------------------------------------------------------------------------------
=cut

use Getopt::Std;
getopts('m:tq'); # month, testing, query output
our($opt_m,$opt_t,$opt_q); # warn $opt_t; exit;

use strict;
use warnings;

use lib '/home/raj/perl5/lib/perl5';
use Data::Printer;
use Excel::Writer::XLSX;
use lib '/home/raj/perl-lib';
use Local::DB;

my $JUST_TESTING = $opt_t || 0; # email to ra.jones only
my $duration     = $opt_m || 1; # months

############ recipients from contacts.lib ######################################
my @recipients = map $_ . '.secure', qw( lth.commissioning andy.rawstron raj );
################################################################################

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 $ref_date = $tools->date_subtract( months => $duration );
my $filename = 'HMDS.xlsx'; # new filename requirement
my $subject  = sprintf 'HMDS Outreach patients [%s %s]',
    $ref_date->month_name, $ref_date->year; # warn $subject; exit;

# xl file headers:
my @headers = qw( last_name first_name dob unit_number nhs_number registered
    location sample );
#-------------------------------------------------------------------------------

my $sql_lib = $tools->sql_lib();
my $config  = $tools->config();

my $dbix = Local::DB->dbix({ dbname => 'hilis4', dump_query => $opt_q });

my @data = do{
    my $args = _query_args();
    $dbix->sam_query($args)->arrays;
}; # p @data;

my %mail = (
	config  => $config,
	subject => $subject,
);

if (@data) {
    open my $fh, '>', \my $str or die $!;
	my $xl = Excel::Writer::XLSX->new($fh);

    my $worksheet = $xl->add_worksheet('CommissioningData');

    my $hdr_format = $xl->add_format(bold => 1); # bg_color => '#e0f8f7'
    my $row_format = $xl->add_format(align => 'left'); # unit number varies

    $worksheet->write('A1', \@headers, $hdr_format); # row 0 - headers
    $worksheet->write('A2', [\@data] , $row_format); # ref to arrayref for write_cols() function
    $xl->close() or die $!;

	$mail{attachment} = $str;
    $mail{filename}   = $filename;

    save_file($str) if $JUST_TESTING;
}
else { # unlikely !!
	$mail{message} = "No Outreach patients registered during this period.";
} # p %mail;

$tools->send_mail(\%mail, \@recipients) unless $opt_q;

sub save_file {
    my $str = shift;
    open my $fh, '>', join '/', $Bin, $filename or die $!;
    binmode $fh;
    print   $fh $str;
    close   $fh;
}

sub _query_args {
    my @cols = qw(
        p.last_name
        p.first_name
        p.dob
        pc.unit_number
        p.nhs_number
        DATE(r.created_at)
        rs1.display_name
        s1.sample_code
    );
    my @rels = (
        'requests|r'                    =>  'r.patient_case_id = pc.id'        ,
        'patient_case|pc'               =>  'pc.patient_id = p.id'             ,
        'patients|p'                    =>  'pc.referral_source_id = rs1.id'   ,
		'referral_sources|rs1'          =>  'rs2.request_id = r.id'            ,
        'request_specimen|rs2'          =>  'rs2.specimen_id = s1.id'          ,
        'specimens|s1'                  =>  'ris.request_id = r.id'            ,
        'request_initial_screen|ris'    =>  'ris.screen_id = s2.id'            ,
		'screens|s2'
    );
    my %where = (
        's2.description' => { -rlike => 'outreach' },
        's1.sample_code' => { '!=' => 'CMP' },
        'MONTH(r.created_at)' => $ref_date->month,
        'YEAR(r.created_at)'  => $ref_date->year,
    );
    my $order = 'r.created_at';
    return {
        cols => \@cols,
        rels => \@rels,
        where   => \%where,
        sort_by => $order,
    }
}