package LIMS::Model::PatientCase; use base 'LIMS::Model::Base'; use strict; use warnings; use Data::Dumper; use Rose::DB::Object::Util qw(:columns); #------------------------------------------------------------------------------- # gets patient_case by case_id: sub get_patient_case { my $self = shift; my $case_id = shift; my @objects = qw(patient referral_source); my $case = LIMS::DB::PatientCase ->new(id => $case_id) ->load(with => \@objects, speculative => 1); return $case; } #------------------------------------------------------------------------------- # gets patient_cases by patient_id: sub get_patient_cases { my $self = shift; my $case_id = shift; my %args = ( require_objects => [ qw(referral_source patient) ], query => [ id => $case_id, ] ); #$self->set_rose_debug(1); my $patient_cases = LIMS::DB::PatientCase::Manager->get_patient_cases(%args); #$self->set_rose_debug(0); return $patient_cases; } #------------------------------------------------------------------------------- sub get_patient_case_by_request_id { my ($self, $request_id) = @_; my $request_patient_case = LIMS::DB::Request->new(id => $request_id) ->load(with => 'patient_case'); return $request_patient_case; } #------------------------------------------------------------------------------- # gets patient_cases by patient_id: sub get_cases_by_patient_id { my $self = shift; my $patient_id = shift; my %args = ( require_objects => [ qw(referral_source patient) ], query => [ patient_id => $patient_id, ] ); #$self->set_rose_debug(1); my $patient_cases = LIMS::DB::PatientCase::Manager->get_patient_cases(%args); #$self->set_rose_debug(0); return $patient_cases; } #------------------------------------------------------------------------------- # add new location/unit_number combination: sub new_patient_case { my $self = shift; my $data = shift; # first check to see if combination already exists: my $patient_case = LIMS::DB::PatientCase->new(%$data)->load(speculative => 1); if (! $patient_case) { $patient_case = LIMS::DB::PatientCase->new(%$data)->save; } return $patient_case; } #------------------------------------------------------------------------------- sub update_patient_case { my $self = shift; my $args = shift; # DEBUG $data; my $data = $args->{data}; my $case = LIMS::DB::PatientCase->new(id => $args->{case_id})->load; # warn Dumper $case->as_tree; $case->unit_number($data->{unit_number}); $case->referral_source_id($data->{referral_source_id}); #warn Dumper $case->as_tree; eval { $case->save( changes_only => 1 ); }; return $@ if $@; } #------------------------------------------------------------------------------- sub retrieve_patient_data { my ($self, $case_id) = @_; # DEBUG $case_id; # TODO: ignores 'nested_joins => 0' my @objects = qw(patient referral_source.referral_type); #$Rose::DB::Object::Debug=$Rose::DB::Object::Manager::Debug=1; my $patient = LIMS::DB::PatientCase ->new(id => $case_id) ->load( with => \@objects, nested_joins => 0 ); #$Rose::DB::Object::Debug=$Rose::DB::Object::Manager::Debug=0; return $patient; } #------------------------------------------------------------------------------- sub delete_patient_case { my $self = shift; my $case_id = shift; # return true if the row was deleted or did not exist, false otherwise my $result = LIMS::DB::PatientCase->new(id => $case_id)->delete; return $result; # will return true if success } #------------------------------------------------------------------------------- sub registration_search { my $self = shift; my $args = shift; # warn Dumper $args; my @sort = qw( patient.last_name patient.first_name patient.dob request.id patient_case.id ); # last 2 required to force lowest precedence my %h = ( require_objects => [ qw(patient referral_source) ], with_objects => 'request', sort_by => \@sort, ); # ensure no keys of same name passed in, then merge $args with %h: map { die 'duplicate key' if $h{$_}; $h{$_} = $args->{$_} } keys %$args; my $cases = LIMS::DB::PatientCase::Manager->get_patient_cases(%h); return $cases; } =begin #------------------------------------------------------------------------ # reverted to Patient::patient_matches_count() again sub find_patients_count { # TODO: not reliable - see sql output # may have to use Rose::DB::Object::QueryBuilder, or accept approx value of count my $self = shift; my $args = shift; # DEBUG $args; $args->{require_objects} = 'patient'; # $args->{group_by} = [ # returns a list instead of single str # qw(last_name first_name dob nhs_number unit_number referral_source_id) # ]; my $rows = LIMS::DB::PatientCase::Manager->get_patient_cases_count(%$args); return $rows; } =cut #------------------------------------------------------------------------------- # called by Patient::add_new() & Ajax::_validate_param() methods: sub validate_patient_case { my $self = shift; my $data = shift; # my $unit_number_default = # LIMS::DB::PatientCase->new->meta->column('unit_number')->default; # Rose converts undef vals to 'IS NULL' so would get many matches, so make # all $data vals defined so sql reads: foo = '', not: foo IS NULL; need to # take local copy of $data so we don't affect original: my %cloned_data = map { $_ => $data->{$_} || ''; } keys %$data; my %args = ( with_objects => [ qw(patient referral_source) ], query => [ or => [ last_name => { ne => $cloned_data{last_name} }, first_name => { ne => $cloned_data{first_name} }, ], or => [ nhs_number => $cloned_data{nhs_number}, unit_number => $cloned_data{unit_number}, ], ], group_by => 't2.id', # patients = t2 sort_by => [ 't2.last_name', 't2.first_name' ], ); my $patient = LIMS::DB::PatientCase::Manager->get_patient_cases(%args); return $patient; } 1;