package LIMS::Controller::Admin::Lab::Test::Linked; use base 'LIMS::Base'; use LIMS::Local::Sugar; use Data::Dumper; use Moose; with 'LIMS::Controller::Roles::DataMap'; __PACKAGE__->meta->make_immutable(inline_constructor => 0); __PACKAGE__->authz->authz_runmodes( ':all' => 'do_admin' ); startmode default ($errs) { $self->_debug_path($self->get_current_runmode); my $vars = $self->query->Vars; # warn Dumper $vars; $self->tt_params( vars => $vars ); { # get lab sections: my $sections = $self->model('LabSection')->get_lab_sections(); $self->tt_params( sections => $sections ); } { # get current linked lab-tests: my @joins = ( 'parent_lab_test.lab_section', 'linked_lab_test.lab_section', ); my $args = { sort_by => 'parent_lab_test.field_label' }; my @args = ( 'LinkedLabTest', $args, \@joins ); my $linked_tests = $self->model('Base')->get_objects(@args); $self->tt_params( all_linked_tests => $linked_tests ); # warn Dumper $linked_tests; { # hashmap of existing parent -> linked test entries: my %map = (); # map +($_->parent_test_id => 1), @$linked_tests; push @{ $map{$_->parent_test_id} }, $_->linked_test_id for @$linked_tests; # warn Dumper \%map; $self->stash( linked_tests_map => \%map ); # for all lab-tests & sections block $self->tt_params( linked_tests_map => \%map ); } } # get lab tests for selected section if submitted: if ( my $lab_section_id = $vars->{lab_section_id} ) { my %args = ( lab_section_id => $lab_section_id ); my $lab_tests = $self->model('LabTest')->get_section_lab_tests(\%args); $self->tt_params( parent_tests => $lab_tests ); } # get all lab tests if parent_lab_test submitted: if ( my $parent_test_id = $vars->{parent_test_id} ) { # get all lab tests & sections: my $tests = $self->model('LabTest')->get_all_active_lab_tests; # iterator my $linked_test_ids = $self->stash->{linked_tests_map}->{$parent_test_id}; my %lab_tests; # warn Dumper $linked_test_ids; while ( my $test = $tests->next ) { # DEBUG $test->lab_section->section_name; my $lab_section = $test->lab_section->section_name; my $test_data = $test->as_tree; # if the test.id matches a linked_test_id, set field to 'selected' for template: if ( grep { $test->id == $_ } @$linked_test_ids ) { $test_data->{selected} = 1; } push @{ $lab_tests{ $lab_section } }, $test_data; } $self->tt_params( lab_tests => \%lab_tests ); # warn Dumper \%lab_tests; } =begin # getting all lab-tests now - don't need this section if ( my $linked_lab_section_id = $vars->{linked_lab_section_id} ) { my $linked_lab_section_tests; # get tests for section if different: if ( $linked_lab_section_id == $vars->{lab_section_id} ) { # same section $linked_lab_section_tests = $self->stash->{parent_lab_tests}; } else { # get tests for different section my %args = ( lab_section_id => $linked_lab_section_id ); $linked_lab_section_tests = $self->model('LabTest')->get_section_lab_tests(\%args); } $self->tt_params( linked_lab_section_tests => $linked_lab_section_tests ); } =cut return $self->tt_process; } runmode do_link { $self->_debug_path($self->get_current_runmode); my $parent_lab_test_id = $self->param('id') || return $self->error('no id passed to ' . $self->get_current_runmode); my @linked_lab_test_id = $self->query->param('test_id'); # can be list or empty my %data = ( parent_test_id => $parent_lab_test_id, linked_test_id => \@linked_lab_test_id, ); # warn Dumper \%data; my $rtn = $self->model('LabTest')->update_linked_lab_tests(\%data); if ($rtn) { return $self->error($rtn); } else { $self->flash( info => $self->messages('action')->{create_success} ); return $self->redirect( $self->query->url . '/admin/lab_test_linked' ); # safer to redirect after db edit } } 1;