Bug 8435: DBRev 3.13.00.038
[koha.git] / reports / stats.screen.pl
index dfa6e71..16b8f8a 100755 (executable)
 #!/usr/bin/perl
 
+# Copyright Katipo Communications 2006
+#
+# 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
 use strict;
+#use warnings; FIXME - Bug 2505
 use CGI;
 use C4::Output;
-use HTML::Template;
 use C4::Auth;
-use C4::Interface::CGI::Output;
 use C4::Context;
-use Date::Manip;
-use C4::Date;
 use C4::Stats;
-&Date_Init("DateFormat=non-US"); # set non-USA date, eg:19/08/2005
-
-my $input=new CGI;
-my $time=$input->param('time');
-my $date=$input->param('from');
-my $date2=$input->param('to');
-my ($template, $loggedinuser, $cookie)
-    = get_template_and_user({template_name => "reports/stats.screen.tmpl",
-                             query => $input,
-                             type => "intranet",
-                             authnotrequired => 0,
-                             flagsrequired => {borrowers => 1},
-                             debug => 1,
-                             });
-
-
-#get a list of every payment
-my @payments=TotalPaid($date,$date2);
-
-my $count=@payments;
-# warn "number of payments=$count\n";
-
-my $i=0;
-my $totalcharges=0;
-my $totalcredits=0;
-my $totalpaid=0;
-my $totalwritten=0;
-my $totalwrittenamount=0;
-my $totalinvoicesamount=0;
-my $totalinvoices=0;
+use C4::Accounts;
+use C4::Debug;
+use Date::Manip;
+
+my $input = new CGI;
+my $time  = $input->param('time');
+my $time2 = $input->param('time2');
+my $op    = $input->param('submit');
+
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+    {
+        template_name   => "reports/stats_screen.tmpl",
+        query           => $input,
+        type            => "intranet",
+        authnotrequired => 1,
+        flagsrequired   => { reports => '*' },
+        debug           => 1,
+    }
+);
+
+( $time  = "today" )    if !$time;
+( $time2 = "tomorrow" ) if !$time2;
+
+my $date  = ParseDate($time);
+my $date2 = ParseDate($time2);
+$date  = UnixDate( $date,  '%Y-%m-%d' );
+$date2 = UnixDate( $date2, '%Y-%m-%d' );
+$debug and warn "MASON: TIME: $time, $time2";
+$debug and warn "MASON: DATE: $date, $date2";
+
+# get a list of every payment
+my @payments = TotalPaid( $date, $date2 );
+
+my $count = @payments;
+
+$debug and warn "MASON: number of payments=$count\n";
+
+my $i            = 0;
+my $totalcharges = 0;
+my $totalcredits = 0;
+my $totalpaid    = 0;
+my $totalwritten = 0;
 my @loop1;
 my @loop2;
-my @loop3;
 
 # lets get a a list of all individual item charges paid for by that payment
-while ($i<$count ){
-
-       my $count;
-       my @charges;
-
-       if ($payments[$i]->{'accounttype'} ne 'W'){         # lets ignore writeoff payments!.
-           @charges=getcharges($payments[$i]{'borrowernumber'}, $payments[$i]{'offset'}, $payments[$i]{'accountno'});
-           $totalcharges++;
-           $count=@charges;
-
-           # getting each of the charges and putting them into a array to be printed out
-           #this loops per charge per person
-           for (my $i2=0;$i2<$count;$i2++){
-              
-               my $time2="$payments[$i]{'date'}";
-#               my $branch=Getpaidbranch($time2,$payments[$i]{'borrowernumber'});
-
-               # lets build up a row
-               my %rows1 = ( datetime => $payments[$i]->{'timestamp'},
-                            surname => $payments[$i]->{'surname'},
-                            firstname => $payments[$i]->{'firstname'},
-                            description => $payments[$i]->{'description'},
-                            accounttype => $charges[$i2]->{'accounttype'},
-                            amount => sprintf("%.2f",  $charges[$i2]->{'amount'}), # rounding amounts to 2dp
-                            type => $payments[$i]->{'accounttype'},
-                            value => sprintf("%.2f", $payments[$i]->{'amount'}*(-1))); # rounding amounts to 2dp
-
-               push (@loop1, \%rows1);
-  $totalpaid = sprintf("%.2f",$totalpaid + $payments[$i]->{'amount'}*(-1));
-           }
-       } else {
-$totalwrittenamount= sprintf("%.2f",$totalwrittenamount + $payments[$i]->{'amount'}*(-1));
-         ++$totalwritten;
-       }
-      
-     
- $i++; #increment the while loop
+
+foreach my $payment (@payments) {
+
+    my @charges;
+    if ( $payment->{'type'} ne 'writeoff' ) {
+
+        @charges = getcharges(
+            $payment->{'borrowernumber'},
+            $payment->{'timestamp'},
+            $payment->{'proccode'}
+        );
+        $totalcharges++;
+        my $count = @charges;
+
+   # getting each of the charges and putting them into a array to be printed out
+   #this loops per charge per person
+        for ( my $i2 = 0 ; $i2 < $count ; $i2++ ) {
+            my $hour = substr( $payment->{'timestamp'}, 8,  2 );
+            my $min  = substr( $payment->{'timestamp'}, 10, 2 );
+            my $sec  = substr( $payment->{'timestamp'}, 12, 2 );
+            my $time = "$hour:$min:$sec";
+            my $time2 = "$payment->{'date'}";
+
+  #               my $branch=Getpaidbranch($time2,$payment->{'borrowernumber'});
+            my $branch = $payment->{'branch'};
+
+            # lets build up a row
+            my %rows1 = (
+                branch      => $branch,
+                datetime    => $payment->{'datetime'},
+                surname     => $payment->{'surname'},
+                firstname   => $payment->{'firstname'},
+                description => $charges[$i2]->{'description'},
+                accounttype => $charges[$i2]->{'accounttype'},
+                amount      => sprintf( "%.2f", $charges[$i2]->{'amount'} )
+                ,    # rounding amounts to 2dp
+                type  => $payment->{'type'},
+                value => sprintf( "%.2f", $payment->{'value'} )
+            );       # rounding amounts to 2dp
+
+            push( @loop1, \%rows1 );
+
+        }
+            $totalpaid = $totalpaid + $payment->{'value'};
+                       $debug and warn "totalpaid = $totalpaid";               
+    }
+    else {
+        ++$totalwritten;
+    }
+
 }
 
 #get credits and append to the bottom of payments
-my @credits=getcredits($date,$date2);
+my @credits = getcredits( $date, $date2 );
 
-my $count=@credits;
-my $i=0;
+my $count = @credits;
+my $i     = 0;
 
-while ($i<$count ){
+while ( $i < $count ) {
 
-       my %rows2 = (creditdate          => format_date($credits[$i]->{'date'}),
-                    creditsurname       => $credits[$i]->{'surname'},
-                    creditfirstname     => $credits[$i]->{'firstname'},
-                    creditdescription   => $credits[$i]->{'description'},
-                    creditaccounttype   => $credits[$i]->{'accounttype'},
-                    creditamount        => sprintf("%.2f",$credits[$i]->{'amount'}*(-1)));
+    my %rows2 = (
+        creditbranch      => $credits[$i]->{'branchcode'},
+        creditdate        => $credits[$i]->{'date'},
+        creditsurname     => $credits[$i]->{'surname'},
+        creditfirstname   => $credits[$i]->{'firstname'},
+        creditdescription => $credits[$i]->{'description'},
+        creditaccounttype => $credits[$i]->{'accounttype'},
+        creditamount      => sprintf( "%.2f", $credits[$i]->{'amount'} )
+    );
 
-       push (@loop2, \%rows2);
-    
-       $totalcredits =sprintf("%.2f", $totalcredits + $credits[$i]->{'amount'});
-         $i++; #increment the while loop
+    push( @loop2, \%rows2 );
+    $totalcredits = $totalcredits + $credits[$i]->{'amount'};
+    $i++;    #increment the while loop
+}
+
+#takes off first char minus sign "-100.00"
+$totalcredits = substr( $totalcredits, 1 );
+
+my $totalrefunds = 0;
+my @loop3;
+my @refunds = getrefunds( $date, $date2 );
+$count = @refunds;
+$i     = 0;
+
+while ( $i < $count ) {
 
+    my %rows3 = (
+        refundbranch      => $refunds[$i]->{'branchcode'},
+        refunddate        => $refunds[$i]->{'datetime'},
+        refundsurname     => $refunds[$i]->{'surname'},
+        refundfirstname   => $refunds[$i]->{'firstname'},
+        refunddescription => $refunds[$i]->{'description'},
+        refundaccounttype => $refunds[$i]->{'accounttype'},
+        refundamount      => sprintf( "%.2f", $refunds[$i]->{'amount'} )
+    );
+
+    push( @loop3, \%rows3 );
+    $totalrefunds = $totalrefunds + $refunds[$i]->{'amount'};
+    $i++;    #increment the while loop
 }
 
+my $totalcash = $totalpaid - $totalrefunds;
 
-#takes off first char minus sign "-100.00"
-$totalcredits = substr($totalcredits, 1);
-
-my @invoices=getinvoices($date,$date2);
-my $count=@invoices;
-my $i=0;
-
-while ($i<$count ){
-
-       my %rows3 = (invoicesdate          => format_date($invoices[$i]->{'date'}),
-                   invoicessurname       => $invoices[$i]->{'surname'},
-                   invoicesfirstname     => $invoices[$i]->{'firstname'},
-                    invoicesdescription   => $invoices[$i]->{'description'},
-                    invoicesaccounttype   => $invoices[$i]->{'accounttype'},
-                    invoicesamount        => sprintf("%.2f",$invoices[$i]->{'amount'}),
-       invoicesamountremaining=>sprintf("%.2f",$invoices[$i]->{'amountoutstanding'}));
-       push (@loop3, \%rows3);
-         $totalinvoicesamount =sprintf("%.2f", $totalinvoicesamount + $invoices[$i]->{'amountoutstanding'});
-       $totalinvoices =sprintf("%.2f", $totalinvoices + $invoices[$i]->{'amount'});
-         $i++; #increment the while loop
+if ( $op eq 'To Excel' ) {
+
+    my $csv = Text::CSV_XS->new(
+        {
+            'quote_char'  => '"',
+            'escape_char' => '"',
+            'sep_char'    => ',',
+            'binary'      => 1
+        }
+    );
+
+    print $input->header(
+        -type       => 'application/vnd.ms-excel',
+        -attachment => "stats.csv",
+    );
+    print
+"Branch, Datetime, Surname, Firstnames, Description, Type, Invoice amount, Payment type, Payment Amount\n";
+
+    $DB::single = 1;
 
+    for my $row (@loop1) {
+        my @array = (
+            $row->{'branch'},      $row->{'datetime'},
+            $row->{'surname'},     $row->{'firstname'},
+            $row->{'description'}, $row->{'accounttype'},
+            $row->{'amount'},      $row->{'type'},
+            $row->{'value'}
+        );
+
+        $csv->combine(@array);
+        my $string = $csv->string(@array);
+        print $string, "\n";
+    }
+    print ",,,,,,,\n";
+    print
+"Branch, Date/time, Surname, Firstname, Description, Charge Type, Invoice Amount\n";
+
+    for my $row (@loop2) {
+
+        my @array = (
+            $row->{'creditbranch'},      $row->{'creditdate'},
+            $row->{'creditsurname'},     $row->{'creditfirstname'},
+            $row->{'creditdescription'}, $row->{'creditaccounttype'},
+            $row->{'creditamount'}
+        );
+
+        $csv->combine(@array);
+        my $string = $csv->string(@array);
+        print $string, "\n";
+    }
+    print ",,,,,,,\n";
+    print
+"Branch, Date/time, Surname, Firstname, Description, Charge Type, Invoice Amount\n";
+
+    for my $row (@loop3) {
+        my @array = (
+            $row->{'refundbranch'},      $row->{'refunddate'},
+            $row->{'refundsurname'},     $row->{'refundfirstname'},
+            $row->{'refunddescription'}, $row->{'refundaccounttype'},
+            $row->{'refundamount'}
+        );
+
+        $csv->combine(@array);
+        my $string = $csv->string(@array);
+        print $string, "\n";
+
+    }
+
+    print ",,,,,,,\n";
+    print ",,,,,,,\n";
+    print ",,Total Amount Paid, $totalpaid\n";
+    print ",,Total Number Written, $totalwritten\n";
+    print ",,Total Amount Credits, $totalcredits\n";
+    print ",,Total Amount Refunds, $totalrefunds\n";
 }
-$template->param( loop1               => \@loop1,
-                  loop2               => \@loop2,
-                loop3               => \@loop3,
-                  totalpaid           => $totalpaid,
-                  totalcredits        => $totalcredits,
-               totalcreditsamount        => sprintf("%.2f",$totalcredits-$totalwrittenamount),
-       totalwrittenamount        => $totalwrittenamount,
-                  totalwritten        => $totalwritten ,
-       totalinvoices=>$totalinvoices, totalinvoicesamount=>$totalinvoicesamount        );
-
-output_html_with_http_headers $input, $cookie, $template->output;
+else {
+    $template->param(
+        date         => $time,
+        date2        => $time2,
+        loop1        => \@loop1,
+        loop2        => \@loop2,
+        loop3        => \@loop3,
+        totalpaid    => $totalpaid,
+        totalcredits => $totalcredits,
+        totalwritten => $totalwritten,
+        totalrefund  => $totalrefunds,
+        totalcash    => $totalcash,
+    );
+    output_html_with_http_headers $input, $cookie, $template->output;
+}
+