# allocates rack_id, vial_location & signed_out values from source file
use Getopt::Std;
getopts('qt'); # output sql query
our($opt_q,$opt_t); # warn $opt_q; exit;
use lib '/home/raj/perl-lib';
use Data::Printer use_prototypes => 0;
use Spreadsheet::Read;
use Modern::Perl;
use Local::DB;
$ENV{SQL_TRACE} = $opt_q; # warn $ENV{SQL_TRACE}; switch on query trace
#==============================================================================
my $JUST_TESTING = $opt_t;
my $src_file = './MaPLe Plasma Plate layout 1-6.xlsx';
#==============================================================================
my $dbix = Local::DB->dbix({ dbname => 'hilis4' });
my $system_user_id = $dbix->select('users', 'id',
{ username => 'hmds-lth'})->value; # p $system_user_id;
my $signed_out = '2017-07-05 16:00:00'; # approx sign-out time
my $xls = ReadData($src_file); # p $xls;
my %RACKS; # to hold plate_id => storage_racks.id
my $i = 0;
process_sheet($_) for 1 .. 6;
sub process_sheet {
my $sheet_num = shift; # starts at #1
my $sheet = $xls->[$sheet_num]; # p $sheet;
# rows() not exported so call as fully qualified method:
my @rows = Spreadsheet::Read::rows($sheet); # p @rows; # AoA
my $headers = shift @rows; # p $headers; exit;
ROW:
for my $row (@rows) { # arrayref
my $data = _to_hash($row, $headers); # p $data; next;
my $plateId = $data->{plateId};
my $labnum = $data->{Lab_number};
my $vialId = $data->{vialId};
my $well = $data->{Well};
{ # check vialId belongs to labnum:
my ($request_num, $yr) = split '/', $labnum; # p [$request_num, $yr];
my %h = ( request_number => $request_num, year => $yr + 2000 );
my $req_id = $dbix->select('requests', 'id', \%h)->value; # p $req_id;
warn "cannot find request id for $labnum" unless $req_id;
my $rack_id = _get_rack_id($plateId)
or warn "cannot get rack ID for $plateId";
my %data = (
vial_location => $well,
signed_out => $signed_out,
rack_id => $rack_id,
);
my $result = $dbix->update('request_storage', \%data,
{ request_id => $req_id, vialId => $vialId });
if ($result->rows) { # p [$request_num, $yr];
# set plate inactive (will do multiple identical updates unless use hash):
$dbix->update('storage_racks',
{ is_active => 'no' }, { id => $rack_id });
# update request_lab_test_history:
my @actions = (
"vialId $vialId scanned to plate",
"scanned out vialId $vialId",
);
$dbix->insert('request_lab_test_history', {
action => $_,
user_id => $system_user_id,
request_id => $req_id
}) for @actions;
$i += $result->rows;
}
else {
warn "cannot update $vialId";
}
}
}
}
warn "updated $i records";
sub _get_rack_id {
my $plate_id = shift;
# return if already seen:
return $RACKS{$plate_id} if $RACKS{$plate_id};
my $table = 'storage_racks';
my %h = ( plateId => $plate_id );
# return if not already seen but in storage_racks:
if ( my $id = $dbix->select($table, 'id', \%h)->value ) {
$RACKS{$plate_id} = $id;
return $id;
}
# create new row & return:
$dbix->insert($table, \%h);
my $last_insert_id = $dbix->query('select max(id) from '.$table)->value;
$RACKS{$plate_id} = $last_insert_id;
return $last_insert_id;
}
sub _to_hash {
my ($ref, $headers) = @_; # p $ref; # arrayref
my %h;
my $i = 0;
for (@$headers) { # p $_;
$h{$_} = $ref->[$i++];
} # p %h;
return \%h;
}