RSS Git Download  Clone
Raw Blame History
package LIMS::Controller::Storage;

use Moose;
use Net::Telnet;

# if using 'extends', need to run at compile time to load attribute handlers
# from parent class otherwise StartRunmode, Runmode, etc fails - hack around AutoRunmode
BEGIN { extends 'LIMS::Base'; }
with (
	'LIMS::Controller::Roles::RecordHandler',
);

__PACKAGE__->meta->make_immutable(inline_constructor => 0);

use Data::Dumper;

# ------------------------------------------------------------------------------
# default() should never be called direct - redirect to start page:
sub default : StartRunmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    return $self->redirect( $self->query->url );
}

# ------------------------------------------------------------------------------
sub load : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    my $errs = shift;
    
    my $request_id = $self->param('id')
    || return $self->error('no id passed to ' . $self->get_current_runmode);

	# get request data:
    my $request_data = $self->model('Request')->get_single_request($request_id);
	# get existing storage data:
	my $storage      = $self->model('Storage')->get_request_storage($request_id);
	# get list of existing samples in storage
	my %specimens 	 = map { $_->specimen->sample_code => 1 } @$storage;
	# get specimen map for request:
    my $specimen_map = $self->specimen_map([ $request_id ]); # warn Dumper $specimen_map;    
	
    $self->tt_params(
        request_data => $request_data,
        specimen_map => $specimen_map,
		specimens    => \%specimens,
		storage      => $storage,
    );
	return $self->render_view($self->tt_template_name);    
}

# ------------------------------------------------------------------------------
sub input : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    my $errs = shift;
    
    my $request_id = $self->param('id')
    || return $self->error('no id passed to ' . $self->get_current_runmode);

    my $params = $self->query->Vars; warn Dumper $params;
    $params->{request_id} = $request_id;
	
	my $rtn = $self->model('Storage')->input_storage($params);
	
    # insert flash message
    return $self->redirect( $self->query->url . '/storage/=/' . $request_id );
}

# ------------------------------------------------------------------------------
sub output : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    my $errs = shift;
    
    my $request_id = $self->param('id')
    || return $self->error('no id passed to ' . $self->get_current_runmode);

    my %params = $self->query->Vars; warn Dumper \%params;    

    # insert flash message
    return $self->redirect( $self->query->url . '/storage/=/' . $request_id );
}

# ------------------------------------------------------------------------------
sub read_xtr_96 : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
	
	my $cfg = $self->cfg('settings'); # warn Dumper $cfg->{xtr_96_addr};	

	if ( $self->query->param('scan') ) {	
		my ($host, $port) = split ':', $cfg->{xtr_96_addr}; # warn Dumper [$host, $port];
		return $self->error('require host & port') unless ($host && $port);

		my @args = (
			Timeout 	=> 15, 
			Errmode		=> 'return', # don't die (default)
#			Input_Log 	=> './xtr-96.log', # uncomment to debug	
		);		
		my $t = Net::Telnet->new(@args);

		my @host = ( Host => $host, Port => $port );
		unless ( $t->open(@host) ) { # returns 1 on success, 0 on failure:
			$self->flash( error => $t->errmsg ); # failure msg in errmsg()
			return $self->redirect( $self->query->url . '/storage/read_xtr_96' );
		}
		$t->cmd('get'); # return val is undef (shouldn't be)
		my $ref = $t->buffer; # warn Dumper [$ref, $t->errmsg];
		$t->close;
		
		{
			my %data = ( ${$ref} =~ /^([A-H][0-9]{2})\,\s?(.+?)$/mg ); # _get_data($ref);
			$self->tt_params( data => \%data );
			# store in session for retrieval after 'import':
			$self->session->param( xtr_96_data => \%data );
		}
		{
			my ($rack_id) = ${$ref} =~ /Rack Identifier = ([A-Z0-9]+)/;
			$self->tt_params( rack_id => $rack_id );
		}
	}
	elsif ( $self->query->param('import') ) {
		my $data = $self->session->dataref->{xtr_96_data}; # warn Dumper $data;
		return $self->dump_html; # move to own sub - get request info from vial posn
	}
	return $self->tt_process();
}

1;

#===============================================================================
sub _get_data { # dummy data to spare plate reader ...
	my %data = (
          'D04' => 'FC12803113',
          'H06' => 'FC12803280',
          'F06' => 'FC12803202',
          'F04' => 'FC12801012',
          'B01' => 'FC12800770',
          'C11' => 'FC12803515',
          'E06' => 'FC12800872',
          'G03' => 'FC12803499',
          'F07' => 'FC12803399',
          'F01' => 'FC12803170',
          'B03' => 'FC12803391',
          'B02' => 'FC12800850',
          'B07' => 'FC12800740',
          'D05' => 'FC12801010',
          'F05' => 'FC12803423',
          'A02' => 'FC12803415',
          'D02' => 'FC12801029',
          'B05' => 'FC12801091',
          'G04' => 'FC12800842',
          'G01' => 'FC12800965',
          'H02' => 'FC12803407',
          'D03' => 'FC12803487',
          'B06' => 'FC12803151',
          'C06' => 'FC12803135',
          'H03' => 'FC12800929',
          'D01' => 'FC12803208',
          'C01' => 'FC12800680',
          'B10' => 'FC12803459',
          'F09' => 'FC12803372',
          'H04' => 'FC12801106',
          'G11' => 'FC12803243',
          'C12' => 'FC12800934',
          'A05' => 'FC12803203',
          'E08' => 'FC12800953',
          'C03' => 'FC12803288',
          'C05' => 'FC12803099',
          'A09' => 'FC12800671',
          'C07' => 'FC12803405',
          'F08' => 'FC12803511',
          'B11' => 'FC12800993',
          'H12' => 'FC12800871',
          'A01' => 'FC12800704',
          'D11' => 'FC12801040',
          'A10' => 'FC12801037',
          'D10' => 'FC12803246',
          'H09' => 'FC12803219',
          'A06' => 'FC12801061',
          'D09' => 'FC12803385',
          'H05' => 'FC12800678',
          'A11' => 'FC12803392',
          'H11' => 'FC12800771',
          'E07' => 'FC12803480',
          'B08' => 'FC12803131',
          'D08' => 'FC12803072',
          'E11' => 'FC12803140',
          'G02' => 'FC12800958',
          'H01' => 'FC12800972',
          'A04' => 'FC12800686',
          'A07' => 'FC12800705',
          'A08' => 'FC12803350',
          'C10' => 'FC12800648',
          'G06' => 'FC12801079',
          'C09' => 'FC12801027',
          'F03' => 'FC12800737',
          'F10' => 'FC12803476',
          'G09' => 'FC12800873',
          'F02' => 'FC12803365',
          'E03' => 'FC12801120',
          'B04' => 'FC12803458',
          'E12' => 'FC12800948',
          'G08' => 'FC12803293',
          'H08' => 'FC12803401',
          'C04' => 'FC12800955',
          'H07' => 'FC12803196',
          'E01' => 'No Tube',
          'G05' => 'FC12803207',
          'E05' => 'FC12800774',
          'B09' => 'FC12800987',
          'C02' => 'FC12803386',
          'D06' => 'FC12800753',
          'D07' => 'FC12800724',
          'E04' => 'FC12800857',
          'E02' => 'FC12803185',
          'E10' => 'FC12800805',
          'H10' => 'FC12801055',
          'G12' => 'FC12803439',
          'B12' => 'FC12800957',
          'E09' => 'FC12803403',
          'A03' => 'FC12803358',
          'D12' => 'FC12803394',
          'F11' => 'FC12803502',
          'F12' => 'FC12800783',
          'A12' => 'FC12800868',
          'G07' => 'FC12800693',
          'G10' => 'FC12800964',
          'C08' => 'FC12800777',
		); # warn Dumper \%data;
	return \%data;
}