#!/usr/bin/env perl
# updates ODS data files, downloads from cfh_downloads location, extracts to
# temp location & moves files to data files dir. Inactivates retired GP's.
# -t flag for outputting intent only (doesn't update db table)
use strict;
use warnings;
use feature 'say';
#-------------------------------------------------------------------------------
my $tbl = 'hilis4.referrers'; # 'lims_test.referrers'
#-------------------------------------------------------------------------------
use lib (
'/home/raj/perl5/lib/perl5',
'/home/raj/apps/HILIS4/lib',
);
use IO::All;
use Text::CSV;
use Path::Tiny;
use File::Copy;
use Getopt::Std;
use Config::Tiny;
use Data::Printer;
use File::Basename;
use LWP::UserAgent;
use Archive::Extract;
use FindBin qw($Bin);
use Digest::MD5 qw(md5_hex);
use LIMS::Local::ScriptHelpers;
getopts('t'); # testing
our($opt_t); # warn $opt_t; exit;
my $JUST_TESTING = $opt_t || 0; # outputs update intent, doesn't do it
my $tools = LIMS::Local::ScriptHelpers->new();
my $dbix = $tools->dbix(); # for GP updates
# define paths & filenames:
my $app_dir = path($tools->path_to_app_root)->realpath;
my $data_dir = $app_dir . '/src/data';
my $temp_dir = $data_dir . '/tmp_files';
my $script = $tools->script_filename;
# filename for temp file:
my $temp_zip_file = $temp_dir . '/temp.zip';
my $cfg = Config::Tiny->read($app_dir . '/config/settings/global.txt'); # p $cfg; exit;
my $url = $cfg->{_}->{cfh_downloads}; # p $url;
my $ua = LWP::UserAgent->new;
my @files = map $_->filename,
grep $_->filename =~ /\.csv$/, io($data_dir)->all_files; # p @files;
my $response;
#=begin # to just update GP's
FILE:
for my $file (@files) {
# skip local data files which don't exist on remote site:
next FILE if grep $file =~ /^$_/, qw(default specialities);
# only need to capture filename part (normally filename, path, suffix):
my $filename = fileparse($file, '.csv'); # p $filename; next FILE;
my $old_csv_file = "$data_dir/${filename}.csv"; # p $old_csv_file;
my $new_csv_file = "$temp_dir/${filename}.csv"; # p $new_csv_file;
my $ods_file = sprintf '%s/%s.zip', $url, $filename; # p $ods_file; # next;
$ods_file =~ s/niorg/NIORG/; # typical ODS stupidity !!
# download file to temp dir:
eval { # get the file or give up after 15secs:
local $SIG{ALRM} = sub {
die 'LWP::UserAgent timeout' . "\n"; # NB \n required
};
alarm 15;
$response = $ua->get( $ods_file, ':content_file' => $temp_zip_file );
alarm 0;
};
$response->is_success
or error($filename, $response->status_line) and next FILE;
# extract file:
my $archive = Archive::Extract->new(archive => $temp_zip_file);
$archive->extract(to => $temp_dir)
or error($filename, $archive->error) and next FILE;
# backup old data file if checksums differ & move new one into place:
my $md5_old_file = md5_hex( io($old_csv_file)->all ); # p $md5_old_file;
my $md5_new_file = md5_hex( io($new_csv_file)->all ); # p $md5_new_file;
if ( $md5_old_file ne $md5_new_file ) { # p $filename; warn 'here';
( my $backup_filename = $old_csv_file ) =~ s/csv$/old/;
io($old_csv_file)->rename($backup_filename);
}
move( $new_csv_file, $old_csv_file ) or error($filename, $!);
# so data file mtime never >1 month:
( my $timestamp = $tools->time_now ) =~ s/T/ /;
system('/usr/bin/touch', "-d $timestamp", $old_csv_file); # old is now new
}
#=cut
# inactivate retired/closed GP's:
{
my $src_file = $data_dir . '/egpcur.csv';
my $io = new IO::File;
open( $io, '<', $src_file ) || die $!;
my $opt = { binary => 1 }; # recommended to set true
my $csv = Text::CSV->new($opt); # p $csv; exit;
my $total = my $updated = 0;
while ( my $ref = $csv->getline($io) ) { # p $ref; # aref
my ($code, $status) = map $ref->[$_], (0, 12); # p $code; p $status;
next if $status eq 'A'; # active, B = retired, C = closed (?), P = proposed
$total++;
# do we have an active referrer matching national_code?
$dbix->select($tbl, 1,
{ national_code => $code, active => 'yes' } )->list || next;
$updated++;
if ($JUST_TESTING) {
say "will set $code to inactive ($status)";
# say qq!"$code",! if $status eq 'B'; # for sql query IN (...)
}
else {
$dbix->update($tbl, { active => 'no' }, { national_code => $code });
say "$script updated $code status to inactive ($status)";
}
}
say "inactivated $updated HILIS referrer table GPs of total $total "
. 'inactive national GPs' if $JUST_TESTING;
}
sub error { warn join ': ', @_ }