package LIMS::Model::LabSection;
use strict;
use base 'LIMS::Model::Base';
use Data::Dumper;
#-------------------------------------------------------------------------------
sub get_lab_section {
my $self = shift;
my $id = shift;
my $section = LIMS::DB::LabSection->new(id => $id)->load; # DEBUG $test;
return $section;
}
#-------------------------------------------------------------------------------
sub get_lab_section_by_name {
my $self = shift;
my $name = shift;
my $section = LIMS::DB::LabSection->new(section_name => $name)->load; # DEBUG $test;
return $section;
}
#-------------------------------------------------------------------------------
sub get_lab_sections {
my $self = shift;
my $params = shift || {};
$params->{sort_by} ||= 'section_name';
# get lab_section rows as arrayref:
my $data = LIMS::DB::LabSection::Manager->get_lab_sections(%$params); # $self->debug($data);
return $data;
}
#-------------------------------------------------------------------------------
sub get_lab_sections_with_test_results {
my $self = shift;
my $o = LIMS::DB::LabSection::Manager->get_lab_sections(
query => [ 'lab_tests.has_results' => 'yes' ],
require_objects => [ 'lab_tests' ],
distinct => 1,
);
}
#-------------------------------------------------------------------------------
sub get_section_status_options {
my ($self, $lab_section_id) = @_;
my %args = (
query => [ lab_section_id => $lab_section_id ],
require_objects => 'status_option',
sort_by => 'position',
);
my $status_options = LIMS::DB::LabSectionStatusOption::Manager
->get_lab_section_status_option(%args);
return $status_options;
}
#-------------------------------------------------------------------------------
sub get_section_sample_types {
my ($self, $lab_section_id) = @_;
my %args = ( query => [ lab_section_id => $lab_section_id ] );
my $o = LIMS::DB::LabSectionSampleType::Manager
->get_lab_section_sample_types(%args);
return $o;
}
#-------------------------------------------------------------------------------
sub get_labsection_remote_system_ids {
my ($self, $request_id) = @_; # DEBUG $section; return;
my %args = (
query => [ request_id => $request_id ],
require_objects => 'lab_section',
);
my $remote_system_ids = LIMS::DB::RequestLabSectionForeignID::Manager
->get_request_lab_section_foreign_ids(%args);
return $remote_system_ids;
}
#-------------------------------------------------------------------------------
sub update_section_status_options {
my $self = shift;
my $data = shift; # warn Dumper $data;
my $db = $self->lims_db; # ie LIMS::DB->new_or_cached;
my $option_data = $data->{option_data};
my $update = sub {
# first clear existing data:
LIMS::DB::LabSectionStatusOption::Manager->delete_lab_section_status_option(
where => [ lab_section_id => $data->{section_id} ],
);
if ( ref $option_data eq 'ARRAY' ) {
DATA: for my $d (@$option_data) { # warn Dumper $d;
next DATA unless defined $d; # empty entries submitted
my ($option_id, $position) = split /~~/, $d;
LIMS::DB::LabSectionStatusOption->new(
status_option_id => $option_id,
lab_section_id => $data->{section_id},
position => $position,
)->save;
}
}
elsif ($option_data) { # need to test in case it's a submit to clear
my ($option_id, $position) = split /~~/, $option_data;
LIMS::DB::LabSectionStatusOption->new(
status_option_id => $option_id,
lab_section_id => $data->{section_id},
position => $position,
)->save;
}
};
my $ok = $db->do_transaction($update);
# don't need return value unless error:
return $ok ? 0 : 'update_lab_section_status_options() error - ' . $db->error;
}
#-------------------------------------------------------------------------------
sub update_lab_sections {
my $self = shift;
my $data = shift; # warn Dumper $data; return 1;
my $db = $self->lims_db; # ie LIMS::DB->new_or_cached;
# get lab_section data from $data - will be same thing if sample_type_id not used:
my %lab_section_data = map {
$_ => $data->{$_};
} grep $_ ne 'sample_type_id', keys %$data; # warn Dumper \%lab_section_data;
my $update = sub {
my %args = ( class => 'LabSection', data => \%lab_section_data );
$self->update_object(\%args);
# sample_type_id data if configured:
if ( my $sample_type_id = $data->{sample_type_id} ) {
# $sample_type_id will be str if singular, or arrayref if multiple:
$sample_type_id = [ $sample_type_id ]
unless ref $sample_type_id eq 'ARRAY';
my $lab_section_id = $data->{_record_id}; # only if not new entry
if ($lab_section_id) { # not new lab_section so clear existing data:
LIMS::DB::LabSectionSampleType::Manager->delete_lab_section_sample_types(
where => [ lab_section_id => $lab_section_id ],
);
}
else { # get new lab_section id:
my $dbh = $self->lims_db->dbh;
$lab_section_id
= $dbh->last_insert_id(undef, undef, 'lab_sections', 'id');
}
my %data = ( lab_section_id => $lab_section_id );
map {
$data{sample_type_id} = $_;
LIMS::DB::LabSectionSampleType->new(%data)->save;
} @$sample_type_id;
}
};
my $ok = $db->do_transaction($update);
# don't need return value unless error:
return $ok ? 0 : 'update_lab_sections() error - ' . $db->error;
}
#-------------------------------------------------------------------------------
sub get_section_result_summaries {
my ($self, $request_id, $section_name) = @_; # $section_name optional
my @query = ( request_id => $request_id );
push @query, ( section_name => $section_name ) if $section_name;
my %args = (
query => \@query,
require_objects => ['lab_section', 'user'],
);
my $result_summaries = LIMS::DB::RequestResultSummary::Manager
->get_request_result_summaries(%args);
return $result_summaries;
}
1;