package LIMS::Model::Roles::ScreenUpdate;
use Moose::Role;
has status_option_new => (
is => 'ro',
isa => 'LIMS::DB::LabTestStatusOption',
lazy_build => 1,
);
use Data::Dumper;
#-------------------------------------------------------------------------------
# creates new lab_tests according to ScreenLabTest data for this screen_id
# doesn't overwrite existing tests
sub do_lab_tests {
my $self = shift;
my $data = shift;
my %args = (
query => [ screen_id => $data->{screen_id} ],
);
my $lab_tests
= LIMS::DB::ScreenLabTest::Manager->get_screen_lab_tests(%args);
foreach my $t (@$lab_tests) {
$data->{lab_test_id} = $t->lab_test_id;
$self->do_new_lab_test($data);
}
}
#-------------------------------------------------------------------------------
sub do_new_lab_test { # shared by M::Request::new_request()
my $self = shift;
my $data = shift; # requires lab_test_id && user_id
my $status_option = $self->status_option_new;
LIMS::DB::RequestLabTestStatus->new(
user_id => $self->user_profile->{id},
lab_test_id => $data->{lab_test_id},
request_id => $data->{_request_id},
status_option_id => $status_option->id,
)->load_or_insert; # in case test already requested manually
}
#-------------------------------------------------------------------------------
sub do_lab_test_details {
my $self = shift;
my $data = shift;
my %args = (
query => [ screen_id => $data->{screen_id} ],
);
my $lab_test_details
= LIMS::DB::ScreenLabTestDetail::Manager->get_screen_lab_test_details(%args);
foreach my $detail (@$lab_test_details) { # should only be 0 or 1:
LIMS::DB::RequestLabSectionNote->new(
details => $detail->test_details,
request_id => $data->{_request_id},
lab_section_id => $detail->lab_section_id,
)->load_or_insert; # in case test_detail already exists
}
}
#-------------------------------------------------------------------------------
sub additional_options {
my ($self, $action) = @_; # warn Dumper $action;
my $data = $self->form_data; # warn Dumper $data;
my $cfg = $data->{additional_options_config}->{$action} || return 0;
# get 'screened_as' description:
my $presentation = LIMS::DB::Screen->new(id => $data->{screen_id})->load;
my $screened_as = $presentation->description; # warn $screened_as;
# cycle through options to see if screened_as term triggers option flag:
while ( my($option, $d) = each %$cfg ) { # warn Dumper [$option, $d];
# check option (eg DoI) exists and is active:
my $o = LIMS::DB::AdditionalOption->new(option_name => $option)
->load(speculative => 1); # warn Dumper $o->as_tree;
return 0 unless $o && $o->is_active eq 'yes';
# set option flag if screened_as term matches one of list:
if ( grep lc($screened_as) eq lc($_), @$d ) {
my %data = (
request_id => $data->{_request_id},
option_id => $o->id,
); # warn Dumper \%data;
LIMS::DB::RequestOption->new(%data)->load_or_insert;
}
}
}
#-------------------------------------------------------------------------------
sub _build_status_option_new {
my $self = shift;
my $status_option
= LIMS::DB::LabTestStatusOption->new(description => 'new')->load;
return $status_option;
}
1;