package LIMS::Model::Outreach;
use Moose;
with (
'LIMS::Model::Roles::DBIxSimple',
);
extends 'LIMS::Model::Base';
use namespace::clean -except => 'meta';
__PACKAGE__->meta->make_immutable;
use Data::Dumper;
sub get_all_data {
my ($self, $args) = @_; # warn $request_id;
my $request_id = $args->{request_id};
my $patient_id = $args->{patient_id}; # warn Dumper $patient_id;
my $dbix = $self->lims_dbix;
my %data = ();
{ # first get list of all departments, lab_tests, defaults & ranges:
my $sql = $self->sql_lib->retr('outreach_lab_params');
my $query = $dbix->query($sql);
# get list of cols from defaults_and_ranges table:
my $meta = $self->get_meta('outreach.defaults_and_ranges'); # warn Dumper $meta;
my @cols = grep {
$meta->{$_}->{key} ne 'PRI' # skip primary key
} keys %$meta; # warn Dumper \@cols;
while ( my $vars = $query->hash ) {
my $param = $vars->{param_name};
my $dept = $vars->{description};
my %params = (
field_label => $vars->{field_label},
field_type => $vars->{field_type},
result => undef, # initialise placeholder
);
$data{$dept}{$param} = \%params;
# add any (optional) default & ranges cols:
map {
$data{$dept}{$param}{$_} = $vars->{$_};
} grep $vars->{$_}, @cols;
}
}
{ # add lab_test results:
my $sql = $self->sql_lib->retr('outreach_lab_results');
my $query = $dbix->query($sql, $request_id);
while ( my $vals = $query->hash ) {
my $result = $vals->{result};
my $param = $vals->{param_name};
my $dept = $vals->{description};
$data{$dept}{$param}{result} = $result;
}
}
{ # add demographics data:
my $sql = $self->sql_lib->retr('outreach_patient_demographics');
my $demographics = $dbix->query($sql, $request_id)->hash;
$data{demographics} = $demographics;
}
{ # questionnaire details:
my $sql = $self->sql_lib->retr('outreach_patient_questionnaire');
my $data = $dbix->query($sql, $request_id)->hash;
$data{questionnaire} = $data;
}
{ # patient notes:
my $sql = $self->sql_lib->retr('outreach_patient_notes');
my $data = $dbix->query($sql, $patient_id)->list;
$data{demographics}{patient_notes} = $data;
}
# get GP's for practice:
if ( my $practice_id = $data{demographics}{practice_id} ) {
my $GPs = $self->_get_practitioners($practice_id);
$data{demographics}{practitioners} = $GPs;
}
{ # get unknown practitioner id:
my $o = LIMS::DB::ReferralType->new(description => 'practitioner')->load;
my $ref
= LIMS::DB::Referrer->new(national_code => $o->default_unknown)->load;
$data{demographics}{unknown_gp_id} = $ref->id;
}
{ # non-participating practices:
my $sql = 'select practice_id, 1 from outreach.non_participant_practice';
my $ids = $dbix->query($sql)->map;
$data{demographics}{non_participant_practices} = $ids;
}
{ # get menu options:
my $sql = $self->sql_lib->retr('outreach_menu_options');
my $query = $dbix->query($sql);
my %opts;
while ( my $vars = $query->array ) {
my ($param_name, $detail) = @$vars;
push @{ $opts{$param_name} }, $detail;
}
$data{menu_options} = \%opts;
}
return \%data;
}
sub get_diagnosis_ids {
my $self = shift;
my $dbix = $self->lims_dbix;
my $ids = $dbix->query('select diagnosis_id from outreach.diagnoses')->flat;
return $ids;
}
sub _get_practitioners { # from M::Referrer::get_referrers_by_source_id
my ($self, $source_id) = @_;
my @args = (
query => [ 'referral_sources.id' => $source_id ],
require_objects => [
'referrer',
'parent_organisation.referral_source'
],
);
# use ReferrerDepartment - easier to retrieve data from object:
my $referrers = LIMS::DB::ReferrerDepartment::Manager
->get_referrer_department(@args);
my @data = map { # warn Dumper $_->as_tree;
[ $_->referrer->id, $_->referrer->name ];
} sort { $a->referrer->name cmp $b->referrer->name } @$referrers;
return \@data;
}
1;