Main Koha release repository https://koha-community.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

277 lines
6.9 KiB

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, see <http://www.gnu.org/licenses>.
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;
use Koha::Notice::Template;
=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(@_);
},
patron_notice => sub {
$self->log_patron_notice(@_);
}
};
my $query = CGI->new; # To keep C4::Templates::_get_template_file() from complaining
my ( $htdocs, $theme, $lang, $base ) =
C4::Templates::_get_template_file('ill/log/', 'intranet', $query);
$self->{templates} = {
STATUS_CHANGE => $base . 'status_change.tt',
PATRON_NOTICE => $base . 'patron_notice.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_patron_notice
Koha::IllRequest::Logger->log_patron_notice($params);
Receive a hashref containing a request object and params to log,
and log it
=cut
sub log_patron_notice {
my ( $self, $params ) = @_;
if (defined $params->{request} && defined $params->{notice_code}) {
$self->log_something({
modulename => 'ILL',
actionname => 'PATRON_NOTICE',
objectnumber => $params->{request}->id,
infos => to_json({
log_origin => 'core',
notice_code => $params->{notice_code}
})
});
}
}
=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 all ILL notice types
my $notice_types = Koha::Notice::Templates->search({
module => 'ill'
})->unblessed;
my $notice_hash;
foreach my $notice(@{$notice_types}) {
$notice_hash->{$notice->{code}} = $notice;
}
# Populate a lookup table for status aliases
my $aliases = C4::Koha::GetAuthorisedValues('ILLSTATUS');
my $alias_hash;
foreach my $alias(@{$aliases}) {
$alias_hash->{$alias->{authorised_value}} = $alias;
}
foreach my $log(@{$logs}) {
$log->{notice_types} = $notice_hash;
$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;