hdl
19 years ago
5 changed files with 491 additions and 47 deletions
@ -0,0 +1,118 @@ |
|||
<!-- TMPL_INCLUDE NAME="reports-top.inc" --> |
|||
<div id="mainbloc" > |
|||
|
|||
<!-- TMPL_IF NAME="do_it" --> |
|||
<!-- TMPL_LOOP NAME="mainloop" --> |
|||
<h1 class="reports">Koha : Borrowers statistics </h1> |
|||
<!-- TMPL_IF NAME="loopfilter"--> |
|||
<p>Filtered on</p> |
|||
<!-- TMPL_LOOP NAME="loopfilter" --> |
|||
<p><label> <!-- TMPL_VAR NAME="crit"--> =</label><!-- TMPL_VAR NAME="filter"--></p> |
|||
<!-- /TMPL_LOOP --> |
|||
<!-- /TMPL_IF NAME="loopfilter"--> |
|||
<table> |
|||
<tr > |
|||
<th class="reports"><!-- TMPL_VAR name="line" --> / <!-- TMPL_VAR name="column" --></th> |
|||
<!-- TMPL_LOOP NAME="loopcol" --> |
|||
<th class="reports"><!-- TMPL_VAR NAME="coltitle" --></th> |
|||
<!-- /TMPL_LOOP --> |
|||
<th class="reports">TOTAL</th> |
|||
</tr> |
|||
<!-- TMPL_LOOP NAME="looprow" --> |
|||
<tr> |
|||
<!-- TMPL_IF NAME="hilighted" --><td class="hilighted"><!-- TMPL_ELSE --><td><!-- /TMPL_IF --> |
|||
<!-- TMPL_VAR NAME="rowtitle" --></td> |
|||
<!-- TMPL_LOOP NAME="loopcell" --> |
|||
<!-- TMPL_IF NAME="hilighted" --><td class="numberhilighted"><!-- TMPL_ELSE --><td class="number"><!-- /TMPL_IF --> |
|||
<!-- TMPL_VAR NAME="value" --> |
|||
</td> |
|||
<!-- /TMPL_LOOP --> |
|||
<!-- TMPL_IF NAME="hilighted" --><td class="numberhilighted"><!-- TMPL_ELSE --><td class="number"><!-- /TMPL_IF --> |
|||
<!-- TMPL_VAR NAME="totalrow" --> |
|||
</td> |
|||
</tr> |
|||
<!-- /TMPL_LOOP NAME="looprow" --> |
|||
<tr > |
|||
<th class="reports">TOTAL</th> |
|||
<!-- TMPL_LOOP NAME="loopfooter" --> |
|||
<th class="reports"> |
|||
<!-- TMPL_VAR NAME="totalcol" --> |
|||
</th> |
|||
<!-- /TMPL_LOOP --> |
|||
<th class="reports"><!-- TMPL_VAR NAME="total" --></th> |
|||
</tr> |
|||
</table> |
|||
<!-- /TMPL_LOOP --> |
|||
<!-- TMPL_ELSE --> |
|||
<h1 class = "reports">Borrowers statistics</h1> |
|||
<form method="post"> |
|||
<table> |
|||
<thead> |
|||
<tr> |
|||
<th class="reports">Title</th> |
|||
<th class="reports">Row</th> |
|||
<th class="reports">Column</th> |
|||
<th class="reports">Filter</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr class="hilighted"> |
|||
<td>Borrower category</td> |
|||
<td align="center"><input type="radio" name="Line" value="categorycode"></td> |
|||
<td align="center"><input type="radio" name="Column" value="categorycode"></td> |
|||
<td ><!-- TMPL_VAR NAME="CGICatCode" --></td> |
|||
</tr> |
|||
<tr> |
|||
<td>Borrower status</td> |
|||
<td></td> |
|||
<td></td> |
|||
<td ><select name="status"><option value=""> </option><option value="debarred">debarred</option><option value="gonenoadress">gone no adress</option><option value="lost">lost</option></td> |
|||
</tr> |
|||
<tr class="hilighted"> |
|||
<td> |
|||
Zip Code |
|||
</td> |
|||
<td align="center"><input type="radio" name="Line" value="zipcode"></td> |
|||
<td align="center"><input type="radio" name="Column" value="zipcode"></td> |
|||
<td><input type="text" name="Filter"></td> |
|||
</tr> |
|||
<tr class="hilighted"> |
|||
<td> </td> |
|||
<td align="center" colspan="2"><select name="digits"> |
|||
<option value=""> </option> |
|||
<option value ="1">1</option> |
|||
<option value ="2">2</option> |
|||
<option value ="3">3</option> |
|||
<option value ="4">4</option> |
|||
<option value ="5">5</option> |
|||
<option value ="6">6</option> |
|||
<option value ="7">7</option> |
|||
<option value ="8">8</option> |
|||
<option value ="9">9</option> |
|||
<option value ="10">10</option> |
|||
</select> |
|||
digits |
|||
</td> |
|||
<td> </td> |
|||
</tr> |
|||
<tr> |
|||
<td>Sort1</td> |
|||
<td align="center"><input type="radio" name="Line" value="sort1"></td> |
|||
<td align="center"><input type="radio" name="Column" value="sort1"></td> |
|||
<td ><!-- TMPL_VAR NAME="CGISort1" --></td> |
|||
</tr> |
|||
<tr class="hilighted" > |
|||
<td>Sort2</td> |
|||
<td align="center"><input type="radio" name="Line" value="sort2"></td> |
|||
<td align="center"><input type="radio" name="Column" value="sort2"></td> |
|||
<td><!-- TMPL_VAR NAME="CGISort2" --></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
<input TYPE="submit" value="OK" class="button reports"> |
|||
<input type="hidden" name="report_name" value="<!--TMPL_VAR NAME="report_name" -->"> |
|||
<input type="hidden" name="do_it" value="1"> |
|||
</form> |
|||
<!-- /TMPL_IF --> |
|||
</div> |
|||
<!-- TMPL_INCLUDE NAME="reports-bottom.inc" --> |
@ -0,0 +1,270 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
# $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 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 |
|||
|
|||
use strict; |
|||
use C4::Auth; |
|||
use CGI; |
|||
use C4::Context; |
|||
use HTML::Template; |
|||
use C4::Search; |
|||
use C4::Output; |
|||
use C4::Koha; |
|||
use C4::Interface::CGI::Output; |
|||
use C4::Circulation::Circ2; |
|||
|
|||
=head1 NAME |
|||
|
|||
plugin that shows a stats on borrowers |
|||
|
|||
=head1 DESCRIPTION |
|||
|
|||
|
|||
=over2 |
|||
|
|||
=cut |
|||
|
|||
my $input = new CGI; |
|||
my $do_it=$input->param('do_it'); |
|||
my $fullreportname = "reports/borrowers_stats.tmpl"; |
|||
my $line = $input->param("Line"); |
|||
my $column = $input->param("Column"); |
|||
my @filters = $input->param("Filter"); |
|||
my $digits = $input->param("digits"); |
|||
my $borstat = $input->param("status"); |
|||
my ($template, $borrowernumber, $cookie) |
|||
= get_template_and_user({template_name => $fullreportname, |
|||
query => $input, |
|||
type => "intranet", |
|||
authnotrequired => 0, |
|||
flagsrequired => {editcatalogue => 1}, |
|||
debug => 1, |
|||
}); |
|||
$template->param(do_it => $do_it); |
|||
if ($do_it) { |
|||
my $results = calculate($line, $column, $digits, $borstat, \@filters); |
|||
$template->param(mainloop => $results); |
|||
# print $input->header(-type => 'application/vnd.ms-excel', -name=>"export.csv"); |
|||
# my $lines = @$results[0]->{looprow}; |
|||
# foreach my $line (@$lines) { |
|||
# my $x = $line->{loopcell}; |
|||
# foreach my $cell (@$x) { |
|||
# print $cell->{value}.";"; |
|||
# } |
|||
# print "\n"; |
|||
# } |
|||
} else { |
|||
my $dbh = C4::Context->dbh; |
|||
my @values; |
|||
my %labels; |
|||
my $req; |
|||
$req = $dbh->prepare( "select categorycode, description from categories"); |
|||
$req->execute; |
|||
my %select_catcode; |
|||
my @select_catcode; |
|||
push @select_catcode,""; |
|||
$select_catcode{""} = ""; |
|||
while (my ($catcode, $description) =$req->fetchrow) { |
|||
push @select_catcode, $catcode; |
|||
$select_catcode{$catcode} = $description |
|||
} |
|||
my $CGICatCode=CGI::scrolling_list( -name => 'Filter', |
|||
-id => 'Filter', |
|||
-values => \@select_catcode, |
|||
-labels => \%select_catcode, |
|||
-size => 1, |
|||
-multiple => 0 ); |
|||
|
|||
$req = $dbh->prepare( "select distinctrow sort1 from borrowers"); |
|||
$req->execute; |
|||
my @select_sort1; |
|||
push @select_sort1,""; |
|||
while (my ($value) =$req->fetchrow) { |
|||
push @select_sort1, $value; |
|||
} |
|||
my $CGIsort1=CGI::scrolling_list( -name => 'Filter', |
|||
-id => 'Filter', |
|||
-values => \@select_sort1, |
|||
-size => 1, |
|||
-multiple => 0 ); |
|||
|
|||
$req = $dbh->prepare( "select distinctrow sort2 from borrowers"); |
|||
$req->execute; |
|||
my @select_sort2; |
|||
push @select_sort2,""; |
|||
while (my ($value) =$req->fetchrow) { |
|||
push @select_sort2, $value; |
|||
} |
|||
my $CGIsort2=CGI::scrolling_list( -name => 'Filter', |
|||
-id => 'Filter', |
|||
-values => \@select_sort2, |
|||
-size => 1, |
|||
-multiple => 0 ); |
|||
$template->param(CGICatcode => $CGICatCode, |
|||
CGISort1 => $CGIsort1, |
|||
CGISort2 => $CGIsort2 |
|||
); |
|||
|
|||
} |
|||
output_html_with_http_headers $input, $cookie, $template->output; |
|||
|
|||
|
|||
|
|||
sub calculate { |
|||
my ($line, $column, $digits, $status, $filters) = @_; |
|||
my @mainloop; |
|||
my @loopfooter; |
|||
my @loopcol; |
|||
my @looprow; |
|||
my %globalline; |
|||
my $grantotal =0; |
|||
# extract parameters |
|||
my $dbh = C4::Context->dbh; |
|||
|
|||
# Filters |
|||
my $linefilter = ""; |
|||
$linefilter = @$filters[0] if ($line =~ /categorycode/ ) ; |
|||
$linefilter = @$filters[1] if ($line =~ /zipcode/ ) ; |
|||
$linefilter = @$filters[2] if ($line =~ /sort1/ ) ; |
|||
$linefilter = @$filters[3] if ($line =~ /sort2/ ) ; |
|||
|
|||
my $colfilter = ""; |
|||
$colfilter = @$filters[0] if ($column =~ /categorycode/); |
|||
$colfilter = @$filters[1] if ($column =~ /zipcode/); |
|||
$colfilter = @$filters[2] if ($column =~ /sort1/); |
|||
$colfilter = @$filters[3] if ($column =~ /sort2/); |
|||
|
|||
my @loopfilter; |
|||
for (my $i=0;$i<=3;$i++) { |
|||
my %cell; |
|||
if ( @$filters[$i] ) { |
|||
$cell{filter} .= @$filters[$i]; |
|||
$cell{crit} .="Category Code " if ($i==0); |
|||
$cell{crit} .="Zip Code" if ($i==1); |
|||
$cell{crit} .="Sort1" if ($i==2); |
|||
$cell{crit} .="Sort2" if ($i==3); |
|||
push @loopfilter, \%cell; |
|||
} |
|||
} |
|||
if ($status) { |
|||
push @loopfilter,{crit=>"Status",filter=>$status} |
|||
} |
|||
# 1st, loop rows. |
|||
#problem with NULL Values. |
|||
my $strsth; |
|||
$strsth .= "select distinctrow $line from borrowers where $line is not null "; |
|||
$linefilter =~ s/\*/%/g; |
|||
if ( $linefilter ) { |
|||
$strsth .= " and $line LIKE ? " ; |
|||
} |
|||
$strsth .= " and $status='1' " if ($status); |
|||
$strsth .=" order by $line"; |
|||
warn "". $strsth; |
|||
|
|||
my $sth = $dbh->prepare( $strsth ); |
|||
if ( $linefilter ) { |
|||
$sth->execute($linefilter); |
|||
} else { |
|||
$sth->execute; |
|||
} |
|||
while ( my ($celvalue) = $sth->fetchrow) { |
|||
my %cell; |
|||
if ($celvalue) { |
|||
$cell{rowtitle} = $celvalue; |
|||
} else { |
|||
$cell{rowtitle} = ""; |
|||
} |
|||
$cell{totalrow} = 0; |
|||
push @looprow, \%cell; |
|||
} |
|||
|
|||
# 2nd, loop cols. |
|||
my $strsth2; |
|||
$colfilter =~ s/\*/%/g; |
|||
$strsth2 .= "select distinctrow $column from borrowers where $column is not null"; |
|||
if ( $colfilter ) { |
|||
$strsth2 .= " and $column LIKE ? "; |
|||
} |
|||
$strsth2 .= " and $status='1' " if ($status); |
|||
$strsth2 .= " order by $column"; |
|||
warn "". $strsth2; |
|||
my $sth2 = $dbh->prepare( $strsth2 ); |
|||
if ($colfilter) { |
|||
$sth2->execute($colfilter); |
|||
} else { |
|||
$sth2->execute; |
|||
} |
|||
while (my ($celvalue) = $sth2->fetchrow) { |
|||
my %cell; |
|||
my %ft; |
|||
$cell{coltitle} = $celvalue; |
|||
$ft{totalcol} = 0; |
|||
push @loopcol, \%cell; |
|||
push @loopfooter, \%ft; |
|||
} |
|||
# now, parse each category. Before filling the result array, fill it with 0 to have every itemtype column. |
|||
my $strcalc .= "SELECT count( * ) FROM borrowers WHERE $line = ? and $column= ? "; |
|||
$strcalc .= " AND categorycode like '" . @$filters[1] ."%' " if ( @$filters[1] ); |
|||
$strcalc .= " AND sort1 like ' " . @$filters[2] ."%'" if ( @$filters[2] ); |
|||
$strcalc .= " AND sort2 like ' " . @$filters[3] ."%'" if ( @$filters[3] ); |
|||
$strcalc .= " AND zipcode like ' " . @$filters[4] ."%'" if ( @$filters[4] ); |
|||
$strcalc .= " and $status='1' " if ($status); |
|||
warn "". $strcalc; |
|||
my $dbcalc = $dbh->prepare($strcalc); |
|||
my $i=0; |
|||
my @totalcol; |
|||
my $hilighted=-1; |
|||
# for each line |
|||
for (my $i=0; $i<=$#looprow; $i++) { |
|||
my $row = $looprow[$i]->{'rowtitle'}; |
|||
my @loopcell; |
|||
my $totalrow=0; |
|||
# for each column |
|||
for (my $j=0;$j<=$#loopcol;$j++) { |
|||
my $col = $loopcol[$j]->{'coltitle'}; |
|||
$dbcalc->execute($row,$col); |
|||
my ($value) = $dbcalc->fetchrow; |
|||
# warn "$row / $col / $value"; |
|||
$totalrow += $value; |
|||
$grantotal += $value; |
|||
$loopfooter[$j]->{'totalcol'} +=$value; |
|||
push @loopcell,{value => $value}; |
|||
} |
|||
$looprow[$i]->{'totalrow'}=$totalrow; |
|||
$looprow[$i]->{'loopcell'}=\@loopcell; |
|||
$looprow[$i]->{'hilighted'} = 1 if $hilighted eq 1; |
|||
$hilighted = -$hilighted; |
|||
} |
|||
|
|||
# # the header of the table |
|||
$globalline{loopfilter}=\@loopfilter; |
|||
$globalline{looprow} = \@looprow; |
|||
# # the core of the table |
|||
$globalline{loopcol} = \@loopcol; |
|||
# # the foot (totals by borrower type) |
|||
$globalline{loopfooter} = \@loopfooter; |
|||
$globalline{total}= $grantotal; |
|||
$globalline{line} = $line; |
|||
$globalline{column} = $column; |
|||
push @mainloop,\%globalline; |
|||
return \@mainloop; |
|||
} |
|||
|
|||
1; |
Loading…
Reference in new issue