package LIMS::Controller::Local::Worklist::Histology; use base 'LIMS::Base'; use Moose; with ( 'LIMS::Controller::Roles::Misc', 'LIMS::Controller::Roles::User', 'LIMS::Controller::Roles::DataMap', ); __PACKAGE__->meta->make_immutable(inline_constructor => 0); use Data::Dumper; # ------------------------------------------------------------------------------ sub processing : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); my $errs = shift; # $self->stash( errs => $errs ); # name of test for this worklist: my $test_name = 'cut_up'; # NB: following methods return val already validated in an upstream method: my $lab_test = $self->get_lab_test_for_unique_test_name($test_name); # all work done in shared method: do { $self->_format_lab_test_data($lab_test) }; # don't need rtn val $self->js_validation_profile('histology_processing'); my $tmpl = 'worklist/local/histology/'.$self->get_current_runmode.'.tt'; return $self->tt_process($tmpl, $errs); } # ------------------------------------------------------------------------------ sub staining : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); my $errs = shift; # $self->stash( errs => $errs ); # name of test for this worklist: my $test_name = 'haematoxylin_eosin'; # NB: following methods return val already validated in an upstream method: my $lab_test = $self->get_lab_test_for_unique_test_name($test_name); # all work done in shared method: do { $self->_format_lab_test_data($lab_test) }; # don't need rtn val $self->js_validation_profile('histology_staining'); my $tmpl = 'worklist/local/histology/'.$self->get_current_runmode.'.tt'; return $self->tt_process($tmpl, $errs); } # ------------------------------------------------------------------------------ sub blocks_data_update : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); unless ( $self->csrf_check_token ) { return $self->tt_process('site/csrf_error.tt'); } my @request_ids = $self->query->param('request_id'); # warn Dumper \@request_ids; my $reference = $self->query->param('reference'); # warn $reference; unless ( @request_ids && $reference ) { $self->flash( error => $self->messages('worklist')->{no_ref_supplied} ) unless $reference; $self->flash( error => $self->messages('worklist')->{no_request_ids} ) unless @request_ids; return $self->redirect( $self->query->url . '/local_worklist?function_name=histology_blocks' ); } my %data = ( request_ids => \@request_ids, reference => $reference, ); my $rtn = $self->model('Local')->update_histology_blocks(\%data); if ($rtn) { return $self->error($rtn); } else { my $data = $self->model('Request')->get_requests(\@request_ids); $self->tt_params( updates => $data ); # warn Dumper $data; return $self->tt_process('worklist/local/histology/block_ref.tt'); } } # ------------------------------------------------------------------------------ sub immunochemistry : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); my $errs = shift; # $self->stash( errs => $errs ); # capture lab_test.id - param 'id' captured in _format_lab_test_data(): my $lab_test_id = $self->param('Id') || return $self->error( "no 'lab-test id' passed to " . $self->get_current_runmode ); my $lab_test = $self->model('LabTest')->get_lab_test($lab_test_id); $self->tt_params( lab_test_name => $lab_test->field_label ); # all work done in shared method: do { $self->_format_lab_test_data($lab_test) }; # don't need rtn val $self->js_validation_profile('histology_immunochemistry'); my $tmpl = 'worklist/local/histology/'.$self->get_current_runmode.'.tt'; return $self->tt_process($tmpl, $errs); } # ------------------------------------------------------------------------------ sub processing_update : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); # get linked tests if configured: if ( my $yaml = $self->get_yaml_file('worklist_cfg') ) { # warn Dumper $yaml; if ( my $data = $yaml->{cut_up_and_processing} ) { # warn Dumper $cfg; $self->stash( linked_tests => $data ); } } return $self->_do_update('processing'); } # ------------------------------------------------------------------------------ sub immunochemistry_update : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); return $self->_do_update('immunochemistry','immunohistochemistry'); } # ------------------------------------------------------------------------------ sub staining_update : Runmode { my $self = shift; $self->_debug_path($self->get_current_runmode); return $self->_do_update('staining'); } # ------------------------------------------------------------------------------ sub _format_lab_test_data { my ($self, $lab_test) = @_; $self->_debug_path(); # capture request.id: my $id = $self->param('id') || return $self->error( "no 'id' passed to " . $self->get_current_runmode ); { # patient data: my $request_data = $self->model('Request')->get_patient_and_request_data($id); $self->tt_params( request_data => $request_data ); } { # request specimen data: my $specimen_data = $self->model('Specimen')->get_request_specimens($id); my @specimens = map { $_->specimen->sample_code } @$specimen_data; $self->tt_params( specimens => \@specimens ); } { # request_lab_test_history data: my %args = ( request_ids => [$id], # requires arrayref field_label => $lab_test->field_label, # history table uses field label ); my $lab_test_status # returns hashref of { $id => { status => 1 } } = $self->lab_test_status_for_field_label_map(\%args)->{$id}; # warn Dumper $lab_test_status_map; $self->tt_params( lab_test_status => $lab_test_status ); } { # get test results for lab_test: my %args = ( request_id => $id, lab_section_id => $lab_test->lab_section_id, ); # warn Dumper \%args; my $results = $self->get_lab_test_results_for_lab_section(\%args); if ($results) { # hashref of { $id => { field_name => val } }, or 0 $self->tt_params( results => $results->{$id} ); } } { # lab users: my $user_list = $self->get_lab_staff_users; $self->tt_params( user_list => $user_list ); } # params for hidden fields in tmpl to save downstream lookup: $self->tt_params( lab_section_id => $lab_test->lab_section_id, lab_test_id => $lab_test->id, ); } # ------------------------------------------------------------------------------ sub _do_update { my $self = shift; $self->_debug_path(); my $type = shift; # eg processing, staining, etc my $function_name = shift; # optional var for redirect # capture request.id: my $id = $self->param('id') || return $self->error( "no 'id' passed to " . $self->get_current_runmode ); my $profile_name = 'histology_'.$type; my $dfv = $self->check_rm( $type, $self->validate($profile_name) ) || return $self->dfv_error_page; my $data = $dfv->valid; $data->{request_id} = $id; # add param('id') # any linked tests from yaml: if ( my $linked_tests = $self->stash->{linked_tests} ) { $data->{linked_tests} = $linked_tests; } my $rtn = $self->model('Local')->update_histology_data($data); if ($rtn) { return $self->error($rtn); } else { $self->flash( info => $self->messages('action')->{edit_success} ); $function_name ||= $profile_name; # if not already supplied return $self->redirect( $self->query->url . '/local_worklist?function_name='.$function_name ); } } 1;