From a0d3179d2a670ea2ed8d52d1c22a0c6809832b4c Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Wed, 26 Apr 2023 15:58:13 +0200 Subject: [PATCH] Bug 33608: Redirect UpdateStats to Koha namespace Content-Type: text/plain; charset=utf-8 Moving code to Koha::Statistic->new and ->insert. Polishing code a bit further in next patch. Test plan: Run t/db_dependent/Stats.t Run t/db_dependent/Koha/Statistics.t Run t/db_dependent/Koha/Pseudonymization.t Signed-off-by: Marcel de Rooy --- C4/Stats.pm | 110 ++----------------- Koha/Statistic.pm | 142 ++++++++++++++++++++++++- t/db_dependent/Koha/Pseudonymization.t | 1 + 3 files changed, 145 insertions(+), 108 deletions(-) diff --git a/C4/Stats.pm b/C4/Stats.pm index 7d67c8a18b..3e6977947e 100644 --- a/C4/Stats.pm +++ b/C4/Stats.pm @@ -1,6 +1,5 @@ package C4::Stats; - # Copyright 2000-2002 Katipo Communications # # This file is part of Koha. @@ -19,12 +18,8 @@ package C4::Stats; # along with Koha; if not, see . use Modern::Perl; -use Carp qw( croak ); -use C4::Context; -use Koha::DateUtils qw( dt_from_string ); -use Koha::Statistics; -use Koha::PseudonymizedTransactions; +use Koha::Statistic; our (@ISA, @EXPORT_OK); BEGIN { @@ -35,14 +30,13 @@ BEGIN { ); } - =head1 NAME C4::Stats - Update Koha statistics (log) =head1 SYNOPSIS - use C4::Stats; + use C4::Stats; =head1 DESCRIPTION @@ -52,105 +46,16 @@ The functions of this module deals with statistics table of Koha database. =head2 UpdateStats - &UpdateStats($params); - -Adds an entry to the statistics table in the Koha database, which acts as an activity log. + C4::Stats::UpdateStats($params); -C<$params> is an hashref whose expected keys are: - branch : the branch where the transaction occurred - type : the type of transaction (renew, issue, localuse, return, writeoff, payment - itemnumber : the itemnumber of the item - borrowernumber : the borrowernumber of the patron - amount : the amount of the transaction - other : sipmode - itemtype : the type of the item - ccode : the collection code of the item - categorycode : the categorycode of the patron - interface : the context this action was taken in - -type key is mandatory. -For types used in C4::Circulation (renew,issue,localuse,return), the following other keys are mandatory: -branch, borrowernumber, itemnumber, ccode, itemtype -For types used in C4::Accounts (writeoff, payment), the following other keys are mandatory: -branch, borrowernumber, itemnumber, ccode, itemtype -If an optional key is not provided, the value '' is used for this key. - -Returns undef if no C<$param> is given + This is a (legacy) alias for Koha::Statistic->insert($params). + Please see Koha::Statistic module. =cut sub UpdateStats { - my ($params) = @_; -# make some controls - return () if ! defined $params; -# change these arrays if new types of transaction or new parameters are allowed - my @allowed_keys = qw (type branch amount other itemnumber itemtype borrowernumber ccode location categorycode interface); - my @allowed_circulation_types = qw (renew issue localuse return onsite_checkout recall item_found item_lost); - my @allowed_accounts_types = qw (writeoff payment); - my @circulation_mandatory_keys = qw (type branch borrowernumber itemnumber ccode itemtype); - my @accounts_mandatory_keys = qw (type branch borrowernumber amount); - - my @mandatory_keys = (); - if (! exists $params->{type} or ! defined $params->{type}) { - croak ("UpdateStats did not received type param"); - } - if (grep ($_ eq $params->{type}, @allowed_circulation_types )) { - @mandatory_keys = @circulation_mandatory_keys; - } elsif (grep ($_ eq $params->{type}, @allowed_accounts_types )) { - @mandatory_keys = @accounts_mandatory_keys; - } else { - croak ("UpdateStats received forbidden type param: ".$params->{type}); - } - my @missing_params = (); - for my $mykey (@mandatory_keys ) { - push @missing_params, $mykey if !grep (/^$mykey/, keys %$params); - } - if (scalar @missing_params > 0 ) { - croak ("UpdateStats did not received mandatory param(s): ".join (", ",@missing_params )); - } - my @invalid_params = (); - for my $myparam (keys %$params ) { - push @invalid_params, $myparam unless grep { $_ eq $myparam } @allowed_keys; - } - if (scalar @invalid_params > 0 ) { - croak ("UpdateStats received invalid param(s): ".join (", ",@invalid_params )); - } -# get the parameters - my $branch = $params->{branch}; - my $type = $params->{type}; - my $borrowernumber = exists $params->{borrowernumber} ? $params->{borrowernumber} : ''; - my $itemnumber = exists $params->{itemnumber} ? $params->{itemnumber} : undef; - my $amount = exists $params->{amount} ? $params->{amount} : 0; - my $other = exists $params->{other} ? $params->{other} : ''; - my $itemtype = exists $params->{itemtype} ? $params->{itemtype} : ''; - my $location = exists $params->{location} ? $params->{location} : undef; - my $ccode = exists $params->{ccode} ? $params->{ccode} : ''; - my $categorycode = exists $params->{categorycode} ? $params->{categorycode} : undef; - my $interface = exists $params->{interface} ? $params->{interface} : undef; - - my $dtf = Koha::Database->new->schema->storage->datetime_parser; - my $statistic = Koha::Statistic->new( - { - datetime => $dtf->format_datetime( dt_from_string ), - branch => $branch, - type => $type, - value => $amount, - other => $other, - itemnumber => $itemnumber, - itemtype => $itemtype, - location => $location, - borrowernumber => $borrowernumber, - ccode => $ccode, - categorycode => $categorycode, - interface => $interface, - } - )->store; - - Koha::PseudonymizedTransaction->new_from_statistic($statistic)->store - if C4::Context->preference('Pseudonymization') - && $borrowernumber # Not a real transaction if the patron does not exist - # For instance can be a transfer, or hold trigger - && grep { $_ eq $params->{type} } qw(renew issue return onsite_checkout); + my $params = shift; + Koha::Statistic->insert($params); } 1; @@ -161,4 +66,3 @@ __END__ Koha Development Team =cut - diff --git a/Koha/Statistic.pm b/Koha/Statistic.pm index 397e440cdb..ba19c53826 100644 --- a/Koha/Statistic.pm +++ b/Koha/Statistic.pm @@ -17,25 +17,157 @@ package Koha::Statistic; use Modern::Perl; - +use C4::Context; use Koha::Database; +use Koha::DateUtils qw/dt_from_string/; use Koha::Items; +use Koha::PseudonymizedTransaction; use base qw(Koha::Object); +our @allowed_accounts_types = qw( writeoff payment ); +our @allowed_circulation_types = qw( renew issue localuse return onsite_checkout recall item_found item_lost ); +our @mandatory_accounts_keys = qw( type branch borrowernumber amount ); +our @mandatory_circulation_keys = qw( type branch borrowernumber itemnumber ccode itemtype ); + =head1 NAME Koha::Statistic - Koha Statistic Object class =head1 API -=head2 Class methods +=head2 METHODS + +=head3 new + + my $record = Koha::Statistic->new( $params ); + + C<$params> is an hashref whose expected keys are: + branch : transaction branch + type : transaction type + itemnumber : itemnumber + borrowernumber : borrowernumber + categorycode : patron category + amount : transaction amount + other : sipmode + itemtype : itemtype + ccode : collection code + interface : the context this action was taken in + + The type key is mandatory, see @Koha::Statistic::allowed_account_types or + @Koha::Statistic::allowed_circulation_types. + Some keys are mandatory, depending on type. See @mandatory_accounts_keys + or @mandatory_circulation_keys. + + The method throws an exception when given bad data, otherwise returns a + Koha::Statistic object, which is not yet stored. + +=cut + +sub new { + my ( $class, $params ) = @_; +# make some controls + return () if ! defined $params; +# change these arrays if new types of transaction or new parameters are allowed + my @allowed_keys = qw (type branch amount other itemnumber itemtype borrowernumber ccode location categorycode interface); + + my @mandatory_keys = (); + if (! exists $params->{type} or ! defined $params->{type}) { + croak ("UpdateStats did not received type param"); + } + if (grep ($_ eq $params->{type}, @allowed_circulation_types )) { + @mandatory_keys = @mandatory_circulation_keys; + } elsif (grep ($_ eq $params->{type}, @allowed_accounts_types )) { + @mandatory_keys = @mandatory_accounts_keys; + } else { + croak ("UpdateStats received forbidden type param: ".$params->{type}); + } + my @missing_params = (); + for my $mykey (@mandatory_keys ) { + push @missing_params, $mykey if !grep (/^$mykey/, keys %$params); + } + if (scalar @missing_params > 0 ) { + croak ("UpdateStats did not received mandatory param(s): ".join (", ",@missing_params )); + } + my @invalid_params = (); + for my $myparam (keys %$params ) { + push @invalid_params, $myparam unless grep { $_ eq $myparam } @allowed_keys; + } + if (scalar @invalid_params > 0 ) { + croak ("UpdateStats received invalid param(s): ".join (", ",@invalid_params )); + } +# get the parameters + my $branch = $params->{branch}; + my $type = $params->{type}; + my $borrowernumber = exists $params->{borrowernumber} ? $params->{borrowernumber} : ''; + my $itemnumber = exists $params->{itemnumber} ? $params->{itemnumber} : undef; + my $amount = exists $params->{amount} ? $params->{amount} : 0; + my $other = exists $params->{other} ? $params->{other} : ''; + my $itemtype = exists $params->{itemtype} ? $params->{itemtype} : ''; + my $location = exists $params->{location} ? $params->{location} : undef; + my $ccode = exists $params->{ccode} ? $params->{ccode} : ''; + my $categorycode = exists $params->{categorycode} ? $params->{categorycode} : undef; + my $interface = exists $params->{interface} ? $params->{interface} : undef; + + my $dtf = Koha::Database->new->schema->storage->datetime_parser; + return $class->SUPER::new( + { + datetime => $dtf->format_datetime( dt_from_string ), + branch => $branch, + type => $type, + value => $amount, + other => $other, + itemnumber => $itemnumber, + itemtype => $itemtype, + location => $location, + borrowernumber => $borrowernumber, + categorycode => $categorycode, + ccode => $ccode, + interface => $interface, + } + ); +} + +=head3 store + + $statistic->store; + + This call includes pseudonymization if enabled. + +=cut + +sub store { + my ( $self ) = @_; + $self->SUPER::store; + Koha::PseudonymizedTransaction->new_from_statistic($self)->store + if C4::Context->preference('Pseudonymization') + && $self->borrowernumber # Not a real transaction if the patron does not exist + # For instance can be a transfer, or hold trigger + && grep { $_ eq $self->type } qw(renew issue return onsite_checkout); + return $self; +} + +=head3 insert + + Koha::Statistic->insert( $params ); + + This is a shorthand for ->new($params)->store. + It is the new equivalent for the legacy C4::Stats::UpdateStats call. + +=cut + +sub insert { + my ( $class, $params ) = @_; + my $statistic = $class->new($params) or return; + $statistic->store; + return $statistic; +} =head3 item -my $item = $statistic->item; + my $item = $statistic->item; -Return the item associated to this statistic. + Return the item associated to this statistic. =cut @@ -44,7 +176,7 @@ sub item { return Koha::Items->find( $self->itemnumber ); } -=head2 Internal methods +=head2 INTERNAL METHODS =head3 _type diff --git a/t/db_dependent/Koha/Pseudonymization.t b/t/db_dependent/Koha/Pseudonymization.t index 9ee23ceaa3..e7a3e1dd18 100755 --- a/t/db_dependent/Koha/Pseudonymization.t +++ b/t/db_dependent/Koha/Pseudonymization.t @@ -29,6 +29,7 @@ use Koha::Database; use Koha::DateUtils qw( dt_from_string ); use Koha::Patrons; use Koha::PseudonymizedTransactions; +use Koha::Statistics; use t::lib::TestBuilder; use t::lib::Mocks; -- 2.30.2