ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / reports / acquisitions_stats.pl
index 8220148..d7dea6a 100755 (executable)
@@ -1,80 +1,87 @@
 #!/usr/bin/perl
 
-
 # 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.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-# test comment
+use Modern::Perl;
 
-use strict;
-#use warnings; FIXME - Bug 2505
 use C4::Auth;
-use CGI;
+use CGI qw ( -utf8 );
 use C4::Context;
 use C4::Reports;
 use C4::Output;
 use C4::Koha;
 use C4::Circulation;
-use C4::Dates qw/format_date format_date_in_iso/;
+use C4::Biblio;
+use Koha::ItemTypes;
+use Koha::DateUtils;
+use Koha::Libraries;
 
 =head1 NAME
 
-plugin that shows a stats on borrowers
+reports/acquisitions_stats.pl
 
 =head1 DESCRIPTION
 
-=over 2
+Plugin that shows a stats on borrowers
 
 =cut
 
 my $input          = new CGI;
 my $do_it          = $input->param('do_it');
-my $fullreportname = "reports/acquisitions_stats.tmpl";
+my $fullreportname = "reports/acquisitions_stats.tt";
 my $line           = $input->param("Line");
 my $column         = $input->param("Column");
-my @filters        = $input->param("Filter");
-$filters[0]= (($line =~ /closedate/ || $column =~ /closedate/) ? format_date_in_iso($filters[0]) : undef);
-$filters[1]= (($line =~ /closedate/ || $column =~ /closedate/) ? format_date_in_iso($filters[1]) : undef);
-$filters[2]= (($line =~ /delivery/ || $column =~ /delivery/) ? format_date_in_iso($filters[2]) : undef);
-$filters[3]= (($line =~ /delivery/ || $column =~ /delivery/) ? format_date_in_iso($filters[3]) : undef);
+my @filters        = $input->multi_param("Filter");
+$filters[0] = eval { output_pref( { dt => dt_from_string( $filters[0]), dateonly => 1, dateformat => 'iso' } ); }
+    if ( $filters[0] );
+$filters[1] = eval { output_pref( { dt => dt_from_string( $filters[1]), dateonly => 1, dateformat => 'iso' } ); }
+    if ( $filters[1] );
+$filters[2] = eval { output_pref( { dt => dt_from_string( $filters[2]), dateonly => 1, dateformat => 'iso' } ); }
+    if ( $filters[2] );
+$filters[3] = eval { output_pref( { dt => dt_from_string( $filters[3]), dateonly => 1, dateformat => 'iso' } ); }
+    if ( $filters[3] );
 my $podsp          = $input->param("PlacedOnDisplay");
 my $rodsp          = $input->param("ReceivedOnDisplay");
-my $aodsp          = $input->param("AcquiredOnDisplay");    ##added by mason.
 my $calc           = $input->param("Cellvalue");
 my $output         = $input->param("output");
 my $basename       = $input->param("basename");
 
-#warn "calcul : ".$calc;
-my ($template, $borrowernumber, $cookie)
-       = get_template_and_user({template_name => $fullreportname,
-                               query => $input,
-                               type => "intranet",
-                               authnotrequired => 0,
-                               flagsrequired => {reports => '*'},
-                               debug => 1,
-                               });
-our $sep     = $input->param("sep");
+my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
+    {
+        template_name   => $fullreportname,
+        query           => $input,
+        type            => "intranet",
+        authnotrequired => 0,
+        flagsrequired   => { reports => '*' },
+        debug           => 1,
+    }
+);
+
+our $sep     = $input->param("sep") // '';
 $sep = "\t" if ($sep eq 'tabulation');
-$template->param(do_it => $do_it,
-        DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
-               );
+
+$template->param(
+    do_it                    => $do_it,
+);
+
 if ($do_it) {
     my $results =
-      calculate( $line, $column, $podsp, $rodsp, $aodsp, $calc, \@filters );
+      calculate( $line, $column, $podsp, $rodsp, $calc, \@filters );
     if ( $output eq "screen" ) {
         $template->param( mainloop => $results );
         output_html_with_http_headers $input, $cookie, $template->output;
@@ -109,154 +116,104 @@ if ($do_it) {
         }
         print $sep. @$results[0]->{total};
     }
-    exit(1);
+    exit;
 }
 else {
     my $dbh = C4::Context->dbh;
-    my @select;
-    my %select;
     my $req;
     $req = $dbh->prepare("SELECT distinctrow id,name FROM aqbooksellers ORDER BY name");
     $req->execute;
-    my @select;
-    push @select, "";
-       $select{''} = "All Suppliers";
-    while ( my ( $value, $desc ) = $req->fetchrow ) {
-        push @select, $desc;
-        $select{$value}=$desc;
-    }
-    my $CGIBookSellers = CGI::scrolling_list(
-        -name   => 'Filter',
-        -id     => 'supplier',
-        -values => \@select,
-        -labels   => \%select,
-        -size     => 1,
-        -multiple => 0
-    );
-
-    $req = $dbh->prepare("SELECT DISTINCTROW itemtype,description FROM itemtypes ORDER BY description");
-    $req->execute;
-    undef @select;
-    undef %select;
-    push @select, "";
-    $select{''} = "All Item Types";
-    while ( my ( $value, $desc ) = $req->fetchrow ) {
-        push @select, $value;
-        $select{$value} = $desc;
-    }
-    my $CGIItemTypes = CGI::scrolling_list(
-        -name     => 'Filter',
-        -id       => 'itemtypes',
-        -values   => \@select,
-        -labels   => \%select,
-        -size     => 1,
-        -multiple => 0
-    );
+    my $booksellers = $req->fetchall_arrayref({});
 
     $req = $dbh->prepare("SELECT DISTINCTROW budget_code, budget_name FROM aqbudgets ORDER BY budget_name");
     $req->execute;
-    undef @select;
-    undef %select;
-    push @select, "";
-    $select{''} = "All budgets";
+    my @bselect;
+    my %bselect;
 
     while ( my ( $value, $desc ) = $req->fetchrow ) {
-        push @select, $value;
-        $select{$value} = $desc;
+        push @bselect, $value;
+        $bselect{$value} = $desc;
     }
-    my $CGIBudget = CGI::scrolling_list(
-        -name     => 'Filter',
-        -id       => 'budget',
-        -values   => \@select,
-        -labels   => \%select,
-        -size     => 1,
-        -multiple => 0
-    );
+    my $Budgets = {
+        values   => \@bselect,
+        labels   => \%bselect,
+    };
 
     $req =
       $dbh->prepare(
 "SELECT DISTINCTROW sort1 FROM aqorders WHERE sort1 IS NOT NULL ORDER BY sort1"
       );
     $req->execute;
-    undef @select;
-    undef %select;
-    push @select, "";
-    $select{''} = "All";
+    my @s1select;
+    my %s1select;
     my $hassort1;
     while ( my ($value) = $req->fetchrow ) {
-               if ($value) {
-                       $hassort1 = 1;
-                       push @select, $value;
-                       $select{$value} = $value;
-               }
+        if ($value) {
+            $hassort1 = 1;
+            push @s1select, $value;
+            $s1select{$value} = $value;
+        }
     }
-    my $CGISort1 = CGI::scrolling_list(
-        -name     => 'Filter',
-        -id       => 'sort1',
-        -values   => \@select,
-        -labels   => \%select,
-        -size     => 1,
-        -multiple => 0
-    );
+    my $Sort1 = {
+        values   => \@s1select,
+        labels   => \%s1select,
+    };
 
     $req =
       $dbh->prepare(
 "SELECT DISTINCTROW sort2 FROM aqorders WHERE sort2 IS NOT NULL ORDER BY sort2"
       );
     $req->execute;
-    undef @select;
-    undef %select;
-    push @select, "";
-    $select{''} = "All";
+    my @s2select;
+    my %s2select;
     my $hassort2;
     my $hglghtsort2;
 
     while ( my ($value) = $req->fetchrow ) {
-               if ($value) {
-                       $hassort2 = 1;
-                       $hglghtsort2 = !($hassort1);
-                       push @select, $value;
-                       $select{$value} = $value;
-               }
+        if ($value) {
+            $hassort2    = 1;
+            $hglghtsort2 = !($hassort1);
+            push @s2select, $value;
+            $s2select{$value} = $value;
+        }
     }
-    my $CGISort2 = CGI::scrolling_list(
-        -name     => 'Filter',
-        -id       => 'sort2',
-        -values   => \@select,
-        -labels   => \%select,
-        -size     => 1,
-        -multiple => 0
-    );
-
-    my $CGIextChoice = CGI::scrolling_list(
-        -name     => 'MIME',
-        -id       => 'MIME',
-        -values   => ['CSV'], # FIXME translation
-        -size     => 1,
-        -multiple => 0
-    );
+    my $Sort2 = {
+        values   => \@s2select,
+        labels   => \%s2select,
+    };
 
     my $CGIsepChoice = GetDelimiterChoices;
 
+    my @branches = Koha::Libraries->search({}, { order_by => 'branchname' });
+
+    my $ccode_subfield_structure = GetMarcSubfieldStructureFromKohaField('items.ccode');
+    my $ccode_label;
+    my $ccode_avlist;
+    if($ccode_subfield_structure) {
+        $ccode_label = $ccode_subfield_structure->{liblibrarian};
+        $ccode_avlist = GetAuthorisedValues($ccode_subfield_structure->{authorised_value});
+    }
+
+    my $itemtypes = Koha::ItemTypes->search_with_localization;
     $template->param(
-        CGIBookSeller => $CGIBookSellers,
-        CGIItemType   => $CGIItemTypes,
-        CGIBudget     => $CGIBudget,
+        booksellers   => $booksellers,
+        itemtypes     => $itemtypes, # FIXME Should use the TT plugin instead
+        Budgets       => $Budgets,
         hassort1      => $hassort1,
         hassort2      => $hassort2,
-        HlghtSort2    => $hglghtsort2,
-        CGISort1      => $CGISort1,
-        CGISort2      => $CGISort2,
-        CGIextChoice  => $CGIextChoice,
+        Sort1         => $Sort1,
+        Sort2         => $Sort2,
         CGIsepChoice  => $CGIsepChoice,
-               date_today => C4::Dates->new()->output()
+        branches      => \@branches,
+        ccode_label   => $ccode_label,
+        ccode_avlist  => $ccode_avlist,
     );
 
 }
 output_html_with_http_headers $input, $cookie, $template->output;
 
 sub calculate {
-    my ( $line, $column, $podsp, $rodsp, $aodsp, $process, $filters ) = @_;
+    my ( $line, $column, $podsp, $rodsp, $process, $filters ) = @_;
     my @mainloop;
     my @loopfooter;
     my @loopcol;
@@ -265,6 +222,9 @@ sub calculate {
     my %globalline;
     my $grantotal = 0;
 
+    $podsp ||= 0;
+    $rodsp ||= 0;
+
     # extract parameters
     my $dbh = C4::Context->dbh;
 
@@ -272,143 +232,98 @@ sub calculate {
     # Checking filters
     #
     my @loopfilter;
-    for ( my $i = 0 ; $i <= 8 ; $i++ ) {
-        my %cell;
-        if ( @$filters[$i] ) {
+    for ( my $i = 0 ; $i <= @$filters ; $i++ ) {
+        if( defined @$filters[$i] and @$filters[$i] ne '' ) {
+            my %cell;
             if ( ( ( $i == 1 ) or ( $i == 3 ) ) and ( @$filters[ $i - 1 ] ) ) {
-                $cell{err} = 1 if ( @$filters[$i] < @$filters[ $i - 1 ] );
+                $cell{err} = 1 if ( @$filters[$i] lt @$filters[ $i - 1 ] );
             }
             # format the dates filters, otherwise just fill as is
-            if ($i>=4) {
-                $cell{filter} .= @$filters[$i];
+            if ($i >= 4) {
+                $cell{filter} = @$filters[$i];
             } else {
-                $cell{filter} .= format_date(@$filters[$i]);
+                $cell{filter} = eval { output_pref( { dt => dt_from_string( @$filters[$i] ), dateonly => 1 }); }
+                   if ( @$filters[$i] );
             }
-            $cell{crit}   .= "Placed On From" if ( $i == 0 );
-            $cell{crit}   .= "Placed On To" if ( $i == 1 );
-            $cell{crit}   .= "Received On From" if ( $i == 2 );
-            $cell{crit}   .= "Received On To" if ( $i == 3 );
-
-#            $cell{crit} .= "Acquired On From" if ( $i == 4 );
-#            $cell{crit} .= "Acquired On To"   if ( $i == 5 );
-
-            $cell{crit} .= "BookSeller" if ( $i == 4 );
-            $cell{crit} .= "Doc Type"   if ( $i == 5 );
-            $cell{crit} .= "Budget"     if ( $i == 6 );
-            $cell{crit} .= "Sort1"      if ( $i == 7 );
-            $cell{crit} .= "Sort2"      if ( $i == 8 );
+            $cell{crit} = $i;
             push @loopfilter, \%cell;
         }
     }
 
-    my @linefilter;
-
-    #       warn "filtres ".@filters[0];
-    #       warn "filtres ".@filters[1];
-    #       warn "filtres ".@filters[2];
-    #       warn "filtres ".@filters[3];
-
-    $linefilter[0] = @$filters[0] if ( $line =~ /closedate/ );
-    $linefilter[1] = @$filters[1] if ( $line =~ /closedate/ );
-    $linefilter[0] = @$filters[2] if ( $line =~ /received/ );
-    $linefilter[1] = @$filters[3] if ( $line =~ /received/ );
-
-#    $linefilter[0] = @$filters[4] if ( $line =~ /acquired/ );
-#    $linefilter[1] = @$filters[5] if ( $line =~ /acquired/ );
-
-    $linefilter[0] = @$filters[4]  if ( $line =~ /bookseller/ );
-    $linefilter[0] = @$filters[5]  if ( $line =~ /itemtype/ );
-    $linefilter[0] = @$filters[6]  if ( $line =~ /budget/ );
-    $linefilter[0] = @$filters[7]  if ( $line =~ /sort1/ );
-    $linefilter[0] = @$filters[8] if ( $line =~ /sort2/ );
-
-    #warn "filtre lignes".$linefilter[0]." ".$linefilter[1];
-    #
-    my @colfilter;
-    $colfilter[0] = @$filters[0] if ( $column =~ /closedate/ );
-    $colfilter[1] = @$filters[1] if ( $column =~ /closedate/ );
-    $colfilter[0] = @$filters[2] if ( $column =~ /received/ );
-    $colfilter[1] = @$filters[3] if ( $column =~ /received/ );
-
-#    $colfilter[0] = @$filters[4] if ( $column =~ /acquired/ );
-#    $colfilter[1] = @$filters[5] if ( $column =~ /acquired/ );
-    $colfilter[0] = @$filters[4]  if ( $column =~ /bookseller/ );
-    $colfilter[0] = @$filters[5]  if ( $column =~ /itemtype/ );
-    $colfilter[0] = @$filters[6]  if ( $column =~ /budget/ );
-    $colfilter[0] = @$filters[7]  if ( $column =~ /sort1/ );
-    $colfilter[0] = @$filters[8]  if ( $column =~ /sort2/ );
-
-    #warn "filtre col ".$colfilter[0]." ".$colfilter[1];
-
-#    warn "line=$line, podsp=$podsp, rodsp=$rodsp, aodsp=$aodsp\n";
-
-    # 1st, loop rows.
-    my $linefield;
-    if ( ( $line =~ /closedate/ ) and ( $podsp == 1 ) ) {
-
-        #Display by day
-        $linefield .= "dayname($line)";
-    }
-    elsif ( ( $line =~ /closedate/ ) and ( $podsp == 2 ) ) {
-
-        #Display by Month
-        $linefield .= "monthname($line)";
-    }
-    elsif ( ( $line =~ /closedate/ ) and ( $podsp == 3 ) ) {
-
-        #Display by Year
-        $linefield .= "Year($line)";
-
-    }
-    elsif ( ( $line =~ /received/ ) and ( $rodsp == 1 ) ) {
-
-        #Display by day
-        $linefield .= "dayname($line)";
-    }
-    elsif ( ( $line =~ /received/ ) and ( $rodsp == 2 ) ) {
-
-        #Display by Month
-        $linefield .= "monthname($line)";
-    }
-    elsif ( ( $line =~ /received/ ) and ( $rodsp == 3 ) ) {
-
-        #Display by Year
-        $linefield .= "Year($line)";
-
-    }
-#    elsif ( ( $line =~ /acquired/ ) and ( $aodsp == 1 ) ) {
-#
-#        #Display by day
-#        $linefield .= "dayname($line)";
-#    }
-#    elsif ( ( $line =~ /acquired/ ) and ( $aodsp == 2 ) ) {
-#
-#        #Display by Month
-#        $linefield .= "monthname($line)";
-#    }
-#    elsif ( ( $line =~ /acquired/ ) and ( $aodsp == 3 ) ) {
-#
-#        #Display by Year
-#        $linefield .= "Year($line)";
-#
-#    }
-    else {
-        $linefield .= $line;
+    my %filter;
+    my %field;
+    foreach ($line, $column) {
+        $filter{$_} = [];
+        $field{$_} = $_;
+        if ( $_ =~ /closedate/ ) {
+            $filter{$_}->[0] = @$filters[0];
+            $filter{$_}->[1] = @$filters[1];
+            my $a = $_;
+            if ( $podsp == 1 ) {
+                $field{$a} = "concat(hex(weekday($a)+1),'-',dayname($a))";
+            } elsif ( $podsp == 2 ) {
+                $field{$a} = "concat(hex(month($a)),'-',monthname($a))";
+            } elsif ( $podsp == 3 ) {
+                $field{$a} = "Year($a)";
+            } else {
+                $field{$a} = $a;
+            }
+        }
+        elsif ( $_ =~ /received/ ) {
+            $filter{$_}->[0] = @$filters[2];
+            $filter{$_}->[1] = @$filters[3];
+            my $a = $_;
+            if ( $rodsp == 1 ) {
+                $field{$a} = "concat(hex(weekday($a)+1),'-',dayname($a))";
+            } elsif ( $rodsp == 2 ) {
+                $field{$a} = "concat(hex(month($a)),'-',monthname($a))";
+            } elsif ( $rodsp == 3 ) {
+                $field{$a} = "Year($a)";
+            } else {
+                $field{$a} = $a;
+            }
+        }
+        elsif ( $_ =~ /bookseller/ ) {
+            $filter{$_}->[0] = @$filters[4];
+        }
+        elsif ( $_ =~ /homebranch/ ) {
+            $filter{$_}->[0] = @$filters[5];
+        }
+        elsif ( $_ =~ /ccode/ ) {
+            $filter{$_}->[0] = @$filters[6];
+        }
+        elsif ( $_ =~ /itemtype/ ) {
+            $filter{$_}->[0] = @$filters[7];
+        }
+        elsif ( $_ =~ /budget/ ) {
+            $filter{$_}->[0] = @$filters[8];
+        }
+        elsif ( $_ =~ /sort1/ ) {
+            $filter{$_}->[0] = @$filters[9];
+        }
+        elsif ( $_ =~ /sort2/ ) {
+            $filter{$_}->[0] = @$filters[10];
+        }
     }
 
-    my $strsth;
-    $strsth .=
-      "SELECT DISTINCTROW $linefield FROM (aqorders, aqbasket )
-                LEFT JOIN items ON (aqorders.biblionumber= items.biblionumber)
-                LEFT JOIN biblioitems ON (aqorders.biblionumber= biblioitems.biblionumber)
-                LEFT JOIN aqbudgets  ON (aqorders.budget_id = aqbudgets.budget_id )
+    my @linefilter = @{ $filter{$line} };
+    my $linefield = $field{$line};
+    my @colfilter = @{ $filter{$column} };
+    my $colfield = $field{$column};
 
-                LEFT JOIN aqbooksellers ON (aqbasket.booksellerid=aqbooksellers.id) WHERE (aqorders.basketno=aqbasket.basketno)
-                AND $line IS NOT NULL AND $line <> '' ";
-
-#                              LEFT JOIN aqorderdelivery ON (aqorders.ordernumber =aqorderdelivery.ordernumber )
-    
-       if (@linefilter) {
+    # 1st, loop rows.
+    my $strsth = "
+        SELECT DISTINCTROW $linefield
+        FROM aqorders
+          LEFT JOIN aqbasket ON (aqorders.basketno = aqbasket.basketno)
+          LEFT JOIN aqorders_items ON (aqorders.ordernumber = aqorders_items.ordernumber)
+          LEFT JOIN items ON (aqorders_items.itemnumber = items.itemnumber)
+          LEFT JOIN biblioitems ON (aqorders.biblionumber = biblioitems.biblionumber)
+          LEFT JOIN aqbudgets  ON (aqorders.budget_id = aqbudgets.budget_id )
+          LEFT JOIN aqbooksellers ON (aqbasket.booksellerid = aqbooksellers.id)
+        WHERE $line IS NOT NULL AND $line <> '' ";
+
+    if (@linefilter) {
         if ( $linefilter[1] ) {
             if ( $linefilter[0] ) {
                 $strsth .= " AND $line BETWEEN ? AND ? ";
@@ -421,7 +336,6 @@ sub calculate {
             ( $linefilter[0] )
             and (  ( $line =~ /closedate/ )
                 or ( $line =~ /received/ ))
-#                or ( $line =~ /acquired/ ) )
           )
         {
             $strsth .= " AND $line >= ? ";
@@ -434,8 +348,6 @@ sub calculate {
     $strsth .= " GROUP BY $linefield";
     $strsth .= " ORDER BY $line";
 
-    #warn "377:strsth= $strsth";
-
     my $sth = $dbh->prepare($strsth);
     if ( (@linefilter) and ( $linefilter[1] ) ) {
         $sth->execute( $linefilter[0], $linefilter[1] );
@@ -446,82 +358,27 @@ sub calculate {
     else {
         $sth->execute;
     }
-       while ( my ($celvalue) = $sth->fetchrow ) {
-               my %cell;
-               if ($celvalue) {
-                       $cell{rowtitle} = $celvalue;
-                       push @loopline, \%cell;
-               }
-               $cell{totalrow} = 0;
-       }
-#    warn "column=$column, podsp=$podsp, rodsp=$rodsp, aodsp=$aodsp\n";
-
-    # 2nd, loop cols.
-    my $colfield;
-    if ( ( $column =~ /closedate/ ) and ( $podsp == 1 ) ) {
-
-        #Display by day
-        $colfield .= "dayname($column)";
-    }
-    elsif ( ( $column =~ /closedate/ ) and ( $podsp == 2 ) ) {
-
-        #Display by Month
-        $colfield .= "monthname($column)";
-    }
-    elsif ( ( $column =~ /closedate/ ) and ( $podsp == 3 ) ) {
-
-        #Display by Year
-        $colfield .= "Year($column)";
-
-    }
-    elsif ( ( $column =~ /received/ ) and ( $rodsp == 1 ) ) {
-
-        #Display by day
-        $colfield .= "dayname($column)";
-    }
-    elsif ( ( $column =~ /received/ ) and ( $rodsp == 2 ) ) {
-
-        #Display by Month
-        $colfield .= "monthname($column)";
-    }
-    elsif ( ( $column =~ /received/ ) and ( $rodsp == 3 ) ) {
-
-        #Display by Year
-        $colfield .= "Year($column)";
-
-    }
-#    elsif ( ( $column =~ /dateaccessioned/ ) and ( $aodsp == 1 ) ) {
-#
-#        #Display by day
-#        $colfield .= "dayname($column)";
-#    }
-#    elsif ( ( $column =~ /dateaccessioned/ ) and ( $aodsp == 2 ) ) {
-#
-#        #Display by Month
-#        $colfield .= "monthname($column)";
-#    }
-#    elsif ( ( $column =~ /dateaccessioned/ ) and ( $aodsp == 3 ) ) {
-#
-#        #Display by Year
-#        $colfield .= "Year($column)";
-#
-#    }
-    else {
-        $colfield .= $column;
+    while ( my ($celvalue) = $sth->fetchrow ) {
+        my %cell;
+        if ($celvalue) {
+            $cell{rowtitle} = $celvalue;
+            push @loopline, \%cell;
+        }
+        $cell{totalrow} = 0;
     }
 
-    my $strsth2;
-    $strsth2 .=
-      "SELECT distinctrow $colfield FROM (aqorders, aqbasket )
-                 LEFT JOIN items ON (aqorders.biblionumber= items.biblionumber)
-                 LEFT JOIN biblioitems ON (aqorders.biblionumber= biblioitems.biblionumber)
-                 LEFT JOIN aqbudgets  ON (aqorders.budget_id = aqbudgets.budget_id )
-
-                 LEFT JOIN aqbooksellers ON (aqbasket.booksellerid=aqbooksellers.id)
-                 WHERE (aqorders.basketno=aqbasket.basketno) AND 
-                 $column IS NOT NULL AND $column <> '' ";
-
-#                              LEFT JOIN aqorderdelivery ON (aqorders.ordernumber =aqorderdelivery.ordernumber )
+    # 2nd, loop cols.
+    my $strsth2 = "
+        SELECT DISTINCTROW $colfield
+        FROM aqorders
+          LEFT JOIN aqbasket ON (aqorders.basketno = aqbasket.basketno)
+          LEFT JOIN aqorders_items ON (aqorders.ordernumber = aqorders_items.ordernumber)
+          LEFT JOIN items ON (aqorders_items.itemnumber = items.itemnumber)
+          LEFT JOIN biblioitems ON (aqorders.biblionumber = biblioitems.biblionumber)
+          LEFT JOIN aqbudgets  ON (aqorders.budget_id = aqbudgets.budget_id )
+          LEFT JOIN aqbooksellers ON (aqbasket.booksellerid = aqbooksellers.id)
+        WHERE $column IS NOT NULL AND $column <> ''
+    ";
 
     if (@colfilter) {
         if ( $colfilter[1] ) {
@@ -536,7 +393,6 @@ sub calculate {
             ( $colfilter[0] )
             and (  ( $column =~ /closedate/ )
                 or ( $line =~ /received/ ))
-#                or ( $line =~ /acquired/ ) )
           )
         {
             $strsth2 .= " AND $column >= ? ";
@@ -547,9 +403,8 @@ sub calculate {
         }
     }
 
-
     $strsth2 .= " GROUP BY $colfield";
-    $strsth2 .= " ORDER BY $column";
+    $strsth2 .= " ORDER BY $colfield";
 
     my $sth2 = $dbh->prepare($strsth2);
 
@@ -562,15 +417,13 @@ sub calculate {
     else {
         $sth2->execute;
     }
-       while ( my $celvalue = $sth2->fetchrow ) {
-               my %cell;
-               if ($celvalue) {
-                       $cell{coltitle} = $celvalue;
-                       push @loopcol, \%cell;
-               }
-       }
-
-    #       warn "fin des titres colonnes";
+    while ( my $celvalue = $sth2->fetchrow ) {
+        my %cell;
+        if ($celvalue) {
+            $cell{coltitle} = $celvalue;
+            push @loopcol, \%cell;
+        }
+    }
 
     my $i = 0;
     my @totalcol;
@@ -579,7 +432,6 @@ sub calculate {
     #Initialization of cell values.....
     my %table;
 
-#      warn "init table...\n";
     foreach my $row (@loopline) {
         foreach my $col (@loopcol) {
             $table{ $row->{rowtitle} }->{ $col->{coltitle} } = 0;
@@ -590,20 +442,29 @@ sub calculate {
     # preparing calculation
     my $strcalc;
     $strcalc .= "SELECT $linefield, $colfield, ";
-    $strcalc .= "SUM( aqorders.quantity ) " if ( $process == 1 );
-    $strcalc .= "SUM( aqorders.quantity * aqorders.listprice ) "
-      if ( $process == 2 );
-    $strcalc .= "FROM (aqorders, aqbasket )
-                 LEFT JOIN items ON (aqorders.biblionumber= items.biblionumber)
-                 LEFT JOIN biblioitems ON (aqorders.biblionumber= biblioitems.biblionumber)
-                 LEFT JOIN aqbudgets  ON (aqorders.budget_id = aqbudgets.budget_id )
-
-                 LEFT JOIN aqbooksellers ON (aqbasket.booksellerid=aqbooksellers.id) 
-                 WHERE (aqorders.basketno=aqbasket.basketno) ";
-
-#                 LEFT JOIN aqorderdelivery ON (aqorders.ordernumber =aqorderdelivery.ordernumber )
-    
-       @$filters[0] =~ s/\*/%/g if ( @$filters[0] );
+    if ( $process == 1 ) {
+        $strcalc .= "COUNT(*) ";
+    } elsif ( $process == 2 ) {
+        $strcalc .= "COUNT(DISTINCT(aqorders.biblionumber)) ";
+    } elsif ( $process == 3 || $process == 4 || $process == 5 ) {
+        $strcalc .= "SUM(aqorders.listprice) ";
+    } else {
+        $strcalc .= "NULL ";
+    }
+    $strcalc .= "
+        FROM aqorders
+          LEFT JOIN aqbasket ON (aqorders.basketno = aqbasket.basketno)
+          LEFT JOIN aqorders_items ON (aqorders.ordernumber = aqorders_items.ordernumber)
+          LEFT JOIN items ON (aqorders_items.itemnumber = items.itemnumber)
+          LEFT JOIN biblioitems ON (aqorders.biblionumber = biblioitems.biblionumber)
+          LEFT JOIN aqbudgets ON (aqorders.budget_id = aqbudgets.budget_id )
+          LEFT JOIN aqbooksellers ON (aqbasket.booksellerid = aqbooksellers.id)
+        WHERE aqorders.datecancellationprinted IS NULL ";
+    $strcalc .= " AND (aqorders.datereceived IS NULL OR aqorders.datereceived = '') "
+        if ( $process == 4 );
+    $strcalc .= " AND aqorders.datereceived IS NOT NULL AND aqorders.datereceived <> '' "
+        if ( $process == 5 );
+    @$filters[0] =~ s/\*/%/g if ( @$filters[0] );
     $strcalc .= " AND aqbasket.closedate >= '" . @$filters[0] . "'"
       if ( @$filters[0] );
     @$filters[1] =~ s/\*/%/g if ( @$filters[1] );
@@ -615,44 +476,33 @@ sub calculate {
     @$filters[3] =~ s/\*/%/g if ( @$filters[3] );
     $strcalc .= " AND aqorders.datereceived <= '" . @$filters[3] . "'"
       if ( @$filters[3] );
-#    @$filters[4] =~ s/\*/%/g if ( @$filters[4] );
-#    $strcalc .= " AND aqbasket.closedate >= '" . @$filters[4] . "'"
-#      if ( @$filters[4] );
-#    @$filters[5] =~ s/\*/%/g if ( @$filters[5] );
-#    $strcalc .= " AND aqbasket.closedate <= '" . @$filters[5] . "'"
-#      if ( @$filters[5] );
     @$filters[4] =~ s/\*/%/g if ( @$filters[4] );
     $strcalc .= " AND aqbooksellers.name LIKE '" . @$filters[4] . "'"
       if ( @$filters[4] );
-    @$filters[5] =~ s/\*/%/g if ( @$filters[5] );
-    $strcalc .= " AND biblioitems.itemtype LIKE '" . @$filters[5] . "'"
+    $strcalc .= " AND items.homebranch = '" . @$filters[5] . "'"
       if ( @$filters[5] );
     @$filters[6] =~ s/\*/%/g if ( @$filters[6] );
-    $strcalc .= " AND aqbudgets.budget_code LIKE '" . @$filters[6] . "'"
+    $strcalc .= " AND items.ccode = '" . @$filters[6] . "'"
       if ( @$filters[6] );
     @$filters[7] =~ s/\*/%/g if ( @$filters[7] );
-    $strcalc .= " AND aqorders.sort1 LIKE '" . @$filters[7] . "'"
+    $strcalc .= " AND biblioitems.itemtype LIKE '" . @$filters[7] . "'"
       if ( @$filters[7] );
     @$filters[8] =~ s/\*/%/g if ( @$filters[8] );
-    $strcalc .= " AND aqorders.sort2 LIKE '" . @$filters[8] . "'"
+    $strcalc .= " AND aqbudgets.budget_code LIKE '" . @$filters[8] . "'"
       if ( @$filters[8] );
-
-    $strcalc .= " AND aqorders.datecancellationprinted is NULL ";
+    @$filters[9] =~ s/\*/%/g if ( @$filters[9] );
+    $strcalc .= " AND aqorders.sort1 LIKE '" . @$filters[9] . "'"
+      if ( @$filters[9] );
+    @$filters[10] =~ s/\*/%/g if ( @$filters[10] );
+    $strcalc .= " AND aqorders.sort2 LIKE '" . @$filters[10] . "'"
+      if ( @$filters[10] );
 
     $strcalc .= " GROUP BY $linefield, $colfield ORDER BY $linefield,$colfield";
-
-#      warn $strcalc . "\n";
-
     my $dbcalc = $dbh->prepare($strcalc);
     $dbcalc->execute;
 
-    #       warn "filling table";
     my $emptycol;
     while ( my ( $row, $col, $value ) = $dbcalc->fetchrow ) {
-               next if ($row eq undef || $col eq undef);
-
-# warn "filling table $row / $col / $value ";
-
         $emptycol = 1         if ( !defined($col) );
         $col      = "zzEMPTY" if ( !defined($col) );
         $row      = "zzEMPTY" if ( !defined($row) );
@@ -670,19 +520,20 @@ sub calculate {
         # and the number matches the number of columns
         foreach my $col (@loopcol) {
             my $value = $table{$row}->{ ( $col->{coltitle} eq "NULL" ) ? "zzEMPTY" : $col->{coltitle} };
+            $value = sprintf("%.2f", $value) if($value and grep /$process/, (3,4,5));
             push @loopcell, { value => $value };
         }
-        push @looprow,
-          {
-            'rowtitle' => ( $row eq "zzEMPTY" ) ? "NULL" : $row,
-            'loopcell'  => \@loopcell,
-            'hilighted' => ( $hilighted > 0 ),
-            'totalrow'  => $table{$row}->{totalrow}
-          };
+        my $r = {
+            rowtitle => ( $row eq "zzEMPTY" ) ? "NULL" : $row,
+            loopcell  => \@loopcell,
+            hilighted => ( $hilighted > 0 ),
+            totalrow  => $table{$row}->{totalrow}
+        };
+        $r->{totalrow} = sprintf("%.2f", $r->{totalrow}) if($r->{totalrow} and grep /$process/, (3,4,5));
+        push @looprow, $r;
         $hilighted = -$hilighted;
     }
 
-    #       warn "footer processing";
     foreach my $col (@loopcol) {
         my $total = 0;
         foreach my $row (@looprow) {
@@ -693,21 +544,20 @@ sub calculate {
                 ( $col->{coltitle} eq "NULL" ) ? "zzEMPTY"
                 : $col->{coltitle}
               };
-
-#                       warn "value added ".$table{$row->{rowtitle}}->{$col->{coltitle}}. "for line ".$row->{rowtitle};
         }
+        $total = sprintf("%.2f", $total) if($total and grep /$process/, (3,4,5));
 
-        #               warn "summ for column ".$col->{coltitle}."  = ".$total;
         push @loopfooter, { 'totalcol' => $total };
     }
 
     # the header of the table
-       $globalline{loopfilter}=\@loopfilter;
+    $globalline{loopfilter} = \@loopfilter;
     # the core of the table
     $globalline{looprow} = \@looprow;
     $globalline{loopcol} = \@loopcol;
 
     #       # the foot (totals by borrower type)
+    $grantotal = sprintf("%.2f", $grantotal) if ($grantotal and grep /$process/, (3,4,5));
     $globalline{loopfooter} = \@loopfooter;
     $globalline{total}      = $grantotal;
     $globalline{line}       = $line;