X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FStats.pm;h=6afb538092218fff114507194c74c3433f589bce;hb=eded6edacc5e3bf8dd0be21ed05842c3b78aadce;hp=86ee905cc5560e5032fa0752b3c4a414496d9ec4;hpb=0cc091d22311ce204228904b7b409598d480cdd7;p=koha-ffzg.git diff --git a/C4/Stats.pm b/C4/Stats.pm index 86ee905cc5..6afb538092 100644 --- a/C4/Stats.pm +++ b/C4/Stats.pm @@ -1,33 +1,40 @@ package C4::Stats; -# $Id$ # Copyright 2000-2002 Katipo Communications # # 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 2 of the License, or (at your option) any later -# version. +# 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. +# 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., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; -require Exporter; -use DBI; +use Modern::Perl; +use Carp qw( croak ); use C4::Context; -use vars qw($VERSION @ISA @EXPORT); -# set the version for version checking -$VERSION = $VERSION = do { my @v = '$Revision$' =~ /\d+/g; - shift(@v) . "." . join("_", map {sprintf "%03d", $_ } @v); };; +use Koha::DateUtils qw( dt_from_string ); +use Koha::Statistics; +use Koha::PseudonymizedTransactions; + +our (@ISA, @EXPORT_OK); +BEGIN { + require Exporter; + @ISA = qw(Exporter); + @EXPORT_OK = qw( + UpdateStats + ); +} + =head1 NAME @@ -39,220 +46,113 @@ C4::Stats - Update Koha statistics (log) =head1 DESCRIPTION -The C<&UpdateStats> function adds an entry to the statistics table in -the Koha database, which acts as an activity log. +The functions of this module deals with statistics table of Koha database. =head1 FUNCTIONS -=over 2 - -=cut - -@ISA = qw(Exporter); -@EXPORT = qw(&UpdateStats &statsreport &TotalOwing -&TotalPaid &getcharges &Getpaidbranch &unfilledreserves &getcredits); +=head2 UpdateStats -=item UpdateStats + &UpdateStats($params); - &UpdateStats($env, $branch, $type, $value, $other, $itemnumber, - $itemtype, $borrowernumber); +Adds an entry to the statistics table in the Koha database, which acts as an activity log. -Adds a line to the statistics table of the Koha database. In effect, -it logs an event. +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 -C<$branch>, C<$type>, C<$value>, C<$other>, C<$itemnumber>, -C<$itemtype>, and C<$borrowernumber> correspond to the fields of the -statistics table in the Koha database. +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. -If C<$branch> is the empty string, the branch code will be taken from -C<$env-E{branchcode}>. - -C<$env-E{usercode}> specifies the value of the C field. +Returns undef if no C<$param> is given =cut -#' -sub UpdateStats { - #module to insert stats data into stats table - my ($env,$branch,$type,$amount,$other,$itemnum,$itemtype,$borrowernumber,$accountno)=@_; - my $dbh = C4::Context->dbh; - if ($branch eq ''){ - $branch=$env->{'branchcode'}; - } - my $user = $env->{'usercode'}; - my $organisation = $env->{'organisation'}; - print $borrowernumber; - # FIXME - Use $dbh->do() instead - my $sth=$dbh->prepare("Insert into statistics (datetime,branch,type,usercode,value, - other,itemnumber,itemtype,borrowernumber,proccode,associatedborrower) values (now(),?,?,?,?,?,?,?,?,?,?)"); - $sth->execute($branch,$type,$user,$amount,$other,$itemnum,$itemtype,$borrowernumber,$accountno,$organisation); - $sth->finish; -} - -# Otherwise, it'd need a POD. -sub TotalPaid { - my ($time,$time2)=@_; - $time2=$time unless $time2; - my $dbh = C4::Context->dbh; - - - #my $query="Select * from accountlines,borrowers where (accounttype = 'Pay' or accounttype ='W') - # and accountlines.borrowernumber = borrowers.borrowernumber"; - #my @bind = (); - #if ($time eq 'today'){ - # $query .= " and date = now()"; - #} else { - # $query.=" and date>=? and date<=?"; - # @bind = ($time,$time2); - #} - - my $query="Select * from statistics,borrowers - where statistics.borrowernumber= borrowers.borrowernumber - and (statistics.type='payment' or statistics.type='writeoff') "; - if ($time eq 'today'){ - $query=$query." and datetime = now()"; - } else { - $query.=" and datetime > '$time'"; - } - - - # $query.=" order by timestamp"; - - # print $query; - - my $sth=$dbh->prepare($query); - - $sth->execute(); - # $sth->execute(@bind); - my @results; - my $i=0; - while (my $data=$sth->fetchrow_hashref){ - $results[$i]=$data; - $i++; - } - $sth->finish; - # print $query; - return(@results); -} -# Otherwise, it needs a POD. -sub getcharges{ - my($borrowerno,$timestamp,$accountno)=@_; - my $dbh = C4::Context->dbh; - my $timestamp2=$timestamp-1; - my $query=""; - my $sth; - - # getcharges is now taking accountno. as an argument - if ($accountno){ - $sth=$dbh->prepare("Select * from accountlines where borrowernumber=? - and accountno = ?"); - $sth->execute($borrowerno,$accountno); - - # this bit left in for old 2 arg usage of getcharges - } else { - $sth=$dbh->prepare("Select * from accountlines where borrowernumber=? - and timestamp = ? and accounttype <> 'Pay' and - accounttype <> 'W'"); - $sth->execute($borrowerno,$timestamp); - } - - # print $query,"
"; - my $i=0; - my @results; - while (my $data=$sth->fetchrow_hashref){ - # if ($data->{'timestamp'} == $timestamp){ - $results[$i]=$data; - $i++; - # } - } - return(@results); -} - -# Otherwise, it needs a POD. -sub getcredits{ - my ($date,$date2)=@_; - my $dbh = C4::Context->dbh; - - #takes date converts to timestamps - my $padding="000000"; - (my $a, my $b, my $c) = unpack("A4 x1 A2 x1 A2", $date); - (my $x, my $y, my $z) = unpack("A4 x1 A2 x1 A2", $date2); - my $timestamp = $a.$b.$c.$padding; - my $timestamp2 = $x.$y.$z.$padding; - - my $sth=$dbh->prepare("Select * from accountlines,borrowers where (((accounttype = 'LR') or (accounttype <> 'Pay')) - and amount < 0 and accountlines.borrowernumber = borrowers.borrowernumber - and timestamp >=? and timestamp execute($timestamp, $timestamp2); - - my $i=0; - my @results; - while (my $data=$sth->fetchrow_hashref){ - $results[$i]=$data; - $i++; +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); + my @allowed_circulation_types = qw (renew issue localuse return onsite_checkout recall); + 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 $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, } - return(@results); -} - + )->store; - -# Otherwise, this needs a POD. -sub Getpaidbranch{ - my($date,$borrno)=@_; - my $dbh = C4::Context->dbh; - my $sth=$dbh->prepare("select * from statistics where type='payment' and datetime >? and borrowernumber=?"); - $sth->execute($date,$borrno); - # print $query; - my $data=$sth->fetchrow_hashref; - $sth->finish; - return($data->{'branch'}); -} - -# FIXME - This is only used in reservereport.pl and reservereport.xls, -# neither of which is used. -# Otherwise, it needs a POD. -sub unfilledreserves { - my $dbh = C4::Context->dbh; - my $sth=$dbh->prepare("select *,biblio.title from reserves,reserveconstraints,biblio,borrowers,biblioitems where (found <> 'F' or - found is NULL) and cancellationdate - is NULL and biblio.biblionumber=reserves.biblionumber and - reserves.constrainttype='o' - and (reserves.biblionumber=reserveconstraints.biblionumber - and reserves.borrowernumber=reserveconstraints.borrowernumber) - and - reserves.borrowernumber=borrowers.borrowernumber and - biblioitems.biblioitemnumber=reserveconstraints.biblioitemnumber order by - biblio.title,reserves.reservedate"); - $sth->execute; - my $i=0; - my @results; - while (my $data=$sth->fetchrow_hashref){ - $results[$i]=$data; - $i++; - } - $sth->finish; - $sth=$dbh->prepare("select *,biblio.title from reserves,biblio,borrowers where (found <> 'F' or found is NULL) and cancellationdate - is NULL and biblio.biblionumber=reserves.biblionumber and reserves.constrainttype='a' and - reserves.borrowernumber=borrowers.borrowernumber - order by - biblio.title,reserves.reservedate"); - $sth->execute; - while (my $data=$sth->fetchrow_hashref){ - $results[$i]=$data; - $i++; - } - $sth->finish; - return($i,\@results); + 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); } 1; __END__ -=back - =head1 AUTHOR -Koha Developement team +Koha Development Team =cut