RSS Git Download  Clone
Raw Blame History
# refactor cron jobs which all do the same thing
# 1) run a query
# 2) make an Excel file
# 3) email it to a user

package LIMS::Local::QueryMailer;

use Import::Into;
my $JUST_TESTING = 0;
use Modern::Perl;
use autodie;
use DateTime;

use Data::Printer;

use lib '/home/raj/perl5/lib/perl5';
use FindBin qw($Bin); # warn $Bin;
use lib $Bin . '/../../../lib';

use Excel::Writer::XLSX;

use LIMS::Local::ScriptHelpers;
use SQL::Library;

# get tools from LIMS::Local::ScriptHelpers:
my $tools = LIMS::Local::ScriptHelpers->new();

use Moose;
use namespace::autoclean;

has testing => ( is => 'ro', isa => 'Int', default => 0);
has results => ( is => 'ro', isa => 'ArrayRef', default => sub {[]});
has excel => ( is => 'ro', isa => 'HashRef', default => sub {{}});
has dbix => (is => 'ro' , isa => 'DBIx::Simple' , lazy =>1 , builder => '_build_dbix');

sub _build_dbix {
my $self = shift;
    $tools->test_only($self->testing);
    return $tools->get_dbix();
}

# run query and push it onto results stack
sub run{
    my $self = shift;
    my %params = @_;
#    $self->dbix->query('use hilis4_clone'); # TODO REMOVE THIS LINE!!!!!!!!!!!!!!!!!!!
    my $sql = $params{sql};
    my $bind = $params{bind};
    my $sheet_name = $params{sheet_name};
    my $result = $self->dbix->query($params{sql}, @{$params{bind}});
    push @{ $self->results }, { sql => $sql, bind => $bind, db_output => $result, sheet_name => $sheet_name };
}
sub reset_tmp_table {
    my $self = shift;
    my $sql = shift;
#    $self->dbix->query('use hilis4_clone'); # TODO REMOVE THIS LINE!!!!!!!!!!!!!!!!!!!
    $self->dbix->query('drop table if exists tmp');
    $self->dbix->query('create table tmp (id int)');
    $self->dbix->query($sql) if $sql;
}

sub save_file{
    my $self = shift;
    my $dir = shift || '';
    $dir .= '/' if $dir =~ m{[^/]$}; # add a slash if path doesnt end with one
    open my $fh, '>', $dir . $self->excel->{filename};
    binmode($fh);
    print $fh $self->excel->{workbook};
    close $fh;


}
sub make_excel{
    my $self = shift;
    my $filename = shift || 'output.xlsx'; # result index
    die "no results to write" unless scalar @{$self->results};

    $self->excel->{filename} = $filename;

    open my $fh, '>', \$self->excel->{workbook};
    my $workbook = Excel::Writer::XLSX->new($fh);
    my $bold = $workbook->add_format(bold => 1);

    foreach my $i (@{$self->results}){
        my @column_titles = $i->{db_output}->columns; # p \@column_titles;
        my $worksheet = $workbook->add_worksheet($i->{sheet_name});
        $worksheet->write_row(0,0, \@column_titles);
        my $y = 1;
        foreach my $row( $i->{db_output}->arrays){
            $worksheet->write_row($y++,0, $row);
        }
    }
    $workbook->close() or die "Failed to close Excel document";
}


sub mail_results{
    my $self = shift;
    my %params = @_;
    my $recipients = $params{recipients};

    my %mail = (
        config  => $tools->config,
        subject => $params{subject},
        filename => $self->excel->{filename},
        attachment => $self->excel->{workbook},
    );

    $tools->send_mail(\%mail, $recipients) or die;
}
__PACKAGE__->meta->make_immutable;

# reduce the boilerplate for these crons
sub import{
  my $target = caller;
  Modern::Perl->import::into($target);
  LIMS::Local::ScriptHelpers->import::into($target);
  SQL::Library->import::into($target);
  lib->import::into($target);
  DateTime->import::into($target);
}
1;