package LIMS::Model::PrintRun; use Moose; extends 'LIMS::Model::Base'; with 'LIMS::Model::Roles::Query'; use namespace::clean -except => 'meta'; __PACKAGE__->meta->make_immutable; use Data::Dumper; use LIMS::Local::Utils; #------------------------------------------------------------------------------- sub get_print_run_size { my ($self, $h) = @_; # warn Dumper $h; # hashref of start & end datetimes + optional cfg # just forward to get_print_run_request_ids and return count: my $ids = $self->get_print_run_request_ids($h); my $i = scalar @$ids; # warn $i; return $i; } #------------------------------------------------------------------------------- sub get_print_run_request_ids { my ($self, $h) = @_; # warn Dumper $h; # hashref of start & end datetimes + optional cfg my ($start_date, $end_date) = @{$h}{ qw(start_date end_date) }; my %print_run_args = ( start => $start_date, type => 'non-trial', end => $end_date, ); if ( defined $h->{offset} ) { # can be zero $print_run_args{$_} = $h->{$_} for qw(offset limit); } my ($sql, @bind) = $self->get_query_params(\%print_run_args); # warn $sql; warn Dumper \@bind; exit; my $results = $self->lims_dbix->query($sql, @bind)->flat; # warn Dumper $results; return $results; } #------------------------------------------------------------------------------- sub get_query_params { # returns $sql & @bind params - shared with print_run.pl my $self = shift; # warn ref $self; my $args = shift; # trial or non-trial cases, start & end dates my $start = $args->{start}; # DT object my $type = $args->{type}; # trial or non-trial my $end = $args->{end}; # DT object my $settings = $self->lims_cfg->{settings}; # warn Dumper $settings; my $tbl_rels = get_tbl_rels($type); # set status level required for printing reports: my $status = $self->does_authorisation() ? 'authorised' : 'reported'; # warn $status; my %query = ( 'so.description' => { -in => [ $status, 'complete' ] } ); $query{'DATE(rr.updated_at)'} = ( $start->ymd eq $end->ymd ) ? $start->ymd # or $end->ymd, both same date : { -between => [ $start->ymd, $end->ymd ] }; # warn Dumper \%query; my @sort_by; if ( $type eq 'clinical-trial' ) { # don't exclude any locations @sort_by = qw(ct.trial_name r.year r.request_number); } elsif ( $type eq 'non-trial' ) { if ( $settings->{print_run_skip_trials} ) { # skip trial cases if configured $query{'rt.request_id'} = undef; } # exclude any locations which don't require paper copies: if ( my $cfg = $self->get_yaml_file('skip_paper_reports') ) { # p $cfg; if ( my $org_codes = $cfg->{organisation} ) { # p $org_codes; $query{'po.parent_code'} = { -not_in => $org_codes }; } if ( my $hospitals = $cfg->{hospital} ) { # p $hospitals; $query{'rs.organisation_code'} = { -not_in => $hospitals }; } if ( my $departments = $cfg->{department} ) { # p $departments; for (@$departments) { # eg RWA/823 my ($location, $department) = split '/'; # p $location; p $department; # 5-digits (hospital) or 3-digits (organisation) code: my $site_type = length $location > 3 ? 'rs.organisation_code' : 'po.parent_code'; my %h = ( $site_type => $location, 'rd.hospital_department_code' => $department, ); push @{ $query{-not_bool} }, \%h; } } } # warn Dumper \%query; @sort_by = qw(ref.name r.year r.request_number); } my %sqla_args = ( cols => 'r.id', joins => $tbl_rels, where => \%query, order_by => \@sort_by, ); if ( defined $args->{offset} ) { # can be zero $sqla_args{$_} = $args->{$_} for qw(offset limit); } # warn Dumper \%sqla_args; my ($sql, @bind) = $self->sqla_query(\%sqla_args); return ($sql, @bind); } sub get_tbl_rels { my $type = shift; # trial or non-trial cases my @rels = ( # table|alias # FK-PK relationship 'requests|r' , 'r.referrer_department_id = rd.id' , 'referrer_department|rd' , 'rd.referrer_id = ref.id' , 'referrers|ref' , 'r.patient_case_id = pc.id' , 'patient_case|pc' , 'rr.request_id = r.id' , 'request_report_view|rr' , 'r.status_option_id = so.id' , 'status_options|so' , 'pc.referral_source_id = rs.id' , 'referral_sources|rs' , 'rs.parent_organisation_id = po.id' , 'parent_organisations|po' ); if ( $type eq 'clinical-trial' ) { # include request_trial/clinical_trials: push @rels, ( 'rt.request_id=r.id' => 'request_trial|rt' , 'rt.trial_id=ct.id' => 'clinical_trials|ct' ); } elsif ( $type eq 'non-trial' ) { # left join request_trial to exclude: push @rels, ( '=>rt.request_id=r.id' => 'request_trial|rt' ); } return \@rels; } 1;