1 package Koha::REST::V1::ERM::UsageDataProviders;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 use Mojo::Base 'Mojolicious::Controller';
22 use Koha::ERM::UsageDataProviders;
23 use Koha::ERM::MonthlyUsages;
25 use Scalar::Util qw( blessed );
26 use Try::Tiny qw( catch try );
37 my $c = shift->openapi->valid_input or return;
41 my $usage_data_providers_set = Koha::ERM::UsageDataProviders->new;
42 my $usage_data_providers =
43 $c->objects->search($usage_data_providers_set);
44 if ( $c->validation->output->{"x-koha-embed"}[0]
45 && $c->validation->output->{"x-koha-embed"}[0] eq 'counter_files' )
47 foreach my $provider (@$usage_data_providers) {
48 my $title_dates = _get_earliest_and_latest_dates( 'TR',
49 $provider->{erm_usage_data_provider_id} );
50 $provider->{earliest_title} =
51 $title_dates->{earliest_date}
52 ? $title_dates->{earliest_date}
54 $provider->{latest_title} =
55 $title_dates->{latest_date}
56 ? $title_dates->{latest_date}
59 my $platform_dates = _get_earliest_and_latest_dates( 'PR',
60 $provider->{erm_usage_data_provider_id} );
61 $provider->{earliest_platform} =
62 $platform_dates->{earliest_date}
63 ? $platform_dates->{earliest_date}
65 $provider->{latest_platform} =
66 $platform_dates->{latest_date}
67 ? $platform_dates->{latest_date}
70 my $item_dates = _get_earliest_and_latest_dates( 'IR',
71 $provider->{erm_usage_data_provider_id} );
72 $provider->{earliest_item} =
73 $item_dates->{earliest_date}
74 ? $item_dates->{earliest_date}
76 $provider->{latest_item} =
77 $item_dates->{latest_date} ? $item_dates->{latest_date} : '';
79 my $database_dates = _get_earliest_and_latest_dates( 'DR',
80 $provider->{erm_usage_data_provider_id} );
81 $provider->{earliest_database} =
82 $database_dates->{earliest_date}
83 ? $database_dates->{earliest_date}
85 $provider->{latest_database} =
86 $database_dates->{latest_date}
87 ? $database_dates->{latest_date}
92 return $c->render( status => 200, openapi => $usage_data_providers );
95 $c->unhandled_exception($_);
102 Controller function that handles retrieving a single Koha::ERM::UsageDataProvider object
107 my $c = shift->openapi->valid_input or return;
110 my $usage_data_provider_id =
111 $c->validation->param('erm_usage_data_provider_id');
112 my $usage_data_provider =
113 $c->objects->find( Koha::ERM::UsageDataProviders->search,
114 $usage_data_provider_id );
116 unless ($usage_data_provider) {
119 openapi => { error => "Usage data provider not found" }
125 openapi => $usage_data_provider
129 $c->unhandled_exception($_);
135 Controller function that handles adding a new Koha::ERM::UsageDataProvider object
140 my $c = shift->openapi->valid_input or return;
143 Koha::Database->new->schema->txn_do(
146 my $body = $c->validation->param('body');
148 my $usage_data_provider =
149 Koha::ERM::UsageDataProvider->new_from_api($body)->store;
151 $c->res->headers->location( $c->req->url->to_string . '/'
152 . $usage_data_provider->erm_usage_data_provider_id );
155 openapi => $usage_data_provider->to_api
162 my $to_api_mapping = Koha::ERM::UsageDataProvider->new->to_api_mapping;
165 if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
169 { error => $_->error, conflict => $_->duplicate_id }
172 elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
177 . $to_api_mapping->{ $_->broken_fk }
182 elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
187 . $to_api_mapping->{ $_->parameter }
192 elsif ( $_->isa('Koha::Exceptions::PayloadTooLarge') ) {
195 openapi => { error => $_->error }
200 $c->unhandled_exception($_);
206 Controller function that handles updating a Koha::ERM::UsageDataProvider object
211 my $c = shift->openapi->valid_input or return;
213 my $usage_data_provider_id =
214 $c->validation->param('erm_usage_data_provider_id');
215 my $usage_data_provider =
216 Koha::ERM::UsageDataProviders->find($usage_data_provider_id);
218 unless ($usage_data_provider) {
221 openapi => { error => "Usage data provider not found" }
226 Koha::Database->new->schema->txn_do(
229 my $body = $c->validation->param('body');
231 $usage_data_provider->set_from_api($body)->store;
233 $c->res->headers->location( $c->req->url->to_string . '/'
234 . $usage_data_provider->erm_usage_data_provider_id );
237 openapi => $usage_data_provider->to_api
243 my $to_api_mapping = Koha::ERM::UsageDataProvider->new->to_api_mapping;
246 if ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
251 . $to_api_mapping->{ $_->broken_fk }
256 elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
261 . $to_api_mapping->{ $_->parameter }
266 elsif ( $_->isa('Koha::Exceptions::PayloadTooLarge') ) {
269 openapi => { error => $_->error }
274 $c->unhandled_exception($_);
283 my $c = shift->openapi->valid_input or return;
285 my $usage_data_provider_id =
286 $c->validation->param('erm_usage_data_provider_id');
287 my $usage_data_provider =
288 Koha::ERM::UsageDataProviders->find($usage_data_provider_id);
289 unless ($usage_data_provider) {
292 openapi => { error => "Usage data provider not found" }
297 $usage_data_provider->delete;
304 $c->unhandled_exception($_);
313 my $c = shift->openapi->valid_input or return;
315 my $body = $c->validation->param('body');
316 my $begin_date = $body->{begin_date};
317 my $end_date = $body->{end_date};
319 unless ( $begin_date lt $end_date ) {
322 openapi => { error => "Begin date must be before end date" }
326 my $udprovider = Koha::ERM::UsageDataProviders->find( $c->validation->param('erm_usage_data_provider_id') );
328 unless ($udprovider) {
331 openapi => { error => "Usage data provider not found" }
336 my $jobs = $udprovider->run( { begin_date => $begin_date, end_date => $end_date } );
340 openapi => { jobs => [ @{$jobs} ] }
344 $c->unhandled_exception($_);
348 =head3 test_connection
352 sub test_connection {
353 my $c = shift->openapi->valid_input or return;
355 my $udprovider = Koha::ERM::UsageDataProviders->find( $c->validation->param('erm_usage_data_provider_id') );
357 unless ($udprovider) {
360 openapi => { error => "Usage data provider not found" }
364 my $service_active = $udprovider->test_connection;
367 openapi => $service_active
371 $c->unhandled_exception($_);
375 =head3 _get_earliest_and_latest_dates
379 sub _get_earliest_and_latest_dates {
380 my ( $report_type, $id ) = @_;
382 my @years = Koha::ERM::MonthlyUsages->search(
384 usage_data_provider_id => $id,
385 report_type => { -like => "%$report_type%" }
389 { earliestYear => { min => "year" } },
390 { latestYear => { max => "year" } },
394 if($years[0][0]->{earliestYear}) {
395 my @earliest_month = Koha::ERM::MonthlyUsages->search(
397 usage_data_provider_id => $id,
398 report_type => { -like => "%$report_type%" },
399 year => $years[0][0]->{earliestYear},
403 { month => { min => "month" } },
407 my @latest_month = Koha::ERM::MonthlyUsages->search(
409 usage_data_provider_id => $id,
410 report_type => { -like => "%$report_type%" },
411 year => $years[0][0]->{latestYear},
415 { month => { max => "month" } },
420 $earliest_month[0][0]->{month} = _format_month("0$earliest_month[0][0]->{month}");
421 $latest_month[0][0]->{month} = _format_month("0$latest_month[0][0]->{month}");
423 my $earliest_date = "$years[0][0]->{earliestYear}-$earliest_month[0][0]->{month}";
424 my $latest_date = "$years[0][0]->{latestYear}-$latest_month[0][0]->{month}";
427 earliest_date => $earliest_date,
428 latest_date => $latest_date,
445 $month = length($month) eq 2 ? $month : "0$month";