package LIMS::Model::Storage;
use Moose;
extends 'LIMS::Model::Base';
use namespace::clean -except => 'meta';
__PACKAGE__->meta->make_immutable;
use Data::Dumper;
use LIMS::Local::Utils;
#-------------------------------------------------------------------------------
sub input_storage {
my ($self, $data) = @_; # warn Dumper $data;
{ # add specimen.id:
my $o = LIMS::DB::Specimen::Manager->get_specimens();
my %map = map { $_->sample_code => $_->id } @$o;
my $specimen = $data->{specimen};
$data->{specimen_id} = $map{$specimen};
} # warn Dumper $data;
my $vialID = $data->{vialId}; # 10 chars, or multiples of (input validated)
if ( length $vialID > 10 ) { # have multiple vials
my (@ids) = $vialID =~ /([A-Z]{2}\d{8})/g; # warn Dumper \@ids;
for my $vial_id(@ids) { # warn $vial_id;
my $c = LIMS::Local::Utils::clone($data);
$c->{vialId} = $vial_id; # warn Dumper $c;
my $rtn
= $self->update_object({ class => 'RequestStorage', data => $c });
return $rtn if $rtn; # only returns true on error
}
return 0;
}
else {
return $self->update_object({ class => 'RequestStorage', data => $data });
}
}
#-------------------------------------------------------------------------------
sub output_storage {
my ($self, $data) = @_; # warn Dumper $data;
my $request_id = $data->{request_id};
my $vial_id = $data->{vialId};
my $o = LIMS::DB::RequestStorage->new(vialId => $vial_id)->load_speculative
|| return { error => "vialId $vial_id does not exist" };
# first check vialId belongs to request_id:
unless ( $o->request_id eq $request_id ) {
return { error => "vialId $vial_id does not belong to this request" }
}
$o->signed_out(LIMS::Local::Utils::time_now);
$o->save(changes_only => 1);
return 'OK';
}
#-------------------------------------------------------------------------------
sub update_storage {
my ($self, $data) = @_; # warn Dumper $data;
my $rtn = do {
my %args = ( class => 'RequestStorage', data => $data );
$self->update_object(\%args); # doesn't do 'changes_only'
};
}
#-------------------------------------------------------------------------------
sub update_rack_id {
my ($self, $data) = @_; # warn Dumper $data;
my $i = LIMS::DB::RequestStorage::Manager->update_objects(
set => { rack_id => $data->{rack_id} },
where => [ vialId => $data->{vialId} ],
);
return $i; # number of rows updated
}
#-------------------------------------------------------------------------------
sub get_request_storage {
my ($self, $request_id) = @_;
my @args = (
query => [ request_id => $request_id ],
with_objects => 'specimen',
);
my $o = LIMS::DB::RequestStorage::Manager->get_objects(@args);
return $o;
}
#-------------------------------------------------------------------------------
sub get_storage_vial {
my ($self, $vial_id) = @_;
my $o = LIMS::DB::RequestStorage->new(vialId => $vial_id)->load;
return $o;
}
#-------------------------------------------------------------------------------
sub get_storage_rack {
my ($self, $plateId) = @_;
my $o = LIMS::DB::StorageRack->new( plateId => $plateId )->load_speculative;
return $o ? $o->as_tree : 0; # return hashref for use in session
}
#-------------------------------------------------------------------------------
sub new_storage_rack {
my ($self, $plateId) = @_;
# return id if exists, otherwise create new object first:
my $o = LIMS::DB::StorageRack->new( plateId => $plateId )->load_or_insert;
return $o->id;
}
#-------------------------------------------------------------------------------
sub get_rack_contents { # find rack contents by rack.id, or list of vialId's:
my ($self, $args) = @_;
my $query;
if ( my $rack_id = $args->{rack_id} ) {
$query = [ rack_id => $rack_id ];
}
elsif ( my $vial_ids = $args->{vial_ids} ) {
$query = [ vialId => $vial_ids ];
}
my @args = ( query => $query );
my $o = LIMS::DB::RequestStorage::Manager->get_objects(@args);
return $o;
}
1;