RSS Git Download  Clone
Raw Blame History
package LIMS::Controller::HMRN::Data;

use Moose;
with (
    'LIMS::Controller::Roles::Misc', # redirect_after_edit_success()
    'LIMS::Controller::Roles::FormData', # validate_form_params()
);
BEGIN { extends 'LIMS::Base'; }
__PACKAGE__->meta->make_immutable(inline_constructor => 0);

use Data::Dumper;

__PACKAGE__->authz->authz_runmodes(	':all' => 'view_clinical_data' );

# ------------------------------------------------------------------------------
# default() should never be called direct - redirect to start page:
sub default : StartRunmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);

    return $self->redirect( $self->query->url );
}

# ------------------------------------------------------------------------------
sub load : Runmode { # initial point of entry ie /hmrn_data/=/nnn
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forward('hmrn');
}

# ------------------------------------------------------------------------------
sub hmrn : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    my $errs = shift; $self->stash( errs => $errs ); # for debugging in tmpl

    return $self->forbidden() unless $self->user_can('view_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no id passed to '.$self->get_current_runmode);
    
    # get request data:
    my $request_data
        = $self->model('Request')->get_single_request($request_id);
    $self->tt_params( request_data => $request_data );
    
    my $patient_id = $request_data->patient_case->patient_id;

    { # get request history:
        my $history = $self->model('History')->get_request_history($request_id);
        # create hash with keys = action & values = associated history object:
        my %request_history = map { $_->action => $_ } @$history;
        $self->tt_params( request_history => \%request_history );
    }
    { # get patient demographic data:        
        my $demographics
            = $self->model('HMRN')->get_patient_demographics($patient_id);
        $self->tt_params( demographic_data => $demographics );
    }    
    {  # get hmrn data:
        my $hmrn_data = $self->model('HMRN')->get_all_hmrn_data($patient_id);
        
        # is patient also in outreach (can't edit GP practice if so):
        if ($self->cfg('settings')->{have_outreach}) {
            my $in_outreach = $self->model('HMRN')->is_in_outreach($patient_id);
            $hmrn_data->{is_in_outreach} = $in_outreach;
        }
        $self->tt_params( hmrn_data => $hmrn_data );
    }
    
	# validation profiles:
#	$self->js_validation_profile('hmrn_'.$_)
#        for qw(demographics chronologies treatment); # using jQuery client-side instead

    return $self->tt_process($errs);
}

# ------------------------------------------------------------------------------
sub edit_demographics : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $dfv = $self->check_rm( 'load', $self->validate('hmrn_demographics') )
    || return $self->dfv_error_page;

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $patient_id = $self->param('Id')
    || return $self->error('no patient_id passed to '.$self->get_current_runmode);
    
    my $data = $dfv->valid;
    # add patient_id:
    $data->{patient_id} = $patient_id; # warn Dumper $data; 

    my $rtn = $self->model('HMRN')->update_patient_demographics($data);
    return $rtn
        ? $self->error($rtn)
        : $self->redirect_after_edit_success('/hmrn_data/=/' . $request_id);
}

# ------------------------------------------------------------------------------
sub edit_chronology : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $dfv = $self->check_rm( 'load', $self->validate('hmrn_chronologies') )
    || return $self->dfv_error_page;

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $patient_id = $self->param('Id')
    || return $self->error('no patient_id passed to '.$self->get_current_runmode);

    my $data = $dfv->valid;
    
    # add patient_id:
    $data->{patient_id} = $patient_id;
    
    my $rtn = $self->model('HMRN')->update_patient_chronologies($data);
    return $rtn
        ? $self->error($rtn)
        : $self->redirect_after_edit_success('/hmrn_data/=/' . $request_id);   
}

# ------------------------------------------------------------------------------
sub edit_antecedent : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $patient_id = $self->param('Id')
    || return $self->error('no patient_id passed to '.$self->get_current_runmode);

    my $vars = $self->query->Vars;

    # add patient_id:
    $vars->{patient_id} = $patient_id;
    
    my $rtn = $self->model('HMRN')->update_antecedent_events($vars);
    return $rtn
        ? $self->error($rtn)
        : $self->redirect_after_edit_success('/hmrn_data/=/' . $request_id);
}

# ------------------------------------------------------------------------------
sub new_treatment : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $dfv = $self->check_rm( 'load', $self->validate('hmrn_treatment') )
    || return $self->dfv_error_page;

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $patient_id = $self->param('Id') 
    || return $self->error('no patient_id passed to '.$self->get_current_runmode);    
    
    my $data = $dfv->valid();

    # add patient_id:
    $data->{patient_id} = $patient_id;
    
    my $rtn = $self->model('HMRN')->new_treatment_data($data);
    return $rtn
        ? $self->error($rtn)
        : $self->redirect_after_edit_success('/hmrn_data/=/' . $request_id);
}

# ------------------------------------------------------------------------------
sub edit_treatment : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    my $errs = shift;
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $treatment_id = $self->param('Id') # treatment table 'id'
    || return $self->error('no id passed to '.$self->get_current_runmode);    
    
    my $data = $self->model('HMRN')->get_treatment_data($treatment_id);
    # put request_id into $data:
    $data->{request_id} = $request_id;
    $self->tt_params(data => $data);
    
    # $self->js_validation_profile('hmrn_treatment'); # using jQuery client-side

    return $self->tt_process($errs);
}

# ------------------------------------------------------------------------------
sub do_edit_treatment : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $treatment_id = $self->param('Id') # treatment table 'id'
    || return $self->error('no id passed to '.$self->get_current_runmode);    

    my $rtn;
    
    if ( $self->query->param('delete') ) {
        return $self->forward('edit_treatment')
            unless $self->query->param('confirm_delete');
        $rtn = $self->model('HMRN')->delete_treatment_data($treatment_id); # just send id for del
        $self->flash( info => $self->messages('action')->{delete_success} ) if ! $rtn;        
    }
    else {
        my $dfv = $self->check_rm( 'edit_treatment', $self->validate('hmrn_treatment') )
        || return $self->dfv_error_page;
    
        my $data = $dfv->valid();
        # put treatment table 'id' into $vars:
        $data->{id} = $treatment_id; warn Dumper $data; return 1;
        
        $rtn = $self->model('HMRN')->update_treatment_data($data);
        $self->flash( info => $self->messages('action')->{edit_success} ) if ! $rtn;        
    }
    
    return $rtn
        ? $self->error($rtn)
        : $self->redirect( $self->query->url . '/hmrn_data/=/' . $request_id);
}

# ------------------------------------------------------------------------------
sub edit_mdt_date : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $id = $self->param('Id')
    || return $self->error('no id passed to '.$self->get_current_runmode);    
    
    my $vars = $self->query->Vars();
    
    my $rtn;
    
    # deletion request:
    if ($vars->{delete}) { # NB: do this 1st as var 'date' also passed  
        return $self->fill_form($self->tt_process) # require confirmation before deleting:
            unless $self->query->param('confirm_delete');
        $rtn = $self->model('HMRN')->delete_mdt_date($id); # just send id for del
        $self->flash( info => $self->messages('action')->{delete_success} ) if ! $rtn;
    }
    # if revised date submitted:
    elsif ($vars->{date}) {
        # validate date:
        my $profile = $self->validate('hmrn_mdt_date');
        my $dfv = $self->validate_form_params($profile); 
        if ($dfv->has_invalid) { # $dfv->has_missing not req'd - wouldn't get here
            $self->tt_params(dfv_err => $dfv->msgs); # warn Dumper $dfv->msgs;
            return $self->fill_form($self->tt_process);
        }

        $vars->{id} = $id; # add row id for update
        $rtn = $self->model('HMRN')->update_mdt_date($vars);   
        $self->flash( info => $self->messages('action')->{edit_success} ) if ! $rtn;
    }
    else { # 1st call to method (just get data):
        my $data = $self->model('HMRN')->get_mdt_data($id);
        return $self->tt_process({ data => $data });
    }
    
    return $rtn
        ? $self->error($rtn)
        : $self->redirect( $self->query->url . '/hmrn_data/=/' . $request_id);
}

# ------------------------------------------------------------------------------
sub edit_practice : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);
    
    return $self->forbidden() unless $self->user_can('enter_clinical_data');

    my $request_id = $self->param('id')
    || return $self->error('no request_id passed to '.$self->get_current_runmode);
    
    my $patient_id = $self->param('Id')
    || return $self->error('no patient_id passed to '.$self->get_current_runmode);
    
    # if new practice_id submitted:
    if ( my $practice_id = $self->query->param('practice_id') ) {
        my %data = (
            patient_id  => $patient_id,
            practice_id => $practice_id,
        );
        my $rtn = $self->model('HMRN')->update_patient_demographics(\%data);
        return $rtn
            ? $self->error($rtn)
            : $self->redirect_after_edit_success('/hmrn_data/=/' . $request_id);
    }
    else { # load existing for editing:
        # get current practice_id for patient:
        my $info = $self->model('HMRN')->get_patient_demographics($patient_id);
    
        return $self->tt_process({ data => $info });
    }
}

# ------------------------------------------------------------------------------
# ajax function called from treatment type select menu:
sub treatment_options : Runmode {
    my $self = shift; $self->_debug_path($self->get_current_runmode);

    my $options = [];
    
    if ( my $tx_type_id = $self->query->param('tx_type_id') ) { # warn $tx_type_id;
    	$options = $self->model('HMRN')->get_tx_details_for_tx_type($tx_type_id);
    }
    
    return $self->tt_process({ options => $options });
}

1;