package LIMS::Model::Chart;
use Moose;
extends 'LIMS::Model::Base';
with (
'LIMS::Model::Roles::Query', # get_sql_with_constraint(), sql_lib()
);
use namespace::clean -except => 'meta';
__PACKAGE__->meta->make_immutable;
use LIMS::Local::Utils;
use Data::Dumper;
# using 'warn' requires SELECT to be uppercase to avoid dumping to apache error.log
# ------------------------------------------------------------------------------
sub get_diagnosis_frequency {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
=begin
my %args = (
# query => [ 'time' => { ge => DateTime->now->year } ], # doesn't work
group_by => 'name',
require_objects => 'diagnosis',
);
$self->set_rose_debug(1);
my $data = LIMS::DB::RequestReport::Manager->get_request_report(%args);
$self->set_rose_debug(0);
=cut
my $dbix = $self->lims_dbix;
# joining request_history is deadly slow
# $db->dbh->do( q!drop table if exists `bar`! );
# $db->dbh->do( q!create temporary table `bar` (id INT)! );
# $db->dbh->do( q!insert into bar select request_id from request_history where
# action = 'reported' and year(time) = ?!, undef, DateTime->now->year );
my $sql = $self->get_sql_with_constraint('diagnosis_frequency', 'created_at');
my $data = $dbix->query( $sql )->arrays;
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub get_new_diagnosis_frequency {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql
= $self->get_sql_with_constraint('new_diagnosis_frequency', 'created_at');
my $data = $dbix->query( $sql )->arrays;
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub get_specimen_frequency {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql
= $self->get_sql_with_constraint('specimen_frequency', 'created_at');
my $data = $dbix->query( $sql )->arrays;
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub get_presentation_frequency {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql
= $self->get_sql_with_constraint('presentation_frequency', 'created_at');
my $data = $dbix->query( $sql )->arrays;
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub get_diagnosis_status {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql = $self->get_sql_with_constraint('diagnosis_status', 'created_at');
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub requests_by_day_of_week {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql
= $self->get_sql_with_constraint('requests_by_day_of_week', 'created_at');
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
# ------------------------------------------------------------------------------
sub reports_by_day_of_week {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql
= $self->get_sql_with_constraint('reports_by_day_of_week', 'created_at');
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my @data = (); # initialise new data array
{ # need to massage AoA data into new array of ([freqs for sample types], day-name, sample_type)
my (%h, %sample_types);
for my $row (@$data) { # arrayref of day-name, sample_type, frequency
my ($day, $sample_type, $f) = @$row;
# add { sample_type => freq } hashref to %data 'day-name' key:
$h{$day}{$sample_type} = $f;
$sample_types{$sample_type}++; # increment unique 'sample_type' index
} # warn Dumper \%h; warn Dumper \%sample_types;
# list of days in required order:
my @days = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
my @sample_types = keys %sample_types; # warn Dumper \@sample_types;
for my $d(@days) {
my $ref = $h{$d}; # hashref of { sample_type => freq } for each day
my @ary = @{$ref}{@sample_types}; # warn Dumper \@ary; # array of frequencies
{ # calculate total number from @ary frequencies:
my $total = 0; $total += $_ || 0 for @ary; # 0 in case $_ undef
push @ary, $total;
}
push @data, [ \@ary, $d ]; # add [freqs] & day-name
} # warn Dumper \@data;
# add sample_types, one per row of @data, so they are pulled into 'points'
# by Roles::Chart::_get_chart_data():
for my $i (0 .. @sample_types -1) { # warn $i;
push @{ $data[$i] }, $sample_types[$i];
} # warn Dumper \@data;
}
my $title = $self->constraint_title; # set in Role::DBIxSimple
return (\@data, $title);
}
# ------------------------------------------------------------------------------
sub requests_by_month {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
# set optional 3rd arg to 'all_data' to override default constraint_type:
my @args = qw(requests_by_month created_at all_data);
my $sql = $self->get_sql_with_constraint(@args);
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
#-------------------------------------------------------------------------------
sub diagnosis_errors {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
# set optional 3rd arg to 'all_data' to override default constraint_type:
my @args = qw(diagnosis_errors created_at all_data);
my $sql = $self->get_sql_with_constraint(@args);
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
#-------------------------------------------------------------------------------
sub requests_by_year {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql = $self->sql_lib->retr('requests_by_year'); # warn $sql;
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
#-------------------------------------------------------------------------------
sub specimens_by_year {
my $self = shift;
my $vars = shift || {}; # optional form params
$self->params($vars);
my $dbix = $self->lims_dbix;
my $sql = $self->sql_lib->retr('specimens_by_year'); # warn $sql;
my $data = $dbix->query( $sql )->arrays; # $self->debug($data);
my $title = $self->constraint_title; # set in Role::DBIxSimple
return ($data, $title);
}
#-------------------------------------------------------------------------------
sub get_param_monitoring_data {
my ($self, $args) = @_; # hashref of patient_id, lab_section & test name
my @query = (
section_name => $args->{lab_section},
patient_id => $args->{patient_id},
test_name => $args->{test_name},
);
my @rels = qw(
lab_section
request.patient_case
request.request_lab_tests_status.lab_test
);
my @args = (
query => \@query,
require_objects => \@rels,
sort_by => 'request.id',
);
my $data = LIMS::DB::RequestResultSummary::Manager
->get_request_result_summaries(@args);
my @results = map {
{
result => $_->results_summary,
date => $_->request->created_at->ymd,
}
} @$data; # warn Dumper \@results;
return \@results;
}
1;