Koha-clms/Koha/BackgroundJob/ErmSushiHarvester.pm

192 lines
4.4 KiB
Perl

package Koha::BackgroundJob::ErmSushiHarvester;
# 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 <https://www.gnu.org/licenses>.
use Modern::Perl;
use Try::Tiny;
use Koha::DateUtils qw( dt_from_string );
use Koha::ERM::EUsage::UsageDataProviders;
use base 'Koha::BackgroundJob';
=head1 NAME
Koha::BackgroundJob::ErmSushiHarvester - Background job derived class to process the ERM Usage Statistics SUSHI Harvester
=head1 API
=head2 Class methods
=head3 job_type
Define the job type of this job: erm_sushi_harvester
=cut
sub job_type {
return 'erm_sushi_harvester';
}
=head3 process
Koha::BackgroundJob->find($id)->process(
{
ud_provider_id => $self->erm_usage_data_provider_id
}
);
Process the harvesting.
=cut
sub process {
my ( $self, $args ) = @_;
if ( $self->status eq 'cancelled' ) {
return;
}
$self->{us_report_info} = {
skipped_mus => 0,
skipped_yus => 0,
added_mus => 0,
added_yus => 0,
added_usage_objects => 0,
};
# FIXME If the job has already been started, but started again (worker has been restart for instance)
# Then we will start from scratch and so double process the same records
$self->start;
my $ud_provider = Koha::ERM::EUsage::UsageDataProviders->find( $args->{ud_provider_id} );
$ud_provider->set_background_job_callbacks(
{
report_info_callback => sub { $self->report_info(@_); },
step_callback => sub { $self->step; },
set_size_callback => sub { $self->set_job_size(@_); },
add_message_callback => sub { $self->add_message(@_); },
}
);
my $counter_file;
if ( $args->{file_content} ) {
my $counter_files_rs = $ud_provider->counter_files(
[
{
usage_data_provider_id => $ud_provider->erm_usage_data_provider_id,
file_content => $args->{file_content},
date_uploaded => POSIX::strftime( "%Y%m%d%H%M%S", localtime ),
filename => $ud_provider->name,
}
]
);
$counter_file = $counter_files_rs->last;
} else {
$ud_provider->harvest_sushi(
{
begin_date => $args->{begin_date},
end_date => $args->{end_date},
report_type => $args->{report_type}
}
);
}
my $job_report_report_type = $ud_provider->{report_type} || $counter_file->type;
# Prepare job report
my $report = {
report_type => $job_report_report_type,
us_report_info => $self->{us_report_info},
ud_provider_id => $ud_provider->erm_usage_data_provider_id,
ud_provider_name => $ud_provider->name,
};
my $data = $self->decoded_data;
$data->{report} = $report;
$data->{messages} = \@{ $self->{messages} };
$self->finish($data);
}
=head3 report_info
Setter for report_info
=cut
sub report_info {
my ( $self, $info ) = @_;
$self->{us_report_info}{$info}++;
}
=head3 set_job_size
Setter for job_size
=cut
sub set_job_size {
my ( $self, $size ) = @_;
$self->size($size)->store();
}
=head3 add_message
$job->add_message(
{
type => 'success', # success, warning or error
code => 'object_added', # object_added or object_already_exists
title => $row->{Title},
message => 'message',
}
);
Add a new job message
=cut
sub add_message {
my ( $self, $message ) = @_;
push @{ $self->{messages} }, $message;
}
=head3 enqueue
Enqueue the new job
=cut
sub enqueue {
my ( $self, $args ) = @_;
$self->SUPER::enqueue(
{
job_size => 1,
job_args => {%$args},
job_queue => 'long_tasks',
}
);
}
1;