Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision a939b727

Von Moritz Bunkus vor mehr als 17 Jahren hinzugefügt

  • ID a939b72794643b5ad273886ff6d66b782eecb601
  • Vorgänger 784cf1e9
  • Nachfolger 35648bc6

Eine Report-Klasse geschrieben, der die Ergebnisse von Datenbankabfragen übergeben werden. Diese Klasse kann daraus dann entweder die bekannten Listenansichten oder auch CSV- und PDF-Exporte erzeugen. Dazu werden entsprechende Buttons eingeblendet.
Dazu werden einige neue Perl-Module (Text::CSV_XS und IO::Wrap) sowie zwei weitere Hilfsprogramme (html2ps und Ghostscript) benötigt, deren Pfade über die lx-erp.conf eingestellt werden müssen.

Unterschiede anzeigen:

SL/InstallationCheck.pm
13 13
  { "name" => "Text::Iconv", "url" => "http://search.cpan.org/~mpiotr/" },
14 14
  { "name" => "Time::HiRes", "url" => "http://search.cpan.org/~jhi/" },
15 15
  { "name" => "YAML", "url" => "http://search.cpan.org/~ingy/" },
16
  { "name" => "IO::Wrap", "url" => "http://search.cpan.org/~dskoll/IO-stringy-2.110/" },
17
  { "name" => "Text::CSV_XS", "url" => "http://search.cpan.org/~hmbrand/Text-CSV_XS-0.29/" },
16 18
  );
17 19

  
18 20
sub module_available {
SL/ReportGenerator.pm
1
package SL::ReportGenerator;
2

  
3
use IO::Wrap;
4
use Text::CSV_XS;
5

  
6
use SL::Form;
7

  
8
sub new {
9
  my $type = shift;
10

  
11
  my $self = { };
12

  
13
  $self->{myconfig} = shift;
14
  $self->{form}     = shift;
15

  
16
  $self->{data}     = [];
17
  $self->{options}  = {
18
    'std_column_visibility' => 0,
19
    'output_format'         => 'HTML',
20
    'allow_pdf_export'      => 1,
21
    'allow_csv_export'      => 1,
22
    'pdf_export'            => {
23
      'paper_size'          => 'A4',
24
      'orientation'         => 'landscape',
25
      'font_size'           => '10',
26
      'margin_top'          => 1.5,
27
      'margin_left'         => 1.5,
28
      'margin_bottom'       => 1.5,
29
      'margin_right'        => 1.5,
30
      'number'              => 1,
31
    },
32
    'csv_export'            => {
33
      'quote_char'          => '"',
34
      'sep_char'            => ';',
35
      'escape_char'         => '"',
36
      'eol_style'           => 'DOS',
37
      'headers'             => 1,
38
    },
39
  };
40
  $self->{export}   = {
41
    'nextsub'       => '',
42
    'variable_list' => '',
43
  };
44

  
45
  $self->set_options(@_) if (@_);
46

  
47
  return bless $self, $type;
48
}
49

  
50
sub set_columns {
51
  my $self    = shift;
52
  my %columns = @_;
53

  
54
  $self->{columns} = \%columns;
55

  
56
  foreach my $column (values %{ $self->{columns} }) {
57
    $column->{visible} = $self->{options}->{std_column_visibility} unless defined $column->{visible};
58
  }
59

  
60
  $self->set_column_order(sort keys %{ $self->{columns} });
61
}
62

  
63
sub set_column_order {
64
  my $self    = shift;
65

  
66
  my $order   = 0;
67
  my %columns = map { $order++; ($_, $order) } @_;
68

  
69
  foreach my $column (sort keys %{ $self->{columns} }) {
70
    next if $columns{$column};
71

  
72
    $order++;
73
    $columns{$column} = $order;
74
  }
75

  
76
  $self->{column_order} = [ sort { $columns{$a} <=> $columns{$b} } keys %columns ];
77
}
78

  
79
sub set_sort_indicator {
80
  my $self = shift;
81

  
82
  $self->{options}->{sort_indicator_column}    = shift;
83
  $self->{options}->{sort_indicator_direction} = shift;
84
}
85

  
86
sub add_data {
87
  my $self = shift;
88

  
89
  while (my $arg = shift) {
90
    if ('ARRAY' eq ref $arg) {
91
      push @{ $self->{data} }, $arg;
92

  
93
    } elsif ('HASH' eq ref $arg) {
94
      push @{ $self->{data} }, [ $arg ];
95

  
96
    } else {
97
      $self->{form}->error('Incorrect usage -- expecting hash or array ref');
98
    }
99
  }
100
}
101

  
102
sub clear_data {
103
  my $self = shift;
104

  
105
  $self->{data} = [];
106
}
107

  
108
sub set_options {
109
  my $self    = shift;
110
  my %options = @_;
111

  
112
  map { $self->{options}->{$_} = $options{$_} } keys %options;
113
}
114

  
115
sub set_options_from_form {
116
  my $self     = shift;
117

  
118
  my $form     = $self->{form};
119
  my $myconfig = $self->{myconfig};
120

  
121
  foreach my $key (qw(output_format)) {
122
    my $full_key = "report_generator_${key}";
123
    $self->{options}->{$key} = $form->{$full_key} if (defined $form->{$full_key});
124
  }
125

  
126
  foreach my $format (qw(pdf csv)) {
127
    my $opts = $self->{options}->{"${format}_export"};
128
    foreach my $key (keys %{ $opts }) {
129
      my $full_key = "report_generator_${format}_options_${key}";
130
      $opts->{$key} = $key =~ /^margin/ ? $form->parse_amount($myconfig, $form->{$full_key}) : $form->{$full_key};
131
    }
132
  }
133
}
134

  
135
sub set_export_options {
136
  my $self        = shift;
137

  
138
  $self->{export} = {
139
    'nextsub'       => shift,
140
    'variable_list' => join(" ", @_),
141
  };
142
}
143

  
144
sub generate_content {
145
  my $self   = shift;
146
  my $format = lc $self->{options}->{output_format};
147

  
148
  if (!$self->{columns}) {
149
    $self->{form}->error('Incorrect usage -- no columns specified');
150
  }
151

  
152
  if ($format eq 'html') {
153
    return $self->generate_html_content();
154

  
155
  } elsif ($format eq 'csv') {
156
    return $self->generate_csv_content();
157

  
158
  } elsif ($format eq 'pdf') {
159
    return $self->generate_pdf_content();
160

  
161
  } else {
162
    $self->{form}->error('Incorrect usage -- unknown format (supported are HTML, CSV, PDF)');
163
  }
164
}
165

  
166
sub generate_with_headers {
167
  my $self   = shift;
168
  my $format = lc $self->{options}->{output_format};
169

  
170
  if (!$self->{columns}) {
171
    $self->{form}->error('Incorrect usage -- no columns specified');
172
  }
173

  
174
  my $filename =  $self->{options}->{attachment_basename} || 'report';
175
  $filename    =~ s|.*\\||;
176
  $filename    =~ s|.*/||;
177

  
178
  if ($format eq 'html') {
179
    $self->{form}->{title} = $self->{title};
180
    $self->{form}->header();
181
    print $self->generate_html_content();
182

  
183
  } elsif ($format eq 'csv') {
184
    print qq|content-type: text/plain\n\n|;
185
#     print qq|content-disposition: attachment; filename=${filename}.csv\n\n|;
186
    $self->generate_csv_content();
187

  
188
  } elsif ($format eq 'pdf') {
189
    print qq|content-type: application/pdf\n|;
190
    print qq|content-disposition: attachment; filename=${filename}.pdf\n\n|;
191
    $self->generate_pdf_content();
192

  
193
  } else {
194
    $self->{form}->error('Incorrect usage -- unknown format (supported are HTML, CSV, PDF)');
195
  }
196
}
197

  
198
sub get_visible_columns {
199
  my $self   = shift;
200
  my $format = shift;
201

  
202
  return grep { my $c = $self->{columns}->{$_}; $c && $c->{visible} && (($c->{visible} == 1) || ($c->{visible} =~ /${format}/i)) } @{ $self->{column_order} };
203
}
204

  
205
sub prepare_html_content {
206
  my $self = shift;
207

  
208
  my ($column, $name, @column_headers);
209

  
210
  my $opts            = $self->{options};
211
  my @visible_columns = $self->get_visible_columns('HTML');
212

  
213
  foreach $name (@visible_columns) {
214
    $column = $self->{columns}->{$name};
215

  
216
    my $header = {
217
      'name'                     => $name,
218
      'link'                     => $column->{link},
219
      'text'                     => $column->{text},
220
      'show_sort_indicator'      => $name eq $opts->{sort_indicator_column},
221
      'sort_indicator_direction' => $opts->{sort_indicator_direction},
222
    };
223

  
224
    push @column_headers, $header;
225
  }
226

  
227
  my ($outer_idx, $inner_idx) = (0, 0);
228
  my @rows;
229

  
230
  foreach my $row_set (@{ $self->{data} }) {
231
    $outer_idx++;
232

  
233
    foreach my $row (@{ $row_set }) {
234
      $inner_idx++;
235

  
236
      my $row_data = {
237
        'COLUMNS'       => [ map { $row->{$_} } @visible_columns ],
238
        'outer_idx'     => $outer_idx,
239
        'outer_idx_odd' => $outer_idx % 2,
240
        'inner_idx'     => $inner_idx,
241
      };
242

  
243
      push @rows, $row_data;
244
    }
245
  }
246

  
247
  my @export_variables;
248
  foreach my $key (split m/ +/, $self->{export}->{variable_list}) {
249
    push @export_variables, { 'key' => $key, 'value' => $self->{form}->{$key} };
250
  }
251

  
252
  my $allow_pdf_export = $opts->{allow_pdf_export} && (-x $main::html2ps_bin) && (-x $main::ghostscript_bin);
253

  
254
  my $variables = {
255
    'TITLE'                => $opts->{title},
256
    'TOP_INFO_TEXT'        => $opts->{top_info_text},
257
    'RAW_TOP_INFO_TEXT'    => $opts->{raw_top_info_text},
258
    'BOTTOM_INFO_TEXT'     => $opts->{bottom_info_text},
259
    'RAW_BOTTOM_INFO_TEXT' => $opts->{raw_bottom_info_text},
260
    'ALLOW_PDF_EXPORT'     => $allow_pdf_export,
261
    'ALLOW_CSV_EXPORT'     => $opts->{allow_csv_export},
262
    'SHOW_EXPORT_BUTTONS'  => $allow_pdf_export || $opts->{allow_csv_export},
263
    'COLUMN_HEADERS'       => \@column_headers,
264
    'NUM_COLUMNS'          => scalar @column_headers,
265
    'ROWS'                 => \@rows,
266
    'EXPORT_VARIABLES'     => \@export_variables,
267
    'EXPORT_VARIABLE_LIST' => $self->{export}->{variable_list},
268
    'EXPORT_NEXTSUB'       => $self->{export}->{nextsub},
269
  };
270

  
271
  return $variables;
272
}
273

  
274
sub generate_html_content {
275
  my $self      = shift;
276
  my $variables = $self->prepare_html_content();
277

  
278
  return $self->{form}->parse_html_template('report_generator/html_report', $variables);
279
}
280

  
281
sub verify_paper_size {
282
  my $self                 = shift;
283
  my $requested_paper_size = lc shift;
284
  my $default_paper_size   = shift;
285

  
286
  my %allowed_paper_sizes  = map { $_ => 1 } qw(a3 a4 letter legal);
287

  
288
  return $allowed_paper_sizes{$requested_paper_size} ? $requested_paper_size : $default_paper_size;
289
}
290

  
291
sub generate_pdf_content {
292
  my $self      = shift;
293
  my $variables = $self->prepare_html_content();
294
  my $form      = $self->{form};
295
  my $myconfig  = $self->{myconfig};
296
  my $opt       = $self->{options}->{pdf_export};
297

  
298
  my $opt_number     = $opt->{number}                     ? 'number : 1'    : '';
299
  my $opt_landscape  = $opt->{orientation} eq 'landscape' ? 'landscape : 1' : '';
300

  
301
  my $opt_paper_size = $self->verify_paper_size($opt->{paper_size}, 'a4');
302

  
303
  my $html2ps_config = <<"END"
304
\@html2ps {
305
  option {
306
    titlepage: 0;
307
    hyphenate: 0;
308
    colour: 1;
309
    ${opt_landscape};
310
    ${opt_number};
311
  }
312
  paper {
313
    type: ${opt_paper_size};
314
  }
315
  break-table: 1;
316
}
317

  
318
\@page {
319
  margin-top:    $opt->{margin_top}cm;
320
  margin-left:   $opt->{margin_left}cm;
321
  margin-bottom: $opt->{margin_bottom}cm;
322
  margin-right:  $opt->{margin_right}cm;
323
}
324

  
325
BODY {
326
  font-family: Helvetica;
327
  font-size:   $opt->{font_size}pt;
328
}
329

  
330
END
331
  ;
332

  
333
  my $cfg_file_name = Common::tmpname() . '-html2ps-config';
334
  my $cfg_file      = IO::File->new($cfg_file_name, 'w') || $form->error($locale->text('Could not write the html2ps config file.'));
335

  
336
  $cfg_file->print($html2ps_config);
337
  $cfg_file->close();
338

  
339
  my $html_file_name = Common::tmpname() . '.html';
340
  my $html_file      = IO::File->new($html_file_name, 'w');
341

  
342
  if (!$html_file) {
343
    unlink $cfg_file_name;
344
    $form->error($locale->text('Could not write the temporary HTML file.'));
345
  }
346

  
347
  $html_file->print($form->parse_html_template('report_generator/pdf_report', $variables));
348
  $html_file->close();
349

  
350
  my $gs = IO::File->new("\"${main::html2ps_bin}\" -f \"${cfg_file_name}\" \"${html_file_name}\" | " .
351
                         "\"${main::ghostscript_bin}\" -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sPAPERSIZE=${opt_paper_size} -sOutputFile=- -c .setpdfwrite - |");
352
  if ($gs) {
353
    while (my $line = <$gs>) {
354
      print $line;
355
    }
356
    $gs->close();
357
    unlink $cfg_file_name, $html_file_name;
358

  
359
  } else {
360
    unlink $cfg_file_name, $html_file_name;
361
    $form->error($locale->text('Could not spawn html2ps or GhostScript.'));
362
  }
363
}
364

  
365
sub generate_csv_content {
366
  my $self = shift;
367

  
368
  my %valid_sep_chars    = (';' => ';', ',' => ',', ':' => ':', 'TAB' => "\t");
369
  my %valid_escape_chars = ('"' => 1, "'" => 1);
370
  my %valid_quote_chars  = ('"' => 1, "'" => 1);
371

  
372
  my $opts        = $self->{options}->{csv_export};
373
  my $eol         = $opts->{eol_style} eq 'DOS'               ? "\r\n"                              : "\n";
374
  my $sep_char    = $valid_sep_chars{$opts->{sep_char}}       ? $valid_sep_chars{$opts->{sep_char}} : ';';
375
  my $escape_char = $valid_escape_chars{$opts->{escape_char}} ? $opts->{escape_char}                : '"';
376
  my $quote_char  = $valid_quote_chars{$opts->{quote_char}}   ? $opts->{quote_char}                 : '"';
377

  
378
  $escape_char    = $quote_char if ($opts->{escape_char} eq 'QUOTE_CHAR');
379

  
380
  my $csv = Text::CSV_XS->new({ 'binary'      => 1,
381
                                'sep_char'    => $sep_char,
382
                                'escape_char' => $escape_char,
383
                                'quote_char'  => $quote_char,
384
                                'eol'         => $eol, });
385

  
386
  my $stdout          = wraphandle(\*STDOUT);
387
  my @visible_columns = $self->get_visible_columns('CSV');
388

  
389
  if ($opts->{headers}) {
390
    $csv->print($stdout, [ map { $self->{columns}->{$_}->{text} } @visible_columns ]);
391
  }
392

  
393
  foreach my $row_set (@{ $self->{data} }) {
394
    foreach my $row (@{ $row_set }) {
395
      $csv->print($stdout, [ map { $row->{$_}->{data} } @visible_columns ]);
396
    }
397
  }
398
}
399

  
400
1;
bin/mozilla/report_generator.pl
1
#=====================================================================
2
# LX-Office ERP
3
# Copyright (C) 2004
4
# Based on SQL-Ledger Version 2.1.9
5
# Web http://www.lx-office.org
6
######################################################################
7
#
8
# Stuff that can be used from other modules
9
#
10
######################################################################
11

  
12
use SL::Form;
13
use SL::Common;
14
use SL::MoreCommon;
15
use SL::ReportGenerator;
16

  
17
sub export_as_pdf {
18
  $lxdebug->enter_sub();
19

  
20
  if ($form->{report_generator_pdf_options_set}) {
21
    report_generator_do('PDF');
22
    $lxdebug->leave_sub();
23
    return;
24
  }
25

  
26
  my @form_values;
27
  map { push @form_values, { 'key' => $_, 'value' => $form->{$_} } } keys %{ $form };
28

  
29
  $form->{title} = $locale->text('PDF export -- options');
30
  $form->header();
31
  print $form->parse_html_template('report_generator/pdf_export_options',
32
                                   { 'HIDDEN'         => \@form_values,
33
                                     'default_margin' => $form->format_amount(\%myconfig, 1.5) });
34

  
35
  $lxdebug->leave_sub();
36
}
37

  
38
sub export_as_csv {
39
  $lxdebug->enter_sub();
40

  
41
  if ($form->{report_generator_csv_options_set}) {
42
    report_generator_do('CSV');
43
    $lxdebug->leave_sub();
44
    return;
45
  }
46

  
47
  my @form_values;
48
  map { push @form_values, { 'key' => $_, 'value' => $form->{$_} } } keys %{ $form };
49

  
50
  $form->{title} = $locale->text('CSV export -- options');
51
  $form->header();
52
  print $form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
53

  
54
  $lxdebug->leave_sub();
55
}
56

  
57
sub report_generator_do {
58
  $lxdebug->enter_sub();
59

  
60
  my $format  = shift;
61

  
62
  my $nextsub = $form->{report_generator_nextsub};
63
  if (!$nextsub) {
64
    $form->error($locale->text('report_generator_nextsub is not defined.'));
65
  }
66

  
67
  foreach my $key (split m/ +/, $form->{report_generator_variable_list}) {
68
    $form->{$key} = $form->{"report_generator_hidden_${key}"};
69
  }
70

  
71
  $form->{report_generator_output_format} = $format;
72

  
73
  delete @{$form}{map { "report_generator_$_" } qw(nextsub variable_list)};
74

  
75
  call_sub($nextsub);
76

  
77
  $lxdebug->leave_sub();
78
}
79

  
80
1;
doc/INSTALL
31 31
* Class::Accessor
32 32
* Archive::Zip
33 33
* Text::Iconv
34
* Text::CSV_XS
35
* IO::Wrap (aus dem Paket IO::Stringy)
34 36
* YAML
35 37

  
36 38
Diese Pakete k?nnen bei den unterschiedlichen Distributionen anders hei?en. 
37
(Debian: apache, postgresql, libdbi-perl, libdbd-pg-perl,  libpgperl, libhtml-template-perl, libclass-accessor-perl, libarchive-zip-perl, libtext-iconv-perl, libyaml-perl)
38
(Fedora: httpd, postgresql-server, perl-DBI, perl-DBD-Pg) 
39
(SuSE: apache2, postgresql-server,  perl-DBI, perl-DBD-Pg)
39
(Debian: apache, postgresql, libdbi-perl, libdbd-pg-perl,  libpgperl, libhtml-template-perl, libclass-accessor-perl, libarchive-zip-perl, libtext-iconv-perl, libyaml-perl, libtext-csv-perl, libio-stringy-perl)
40
(Fedora: httpd, postgresql-server, perl-DBI, perl-DBD-Pg)
41
(SuSE: apache2, postgresql-server,  perl-DBI, perl-DBD-Pg, perl-Archive-Zip, perl-Class-Accessor, perl-Text-Iconv, perl-Text-CSV_XS, perl-HTML-Template, perl-IO-stringy)
40 42

  
41 43

  
42 44
Da Perl-CGI-Ajax nicht als Paket f?r Distributionen bereit steht, mu? es mit der CPAN-Shell installiert werden.
43
Leider ist dazu nicht jeder in der Lage. LxO liefert daher das Paket im CGI-Verzeichnis mit. Das sollte als Fall-Back greifen.
45
Leider gibt es F?lle, in denen das nicht m?glich oder praktikabel ist. LxO liefert daher das Paket im CGI-Verzeichnis mit. Das sollte als Fall-Back greifen.
44 46

  
45 47

  
46 48
Die PostgreSQL Konfiguration mu? angepasst werden.
doc/UPGRADE
5 5
** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! **
6 6

  
7 7

  
8
Upgrade von v2.4.0 auf 2.4.1 sowie von 2.4.1 auf 2.4.2
9
======================================================
8
Upgrade von v2.4.0 und neuer auf v2.6.0
9
=======================================
10 10

  
11
Ein Upgrade von v2.4.0 auf v2.4.1 oder von v2.4.1 auf v2.4.2 besteht
12
aus zwei Teilen: den Dateien (einfaches Entpacken und Kopieren in das
11
Ein Upgrade von v2.4.0 oder neuer auf v2.6.0 aus zwei Teilen: den
12
Dateien (einfaches Entpacken und Kopieren in das
13 13
Installationsverzeichnis gen?gen) sowie dem Datenbankupgrade.
14 14

  
15 15
Bitte beachten Sie auch die Liste der ben?tigten Perl-Module am Anfang
16 16
der Datei "doc/INSTALL". Besonders nach einem Upgrade auf 2.4.2 muss
17
sichergestellt werden, dass das Modul "YAML" installiert ist.
17
sichergestellt werden, dass das Modul "YAML" installiert ist. v2.6.0
18
ben?tigt zus?tzlich die Module "Text::CSV_XS" und "IO::Wrap".
18 19

  
19 20
Das Datenbankupgrade wird automatisch gestartet, wenn sich der erste
20 21
Benutzer nach dem Upgrade der Dateien an Lx-Office anmeldet.
......
22 23
** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! **
23 24

  
24 25
Anders als beim Upgrade auf 2.4.0 handelt es bei den Datenbankupgrades
25
auf 2.4.1 und 2.4.2 nur um automatisch ablaufende Scripte, die keine
26
Benutzereingaben erfordern.
26
auf Versionen nach 2.4.0 nur um automatisch ablaufende Scripte, die
27
keine Benutzereingaben erfordern.
27 28

  
28 29

  
29 30
Upgrade von v2.2.0 bis 2.2.2 auf 2.4.0
locale/de/all
200 200
  'Body:'                       => 'Text:',
201 201
  'Books are open'              => 'Die B?cher sind ge?ffnet.',
202 202
  'Both'                        => 'Sowohl als auch',
203
  'Bottom'                      => 'Unten',
203 204
  'Bought'                      => 'Gekauft',
204 205
  'Buchungsdatum'               => 'Buchungsdatum',
205 206
  'Buchungsgruppe'              => 'Buchungsgruppe',
......
212 213
  'Business saved!'             => 'Firma gespeichert.',
213 214
  'C'                           => 'G',
214 215
  'CANCELED'                    => 'Storniert',
216
  'CSV export -- options'       => 'CSV-Export -- Optionen',
215 217
  'Calculate'                   => 'Berechnen',
216 218
  'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren',
217 219
  'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
......
286 288
  'Could not print dunning.'    => 'Die Mahnungen konnten nicht gedruckt werden.',
287 289
  'Could not rename %s to %s. Reason: %s' => 'Die Datei &quot;%s&quot; konnte nicht in &quot;%s&quot; umbenannt werden. Grund: %s',
288 290
  'Could not spawn ghostscript.' => 'Die Anwendung "ghostscript" konnte nicht gestartet werden.',
291
  'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
289 292
  'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
290 293
  'Could not update prices!'    => 'Preise konnten nicht aktualisiert werden!',
294
  'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
295
  'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
291 296
  'Country'                     => 'Land',
292 297
  'Create Buchungsgruppen'      => 'Buchungsgruppe erfassen',
293 298
  'Create Chart of Accounts'    => 'Kontenplan anlegen',
......
473 478
  'Error'                       => 'Fehler',
474 479
  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
475 480
  'Error!'                      => 'Fehler!',
481
  'Escape character'            => 'Escape-Zeichen',
476 482
  'Exch'                        => 'Wechselkurs.',
477 483
  'Exchangerate'                => 'Wechselkurs',
478 484
  'Exchangerate Difference'     => 'Wechselkursunterschied',
......
490 496
  'Expiring in x month(s)'      => 'Die in x Monat(en) ablaufen',
491 497
  'Export Buchungsdaten'        => 'Export Buchungsdaten',
492 498
  'Export Stammdaten'           => 'Export Stammdaten',
499
  'Export as CSV'               => 'Als CSV exportieren',
500
  'Export as PDF'               => 'Als PDF exportieren',
493 501
  'Extended'                    => 'Gesamt',
494 502
  'Extension Of Time'           => 'Dauerfristverl?ngerung',
495 503
  'Factor'                      => 'Faktor',
......
501 509
  'File locked!'                => 'Datei gesperrt!',
502 510
  'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => 'Dateien, die von Lx-Office\' Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.',
503 511
  'Folgekonto'                  => 'Folgekonto',
512
  'Font size'                   => 'Schriftgr&ouml;&szlig;e',
504 513
  'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, but not the other way round.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit ausw&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; hingegen nicht.',
505 514
  'Foreign Exchange Gain'       => 'Wechselkursertr?ge',
506 515
  'Foreign Exchange Loss'       => 'Wechselkursaufwendungen',
......
550 559
  'In-line'                     => 'im Text',
551 560
  'Inactive'                    => 'Inaktiv',
552 561
  'Include Exchangerate Difference' => 'Wechselkursunterschied einbeziehen',
562
  'Include column headings'     => 'Spalten&uuml;berschriften erzeugen',
553 563
  'Include in Report'           => 'In Bericht aufnehmen',
554 564
  'Include in drop-down menus'  => 'In Aufklappmen? aufnehmen',
555 565
  'Income Statement'            => 'GuV',
......
612 622
  'Kundennummer'                => 'Kundennummer',
613 623
  'L'                           => 'L',
614 624
  'LaTeX Templates'             => 'LaTeX-Vorlagen',
625
  'Landscape'                   => 'Querformat',
615 626
  'Language'                    => 'Sprache',
616 627
  'Language Values'             => 'Sprach?bersetzungen',
617 628
  'Language deleted!'           => 'Sprache gel?scht!',
......
632 643
  'Last Vendor Number'          => 'Letzte Lieferantennummer',
633 644
  'Lead'                        => 'Kundenquelle',
634 645
  'Leave host and port field empty unless you want to make a remote connection.' => 'F&uuml;r lokale Verbindungen "Rechner" und "Port" freilassen.',
646
  'Left'                        => 'Links',
635 647
  'Liability'                   => 'Passiva/Mittelherkunft',
636 648
  'License'                     => 'Lizenz',
637 649
  'License key'                 => 'Lizenzschl?ssel',
......
639 651
  'Licenses'                    => 'Lizenzen',
640 652
  'Lieferungen'                 => 'Lieferungen',
641 653
  'Line Total'                  => 'Zeilensumme',
654
  'Line endings'                => 'Zeilenumbr&uuml;che',
642 655
  'List Accounting Groups'      => 'Buchungsgruppen anzeigen',
643 656
  'List Accounts'               => 'Konten anzeigen',
644 657
  'List Businesses'             => 'Kunden-/Lieferantentypen anzeigen',
......
651 664
  'List Pricegroups'            => 'Preisgruppen anzeigen',
652 665
  'List Printer'                => 'Drucker anzeigen',
653 666
  'List Transactions'           => 'Buchungsliste',
667
  'List export'                 => 'Listenexport',
654 668
  'Load draft'                  => 'Entwurf laden',
655 669
  'Local Tax Office Preferences' => 'Angaben zum Finanzamt',
656 670
  'Lock System'                 => 'System sperren',
......
672 686
  'Mandantennummer'             => 'Mandantennummer',
673 687
  'Mar'                         => 'M?rz',
674 688
  'March'                       => 'M?rz',
689
  'Margins'                     => 'Seitenr&auml;nder',
675 690
  'Mark as paid?'               => 'Als bezahlt markieren?',
676 691
  'Marked as paid'              => 'Als bezahlt markiert',
677 692
  'Marked entries printed!'     => 'Markierte Eintr?ge wurden gedruckt!',
......
749 764
  'Number Format'               => 'Zahlenformat',
750 765
  'Number missing in Row'       => 'Nummer fehlt in Zeile',
751 766
  'Number of copies'            => 'Anzahl Kopien',
767
  'Number pages'                => 'Seiten nummerieren',
752 768
  'O'                           => 'O',
753 769
  'OBE-Export erfolgreich!'     => 'OBE-Export erfolgreich!',
754 770
  'Obsolete'                    => 'Ung?ltig',
......
772 788
  'Order deleted!'              => 'Auftrag gel?scht!',
773 789
  'Ordered'                     => 'Vom Kunde bestellt',
774 790
  'Orders'                      => 'Auftr?ge',
791
  'Orientation'                 => 'Seitenformat',
775 792
  'Orphaned'                    => 'Nie benutzt',
776 793
  'Out of balance transaction!' => 'Buchung ist nicht ausgeglichen!',
777 794
  'Out of balance!'             => 'Summen stimmen nicht berein!',
......
781 798
  'PAYMENT POSTED'              => 'Rechung gebucht',
782 799
  'PDF'                         => 'PDF',
783 800
  'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
801
  'PDF export -- options'       => 'PDF-Export -- Optionen',
784 802
  'POSTED'                      => 'Gebucht',
785 803
  'POSTED AS NEW'               => 'Als neu gebucht',
786 804
  'PRINTED'                     => 'Gedruckt',
......
833 851
  'Please seletct the dataset you want to delete:' => 'Bitte w&auml;hlen Sie die zu l&ouml;schende Datenbank aus:',
834 852
  'Plural'                      => 'Plural',
835 853
  'Port'                        => 'Port',
854
  'Portrait'                    => 'Hochformat',
836 855
  'Post'                        => 'Buchen',
837 856
  'Post Payment'                => 'Zahlung buchen',
838 857
  'Postscript'                  => 'Postscript',
......
897 916
  'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
898 917
  'Quotation deleted!'          => 'Angebot wurde gel?scht.',
899 918
  'Quotations'                  => 'Angebote',
919
  'Quote chararacter'           => 'Anf&uuml;hrungszeichen',
900 920
  'Quoted'                      => 'Angeboten',
901 921
  'RFQ'                         => 'Anfrage',
902 922
  'RFQ Number'                  => 'Anfragenummer',
......
932 952
  'Revenue Account'             => 'Erl?skonto',
933 953
  'Revenues EU with UStId'      => 'Erl&ouml;se EU m. UStId',
934 954
  'Revenues EU without UStId'   => 'Erl&ouml;se EU o. UStId',
955
  'Right'                       => 'Rechts',
935 956
  'SAVED'                       => 'Gespeichert',
936 957
  'SAVED FOR DUNNING'           => 'Gespeichert',
937 958
  'SCREENED'                    => 'Angezeigt',
......
943 964
  'Sales invoice number'        => 'Ausgangsrechnungsnummer',
944 965
  'Salesman'                    => 'Verk?ufer/in',
945 966
  'Salesperson'                 => 'Verk?ufer',
967
  'Same as the quote character' => 'Wie Anf&uuml;hrungszeichen',
946 968
  'Sat. Fax'                    => 'Sat. Fax',
947 969
  'Sat. Phone'                  => 'Sat. Tel.',
948 970
  'Save'                        => 'Speichern',
......
976 998
  'Sell Price'                  => 'Verkaufspreis',
977 999
  'Send the backup via Email'   => 'Die Sicherungsdatei per Email verschicken',
978 1000
  'Sep'                         => 'Sep',
1001
  'Separator chararacter'       => 'Feldtrennzeichen',
979 1002
  'September'                   => 'September',
980 1003
  'Serial No.'                  => 'Seriennummer',
981 1004
  'Serial Number'               => 'Seriennummer',
......
1100 1123
  'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des &quot;pg_restore&quot;-Programmes:',
1101 1124
  'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von &quot;pg_restore&quot; an, um festzustellen, ob die Wiederherstellung erfolgreich war.',
1102 1125
  'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => 'Die zweite Variante besteht darin, Perls CPAN-Modul zu benutzen und es das Modul f&uuml;r Sie installieren zu lassen.',
1126
  'The tabulator character'     => 'Das Tabulator-Symbol',
1103 1127
  'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => 'Die dritte Variante besteht darin, das Paket von der oben genannten URL herunterzuladen und es manuell zu installieren. Beachten Sie dabei die im Paket enthaltenen Installationsanweisungen.',
1104 1128
  'The unit has been saved.'    => 'Die Einheit wurde gespeichert.',
1105 1129
  'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gel&ouml;scht worden.',
......
1120 1144
  'To'                          => 'An',
1121 1145
  'To (time)'                   => 'Bis',
1122 1146
  'To add a user to a group edit a name, change the login name and save. A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzuf&uuml;gen, &auml;ndern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
1147
  'Top'                         => 'Oben',
1123 1148
  'Top (CSS)'                   => 'Oben (mit CSS)',
1124 1149
  'Top (Javascript)'            => 'Oben (mit Javascript)',
1125 1150
  'Top 100'                     => 'Top 100',
......
1289 1314
  'proforma'                    => 'Proforma',
1290 1315
  'purchase_order'              => 'Auftrag',
1291 1316
  'quarter'                     => 'Viertelj?hrliche (quartalsweise) Abgabe',
1317
  'report_generator_nextsub is not defined.' => 'report_generator_nextsub ist nicht definiert.',
1292 1318
  'request_quotation'           => 'Angebotsanforderung',
1293 1319
  'reset'                       => 'zur?cksetzen',
1294 1320
  's'                           => 's',
lx-erp.conf
67 67
$dbcharset = "ISO-8859-15";
68 68

  
69 69

  
70
# Pfad zu 'html2ps' zum Export von Listenansichten als PDF
71
$html2ps_bin = "/usr/bin/html2ps";
72
$ghostscript_bin = "/usr/bin/gs";
73

  
74

  
75

  
70 76
# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
71 77
# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollst?ndige
72 78
# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,

Auch abrufbar als: Unified diff