package Model::SQL;
use Moo;
use SQL::Abstract::More;
use Data::Printer alias => 'p';
use Types::Standard 'InstanceOf';
has sql_abs => ( is => 'lazy', builder => sub { SQL::Abstract::More->new() } );
has dbix => ( is => 'ro', isa => InstanceOf['Local::DB'] ); # for get_cols()
sub user_details {
my ($self, $ref) = @_; # p $ref;
# $ref = key => userId, where key = nhs_number, email or patient_id
if ( $ref->{patient_id} ) { # patient_id is ambiguous, replace with p.id:
$ref->{'p.id'} = delete $ref->{patient_id};
} # p $where;
my @cols = qw(
p.dob
p.nhs_number
pa.email
pa.patient_id
pa.last_login
pa.password
pd.address
pd.post_code
pd.contact_number
ref.name|GP
rs.display_name|practice
); # p \@cols;
# names cols depend on db in use (patient_access_demo or outreach_patient_access):
unshift @cols, ( grep $_ eq 'last_name', $self->dbix->get_cols('patients') )
? qw( p.last_name p.first_name ) : qw(p.initials); # p \@cols;
my @rels = ( 'patient_access|pa' ,
'pa.patient_id=p.id' => 'patients|p' ,
'pd.patient_id=p.id' => 'patient_demographics|pd' ,
'pd.practice_id=rs.id' => 'referral_sources|rs' ,
'pd.gp_id=ref.id' => 'referrers|ref' ,
);
my @params = (
-columns => \@cols,
-from => [ -join => @rels ],
-where => $ref,
# -order_by => $sort_by,
);
return $self->sql_abs->select(@params);
}
sub get_pack_dispatches {
my ($self, $patient_id) = @_; # p $patient_id;
# last 10 requests & pack dispatches, reverse chronological order:
my @cols = (
'r.id',
'r.request_number',
'r.year',
'r.registered',
'IFNULL(d.count, 0)|section_data_count',
'so.description|request_status',
'fo.option',
'fo.label|outcome',
# p.status|patient_status',
'rpd.pack_due',
'rpd.pack_sent',
'rpd.return_due',
);
my @rels = ( 'requests|r' ,
'r.status_option_id=so.id' => 'status_options|so' ,
'r.patient_case_id=pc.id' => 'patient_case|pc' ,
'pc.patient_id=p.id' => 'patients|p' ,
# for deployment with access to HILIS4 db:
# 'pd.patient_id=p.id' => 'hilis4.patient_demographics|pd',
# 'rs.request_id=r.id' => 'hilis4.request_specimen|rs' ,
# q!rs.specimen_id=s.id,s.sample_code='CMP'!
# => 'hilis4.specimens|s' ,
# left joins:
'=>rpd.request_id=r.id' => 'request_pack_dispatch|rpd' ,
'=>rfu.request_id=r.id' => 'request_followup|rfu' ,
'=>rfu.followup_option_id=fo.id' => 'followup_options|fo' ,
'=>d.request_id=r.id' => 'lab_sections_data|d' ,
);
my %where = ( 'p.id' => $patient_id );
my @params = (
-columns => \@cols,
-from => [ -join => @rels ],
-where => \%where,
-order_by => { -desc => 'r.id' }, # or just '-r.id' will work
-limit => 10,
);
return $self->sql_abs->select(@params);
}
1;