{ name => "DBD::Pg", version => '1.49', url => "http://search.cpan.org/~dbdpg/" },
{ name => "Email::Address", url => "http://search.cpan.org/~rjbs/" },
{ name => "FCGI", url => "http://search.cpan.org/~mstrout/" },
- { name => "IO::Wrap", version => '2.110', url => "http://search.cpan.org/~dskoll/" },
{ name => "List::MoreUtils", version => '0.21', url => "http://search.cpan.org/~vparseval/" },
{ name => "PDF::API2", version => '2.000', url => "http://search.cpan.org/~areibens/" },
{ name => "Template", version => '2.18', url => "http://search.cpan.org/~abw/" },
$self->{raw_io_active} = 0;
}
+sub set_numberformat_wo_thousands_separator {
+ my $self = shift;
+ my $myconfig = shift || \%::myconfig;
+
+ $self->{saved_numberformat} = $myconfig->{numberformat};
+ $myconfig->{numberformat} =~ s/^1[,\.]/1/;
+}
+
+sub restore_numberformat {
+ my $self = shift;
+ my $myconfig = shift || \%::myconfig;
+
+ $myconfig->{numberformat} = $self->{saved_numberformat} if $self->{saved_numberformat};
+}
+
1;
package SL::ReportGenerator;
use Data::Dumper;
-use IO::Wrap;
use List::Util qw(max);
use Text::CSV_XS;
#use PDF::API2; # these two eat up to .75s on startup. only load them if we actually need them
}
sub unescape_string {
- my $self = shift;
- my $text = shift;
+ my ($self, $text, $do_iconv) = @_;
- $text = $main::locale->unquote_special_chars('HTML', $text);
- $text = $::locale->{iconv}->convert($text);
+ $text = $main::locale->unquote_special_chars('HTML', $text);
+ $text = $::locale->{iconv}->convert($text) if $do_iconv;
return $text;
}
'quote_char' => $quote_char,
'eol' => $eol, });
- my $stdout = wraphandle(\*STDOUT);
my @visible_columns = $self->get_visible_columns('CSV');
+ my $stdout;
+ open $stdout, '>-';
+ binmode $stdout, ':encoding(utf8)' if $::locale->is_utf8;
+
if ($opts->{headers}) {
if (!$self->{custom_headers}) {
- $csv->print($stdout, [ map { $self->unescape_string($self->{columns}->{$_}->{text}) } @visible_columns ]);
+ $csv->print($stdout, [ map { $self->unescape_string($self->{columns}->{$_}->{text}, 1) } @visible_columns ]);
} else {
foreach my $row (@{ $self->{custom_headers} }) {
'attachment_basename' => $locale->text('vendor_invoice_list') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort and escape callback, this one we use for the add sub
$form->{callback} = $href .= "&sort=$form->{sort}";
'attachment_basename' => $locale->text('invoice_list') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort and escape callback, this one we use for the add sub
$form->{callback} = $href .= "&sort=$form->{sort}";
use strict;
+use List::MoreUtils qw(any);
use POSIX qw(strftime);
use SL::BankAccount;
'attachment_basename' => $locale->text('bankaccounts') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'std_column_visibility' => 1,
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'std_column_visibility' => 1,
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'attachment_basename' => $attachment_basename . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'attachment_basename' => $attachment_basename . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort and escape callback, this one we use for the add sub
$form->{callback} = $href .= "&sort=$form->{sort}";
'amount_unit' => $all_units->{$form->{"partunit_$i"}}->{base_unit},
'conv_units' => 'convertible_not_smaller',
'max_places' => 2);
- $content .= qq| <input type="button" onclick="open_stock_in_out_window('${in_out}', $i);" value="?">|;
+ $content = qq|<span id="stock_in_out_qty_display_${i}">${content}</span> <input type="button" onclick="open_stock_in_out_window('${in_out}', $i);" value="?">|;
$main::lxdebug->leave_sub();
$main::lxdebug->leave_sub();
}
+sub _stock_in_out_set_qty_display {
+ my $stock_info = shift;
+ my $form = $::form;
+ my $all_units = AM->retrieve_all_units();
+ my $sum = AM->sum_with_unit(map { $_->{qty}, $_->{unit} } @{ $stock_info });
+ $form->{qty_display} = $form->format_amount_units(amount => $sum * 1,
+ part_unit => $form->{partunit},
+ amount_unit => $all_units->{ $form->{partunit} }->{base_unit},
+ conv_units => 'convertible_not_smaller',
+ max_places => 2);
+}
+
sub set_stock_in {
$main::lxdebug->enter_sub();
$form->{stock} = YAML::Dump($stock_info);
+ _stock_in_out_set_qty_display($stock_info);
+
$form->header();
print $form->parse_html_template('do/set_stock_in_out');
stock_in_out_form();
} else {
+ _stock_in_out_set_qty_display($stock_info);
+
$form->header();
print $form->parse_html_template('do/set_stock_in_out');
}
'attachment_basename' => $locale->text('follow_up_list') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
my $idx = 0;
my $callback = build_std_url('action=report', grep { $form->{$_} } @report_params);
'attachment_basename' => $locale->text('general_ledger_list') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort to callback
$form->{callback} = "$callback&sort=" . E($form->{sort}) . "&sortdir=" . E($form->{sortdir});
'attachment_basename' => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'attachment_basename' => $attachment_basename . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort and escape callback, this one we use for the add sub
$form->{callback} = $href .= "&sort=$form->{sort}";
'attachment_basename' => $locale->text('project_list') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
CVar->add_custom_variables_to_report('module' => 'Projects',
'trans_id_field' => 'id',
</tr>
<tr>
<td>| . $locale->text('Review of Aging list') . qq|</td>
- <td><select name="review_of_aging_list">
+ <td><select name="review_of_aging_list">
<option></option>
<option>0-30</option>
<option>30-60</option>
'pdf_template' => 'rp/html_report_susa',
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
# add sort and escape callback, this one we use for the add sub
$form->{callback} = $href .= "&sort=$form->{sort}";
'std_column_visibility' => 1,
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'title' => $form->{title},
'attachment_basename' => $attachment_basename . strftime('_%Y%m%d', localtime time),
);
+ $report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
my $previous_ctid = 0;
my $row_idx = 0;
'raw_bottom_info_text' => $raw_bottom_info_text);
}
- $report->set_options_from_form();
-
$report->generate_with_headers();
$main::lxdebug->leave_sub();
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
+
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
'attachment_basename' => $locale->text('banktransfers') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%::myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
my ($callback, $href, @columns);
$form->{customer} = $form->unescape($form->{customer});
-
+
($form->{customername}, $form->{customer_id}) = split(/--/, $form->{customer});
# decimalplaces überprüfen oder auf Default 2 setzen
'marge_total' => { 'text' => $locale->text('Sales margin'), },
'marge_percent' => { 'text' => $locale->text('Sales margin %'), },
);
-
+
my %column_alignment = map { $_ => 'right' } qw(lastcost sellprice sellprice_total lastcost_total unit discount marge_total marge_percent qty);
$form->{"l_type"} = "Y";
'attachment_basename' => $locale->text('Sales Report') . strftime('_%Y%m%d', localtime time),
);
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
$ar->{sellprice} = $ar->{sellprice} / $ar->{price_factor};
$ar->{lastcost} = $ar->{lastcost} / $ar->{price_factor};
$ar->{sellprice_total} = $ar->{qty} * $ar->{sellprice};
- $ar->{lastcost_total} = $ar->{qty} * $ar->{lastcost};
+ $ar->{lastcost_total} = $ar->{qty} * $ar->{lastcost};
# marge_percent wird neu berechnet, da Wert in invoice leer ist (Bug)
$ar->{marge_percent} = $ar->{sellprice_total} ? (($ar->{sellprice_total}-$ar->{lastcost_total}) / $ar->{sellprice_total}) : 0;
# marge_total neu berechnen
$report->add_data($headerrow_set);
# add empty row after main header
-# my $emptyheaderrow->{description}->{data} = "";
+# my $emptyheaderrow->{description}->{data} = "";
# $emptyheaderrow->{description}->{class} = "listmainsortheader";
# my $emptyheaderrow_set = [ $emptyheaderrow ];
-# $report->add_data($emptyheaderrow_set) if $form->{l_headers} eq "Y";
+# $report->add_data($emptyheaderrow_set) if $form->{l_headers} eq "Y";
};
# subsort überschriften
- if ( $idx == 0
+ if ( $idx == 0
or $ar->{ $form->{'subsort'} } ne $form->{AR}->[$idx - 1]->{ $form->{'subsort'} }
or $ar->{ $form->{'mainsort'} } ne $form->{AR}->[$idx - 1]->{ $form->{'mainsort'} }
) {
map { $subtotals1{$_} += $ar->{$_};
$subtotals2{$_} += $ar->{$_};
} @subtotal_columns;
-
- map { $totals{$_} += $ar->{$_} } @total_columns;
+
+ map { $totals{$_} += $ar->{$_} } @total_columns;
$subtotals2{sellprice} = $subtotals2{sellprice_total} / $subtotals2{qty} if $subtotals2{qty} != 0;
$subtotals1{sellprice} = $subtotals1{sellprice_total} / $subtotals1{qty} if $subtotals1{qty} != 0;
'align' => $column_alignment{$column},
};
}
-
+
$row->{description}->{class} = 'listsortdescription';
$row->{invnumber}->{link} = build_std_url("script=is.pl", 'action=edit')
} else {
$name = 'name';
};
-
+
if ($form->{l_subtotal} eq 'Y' ) {
push @{ $row_set }, create_subtotal_row_invoice(\%subtotals2, \@columns, \%column_alignment, \@subtotal_columns, 'listsubsortsubtotal', $ar->{$name}) ;
push @{ $row_set }, insert_empty_row();
};
}
- # if mainsort has changed, add mainsort subtotal and empty row
+ # if mainsort has changed, add mainsort subtotal and empty row
if (($form->{l_subtotal} eq 'Y')
&& (($idx == (scalar @{ $form->{AR} } - 1)) # last element always has a subtotal
|| ($ar->{ $form->{'mainsort'} } ne $form->{AR}->[$idx + 1]->{ $form->{'mainsort'} })
push @{ $row_set }, insert_empty_row();
};
}
-
+
$report->add_data($row_set);
$idx++;
my %myconfig = %main::myconfig;
my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } };
-
+
$row->{description}->{data} = "Summe " . $name;
map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } qw(marge_total marge_percent);
'title' => $form->{title},
'attachment_basename' => strftime($locale->text('warehouse_journal_list') . '_%Y%m%d', localtime time));
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
my $all_units = AM->retrieve_units(\%myconfig, $form);
my @contents = WH->get_warehouse_journal(%filter);
'title' => $form->{title},
'attachment_basename' => strftime($locale->text('warehouse_report_list') . '_%Y%m%d', localtime time));
$report->set_options_from_form();
+ $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
my $all_units = AM->retrieve_units(\%myconfig, $form);
my @contents = WH->get_warehouse_report(%filter);
@item
Email::Address
@item
-IO::Wrap (aus dem Paket IO::Stringy)
-@item
List::MoreUtils
@item
PDF::API2
* Email::Address
- * IO::Wrap (aus dem Paket IO::Stringy)
-
* List::MoreUtils
* PDF::API2
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
- span.roman { font-family:serif; font-weight:normal; }
- span.sansserif { font-family:sans-serif; font-weight:normal; }
+ span.roman { font-family:serif; font-weight:normal; }
+ span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<li>DBI
<li>DBD::Pg
<li>Email::Address
-<li>IO::Wrap (aus dem Paket IO::Stringy)
<li>List::MoreUtils
<li>PDF::API2
<li>Template
neu hinzugekommen:
- Achive::Zip
-- IO::Wrap (aus dem Paket "IO::Stringy")
- Template
- Text::CSV_XS
- Text::Iconv
-[% USE HTML %]<body onload="on_load();">
+[% USE HTML %]
+[% USE L %]
+[% L.javascript_tag('jquery') %]
+<body onload="on_load();">
<script type="text/javascript">
<!--
function on_load() {
- var row = document.getElementsByName("row")[0].value;
- var stock = document.getElementsByName("stock")[0].value;
- var in_out = document.getElementsByName("in_out")[0].value;
-
- window.opener.document.getElementsByName("stock_" + in_out + "_" + row)[0].value = stock;
+ var row = $('#row').attr('value');
+ window.opener.document.getElementsByName("stock_" + $('#in_out').attr('value') + "_" + row)[0].value = $('#stock').attr('value');
+ $(window.opener.document.getElementById("stock_in_out_qty_display_" + row)).html($('#qty_display').attr('value'));
window.close();
}
</script>
<form name="data">
- <input type="hidden" name="row" value="[% HTML.escape(row) %]">
- <input type="hidden" name="stock" value="[% HTML.escape(stock) %]">
- <input type="hidden" name="in_out" value="[% HTML.escape(in_out) %]">
+ <input type="hidden" name="row" id="row" value="[% HTML.escape(row) %]">
+ <input type="hidden" name="stock" id="stock" value="[% HTML.escape(stock) %]">
+ <input type="hidden" name="in_out" id="in_out" value="[% HTML.escape(in_out) %]">
+ <input type="hidden" name="qty_display" id="qty_display" value="[% HTML.escape(qty_display) %]">
</form>
</body>
<td align="right">[% 'Separator chararacter' | $T8 %]</td>
<td>
<select name="report_generator_csv_options_sep_char" style="width: 300px">
- <option value=";" selected>;</option>
- <option value=",">,</option>
+ <option value=";">;</option>
+ <option value="," selected>,</option>
<option value=":">:</option>
<option value="TAB">TAB ([% 'The tabulator character' | $T8 %])</option>
</select>