package LIMS::Model::ReferralSource;
use strict;
use warnings;
use base 'LIMS::Model::Base';
use LIMS::Local::Utils;
# ------------------------------------------------------------------------------
# returns hashref of sources, with keys = location_type
sub get_referral_sources_by_type {
my $self = shift;
my %args = (
require_objects => 'referral_type',
sort_by => 'display_name',
);
# get all referral_sources rows as arrayref:
my $src = LIMS::DB::ReferralSource::Manager->get_referral_sources_iterator(%args);
my (@hospitals, @practices);
while (my $source = $src->next) {
if ( $source->referral_type->description eq 'hospital' ) {
push @hospitals, $source;
}
elsif ( $source->referral_type->description eq 'practice' ) {
push @practices, $source;
}
}
return {
hospitals => \@hospitals,
practices => \@practices,
}
}
# ------------------------------------------------------------------------------
sub get_referral_sources_count {
my ($self, $search_terms) = @_; # $self->debug($search_terms);
my %args = (
query => [ %$search_terms ],
);
my $total
= LIMS::DB::ReferralSource::Manager->get_referral_sources_count(%args);
return $total;
}
# ------------------------------------------------------------------------------
sub get_parent_organisations_count {
my ($self, $search_terms) = @_; # $self->debug($search_terms);
my %args = (
query => [ %$search_terms ],
);
my $total = LIMS::DB::ParentOrganisation::Manager
->get_parent_organisations_count(%args);
return $total;
}
# ------------------------------------------------------------------------------
sub get_referral_sources {
my $self = shift;
my ($search_terms, $args) = @_; # $self->debug($args);
$args->{query} = [ %$search_terms ];
$args->{require_objects} = [ qw(referral_type parent_organisation) ];
my $sources = LIMS::DB::ReferralSource::Manager->get_referral_sources(%$args);
return $sources;
}
# ------------------------------------------------------------------------------
sub get_referral_types {
my $self = shift;
my $referral_types
= LIMS::DB::ReferralType::Manager->get_referral_types();
return $referral_types;
}
# ------------------------------------------------------------------------------
sub get_referral_source {
my $self = shift;
my $src_id = shift;
my $source = LIMS::DB::ReferralSource->new(id => $src_id)
->load( with => 'referral_type' );
return $source;
}
# ------------------------------------------------------------------------------
sub get_parent_organisations {
my $self = shift;
my ($search_terms, $args) = @_;
$args->{query} = [ %$search_terms ];
$args->{require_objects} = ['referral_type'];
#$self->set_rose_debug(1);
my $parent_organisations
= LIMS::DB::ParentOrganisation::Manager->get_parent_organisations(%$args);
#$self->set_rose_debug(0);
return $parent_organisations;
}
# ------------------------------------------------------------------------------
sub get_email_contacts {
my $self = shift;
my %args = (
sort_by => 'display_name',
require_objects => 'referral_source',
);
my $contacts = LIMS::DB::EmailContact::Manager->get_email_contacts(%args);
return $contacts;
}
# ------------------------------------------------------------------------------
sub get_email_contact {
my ($self, $id) = @_;
my $contact = LIMS::DB::EmailContact->new(id => $id)->load;
return $contact;
}
# ------------------------------------------------------------------------------
sub update_email_contacts {
my ($self, $data) = @_;
my %args = ( class => 'EmailContact', data => $data );
return $self->update_object(\%args);
}
# ------------------------------------------------------------------------------
# get active mdt contacts:
sub get_mdt_email_contacts {
my $self = shift;
my $all_contacts = $self->get_email_contacts;
my @mdt_contacts = grep {
$_->type eq 'mdt' && $_->is_active eq 'yes';
} @$all_contacts;
return \@mdt_contacts;
}
# ------------------------------------------------------------------------------
sub has_mdt_contact {
my ($self, $ref_src_id) = @_; # warn $ref_src_id;
# get parent_organisation for $referral_source_id:
my $ref_src = LIMS::DB::ReferralSource->new(id => $ref_src_id)->load;
my $parent_org_id = $ref_src->parent_organisation_id;
my %args = (
query => [ type => 'mdt' ],
require_objects => 'referral_source',
);
my $contacts = LIMS::DB::EmailContact::Manager->get_email_contacts(%args);
for (@$contacts) {
if ( $_->scope eq 'hospital' ) {
# if contact for a hospital, return true its ref_src_id matches:
return 1 if $_->referral_source_id == $ref_src_id;
}
elsif ( $_->scope eq 'organisation' ) {
# need to see if its parent_organisation matches:
return 1 if
$_->referral_source->parent_organisation_id == $parent_org_id;
}
}
# if we get here, there's no mdt contact:
return 0;
}
# ------------------------------------------------------------------------------
sub get_parent_organisation {
my $self = shift;
my $org_id = shift;
my $parent_organisation = LIMS::DB::ParentOrganisation
->new(id => $org_id)->load(with => 'referral_type');
return $parent_organisation;
}
# ------------------------------------------------------------------------------
sub update_referral_sources {
my $self = shift;
my $data = shift; # $self->debug($data);
# update method different for hospitals & (new) practices:
my $rtn_value =
# if it's a *new* practice:
$data->{referral_type} eq 'practice' && ! $data->{id} ?
$self->_new_practice($data) :
# else hospital or edit practice:
$self->_update_referral_source($data) ;
return $rtn_value;
}
# ------------------------------------------------------------------------------
sub update_parent_organisations {
my $self = shift;
my $data = shift;
#$self->set_rose_debug(1);
my $parent_organisation = LIMS::DB::ParentOrganisation->new();
my %args = (
data => $data,
obj => $parent_organisation,
);
# get form_params for referral_sources table into $referral_source object:
$self->populate_object_with_form_data(\%args);
# get referral_type data:
my $referral_type
= LIMS::DB::ReferralType->new(description => $data->{referral_type})->load;
# add referral_type object to referral_source object:
$parent_organisation->referral_type($referral_type);
eval {
$parent_organisation->insert_or_update;
};
#$self->set_rose_debug(0);
return $@ if $@;
}
# ------------------------------------------------------------------------------
sub update_network_locations {
my ($self, $parent_ids) = @_;
my $db = $self->lims_db; # ie LIMS::DB->new_or_cached;
my $update = sub {
# 1st clear table:
LIMS::DB::LocalNetworkLocation::Manager
->delete_local_network_locations(all => 1); # or it refuses!!
# add new data (if any):
map {
LIMS::DB::LocalNetworkLocation->new(parent_id => $_)->save;
} @$parent_ids;
};
my $ok = $db->do_transaction($update);
return $ok ? 0 : 'update_network_locations() error - ' . $db->error;
}
# ------------------------------------------------------------------------------
sub _update_referral_source {
my $self = shift;
my $data = shift; # warn Dumper $data;
#$self->set_rose_debug(1);
my $referral_source = LIMS::DB::ReferralSource->new();
my %args = (
data => $data,
obj => $referral_source,
);
# get form_params for referral_sources table into $referral_source object:
$self->populate_object_with_form_data(\%args);
# get referral_type data:
my $referral_type
= LIMS::DB::ReferralType->new(description => $data->{referral_type})->load;
# add referral_type object to referral_source object:
$referral_source->referral_type($referral_type);
eval {
$referral_source->insert_or_update;
};
#$self->set_rose_debug(0);
return $@ if $@;
}
# ------------------------------------------------------------------------------
sub _new_practice {
my $self = shift;
my $data = shift; # warn Dumper $data;
# massage data into format required by referral_sources & parent_organisation tables:
$self->_format_data_for_practices($data); # warn Dumper $data;
# parent_organisation.parent_code & referrral_sources.organisation_code
# same thing for practice:
$data->{parent_code} = $data->{organisation_code};
my $db = $self->lims_db; # ie LIMS::DB->new_or_cached;
my $new_practice = sub {
# create new parent_organisation for practice:
my $parent_organisation = LIMS::DB::ParentOrganisation->new();
{
my %args = (
data => $data,
obj => $parent_organisation,
);
# get form_params for parent_organisation table into $parent_organisation object:
$self->populate_object_with_form_data(\%args);
}
my $referral_source = LIMS::DB::ReferralSource->new();
{
my %args = (
data => $data,
obj => $referral_source,
);
# get form_params for referral_sources table into $referral_source object:
$self->populate_object_with_form_data(\%args);
}
# put $db into both objects:
# $referral_source->db($db);
# $parent_organisation->db($db);
# add parent_organisation object to referral_source object:
$referral_source->parent_organisation($parent_organisation);
$referral_source->save;
};
# do_transaction() returns true if succeeds; sets $db->error on failure:
#$self->set_rose_debug(1);
my $ok = $db->do_transaction($new_practice);
#$self->set_rose_debug(0);
return $ok ? 0 : 'update_practices() error - ' . $db->error;
}
# ------------------------------------------------------------------------------
# formats data into format required by referral_sources & parent_organisation tables:
sub _format_data_for_practices {
my $self = shift;
my $data = shift;
# format post-code to uppercase:
my $zip = $data->{practice_zip};
$data->{practice_zip} = LIMS::Local::Utils::format_postcode($zip);
# format description for parent_organisations table:
$data->{description} = join ', ', map uc $data->{$_}, qw(practice_name practice_zip);
# format display_name for referral_sources table:
$data->{display_name} = join ', ', map $data->{$_},
qw(practice_name practice_address practice_zip);
# get referral_type object for referral_type_id:
my $referral_type
= LIMS::DB::ReferralType->new(description => $data->{referral_type})->load;
$data->{referral_type_id} = $referral_type->id;
}
1;