#
#======================================================================
+use POSIX qw(strftime);
+
use SL::AR;
use SL::IS;
use SL::PE;
-use Data::Dumper;
+use SL::ReportGenerator;
require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
require "bin/mozilla/drafts.pl";
+require "bin/mozilla/report_generator.pl";
1;
$lxdebug->leave_sub();
}
+sub create_subtotal_row {
+ $lxdebug->enter_sub();
+
+ my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_;
+
+ my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } };
+
+ map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } @{ $subtotal_columns };
+
+ $row->{tax}->{data} = $form->format_amount(\%myconfig, $totals->{amount} - $totals->{netamount}, 2);
+
+ map { $totals->{$_} = 0 } @{ $subtotal_columns };
+
+ $lxdebug->leave_sub();
+
+ return $row;
+}
+
sub ar_transactions {
$lxdebug->enter_sub();
- $form->{customer} = $form->unescape($form->{customer});
($form->{customer}, $form->{customer_id}) = split(/--/, $form->{customer});
+ $form->{sort} ||= 'transdate';
+
AR->ar_transactions(\%myconfig, \%$form);
- $callback =
- "$form->{script}?action=ar_transactions&login=$form->{login}&password=$form->{password}";
- $href = $callback;
+ $form->{title} = $locale->text('AR Transactions');
+
+ my $report = SL::ReportGenerator->new(\%myconfig, $form);
+
+ my @columns =
+ qw(transdate id type invnumber ordnumber name netamount tax amount paid
+ datepaid due duedate transaction_description notes employee shippingpoint shipvia
+ globalprojectnumber);
+
+ my @hidden_variables = map { "l_${_}" } @columns;
+ push @hidden_variables, "l_subtotal", qw(open closed customer invnumber ordnumber activity_description notes project_id transdatefrom transdateto);
+
+ my $href = build_std_url('action=ar_transactions', grep { $form->{$_} } @hidden_variables);
+
+ my %column_defs = (
+ 'transdate' => { 'text' => $locale->text('Date'), },
+ 'id' => { 'text' => $locale->text('ID'), },
+ 'type' => { 'text' => $locale->text('Type'), },
+ 'invnumber' => { 'text' => $locale->text('Invoice'), },
+ 'ordnumber' => { 'text' => $locale->text('Order'), },
+ 'name' => { 'text' => $locale->text('Customer'), },
+ 'netamount' => { 'text' => $locale->text('Amount'), },
+ 'tax' => { 'text' => $locale->text('Tax'), },
+ 'amount' => { 'text' => $locale->text('Total'), },
+ 'paid' => { 'text' => $locale->text('Paid'), },
+ 'datepaid' => { 'text' => $locale->text('Date Paid'), },
+ 'due' => { 'text' => $locale->text('Amount Due'), },
+ 'duedate' => { 'text' => $locale->text('Due Date'), },
+ 'transaction_description' => { 'text' => $locale->text('Transaction description'), },
+ 'notes' => { 'text' => $locale->text('Notes'), },
+ 'employee' => { 'text' => $locale->text('Salesperson'), },
+ 'shippingpoint' => { 'text' => $locale->text('Shipping Point'), },
+ 'shipvia' => { 'text' => $locale->text('Ship via'), },
+ 'globalprojectnumber' => { 'text' => $locale->text('Project Number'), },
+ );
+
+ foreach my $name (qw(id transdate duedate invnumber ordnumber name datepaid
+ employee shippingpoint shipvia)) {
+ $column_defs{$name}->{link} = $href . "&sort=$name";
+ }
+
+ my %column_alignment = map { $_ => 'right' } qw(netamount tax amount paid due);
+
+ $form->{"l_type"} = "Y";
+ map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
+ $report->set_columns(%column_defs);
+ $report->set_column_order(@columns);
+
+ $report->set_export_options('ar_transactions', @hidden_variables);
+
+ my @options;
if ($form->{customer}) {
- $callback .= "&customer=" . $form->escape($form->{customer}, 1);
- $href .= "&customer=" . $form->escape($form->{customer});
- $option = $locale->text('Customer') . " : $form->{customer}";
+ push @options, $locale->text('Customer') . " : $form->{customer}";
}
if ($form->{department}) {
- $callback .= "&department=" . $form->escape($form->{department}, 1);
- $href .= "&department=" . $form->escape($form->{department});
($department) = split /--/, $form->{department};
- $option .= "\n<br>" if ($option);
- $option .= $locale->text('Department') . " : $department";
+ push @options, $locale->text('Department') . " : $department";
}
if ($form->{invnumber}) {
- $callback .= "&invnumber=" . $form->escape($form->{invnumber}, 1);
- $href .= "&invnumber=" . $form->escape($form->{invnumber});
- $option .= "\n<br>" if ($option);
- $option .= $locale->text('Invoice Number') . " : $form->{invnumber}";
+ push @options, $locale->text('Invoice Number') . " : $form->{invnumber}";
}
if ($form->{ordnumber}) {
- $callback .= "&ordnumber=" . $form->escape($form->{ordnumber}, 1);
- $href .= "&ordnumber=" . $form->escape($form->{ordnumber});
- $option .= "\n<br>" if ($option);
- $option .= $locale->text('Order Number') . " : $form->{ordnumber}";
+ push @options, $locale->text('Order Number') . " : $form->{ordnumber}";
}
if ($form->{notes}) {
- $callback .= "¬es=" . $form->escape($form->{notes}, 1);
- $href .= "¬es=" . $form->escape($form->{notes});
- $option .= "\n<br>" if $option;
- $option .= $locale->text('Notes') . " : $form->{notes}";
+ push @options, $locale->text('Notes') . " : $form->{notes}";
}
if ($form->{transaction_description}) {
- $callback .= "&transaction_description=" . $form->escape($form->{transaction_description}, 1);
- $href .= "&transaction_description=" . $form->escape($form->{transaction_description});
- $option .= "\n<br>" if $option;
- $option .= $locale->text('Transaction description') . " : $form->{transaction_description}";
+ push @options, $locale->text('Transaction description') . " : $form->{transaction_description}";
}
-
if ($form->{transdatefrom}) {
- $callback .= "&transdatefrom=$form->{transdatefrom}";
- $href .= "&transdatefrom=$form->{transdatefrom}";
- $option .= "\n<br>" if ($option);
- $option .=
- $locale->text('From') . " "
- . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
+ push @options, $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
}
if ($form->{transdateto}) {
- $callback .= "&transdateto=$form->{transdateto}";
- $href .= "&transdateto=$form->{transdateto}";
- $option .= "\n<br>" if ($option);
- $option .=
- $locale->text('Bis') . " "
- . $locale->date(\%myconfig, $form->{transdateto}, 1);
+ push @options, $locale->text('Bis') . " " . $locale->date(\%myconfig, $form->{transdateto}, 1);
}
if ($form->{open}) {
- $callback .= "&open=$form->{open}";
- $href .= "&open=$form->{open}";
- $option .= "\n<br>" if ($option);
- $option .= $locale->text('Open');
+ push @options, $locale->text('Open');
}
if ($form->{closed}) {
- $callback .= "&closed=$form->{closed}";
- $href .= "&closed=$form->{closed}";
- $option .= "\n<br>" if ($option);
- $option .= $locale->text('Closed');
- }
- if ($form->{globalproject_id}) {
- $callback .= "&globalproject_id=" . E($form->{globalproject_id});
- $href .= "&globalproject_id=" . E($form->{globalproject_id});
+ push @options, $locale->text('Closed');
}
- @columns =
- qw(transdate id type invnumber ordnumber name netamount tax amount paid
- datepaid due duedate transaction_description notes employee shippingpoint shipvia
- globalprojectnumber);
-
- $form->{"l_type"} = "Y";
-
- foreach $item (@columns) {
- if ($form->{"l_$item"} eq "Y") {
- push @column_index, $item;
-
- # add column to href and callback
- $callback .= "&l_$item=Y";
- $href .= "&l_$item=Y";
- }
- }
-
- if ($form->{l_subtotal} eq 'Y') {
- $callback .= "&l_subtotal=Y";
- $href .= "&l_subtotal=Y";
- }
-
- $column_header{id} =
- "<th><a class=listheading href=$href&sort=id>"
- . $locale->text('ID')
- . "</a></th>";
- $column_header{transdate} =
- "<th><a class=listheading href=$href&sort=transdate>"
- . $locale->text('Date')
- . "</a></th>";
- $column_header{duedate} =
- "<th><a class=listheading href=$href&sort=duedate>"
- . $locale->text('Due Date')
- . "</a></th>";
- $column_header{type} =
- "<th class=\"listheading\">" . $locale->text('Type') . "</th>";
- $column_header{invnumber} =
- "<th><a class=listheading href=$href&sort=invnumber>"
- . $locale->text('Invoice')
- . "</a></th>";
- $column_header{ordnumber} =
- "<th><a class=listheading href=$href&sort=ordnumber>"
- . $locale->text('Order')
- . "</a></th>";
- $column_header{name} =
- "<th><a class=listheading href=$href&sort=name>"
- . $locale->text('Customer')
- . "</a></th>";
- $column_header{netamount} =
- "<th class=listheading>" . $locale->text('Amount') . "</th>";
- $column_header{tax} =
- "<th class=listheading>" . $locale->text('Tax') . "</th>";
- $column_header{amount} =
- "<th class=listheading>" . $locale->text('Total') . "</th>";
- $column_header{paid} =
- "<th class=listheading>" . $locale->text('Paid') . "</th>";
- $column_header{datepaid} =
- "<th><a class=listheading href=$href&sort=datepaid>"
- . $locale->text('Date Paid')
- . "</a></th>";
- $column_header{due} =
- "<th class=listheading>" . $locale->text('Amount Due') . "</th>";
- $column_header{notes} =
- "<th class=listheading>" . $locale->text('Notes') . "</th>";
- $column_header{employee} =
- "<th><a class=listheading href=$href&sort=employee>"
- . $locale->text('Salesperson') . "</th>";
-
- $column_header{shippingpoint} =
- "<th><a class=listheading href=$href&sort=shippingpoint>"
- . $locale->text('Shipping Point')
- . "</a></th>";
- $column_header{shipvia} =
- "<th><a class=listheading href=$href&sort=shipvia>"
- . $locale->text('Ship via')
- . "</a></th>";
- $column_header{globalprojectnumber} =
- qq|<th class="listheading">| . $locale->text('Project Number') . qq|</th>|;
- $column_header{transaction_description} =
- "<th class=listheading>" . $locale->text('Transaction description') . "</th>";
-
- $form->{title} = $locale->text('AR Transactions');
-
- $form->header;
-
- print qq|
-<body>
-
-<table width=100%>
- <tr>
- <th class=listtop>$form->{title}</th>
- </tr>
- <tr height="5"></tr>
- <tr>
- <td>$option</td>
- </tr>
- <tr>
- <td>
- <table width=100%>
- <tr class=listheading>
-|;
-
- map { print "\n$column_header{$_}" } @column_index;
-
- print qq|
- </tr>
-|;
+ $report->set_options('top_info_text' => join("\n", @options),
+ 'raw_bottom_info_text' => $form->parse_html_template('ar/ar_transactions_bottom'),
+ 'output_format' => 'HTML',
+ 'title' => $form->{title},
+ 'attachment_basename' => $locale->text('invoice_list') . strftime('_%Y%m%d', localtime time),
+ );
+ $report->set_options_from_form();
# add sort and escape callback, this one we use for the add sub
- $form->{callback} = $callback .= "&sort=$form->{sort}";
+ $form->{callback} = $href .= "&sort=$form->{sort}";
# escape callback for href
- $callback = $form->escape($callback);
-
- if (@{ $form->{AR} }) {
- $sameitem = $form->{AR}->[0]->{ $form->{sort} };
- }
-
- # sums and tax on reports by Antonio Gallardo
- #
- foreach $ar (@{ $form->{AR} }) {
-
- if ($form->{l_subtotal} eq 'Y') {
- if ($sameitem ne $ar->{ $form->{sort} }) {
- &ar_subtotal;
- }
- }
+ $callback = $form->escape($href);
- $column_data{netamount} =
- "<td align=right>"
- . $form->format_amount(\%myconfig, $ar->{netamount}, 2, " ")
- . "</td>";
- $column_data{tax} = "<td align=right>"
- . $form->format_amount(\%myconfig, $ar->{amount} - $ar->{netamount},
- 2, " ")
- . "</td>";
- $column_data{amount} =
- "<td align=right>"
- . $form->format_amount(\%myconfig, $ar->{amount}, 2, " ") . "</td>";
- $column_data{paid} =
- "<td align=right>"
- . $form->format_amount(\%myconfig, $ar->{paid}, 2, " ") . "</td>";
- $column_data{due} = "<td align=right>"
- . $form->format_amount(\%myconfig, $ar->{amount} - $ar->{paid},
- 2, " ")
- . "</td>";
+ my @subtotal_columns = qw(netamount amount paid due);
- $subtotalnetamount += $ar->{netamount};
- $subtotalamount += $ar->{amount};
- $subtotalpaid += $ar->{paid};
- $subtotaldue += $ar->{amount} - $ar->{paid};
+ my %totals = map { $_ => 0 } @subtotal_columns;
+ my %subtotals = map { $_ => 0 } @subtotal_columns;
- $totalnetamount += $ar->{netamount};
- $totalamount += $ar->{amount};
- $totalpaid += $ar->{paid};
- $totaldue += ($ar->{amount} - $ar->{paid});
+ my $idx = 0;
- $column_data{transdate} = "<td>$ar->{transdate} </td>";
- $column_data{id} = "<td>$ar->{id}</td>";
- $column_data{datepaid} = "<td>$ar->{datepaid} </td>";
- $column_data{duedate} = "<td>$ar->{duedate} </td>";
+ foreach $ar (@{ $form->{AR} }) {
+ $ar->{tax} = $ar->{amount} - $ar->{netamount};
+ $ar->{due} = $ar->{amount} - $ar->{paid};
- $module = ($ar->{invoice}) ? "is.pl" : $form->{script};
+ map { $subtotals{$_} += $ar->{$_};
+ $totals{$_} += $ar->{$_} } @subtotal_columns;
- $column_data{invnumber} =
- "<td><a href=$module?action=edit&id=$ar->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ar->{invnumber}</a></td>";
+ map { $ar->{$_} = $form->format_amount(\%myconfig, $ar->{$_}, 2) } qw(netamount tax amount paid due);
my $is_storno = $ar->{storno} && IS->is_storno(\%myconfig, $form, 'ar');
my $has_storno = $ar->{storno} && !$is_storno;
- $column_data{type} = "<td>" .
- ($has_storno ? $locale->text("Invoice with Storno (abbreviation)") :
- $is_storno ? $locale->text("Storno (one letter abbreviation)") :
- $ar->{amount} < 0 ? $locale->text("Credit note (one letter abbreviation)") :
- $ar->{invoice} ? $locale->text("Invoice (one letter abbreviation)") :
- $locale->text("AR Transaction (abbreviation)"))
- . "</td>";
- $column_data{ordnumber} = "<td>$ar->{ordnumber} </td>";
- $column_data{name} = "<td>$ar->{name}</td>";
- $ar->{notes} =~ s/\r\n/<br>/g;
- $column_data{notes} = "<td>$ar->{notes} </td>";
- $column_data{shippingpoint} = "<td>$ar->{shippingpoint} </td>";
- $column_data{shipvia} = "<td>$ar->{shipvia} </td>";
- $column_data{employee} = "<td>$ar->{employee} </td>";
- $column_data{globalprojectnumber} =
- "<td>" . H($ar->{globalprojectnumber}) . "</td>";
- $column_data{transaction_description} =
- "<td>" . H($ar->{transaction_description}) . "</td>";
-
- $i++;
- $i %= 2;
- print "
- <tr class=listrow$i>
-";
-
- map { print "\n$column_data{$_}" } @column_index;
-
- print qq|
- </tr>
-|;
-
- }
-
- if ($form->{l_subtotal} eq 'Y') {
- &ar_subtotal;
- }
-
- # print totals
- print qq|
- <tr class=listtotal>
-|;
-
- map { $column_data{$_} = "<td> </td>" } @column_index;
-
- $column_data{netamount} =
- "<th class=listtotal align=right>"
- . $form->format_amount(\%myconfig, $totalnetamount, 2, " ") . "</th>";
- $column_data{tax} = "<th class=listtotal align=right>"
- . $form->format_amount(\%myconfig, $totalamount - $totalnetamount,
- 2, " ")
- . "</th>";
- $column_data{amount} =
- "<th class=listtotal align=right>"
- . $form->format_amount(\%myconfig, $totalamount, 2, " ") . "</th>";
- $column_data{paid} =
- "<th class=listtotal align=right>"
- . $form->format_amount(\%myconfig, $totalpaid, 2, " ") . "</th>";
- $column_data{due} =
- "<th class=listtotal align=right>"
- . $form->format_amount(\%myconfig, $totaldue, 2, " ") . "</th>";
-
- map { print "\n$column_data{$_}" } @column_index;
-
- print qq|
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td><hr size=3 noshade></td>
- </tr>
-</table>
-
-<br>
-<form method=post action=$form->{script}>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
+ $ar->{type} =
+ $has_storno ? $locale->text("Invoice with Storno (abbreviation)") :
+ $is_storno ? $locale->text("Storno (one letter abbreviation)") :
+ $ar->{amount} < 0 ? $locale->text("Credit note (one letter abbreviation)") :
+ $ar->{invoice} ? $locale->text("Invoice (one letter abbreviation)") :
+ $locale->text("AR Transaction (abbreviation)");
-<input class=submit type=submit name=action value="|
- . $locale->text('AR Transaction') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Sales Invoice') . qq|">
+ my $row = { };
-</form>
-
-</body>
-</html>
-|;
-
- $lxdebug->leave_sub();
-}
-
-sub ar_subtotal {
- $lxdebug->enter_sub();
+ foreach my $column (@columns) {
+ $row->{$column} = {
+ 'data' => $ar->{$column},
+ 'align' => $column_alignment{$column},
+ };
+ }
- map { $column_data{$_} = "<td> </td>" } @column_index;
+ $row->{invnumber}->{link} = build_std_url("script=" . ($ar->{invoice} ? 'is.pl' : 'ar.pl'), 'action=edit')
+ . "&id=" . E($ar->{id}) . "&callback=${callback}";
- $column_data{tax} = "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotalamount - $subtotalnetamount,
- 2, " ")
- . "</th>";
- $column_data{amount} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotalamount, 2, " ") . "</th>";
- $column_data{paid} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotalpaid, 2, " ") . "</th>";
- $column_data{due} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotaldue, 2, " ") . "</th>";
+ my $row_set = [ $row ];
- $subtotalnetamount = 0;
- $subtotalamount = 0;
- $subtotalpaid = 0;
- $subtotaldue = 0;
+ if (($form->{l_subtotal} eq 'Y')
+ && (($idx == (scalar @{ $form->{AR} } - 1))
+ || ($ar->{ $form->{sort} } ne $form->{AR}->[$idx + 1]->{ $form->{sort} }))) {
+ push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, \@subtotal_columns, 'listsubtotal');
+ }
- $sameitem = $ar->{ $form->{sort} };
+ $report->add_data($row_set);
- print "<tr class=listsubtotal>";
+ $idx++;
+ }
- map { print "\n$column_data{$_}" } @column_index;
+ $report->add_separator();
+ $report->add_data(create_subtotal_row(\%totals, \@columns, \%column_alignment, \@subtotal_columns, 'listtotal'));
- print "
-</tr>
-";
+ $report->generate_with_headers();
$lxdebug->leave_sub();
}
-
sub storno {
$lxdebug->enter_sub();
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
- 'AR Transaction' => 'Debitorenbuchung',
'AR Transaction (abbreviation)' => 'D',
'AR Transactions' => 'Debitorenbuchungen',
'Account' => 'Konto',
'Bin List' => 'Lagerliste',
'Bis' => 'bis',
'CANCELED' => 'Storniert',
+ 'CSV export -- options' => 'CSV-Export -- Optionen',
'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
'Cannot delete transaction!' => 'Buchung kann nicht gelöscht werden!',
'Cannot post payment for a closed period!' => 'Es können keine Zahlungen für abgeschlossene Bücher gebucht werden!',
'Confirm!' => 'Bestätigen Sie!',
'Confirmation' => 'Auftragsbestätigung',
'Continue' => 'Weiter',
+ 'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
+ 'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
+ 'Could not write the temporary HTML file.' => 'Eine temporäre HTML-Datei konnte nicht geschrieben werden.',
'Credit Limit' => 'Kreditlimit',
'Credit Note' => 'Gutschrift',
'Credit note (one letter abbreviation)' => 'G',
'Order' => 'Auftrag',
'Order Number' => 'Auftragsnummer',
'PAYMENT POSTED' => 'Rechung gebucht',
+ 'PDF export -- options' => 'PDF-Export -- Optionen',
'POSTED' => 'Gebucht',
'POSTED AS NEW' => 'Als neu gebucht',
'PRINTED' => 'Gedruckt',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
- 'Sales Invoice' => 'Rechnung',
'Salesperson' => 'Verkäufer',
'Save draft' => 'Entwurf speichern',
'Select a Customer' => 'Endkunde auswählen',
'button' => '?',
'history' => 'Historie',
'invoice' => 'Rechnung',
+ 'invoice_list' => 'debitorenbuchungsliste',
'mark as paid' => 'als bezahlt markieren',
'no' => 'nein',
'packing_list' => 'Versandliste',
'pick_list' => 'Entnahmeliste',
'proforma' => 'Proforma',
'purchase_order' => 'Auftrag',
+ 'report_generator_nextsub is not defined.' => 'report_generator_nextsub ist nicht definiert.',
'request_quotation' => 'Angebotsanforderung',
'sales_order' => 'Kundenauftrag',
'sales_quotation' => 'Verkaufsangebot',
'add' => 'add',
'add_transaction' => 'add_transaction',
'ap_transaction' => 'ap_transaction',
- 'ar_subtotal' => 'ar_subtotal',
'ar_transaction' => 'ar_transaction',
'ar_transactions' => 'ar_transactions',
'build_std_url' => 'build_std_url',
'check_project' => 'check_project',
'continue' => 'continue',
'create_links' => 'create_links',
+ 'create_subtotal_row' => 'create_subtotal_row',
'delete' => 'delete',
'delete_drafts' => 'delete_drafts',
'delivery_customer_selection' => 'delivery_customer_selection',
'draft_action_dispatcher' => 'draft_action_dispatcher',
'edit' => 'edit',
'employee_selection_internal' => 'employee_selection_internal',
+ 'export_as_csv' => 'export_as_csv',
+ 'export_as_pdf' => 'export_as_pdf',
'form_footer' => 'form_footer',
'form_header' => 'form_header',
'format_dates' => 'format_dates',
'project_selection_internal' => 'project_selection_internal',
'reformat_numbers' => 'reformat_numbers',
'remove_draft' => 'remove_draft',
+ 'report_generator_do' => 'report_generator_do',
'sales_invoice' => 'sales_invoice',
'save_draft' => 'save_draft',
'search' => 'search',
'weiter' => 'continue',
'löschen' => 'delete',
'entwürfe_löschen' => 'delete_drafts',
+ 'als_csv_exportieren' => 'export_as_csv',
+ 'als_pdf_exportieren' => 'export_as_pdf',
'buchen' => 'post',
'zahlung_buchen' => 'post_payment',
'rechnung' => 'sales_invoice',