| 
      
            Lines 21-26
          
      
      
        Link Here
      
     | 
  
        
          | 21 | 
          use CGI qw/-utf8/;  | 
          21 | 
          use CGI qw/-utf8/;  | 
        
        
          | 22 | 
          use Text::CSV;  | 
          22 | 
          use Text::CSV;  | 
        
        
          | 23 | 
          use URI::Escape;  | 
          23 | 
          use URI::Escape;  | 
        
            
               | 
               | 
              24 | 
              use File::Temp;  | 
            
        
          | 24 | 
          use C4::Reports::Guided;  | 
          25 | 
          use C4::Reports::Guided;  | 
        
        
          | 25 | 
          use C4::Auth qw/:DEFAULT get_session/;  | 
          26 | 
          use C4::Auth qw/:DEFAULT get_session/;  | 
        
        
          | 26 | 
          use C4::Output;  | 
          27 | 
          use C4::Output;  | 
        
  
    | 
      
            Lines 761-766
          elsif ($phase eq 'Run this report'){
      
      
        Link Here
      
     | 
  
        
          | 761 | 
              else { | 
          762 | 
              else { | 
        
        
          | 762 | 
                  push @errors, { no_sql_for_id => $report_id }; | 
          763 | 
                  push @errors, { no_sql_for_id => $report_id }; | 
        
        
          | 763 | 
              }  | 
          764 | 
              }  | 
        
            
               | 
               | 
              765 | 
                  my $csv2ods_cmd = qx|which csv2ods|;  | 
            
            
              | 766 | 
                  chomp $csv2ods_cmd;  | 
            
            
              | 767 | 
                  my $csv2ods_is_installed =  | 
            
            
              | 768 | 
                      ( not $csv2ods_cmd or not -f $csv2ods_cmd )  | 
            
            
              | 769 | 
                          ? 0  | 
            
            
              | 770 | 
                          : 1;  | 
            
            
              | 771 | 
                  $template->param( csv2ods_is_installed => $csv2ods_is_installed );  | 
            
        
          | 764 | 
          }  | 
          772 | 
          }  | 
        
        
          | 765 | 
           | 
          773 | 
           | 
        
        
          | 766 | 
          elsif ($phase eq 'Export'){ | 
          774 | 
          elsif ($phase eq 'Export'){ | 
        
  
    | 
      
            Lines 771-800
          elsif ($phase eq 'Export'){
      
      
        Link Here
      
     | 
  
        
          | 771 | 
              my $format = $input->param('format'); | 
          779 | 
              my $format = $input->param('format'); | 
        
        
          | 772 | 
          	my ($sth, $q_errors) = execute_query($sql);  | 
          780 | 
          	my ($sth, $q_errors) = execute_query($sql);  | 
        
        
          | 773 | 
              unless ($q_errors and @$q_errors) { | 
          781 | 
              unless ($q_errors and @$q_errors) { | 
        
          
            
              | 774 | 
                      print $input->header(       -type => 'application/octet-stream',  | 
              782 | 
                      my ( $type, $content );  | 
            
            
              | 775 | 
                                                  -attachment=>"reportresults.$format"  | 
               | 
               | 
            
            
              | 776 | 
                                          );  | 
            
        
          | 777 | 
                  if ($format eq 'tab') { | 
          783 | 
                  if ($format eq 'tab') { | 
        
          
            
              | 778 | 
                          print join("\t", header_cell_values($sth)), "\n"; | 
              784 | 
                          $type = 'application/octet-stream';  | 
            
            
               | 
               | 
              785 | 
                          $content .= join("\t", header_cell_values($sth)) . "\n"; | 
            
        
          | 779 | 
                      while (my $row = $sth->fetchrow_arrayref()) { | 
          786 | 
                      while (my $row = $sth->fetchrow_arrayref()) { | 
        
          
            
              | 780 | 
                              print join("\t", @$row), "\n"; | 
              787 | 
                              $content .= join("\t", @$row) . "\n"; | 
            
        
          | 781 | 
                      }  | 
          788 | 
                      }  | 
        
        
          | 782 | 
                  } else { | 
          789 | 
                  } else { | 
        
          
            
              | 783 | 
                          my $csv = Text::CSV->new({binary => 1}); | 
              790 | 
                          my $delimiter = C4::Context->preference('delimiter') || ','; | 
            
            
               | 
               | 
              791 | 
                          my $csv_content = q||;  | 
            
            
              | 792 | 
                          my $csv = Text::CSV->new({binary => 1, sep_char => $delimiter}); | 
            
        
          | 784 | 
                      $csv or die "Text::CSV->new({binary => 1}) FAILED: " . Text::CSV->error_diag(); | 
          793 | 
                      $csv or die "Text::CSV->new({binary => 1}) FAILED: " . Text::CSV->error_diag(); | 
        
        
          | 785 | 
                      if ($csv->combine(header_cell_values($sth))) { | 
          794 | 
                      if ($csv->combine(header_cell_values($sth))) { | 
        
          
            
              | 786 | 
                              print $csv->string(), "\n";  | 
              795 | 
                              $csv_content .= $csv->string(). "\n";  | 
            
        
          | 787 | 
                      } else { | 
          796 | 
                      } else { | 
        
        
          | 788 | 
                          push @$q_errors, { combine => 'HEADER ROW: ' . $csv->error_diag() } ; | 
          797 | 
                          push @$q_errors, { combine => 'HEADER ROW: ' . $csv->error_diag() } ; | 
        
        
          | 789 | 
                      }  | 
          798 | 
                      }  | 
        
        
          | 790 | 
                      while (my $row = $sth->fetchrow_arrayref()) { | 
          799 | 
                      while (my $row = $sth->fetchrow_arrayref()) { | 
        
        
          | 791 | 
                          if ($csv->combine(@$row)) { | 
          800 | 
                          if ($csv->combine(@$row)) { | 
        
          
            
              | 792 | 
                                  print $csv->string(), "\n";   | 
              801 | 
                                  $csv_content .= $csv->string() . "\n";  | 
            
        
          | 793 | 
                          } else { | 
          802 | 
                          } else { | 
        
        
          | 794 | 
                              push @$q_errors, { combine => $csv->error_diag() } ; | 
          803 | 
                              push @$q_errors, { combine => $csv->error_diag() } ; | 
        
        
          | 795 | 
                          }  | 
          804 | 
                          }  | 
        
        
          | 796 | 
                      }  | 
          805 | 
                      }  | 
        
            
               | 
               | 
              806 | 
                          if ( $format eq 'csv' ) { | 
            
            
              | 807 | 
                              $type = 'application/csv';  | 
            
            
              | 808 | 
                              $content = $csv_content;  | 
            
            
              | 809 | 
                          }  | 
            
            
              | 810 | 
                          elsif ( $format eq 'ods' ) { | 
            
            
              | 811 | 
                              $type = 'application/vnd.oasis.opendocument.spreadsheet';  | 
            
            
              | 812 | 
                              my $csv_fh = File::Temp->new();  | 
            
            
              | 813 | 
                              my $ods_fh = File::Temp->new();  | 
            
            
              | 814 | 
                              print $csv_fh $csv_content;  | 
            
            
              | 815 | 
                              my $csv_filepath = $csv_fh->filename;  | 
            
            
              | 816 | 
                              my $ods_filepath = $ods_fh->filename;  | 
            
            
              | 817 | 
               | 
            
            
              | 818 | 
                              my $csv2ods_cmd = qx|which csv2ods|;  | 
            
            
              | 819 | 
                              chomp $csv2ods_cmd;  | 
            
            
              | 820 | 
                              qx|  | 
            
            
              | 821 | 
                                  $csv2ods_cmd -i $csv_filepath -o $ods_filepath -d '$delimiter'  | 
            
            
              | 822 | 
                              |;  | 
            
            
              | 823 | 
               | 
            
            
              | 824 | 
                              binmode(STDOUT);  | 
            
            
              | 825 | 
                              $content .= $_ while <$ods_fh>;  | 
            
            
              | 826 | 
                          }  | 
            
        
          | 797 | 
                  }  | 
          827 | 
                  }  | 
        
            
               | 
               | 
              828 | 
                      print $input->header(  | 
            
            
              | 829 | 
                          -type => $type,  | 
            
            
              | 830 | 
                          -attachment=>"reportresults.$format"  | 
            
            
              | 831 | 
                      );  | 
            
            
              | 832 | 
                      print $content;  | 
            
            
              | 833 | 
               | 
            
        
          | 798 | 
                  foreach my $err (@$q_errors, @errors) { | 
          834 | 
                  foreach my $err (@$q_errors, @errors) { | 
        
        
          | 799 | 
                      print "# ERROR: " . (map {$_ . ": " . $err->{$_}} keys %$err) . "\n"; | 
          835 | 
                      print "# ERROR: " . (map {$_ . ": " . $err->{$_}} keys %$err) . "\n"; | 
        
        
          | 800 | 
                  }   # here we print all the non-fatal errors at the end.  Not super smooth, but better than nothing.  | 
          836 | 
                  }   # here we print all the non-fatal errors at the end.  Not super smooth, but better than nothing.  | 
        
            
              | 801 | 
              -   | 
               | 
               |