# 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;