#!/usr/bin/perl =begin ------------------------------------------------------------------------- compiles list of number of cases registered vs frequency of error code A, by user =cut --------------------------------------------------------------------------- use strict; use warnings; my $JUST_TESTING = 0; # emails just raj ####################################### my @recipients = qw(douglas raj); # my $duration = 2; # months # ####################################### BEGIN { use FindBin qw($Bin); # warn $Bin; use lib ( "$Bin/../../../lib", '/home/raj/perl5/lib/perl5', ); } use IO::All; use Data::Dumper; use DateTime::Format::MySQL; use LIMS::Local::ScriptHelpers; my $cfg_file = "$Bin/../lib/settings.cfg"; my $settings = Config::Auto::parse($cfg_file); # warn Dumper $settings; my $tools = LIMS::Local::ScriptHelpers->new(); $tools->test_only($JUST_TESTING); # get tools from LIMS::Local::ScriptHelpers: my $sql_lib = $tools->sql_lib(); my $config = $tools->config(); my $dbix = $tools->dbix(); # get date 1 month ago: my $ref_date = $tools->date_subtract(months => $duration); my $subject = sprintf 'HILIS register log & error codes [%s.%s]', $ref_date->month_name, $ref_date->year; # warn $subject; # template: my $tt_file = 'cron/register_and_error_log.tt'; # get register log for previous month: my $register_log = do { my $sql = $sql_lib->retr('register_log'); $dbix->query($sql, $ref_date->year, $ref_date->month)->hashes; }; # warn Dumper $register_log; # get request_id's with error code A or deletion for previous month: my $request_id = do { my $sql = $sql_lib->retr('error_code_A_requests'); $dbix->query($sql, $ref_date->year, $ref_date->month)->flat; }; # warn Dumper $request_id; # get map of registration users for requests { user_id => frequency } my $registration_user = do { my $sql = $sql_lib->retr('registration_user_map'); $dbix->query($sql, @$request_id)->map; }; # warn Dumper $registration_user; =begin # ditched - not accurate anymore as error code attached to request not history my $errCodeA_data = do { my $sql = $sql_lib->retr('error_code_A_data'); $sql =~ s/%PARAMS%/join ',',@$request_id/e; # placeholders already in use $dbix->query($sql, $ref_date->year, $ref_date->month)->hashes; }; # warn Dumper $errCodeA_data; # get userid => username map for HMDS users: my $user_map = do { my $sql = q!select u.id, u.username from users u join user_locations l on (u.user_location_id = l.id) where l.location_name = 'HMDS'!; $dbix->query($sql)->map; }; =cut # get breakdown of error code frequencies for month: my $error_codes = do { my $sql = $sql_lib->retr('error_codes'); $dbix->query($sql, $ref_date->year, $ref_date->month)->arrays; }; my @rows; { # write out register log data to rows: for my $user (@$register_log) { my $user_id = $user->{id}; # get frequency of error code A's for this user: my $err_freq = $registration_user->{$user_id}; my @data = ( uc $user->{username}, $user->{f}, # total number records registered by user $err_freq || 0, # no. of error code A / deleted records ); { # calculate % if $err_freq: my $err_percent = $err_freq ? ( sprintf "%.2f%%", 100 * $err_freq / $user->{f} ) : 0; push @data, $err_percent; } push @rows, \@data; } } my $message = do{ my %args = ( data => \@rows, errs => $error_codes ); $tools->process_template($tt_file, \%args); }; =begin # ditched - see above { # error details for each user: my %user_errors; for my $err (@$errCodeA_data) { my $user_id = $err->{user_id}; my $request_id = $err->{request_id}; my $action_user = $user_map->{$user_id}; # who made the change my $request = do { my $sql = q!select request_number, year, username from requests r join request_history rh on (rh.request_id = r.id) join users u on (rh.user_id = u.id) where action = 'registered' and rh.request_id = ?!; $dbix->query($sql, $request_id)->hash; }; my $registration_user = uc $request->{username}; my $data = sprintf 'H%s/%s %s %s', $request->{request_number}, $request->{year} - 2000, uc $action_user, $err->{action}; push @{ $user_errors{$registration_user} }, $data; } # warn Dumper \%user_errors; for my $user (sort keys %user_errors) { $message .= $user . "\n"; foreach ( @{ $user_errors{$user} } ) { $message .= " $_\n"; } $message .= "\n\n"; } # warn $message; } =cut if ($JUST_TESTING) { open my $fh, '>', "$Bin/register_and_error_log.html"; print $fh $message; } my %mail = ( content => 'html', config => $config, subject => $subject, message => $message, ); # warn Dumper \%mail; $tools->send_mail(\%mail, \@recipients);