Merge remote-tracking branch 'origin/new/bug_7729'
[koha.git] / members / statistics.pl
1 #!/usr/bin/perl
2
3 # Copyright 2012 BibLibre
4 # This file is part of Koha.
5 #
6 # Koha is free software; you can redistribute it and/or modify it under the
7 # terms of the GNU General Public License as published by the Free Software
8 # Foundation; either version 2 of the License, or (at your option) any later
9 # version.
10 #
11 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
12 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License along with
16 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
17 # Suite 330, Boston, MA  02111-1307 USA
18
19
20 =head1 members/statistics.pl
21   Generate statistic issues for a member
22 =cut
23
24 use Modern::Perl;
25
26 use CGI;
27 use C4::Auth;
28 use C4::Branch;
29 use C4::Context;
30 use C4::Members;
31 use C4::Members::Statistics;
32 use C4::Output;
33
34 my $input = new CGI;
35
36 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
37     {   template_name   => "members/statistics.tmpl",
38         query           => $input,
39         type            => "intranet",
40         authnotrequired => 0,
41         flagsrequired   => { borrowers => 1 },
42         debug           => 1,
43     }
44 );
45
46 my $borrowernumber = $input->param('borrowernumber');
47
48 # Set informations for the patron
49 my $borrower = GetMemberDetails( $borrowernumber, 0 );
50 if ( not defined $borrower ) {
51     $template->param (unknowuser => 1);
52     output_html_with_http_headers $input, $cookie, $template->output;
53     exit;
54 }
55
56 foreach my $key ( keys %$borrower ) {
57     $template->param( $key => $borrower->{$key} );
58 }
59
60 # Construct column names
61 my $fields = C4::Context->preference('StatisticsFields') || 'location|itype|ccode';
62 our @statistic_column_names = split '\|', $fields;
63 our @value_column_names = ( 'count_precedent_state', 'count_total_issues_today', 'count_total_issues_returned_today' );
64 our @column_names = ( @statistic_column_names, @value_column_names );
65
66 # Get statistics
67 my $precedent_state = GetPrecedentStateByBorrower( $borrowernumber );
68 my $total_issues_today = GetTotalIssuesTodayByBorrower( $borrowernumber );
69 my $total_issues_returned_today = GetTotalIssuesReturnedTodayByBorrower( $borrowernumber );
70 my $r = merge (
71     @$precedent_state, @$total_issues_today, @$total_issues_returned_today
72 );
73 add_actual_state( $r );
74 my ( $total, $datas ) = build_array( $r );
75
76 # Gettings sums
77 my $count_total_precedent_state = $total->{count_precedent_state} || 0;
78 my $count_total_issues = $total->{count_total_issues_today} || 0;
79 my $count_total_issues_returned = $total->{count_total_issues_returned_today} || 0;
80 my $count_total_actual_state = ($count_total_precedent_state - $count_total_issues_returned + $count_total_issues);
81
82 $template->param(
83     statisticsview => 1,
84     datas          => $datas,
85     column_names   => \@statistic_column_names,
86     length_keys    => scalar( @statistic_column_names),
87     count_total_issues => $count_total_issues,
88     count_total_issues_returned => $count_total_issues_returned,
89     count_total_precedent_state => $count_total_precedent_state,
90     count_total_actual_state => $count_total_actual_state,
91 );
92
93 output_html_with_http_headers $input, $cookie, $template->output;
94
95
96 =head1 FUNCTIONS
97
98 =head2 add_actual_state
99   Add a 'count_actual_state' key in all hashes
100   count_actual_state = count_precedent_state - count_total_issues_returned_today + count_total_issues_today
101 =cut
102 sub add_actual_state {
103     my ( $array ) = @_;
104     for my $hash ( @$array ) {
105         $hash->{count_actual_state} = ( $hash->{count_precedent_state} // 0 ) - ( $hash->{count_total_issues_returned_today} // 0 ) + ( $hash->{count_total_issues_today} // 0 );
106     }
107 }
108
109 =head2 build_array
110   Build a new array containing values of hashes.
111   It used by template whitch display silly values.
112   ex:
113     $array = [
114       {
115         'count_total_issues_returned_today' => 1,
116         'ccode' => 'ccode',
117         'count_actual_state' => 1,
118         'count_precedent_state' => 1,
119         'homebranch' => 'homebranch',
120         'count_total_issues_today' => 1,
121         'itype' => 'itype'
122       }
123     ];
124   and returns:
125     [
126       [
127         'homebranch',
128         'itype',
129         'ccode',
130         1,
131         1,
132         1,
133         1
134       ]
135     ];
136
137 =cut
138 sub build_array {
139     my ( $array ) = @_;
140     my ( @r, $total );
141     for my $hash ( @$array) {
142         my @line;
143         for my $cn ( ( @column_names, 'count_actual_state') ) {
144             if ( grep /$cn/, ( @value_column_names, 'count_actual_state') ) {
145                 $hash->{$cn} //= 0;
146                 if ( exists $total->{$cn} ) {
147                     $total->{$cn} += $hash->{$cn} if $hash->{$cn};
148                 } else {
149                     $total->{$cn} = $hash->{$cn};
150                 }
151             }
152             push @line, $hash->{$cn};
153         }
154         push @r, \@line;
155     }
156     return ( $total, \@r );
157 }
158
159 =head2 merge
160   Merge hashes with the same statistic column names into one
161   param: array, a arrayref of arrayrefs
162   ex:
163   @array = (
164      {
165        'ccode' => 'ccode',
166        'count_precedent_state' => '1',
167        'homebranch' => 'homebranch',
168        'itype' => 'itype'
169      },
170      {
171        'count_total_issues_returned_today' => '1',
172        'ccode' => 'ccode',
173        'homebranch' => 'homebranch',
174        'itype' => 'itype'
175      }
176    );
177    and returns:
178    [
179      {
180        'count_total_issues_returned_today' => '1',
181        'ccode' => 'ccode',
182        'count_precedent_state' => '1',
183        'homebranch' => 'homebranch',
184        'itype' => 'itype'
185      }
186    ];
187
188 =cut
189 sub merge {
190     my @array = @_;
191     my @r;
192     for my $h ( @array ) {
193         my $exists = 0;
194         for my $ch ( @r ) {
195             $exists = 1;
196             for my $cn ( @statistic_column_names ) {
197                 if ( not $ch->{$cn} eq $h->{$cn} ) {
198                     $exists = 0;
199                     last;
200                 }
201             }
202             if ($exists){
203                 for my $cn ( @value_column_names ) {
204                     next if not exists $h->{$cn};
205                     $ch->{$cn} = $h->{$cn} ? $h->{$cn} : 0;
206                 }
207                 last;
208             }
209         }
210
211         if ( not $exists ) {push @r, $h;}
212     }
213     return \@r;
214 }