3 #package to deal with Logging Actions in DB
6 # Copyright 2000-2002 Katipo Communications
7 # Copyright 2011 MJ Ray and software.coop
9 # This file is part of Koha.
11 # Koha is free software; you can redistribute it and/or modify it under the
12 # terms of the GNU General Public License as published by the Free Software
13 # Foundation; either version 2 of the License, or (at your option) any later
16 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
17 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
18 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License along
21 # with Koha; if not, write to the Free Software Foundation, Inc.,
22 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 use C4
::Dates
qw(format_date);
30 use vars
qw($VERSION @ISA @EXPORT);
33 # set the version for version checking
37 @EXPORT = qw(&logaction &GetLogStatus &displaylog &GetLogs);
42 C4::Log - Koha Log Facility functions
50 The functions in this module perform various functions in order to log all the operations done on the Database, including deleting and undeleting books, adding/editing members, etc.
58 &logaction($modulename, $actionname, $objectnumber, $infos);
60 Adds a record into action_logs table to report the different changes upon the database.
61 Each log entry includes the number of the user currently logged in. For batch
62 jobs, which operate without authenticating a user and setting up a session, the user
63 number is set to 0, which is the same as the superlibrarian's number.
69 my ($modulename, $actionname, $objectnumber, $infos)=@_;
71 # Get ID of logged in user. if called from a batch job,
72 # no user session exists and C4::Context->userenv() returns
74 my $userenv = C4
::Context
->userenv();
75 my $usernumber = (ref($userenv) eq 'HASH') ?
$userenv->{'number'} : 0;
77 my $dbh = C4
::Context
->dbh;
78 my $sth=$dbh->prepare("Insert into action_logs (timestamp,user,module,action,object,info) values (now(),?,?,?,?,?)");
79 $sth->execute($usernumber,$modulename,$actionname,$objectnumber,$infos);
85 $status = GetLogStatus;
87 C<$status> is a hasref like this example:
100 $hash{BorrowersLog
} = C4
::Context
->preference("BorrowersLog");
101 $hash{CataloguingLog
} = C4
::Context
->preference("CataloguingLog");
102 $hash{IssueLog
} = C4
::Context
->preference("IssueLog");
103 $hash{ReturnLog
} = C4
::Context
->preference("ReturnLog");
104 $hash{SubscriptionLog
} = C4
::Context
->preference("SubscriptionLog");
105 $hash{LetterLog
} = C4
::Context
->preference("LetterLog");
106 $hash{FinesLog
} = C4
::Context
->preference("FinesLog");
112 &displaylog($modulename, @filters);
113 $modulename is the name of the module on which the user wants to display logs
114 @filters is an optional table of hash containing :
115 - name : the name of the variable to filter
116 - value : the value of the filter.... May be with * joker
118 returns a table of hash containing who did what on which object at what time
124 my ($modulename, @filters) = @_;
125 my $dbh = C4
::Context
->dbh;
127 SELECT action_logs
.timestamp
, action_logs
.action
, action_logs
.info
,
128 borrowers
.cardnumber
, borrowers
.surname
, borrowers
.firstname
, borrowers
.userid
,
129 biblio
.biblionumber
, biblio
.title
, biblio
.author
131 LEFT JOIN borrowers ON borrowers
.borrowernumber
=action_logs
.user
132 LEFT JOIN biblio ON action_logs
.object
=biblio
.biblionumber
133 WHERE action_logs
.module
= 'cataloguing'
136 if ($modulename eq "catalogue" or $modulename eq "acqui") {
138 user
=> 'borrowers.surname',
139 title
=> 'biblio.title',
140 author
=> 'biblio.author',
142 } elsif ($modulename eq "members") {
144 SELECT action_logs
.timestamp
, action_logs
.action
, action_logs
.info
,
145 borrowers
.cardnumber
, borrowers
.surname
, borrowers
.firstname
, borrowers
.userid
,
146 bor2
.cardnumber
, bor2
.surname
, bor2
.firstname
, bor2
.userid
148 LEFT JOIN borrowers ON borrowers
.borrowernumber
=action_logs
.user
149 LEFT JOIN borrowers as bor2 ON action_logs
.object
=bor2
.borrowernumber
150 WHERE action_logs
.module
= 'members'
153 user
=> 'borrowers.surname',
154 surname
=> 'bor2.surname',
155 firstname
=> 'bor2.firstname',
156 cardnumber
=> 'bor2.cardnumber',
163 foreach my $filter (@filters) {
164 my $tempname = $filter->{name
} or next;
165 (grep {/^$tempname$/} keys %filtermap) or next;
166 $filter->{value
} =~ s/\*/%/g;
167 $strsth .= " AND " . $filtermap{$tempname} . " LIKE " . $filter->{value
};
170 my $sth=$dbh->prepare($strsth);
175 while (my $data = $sth->fetchrow_hashref){
176 $data->{hilighted
} = ($hilighted>0);
177 $data->{info
} =~ s/\n/<br\/>/g
;
178 $data->{day
} = format_date
($data->{timestamp
});
179 push @results, $data;
181 $hilighted = -$hilighted;
183 return ($count, \
@results);
188 $logs = GetLogs($datefrom,$dateto,$user,\@modules,$action,$object,$info);
191 C<$logs> is a ref to a hash which containts all columns from action_logs
196 my $datefrom = shift;
204 my $iso_datefrom = C4
::Dates
->new($datefrom,C4
::Context
->preference("dateformat"))->output('iso');
205 my $iso_dateto = C4
::Dates
->new($dateto,C4
::Context
->preference("dateformat"))->output('iso');
207 my $dbh = C4
::Context
->dbh;
215 $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') >= \"".$iso_datefrom."\" " if $iso_datefrom; #fix me - mysql specific
216 $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') <= \"".$iso_dateto."\" " if $iso_dateto;
218 $query .= " AND user = ? ";
219 push(@parameters,$user);
221 if($modules && scalar(@
$modules)) {
222 $query .= " AND module IN (".join(",",map {"?"} @
$modules).") ";
223 push(@parameters,@
$modules);
225 if($action && scalar(@
$action)) {
226 $query .= " AND action IN (".join(",",map {"?"} @
$action).") ";
227 push(@parameters,@
$action);
230 $query .= " AND object = ? ";
231 push(@parameters,$object);
234 $query .= " AND info LIKE ? ";
235 push(@parameters,"%".$info."%");
238 my $sth = $dbh->prepare($query);
239 $sth->execute(@parameters);
242 while( my $row = $sth->fetchrow_hashref ) {
243 $row->{$row->{module
}} = 1;
256 Koha Development Team <http://koha-community.org/>