+package Koha::Illrequest::Logger;
+
+# Copyright 2018 PTFS Europe Ltd
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+use Modern::Perl;
+use JSON qw( to_json from_json );
+use Time::Local;
+
+use C4::Koha;
+use C4::Context;
+use C4::Templates;
+use C4::Log qw( logaction );
+use Koha::ActionLogs;
+
+=head1 NAME
+
+Koha::Illrequest::Logger - Koha ILL Action / Event logger
+
+=head1 SYNOPSIS
+
+Object-oriented class that provides event logging functionality for
+ILL requests
+
+=head1 DESCRIPTION
+
+This class provides the ability to log arbitrary actions or events
+relating to Illrequest to the action log.
+
+=head1 API
+
+=head2 Class Methods
+
+=head3 new
+
+ my $config = Koha::Illrequest::Logger->new();
+
+Create a new Koha::Illrequest::Logger object.
+We also set up what can be logged, how to do it and how to display
+log entries we get back out
+
+=cut
+
+sub new {
+ my ( $class ) = @_;
+ my $self = {};
+
+ $self->{loggers} = {
+ status => sub {
+ $self->log_status_change(@_);
+ }
+ };
+
+ my ( $htdocs, $theme, $lang, $base ) =
+ C4::Templates::_get_template_file('ill/log/', 'intranet');
+
+ $self->{templates} = {
+ STATUS_CHANGE => $base . 'status_change.tt'
+ };
+
+ bless $self, $class;
+
+ return $self;
+}
+
+=head3 log_maybe
+
+ Koha::IllRequest::Logger->log_maybe($params);
+
+Receive params hashref, containing a request object and an attrs
+hashref (which may or may not be defined) If the attrs hashref contains
+a key matching our "loggers" hashref then we want to log it
+
+=cut
+
+sub log_maybe {
+ my ($self, $params) = @_;
+
+ if (defined $params->{request} && defined $params->{attrs}) {
+ foreach my $key (keys %{ $params->{attrs} }) {
+ if (defined($self->{loggers}->{$key})) {
+ $self->{loggers}->{$key}(
+ $params->{request},
+ $params->{attrs}->{$key}
+ );
+ }
+ }
+ }
+}
+
+=head3 log_status_change
+
+ Koha::IllRequest::Logger->log_status_change($params);
+
+Receive a hashref containing a request object and a status to log,
+and log it
+
+=cut
+
+sub log_status_change {
+ my ( $self, $params ) = @_;
+
+ if (defined $params->{request} && defined $params->{value}) {
+ $self->log_something({
+ modulename => 'ILL',
+ actionname => 'STATUS_CHANGE',
+ objectnumber => $params->{request}->id,
+ infos => to_json({
+ log_origin => 'core',
+ status_before => $params->{request}->{previous_status},
+ status_after => $params->{value}
+ })
+ });
+ }
+}
+
+=head3 log_something
+
+ Koha::IllRequest::Logger->log_something({
+ modulename => 'ILL',
+ actionname => 'STATUS_CHANGE',
+ objectnumber => $req->id,
+ infos => to_json({
+ log_origin => 'core',
+ status_before => $req->{previous_status},
+ status_after => $new_status
+ })
+ });
+
+If we have the required data passed, log an action
+
+=cut
+
+sub log_something {
+ my ( $self, $to_log ) = @_;
+
+ if (
+ defined $to_log->{modulename} &&
+ defined $to_log->{actionname} &&
+ defined $to_log->{objectnumber} &&
+ defined $to_log->{infos} &&
+ C4::Context->preference("IllLog")
+ ) {
+ logaction(
+ $to_log->{modulename},
+ $to_log->{actionname},
+ $to_log->{objectnumber},
+ $to_log->{infos}
+ );
+ }
+}
+
+=head3 get_log_template
+
+ $template_path = get_log_template($params);
+
+Given a log's origin and action, get the appropriate display template
+
+=cut
+
+sub get_log_template {
+ my ($self, $params) = @_;
+
+ my $origin = $params->{origin};
+ my $action = $params->{action};
+
+ if ($origin eq 'core') {
+ # It's a core log, so we can just get the template path from
+ # the hashref above
+ return $self->{templates}->{$action};
+ } else {
+ # It's probably a backend log, so we need to get the path to the
+ # template from the backend
+ my $backend =$params->{request}->{_my_backend};
+ return $backend->get_log_template_path($action);
+ }
+}
+
+=head3 get_request_logs
+
+ $requestlogs = Koha::IllRequest::Logger->get_request_logs($request_id);
+
+Get all logged actions for a given request
+
+=cut
+
+sub get_request_logs {
+ my ( $self, $request ) = @_;
+
+ my $logs = Koha::ActionLogs->search(
+ {
+ module => 'ILL',
+ object => $request->id
+ },
+ { order_by => { -desc => "timestamp" } }
+ )->unblessed;
+
+ # Populate a lookup table for status aliases
+ my $aliases = GetAuthorisedValues('ILLSTATUS');
+ my $alias_hash;
+ foreach my $alias(@{$aliases}) {
+ $alias_hash->{$alias->{authorised_value}} = $alias;
+ }
+ foreach my $log(@{$logs}) {
+ $log->{aliases} = $alias_hash;
+ $log->{info} = from_json($log->{info});
+ $log->{template} = $self->get_log_template({
+ request => $request,
+ origin => $log->{info}->{log_origin},
+ action => $log->{action}
+ });
+ }
+
+ return $logs;
+}
+
+=head1 AUTHOR
+
+Andrew Isherwood <andrew.isherwood@ptfs-europe.com>
+
+=cut
+
+1;