ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / reports / acquisitions_stats.pl
index cdc5b9a..d7dea6a 100755 (executable)
@@ -1,58 +1,60 @@
 #!/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.
-
-# test comment
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use Modern::Perl;
 
 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::Branch;
 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] = format_date_in_iso( $filters[0] );
-$filters[1] = format_date_in_iso( $filters[1] );
-$filters[2] = format_date_in_iso( $filters[2] );
-$filters[3] = format_date_in_iso( $filters[3] );
+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 $calc           = $input->param("Cellvalue");
@@ -123,80 +125,47 @@ else {
     $req->execute;
     my $booksellers = $req->fetchall_arrayref({});
 
-    $req = $dbh->prepare("SELECT DISTINCTROW itemtype,description FROM itemtypes ORDER BY description");
-    $req->execute;
-    my @select;
-    my %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
-    );
-
     $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;
+            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;
 
@@ -204,36 +173,20 @@ else {
         if ($value) {
             $hassort2    = 1;
             $hglghtsort2 = !($hassort1);
-            push @select, $value;
-            $select{$value} = $value;
+            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 = GetBranches;
-    my @branches;
-    foreach ( sort keys %$branches ) {
-        push @branches, $branches->{$_};
-    }
+    my @branches = Koha::Libraries->search({}, { order_by => 'branchname' });
 
-    my $ccode_subfield_structure = GetMarcSubfieldStructureFromKohaField('items.ccode', '');
+    my $ccode_subfield_structure = GetMarcSubfieldStructureFromKohaField('items.ccode');
     my $ccode_label;
     my $ccode_avlist;
     if($ccode_subfield_structure) {
@@ -241,15 +194,15 @@ else {
         $ccode_avlist = GetAuthorisedValues($ccode_subfield_structure->{authorised_value});
     }
 
+    my $itemtypes = Koha::ItemTypes->search_with_localization;
     $template->param(
         booksellers   => $booksellers,
-        CGIItemType   => $CGIItemTypes,
-        CGIBudget     => $CGIBudget,
+        itemtypes     => $itemtypes, # FIXME Should use the TT plugin instead
+        Budgets       => $Budgets,
         hassort1      => $hassort1,
         hassort2      => $hassort2,
-        CGISort1      => $CGISort1,
-        CGISort2      => $CGISort2,
-        CGIextChoice  => $CGIextChoice,
+        Sort1         => $Sort1,
+        Sort2         => $Sort2,
         CGIsepChoice  => $CGIsepChoice,
         branches      => \@branches,
         ccode_label   => $ccode_label,
@@ -289,7 +242,8 @@ sub calculate {
             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} = $i;
             push @loopfilter, \%cell;
@@ -301,51 +255,55 @@ sub calculate {
     foreach ($line, $column) {
         $filter{$_} = [];
         $field{$_} = $_;
-        given ($_) {
-            when (/closedate/) {
-                $filter{$_}->[0] = @$filters[0];
-                $filter{$_}->[1] = @$filters[1];
-                my $a = $_;
-                given ($podsp) {
-                    when (1) { $field{$a} = "concat(hex(weekday($a)+1),'-',dayname($a))" }
-                    when (2) { $field{$a} = "concat(hex(month($a)),'-',monthname($a))" }
-                    when (3) { $field{$a} = "Year($a)" }
-                    default  { $field{$a} = $a }
-                }
-            }
-            when (/received/) {
-                $filter{$_}->[0] = @$filters[2];
-                $filter{$_}->[1] = @$filters[3];
-                my $a = $_;
-                given ($rodsp) {
-                    when (1) { $field{$a} = "concat(hex(weekday($a)+1),'-',dayname($a))" }
-                    when (2) { $field{$a} = "concat(hex(month($a)),'-',monthname($a))" }
-                    when (3) { $field{$a} = "Year($a)" }
-                    default  { $field{$a} = $a }
-                }
-            }
-            when (/bookseller/) {
-                $filter{$_}->[0] = @$filters[4];
-            }
-            when (/homebranch/) {
-                $filter{$_}->[0] = @$filters[5];
-            }
-            when (/ccode/) {
-                $filter{$_}->[0] = @$filters[6];
-            }
-            when (/itemtype/) {
-                $filter{$_}->[0] = @$filters[7];
-            }
-            when (/budget/) {
-                $filter{$_}->[0] = @$filters[8];
-            }
-            when (/sort1/) {
-                $filter{$_}->[0] = @$filters[9];
+        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;
             }
-            when (/sort2/) {
-                $filter{$_}->[0] = @$filters[10];
+        }
+        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 @linefilter = @{ $filter{$line} };
@@ -484,11 +442,14 @@ sub calculate {
     # preparing calculation
     my $strcalc;
     $strcalc .= "SELECT $linefield, $colfield, ";
-    given ($process) {
-        when (1) { $strcalc .= "COUNT(*) " }
-        when (2) { $strcalc .= "COUNT(DISTINCT(aqorders.biblionumber)) " }
-        when ([3,4,5]) { $strcalc .= "SUM(aqorders.listprice) " }
-        default { $strcalc .= "NULL " }
+    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