package LIMS::Controller::Admin::Config::Clinicians; use base 'LIMS::Base'; use LIMS::Local::Sugar; use Data::Dumper; use Moose; with ( 'LIMS::Controller::Roles::SearchConstraint', 'LIMS::Controller::Roles::ReferrerSearch', 'LIMS::Controller::Roles::Misc', ); __PACKAGE__->meta->make_immutable(inline_constructor => 0); __PACKAGE__->authz->authz_runmodes( ':all' => 'do_admin' ); # ------------------------------------------------------------------------------ startmode default ($errs) { $self->_debug_path($self->get_current_runmode); my $referral_types = $self->model('Referrer')->get_referral_types; my $departments = $self->model('Referrer')->get_hospital_departments; $self->tt_params( departments => $departments, referral_types => $referral_types, ); # get js validation foo_onsubmit & foo_dfv_js vars into tt_params: $self->js_validation_profile('new_clinician'); return $self->tt_process($errs); } # ------------------------------------------------------------------------------ runmode search { $self->_debug_path($self->get_current_runmode); # function located in LIMS::Controller::Roles::ReferrerSearch: return $self->referrer_search('clinicians'); } # ------------------------------------------------------------------------------ runmode add_new ($errs) { $self->_debug_path($self->get_current_runmode); my $dfv = $self->check_rm('default', $self->validate('new_clinician') ) || return $self->dfv_error_page; my $data = $dfv->valid; # $self->debug($data); # get location object from referral_source_id: my $location = $self->model('ReferralSource')->get_referral_source($data->{referral_source_id}) || return $self->error('cannot retrieve location in '.$self->get_current_runmode); # get clinician object or return to start page (flash message set in _get_clinician): my $clinician = $self->_retrieve_or_create_clinician($data) # $self->debug($clinician); || return $self->forward('default'); # forward not redirect to retain query params my %data = ( referrer_id => $clinician->id, parent_organisation_id => $location->parent_organisation_id, hospital_department_code => $data->{hospital_department_code}, ); # test for existence of referrer_id & organisation_code: if ( $self->model('Referrer')->get_referrer_parent_organisation(\%data) ) { my $msg = $self->messages('admin')->{clinician}->{not_unique}; $self->flash( warning => $msg ); return $self->forward('default'); } # add new referrer_department entry (returns error if not unique entry): my $rtn = $self->model('Referrer')->update_referrer_department(\%data); if ($rtn) { # $self->debug($rtn); return $self->error($rtn); } else { $self->flash( info => $self->messages('admin')->{clinician}->{create_success} ); return $self->forward('default'); } } # ------------------------------------------------------------------------------ runmode edit ($errs, $id) { $self->_debug_path($self->get_current_runmode); # $self->stash(errs => $errs); $id || return $self->error('no id passed to '.$self->get_current_runmode); # $self->debug('id:'.$id); my $data = $self->model('Referrer')->get_referrer_departments($id); my $referral_types = $self->model('Referrer')->get_referral_types; $self->tt_params( data => $data, types => $referral_types, ); # get js validation foo_onsubmit & foo_dfv_js vars into tt_params: $self->js_validation_profile('edit_referrer'); return $self->tt_process($errs); } # ------------------------------------------------------------------------------ runmode location ($id) { # just sets 'is_active' to yes or no - don't need validation $self->_debug_path($self->get_current_runmode); # get *clinician id* from app param: $id || return $self->error('no id passed to '.$self->get_current_runmode); # $self->debug('id:'.$id); my $vars = $self->query->Vars; # get *referrer_department id* & is_active from form params: my %args = map +($_ => $vars->{$_}), qw( id is_active ); # warn Dumper \%args; my $rtn = $self->model('Referrer')->update_referrer_department(\%args); return $rtn ? $self->error($rtn) : $self->redirect_after_edit_success('/config/clinicians/edit/' . $id); } # ------------------------------------------------------------------------------ runmode update ($id) { $self->_debug_path($self->get_current_runmode); # put id (if submitted) into params() as _record_id for validation: if ( $id ) { $self->query->param( _record_id => $id ); } my $dfv = $self->check_rm('edit', $self->validate('edit_referrer') ) || return $self->dfv_error_page; my $data = $dfv->valid || return $self->forward('default'); # eg if empty param # provide 'id' if supplied, so record updated, otherwise new one created: if ($id) { $data->{id} = $id; } my $rtn = $self->model('Referrer')->update_clinician($data); # warn $rtn; if ($rtn) { return $self->error($rtn); } else { # set flash success message: $self->flash( info => $self->messages('admin')->{clinician}->{edit_success} ); $self->redirect( $self->query->url . '/config/clinicians' ); } } # ------------------------------------------------------------------------------ sub _retrieve_or_create_clinician { my $self = shift; $self->_debug_path(); my $data = shift; # warn Dumper $data; my $national_code = $data->{prefix} . $data->{national_code}; my $clinician = $self->model('Referrer')->get_clinician_speculative($national_code); my $initials = join '', grep { defined $_ } map { $data->{'initials_' . $_} } (1..4); # warn $initials; # if clinician exists, check submitted surname + initials matches clinician object: if ($clinician) { my $new_clinician_name = join ' ', $data->{surname}, $initials; unless ( lc $clinician->name eq lc $new_clinician_name ) { my $msg = sprintf $self->messages('admin')->{clinician}->{name_mismatch}, $national_code, $clinician->name; $self->flash( warning => $msg ); return 0; # triggers return to default start mode } } # else create one: else { my %clinician = ( surname => $data->{surname}, initials => $initials, national_code => $national_code, ); $clinician = $self->model('Referrer')->create_new_clinician(\%clinician); if (! $clinician) { my $msg = $self->messages('admin')->{clinician}->{failure}; $self->flash( warning => $msg ); } } return $clinician; } 1;