package LIMS::Controller::History;
use Moose;
BEGIN { extends 'LIMS::Base'; }
with (
'LIMS::Controller::Roles::Diff',
'LIMS::Controller::Roles::DataMap',
'LIMS::Controller::Roles::History', # get_*_history()
);
__PACKAGE__->meta->make_immutable(inline_constructor => 0);
use Data::Dumper;
# ------------------------------------------------------------------------------
# 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 {
my $self = shift; $self->_debug_path($self->get_current_runmode);
return $self->forbidden() unless $self->user_can('view_history');
my $request_id = $self->param('id')
|| return $self->error('no id passed to ' . $self->get_current_runmode);
my $request = $self->model('Request')->get_single_request($request_id);
# load history data into tt_params:
$self->_load_history_data($request);
return $self->render_view('history/default.tt', { request => $request } );
}
# ------------------------------------------------------------------------------
sub previous_diagnosis : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $request_id = $self->param('id')
|| return $self->error('no id passed to ' . $self->get_current_runmode);
my $previous_diagnoses
= $self->model('History')->get_diagnosis_history($request_id);
my $request_data
= $self->model('Request')->get_patient_and_request_data($request_id);
$self->tt_params(
request_data => $request_data,
previous_diagnoses => $previous_diagnoses,
);
return $self->tt_process;
}
# ------------------------------------------------------------------------------
sub report_diff : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $request_id = $self->param('id')
|| return $self->error('no id passed to ' . $self->get_current_runmode);
my $field = $self->param('Id')
|| return $self->error('no Id passed to ' . $self->get_current_runmode);
my $args = {
request_id => $request_id,
field => $field,
};
my $changes = $self->diff_report_changes($args);
unless ($changes) { # some changes not logged in request_report_history
$self->flash( warning => $self->messages('report')->{no_report_history});
return $self->redirect( $self->query->url . '/history/=/'.$request_id );
}
$self->tt_params( history => $changes );
my $request = $self->model('Request')->get_single_request($request_id);
$self->tt_params( request => $request );
return $self->tt_process;
}
# ------------------------------------------------------------------------------
sub request_view : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $request_id = $self->param('id')
|| return $self->error('no id passed to ' . $self->get_current_runmode);
my $request = $self->model('Request')->get_single_request($request_id);
my $history = $self->model('History')->get_view_history($request_id);
$self->tt_params(
history => $history,
request => $request,
);
return $self->tt_process;
}
# ------------------------------------------------------------------------------
sub request_print : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $request_id = $self->param('id')
|| return $self->error('no id passed to ' . $self->get_current_runmode);
my $request = $self->model('Request')->get_single_request($request_id);
my $history = $self->model('History')->get_print_history($request_id);
$self->tt_params(
history => $history,
request => $request,
);
return $self->tt_process;
}
# ------------------------------------------------------------------------------
sub _load_history_data {
my ($self, $request) = @_; $self->_debug_path();
my $request_id = $request->id; # $self->debug($request_id);
my $patient_id = $request->patient_case->patient_id; # $self->debug($patient_id);
my %history = (
patient_data => $self->get_patient_history($patient_id),
request_data => $self->get_request_history($request_id),
demographics => $self->get_demographic_history($patient_id),
);
if ($history{patient_data}) { # need error_codes:
$history{error_codes} = $self->error_codes_map;
}
# only lab staff can view lab test history:
if ($self->is_lab_staff) {
$history{diagnosis_data} = $self->get_diagnosis_history($request_id),
$history{lab_test_data} = $self->get_lab_test_history($request_id);
$history{deletion_data} = $self->get_deletion_history($request);
$self->tt_params( is_lab_user => 1 ); # flag for tt
}
# sort into chronological order:
my @chrono = (); # warn Dumper \%history_data;
while ( my ($type, $data) = each %history ) { # warn ref $data;
# only want request & lab_test data:
next unless $data && grep $type eq $_, qw(request_data lab_test_data);
for (@$data) { # warn Dumper $_->as_tree;
my $event = $_->as_tree(deflate => 0);
# add history type (patient, request, lab_test, etc):
$event->{history_type} = $type;
push @chrono, $event;
}
} # warn Dumper \@chrono;
$self->tt_params(
categorical => \%history,
chronological => [ sort by_epoch @chrono ],
);
}
sub by_epoch {
return $a->{time}->epoch <=> $b->{time}->epoch || $a->{id} <=> $b->{id};
}
1;