Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 05c6840d

Von Moritz Bunkus vor etwa 14 Jahren hinzugefügt

  • ID 05c6840d4fbb90cbe81e14427617793c45ba4714
  • Vorgänger 2af9eae7
  • Nachfolger 9437bec6

Dateiencodings auf UTF-8 geändert

Fix für Bug 1375.

Unterschiede anzeigen:

SL/AccTransCorrections.pm
package AccTransCorrections;
use utf8;
use strict;
use List::Util qw(first);
......
delete $entry->{chartlink};
}
# Verkn?pfungen zwischen Steuerschl?sseln und zum Zeitpunkt der Transaktion
# g?ltigen Steuers?tze
# Verknüpfungen zwischen Steuerschlüsseln und zum Zeitpunkt der Transaktion
# gültigen Steuersätze
my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $transaction->[0]->{transdate});
my ($trans_type, $previous_non_tax_entry);
......
}
}
# Alle Eintr?ge entfernen, die die Gegenkonten zu Zahlungsein- und
# -ausg?ngen darstellen.
# Alle Einträge entfernen, die die Gegenkonten zu Zahlungsein- und
# -ausgängen darstellen.
foreach my $payment (@{ $data->{payments} }) {
my $idx = 0 < $payment->{amount} ? 'debit' : 'credit';
......
}
# Problemfall: Verkaufsrechnungen, bei denen Buchungen auf Warenbestandskonten
# mit Steuerschl?ssel != 0 durchgef?hrt wurden. Richtig w?re, dass alle
# Steuerschl?ssel f?r solche Warenbestandsbuchungen 0 sind.
# mit Steuerschlüssel != 0 durchgeführt wurden. Richtig wäre, dass alle
# Steuerschlüssel für solche Warenbestandsbuchungen 0 sind.
sub _check_trans_invoices_inventory_with_taxkeys {
$main::lxdebug->enter_sub();
......
}
# Problemfall: Verkaufsrechnungen, bei denen Steuern verbucht wurden, obwohl
# kein Steuerschl?ssel eingetragen ist.
# kein Steuerschlüssel eingetragen ist.
sub _check_missing_taxkeys_in_invoices {
$::lxdebug->enter_sub;
......
return $found_broken;
}
# Problemfall: Kreditorenbuchungen, bei denen mit Umsatzsteuerschl?sseln
# gebucht wurde und Debitorenbuchungen, bei denen mit Vorsteuerschl?sseln
# Problemfall: Kreditorenbuchungen, bei denen mit Umsatzsteuerschlüsseln
# gebucht wurde und Debitorenbuchungen, bei denen mit Vorsteuerschlüsseln
# gebucht wurde.
sub _check_trans_ap_ar_wrong_taxkeys {
$main::lxdebug->enter_sub();
......
}
# Problemfall: Splitbuchungen, die mehrere Haben- und Sollkonten ansprechen.
# Aber nur f?r Debitoren- und Kreditorenbuchungen, weil das bei Einkaufs- und
# Verkaufsrechnungen hingegen v?llig normal ist.
# Aber nur für Debitoren- und Kreditorenbuchungen, weil das bei Einkaufs- und
# Verkaufsrechnungen hingegen völlig normal ist.
sub _check_trans_split_multiple_credit_and_debit {
$main::lxdebug->enter_sub();
......
}
# Problemfall: Buchungen, bei denen Steuersummen nicht mit den Summen
# ?bereinstimmen, die nach ausgew?hltem Steuerschl?ssel h?tten auftreten m?ssen.
# übereinstimmen, die nach ausgewähltem Steuerschlüssel hätten auftreten müssen.
sub _check_trans_wrong_taxkeys {
$main::lxdebug->enter_sub();
......
return $retval;
}
# Inaktiver Code f?r das Erraten m?glicher Verteilungen von
# Steuerschl?sseln. Deaktiviert, weil er exponentiell Zeit
# ben?tigt.
# Inaktiver Code für das Erraten möglicher Verteilungen von
# Steuerschlüsseln. Deaktiviert, weil er exponentiell Zeit
# benötigt.
# if (abs($expected_tax - $data{$side}->{tax_sum}) >= 0.02) {
# my @potential_taxkeys = $trans_type eq 'AP' ? (0, 8, 9) : (0, 1, 2, 3);
# $main::lxdebug->dump(0, "pota", \@potential_taxkeys);
# # ?ber alle Kombinationen aus Buchungss?tzen und potenziellen Steuerschl?sseln
# # Über alle Kombinationen aus Buchungssätzen und potenziellen Steuerschlüsseln
# # iterieren und jeweils die Summe ermitteln.
# my $num_entries = scalar @{ $data{$side}->{entries} };
# my @taxkey_indices = (0) x $num_entries;
......
# while ($num_entries == scalar @taxkey_indices) {
# my @tax_cache = ();
# # Berechnen der Steuersumme f?r die aktuell angenommenen Steuerschl?ssel.
# # Berechnen der Steuersumme für die aktuell angenommenen Steuerschlüssel.
# my $tax_sum = 0;
# foreach my $i (0 .. $num_entries - 1) {
# my $taxkey = $potential_taxkeys[$taxkey_indices[$i]];
......
# $tax_sum += $tax_cache[$i];
# }
# # Entspricht die Steuersumme mit den aktuell angenommenen Steuerschl?sseln
# # Entspricht die Steuersumme mit den aktuell angenommenen Steuerschlüsseln
# # der verbuchten Steuersumme? Wenn ja, dann ist das eine potenzielle
# # L?sung.
# # Lösung.
# if (abs($tax_sum - $data{$side}->{tax_sum}) < 0.02) {
# push @solutions, {
# 'taxkeys' => [ @potential_taxkeys[@taxkey_indices] ],
......
# }
# }
# # Weiterz?hlen der Steuerschl?sselindices zum Interieren ?ber
# # alle m?glichen Kombinationen.
# # Weiterzählen der Steuerschlüsselindices zum Interieren über
# # alle möglichen Kombinationen.
# my $i = 0;
# while (1) {
# $taxkey_indices[$i]++;
SL/CA.pm
#
#======================================================================
use utf8;
use strict;
package CA;
use Data::Dumper;
use SL::DBUtils;
use strict;
sub all_accounts {
$main::lxdebug->enter_sub();
......
# connect to database
my $dbh = $form->dbconnect($myconfig);
# bug 1071 Warum sollte bei Erreichen eines neuen Jahres die Konten?bersicht nur noch die
# bug 1071 Warum sollte bei Erreichen eines neuen Jahres die Kontenübersicht nur noch die
# bereits bebuchten Konten anzeigen?
# Folgende Erweiterung:
# 1.) Gehe zur?ck bis zu dem Datum an dem die B?cher geschlossen wurden
# 2.) Falls die B?cher noch nie geschlossen wurden, gehe zur?ck bis zum Bearbeitungsstart
# 1.) Gehe zurück bis zu dem Datum an dem die Bücher geschlossen wurden
# 2.) Falls die Bücher noch nie geschlossen wurden, gehe zurück bis zum Bearbeitungsstart
# COALESCE((SELECT closedto FROM defaults),(SELECT itime FROM defaults))
my $closedto_sql = "COALESCE((SELECT closedto FROM defaults),(SELECT itime FROM defaults))";
if ($form->{method} eq "cash") { # E?R
if ($form->{method} eq "cash") { # EÜR
$acc_cash_where = qq| AND (a.trans_id IN (SELECT id FROM ar WHERE datepaid>= $closedto_sql
UNION SELECT id FROM ap WHERE datepaid>= $closedto_sql
UNION SELECT id FROM gl WHERE transdate>= $closedto_sql
......
$query =
qq|SELECT a.id, a.reference, a.description, ac.transdate, ac.chart_id, | .
qq| $false AS invoice, ac.amount, 'gl' as module, | .
qq?(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo ? .
qq§(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo § .
qq|FROM acc_trans ac, gl a | .
$dpt_join .
qq|WHERE | . $where . $dpt_where . $project .
......
qq|SELECT a.id, a.invnumber, c.name, ac.transdate, ac.chart_id, | .
qq| a.invoice, ac.amount, 'ar' as module, | .
qq?(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo ? .
qq§(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo § .
qq|FROM acc_trans ac, customer c, ar a | .
$dpt_join .
qq|WHERE | . $where . $dpt_where . $project .
......
qq|SELECT a.id, a.invnumber, v.name, ac.transdate, ac.chart_id, | .
qq| a.invoice, ac.amount, 'ap' as module, | .
qq?(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo ? .
qq§(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo, ac.source || ' ' || ac.memo AS memo § .
qq|FROM acc_trans ac, vendor v, ap a | .
$dpt_join .
qq|WHERE | . $where . $dpt_where . $project .
......
qq|SELECT a.id, a.invnumber, c.name, a.transdate, | .
qq| a.invoice, ac.qty * ac.sellprice AS sellprice, 'ar' as module, | .
qq?(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo ? .
qq§(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo § .
qq|FROM ar a | .
qq|JOIN invoice ac ON (ac.trans_id = a.id) | .
qq|JOIN parts p ON (ac.parts_id = p.id) | .
......
qq|SELECT a.id, a.invnumber, v.name, a.transdate, | .
qq| a.invoice, ac.qty * ac.sellprice AS sellprice, 'ap' as module, | .
qq?(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo ? .
qq§(SELECT accno||'--'||rate FROM tax LEFT JOIN chart ON (tax.chart_id=chart.id) WHERE tax.id = (SELECT tax_id FROM taxkeys WHERE taxkey_id = ac.taxkey AND taxkeys.startdate <= ac.transdate ORDER BY taxkeys.startdate DESC LIMIT 1)) AS taxinfo § .
qq|FROM ap a | .
qq|JOIN invoice ac ON (ac.trans_id = a.id) | .
qq|JOIN parts p ON (ac.parts_id = p.id) | .
SL/Common.pm
package Common;
use utf8;
use strict;
use Time::HiRes qw(gettimeofday);
use Data::Dumper;
......
use vars qw(@db_encodings %db_encoding_to_charset %charset_to_db_encoding);
use strict;
@db_encodings = (
{ "label" => "ASCII", "dbencoding" => "SQL_ASCII", "charset" => "ASCII" },
{ "label" => "UTF-8 Unicode", "dbencoding" => "UNICODE", "charset" => "UTF-8" },
......
my $query =
qq!SELECT id, name, customernumber, (street || ', ' || zipcode || city) AS address FROM customer ! .
qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = 'H?ndler') ! .
qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = ?') ! .
qq!ORDER BY $order_by $order_dir!;
push @filter_values, $::locale->{iconv_utf8}->convert('Händler');
my $sth = $dbh->prepare($query);
$sth->execute(@filter_values) ||
$form->dberror($query . " (" . join(", ", @filter_values) . ")");
......
my $base_path = substr($ENV{'SCRIPT_NAME'}, 1);
$base_path =~ s|[^/]+$||;
$base_path =~ s|/$||;
# wo kommt der wert f?r dir her? es wird doch gar nichts ?bergeben? fix f?r strict my $dir jb 21.2.
# wo kommt der wert für dir her? es wird doch gar nichts übergeben? fix für strict my $dir jb 21.2.
if (opendir my $dir, $path) {
foreach my $file (sort { lc $a cmp lc $b } readdir $dir) {
next if (($file eq '.') || ($file eq '..'));
SL/DATEV.pm
package DATEV;
use List::Util qw(max);
use utf8;
use strict;
use SL::DBUtils;
use SL::DATEV::KNEFile;
......
use Data::Dumper;
use File::Path;
use List::Util qw(max);
use Time::HiRes qw(gettimeofday);
use strict;
sub _get_export_path {
$main::lxdebug->enter_sub();
......
my $taxkey = 0;
my $charttax = 0;
my ($haben, $soll);
my $iconv = $main::locale->{iconv_iso8859};
my %umlaute = ($iconv->convert('?') => 'ae',
$iconv->convert('?') => 'oe',
$iconv->convert('?') => 'ue',
$iconv->convert('?') => 'Ae',
$iconv->convert('?') => 'Oe',
$iconv->convert('?') => 'Ue',
$iconv->convert('?') => 'sz');
my $iconv = $::locale->{iconv_utf8};
my %umlaute = ($iconv->convert('ä') => 'ae',
$iconv->convert('ö') => 'oe',
$iconv->convert('ü') => 'ue',
$iconv->convert('Ä') => 'Ae',
$iconv->convert('Ö') => 'Oe',
$iconv->convert('Ü') => 'Ue',
$iconv->convert('ß') => 'sz');
for (my $i = 0; $i < $trans_lines; $i++) {
if ($trans_lines == 2) {
if (abs($transaction->[$i]->{'amount'}) > abs($umsatz)) {
SL/DB/Helpers/Mappings.pm
package SL::DB::Helpers::Mappings;
use utf8;
use strict;
# these will not be managed as Rose::DB models, because they are not normalized,
......
=head1 AUTHOR
Sven Sch?ling <s.schoeling@linet-services.de>
Sven Schöling <s.schoeling@linet-services.de>
=cut
SL/DB/Order.pm
package SL::DB::Order;
use utf8;
use strict;
use SL::RecordLinks;
......
=head1 AUTHOR
Sven Sch?ling <s.schoeling@linet-services.de>
Sven Schöling <s.schoeling@linet-services.de>
=cut
SL/Locale.pm
$self->{iconv_english} = SL::Iconv->new('ASCII', $db_charset);
$self->{iconv_iso8859} = SL::Iconv->new('ISO-8859-15', $db_charset);
$self->{iconv_to_iso8859} = SL::Iconv->new($db_charset, 'ISO-8859-15');
$self->{iconv_utf8} = SL::Iconv->new('UTF-8', $db_charset);
$self->_read_special_chars_file($country);
SL/RecordLinks.pm
package RecordLinks;
use utf8;
use strict;
use SL::Common;
use SL::DBUtils;
use Data::Dumper;
use List::Util qw(reduce);
use strict;
sub create_links {
$main::lxdebug->enter_sub();
......
Transitive RecordLinks mit get_links_via.
get_links_via erwartet den zus?tzlichen parameter via. via ist ein
hashref mit den jeweils optionalen Eintr?gen table und id, die sich
get_links_via erwartet den zusätzlichen parameter via. via ist ein
hashref mit den jeweils optionalen Einträgen table und id, die sich
genauso verhalten wie die from/to_table/id werte der get_links funktion.
Alternativ kann via auch ein Array dieser Hashes sein:
......
],
)
Die Eintr?ge in einem via-Array werden exakt in dieser Reihenfolge
benutzt und sind nicht optional. Da obige Beispiel w?rde also die
Verkn?pfung:
Die Einträge in einem via-Array werden exakt in dieser Reihenfolge
benutzt und sind nicht optional. Da obige Beispiel würde also die
Verknüpfung:
oe:11 -> ar:12 -> is:13 -> do:14
SL/USTVA.pm
use SL::DBUtils;
use utf8;
use strict;
my @tax_office_information = (
{ 'id' => 8, 'name' => 'Baden-W?rttemberg', 'taxbird_nr' => '0', 'elster_format' => 'FF/BBB/UUUUP', },
{ 'id' => 8, 'name' => 'Baden-Württemberg', 'taxbird_nr' => '0', 'elster_format' => 'FF/BBB/UUUUP', },
{ 'id' => 9, 'name' => 'Bayern', 'taxbird_nr' => '1', 'elster_format' => 'FFF/BBB/UUUUP', },
{ 'id' => 11, 'name' => 'Berlin', 'taxbird_nr' => '2', 'elster_format' => 'FF/BBB/UUUUP', },
{ 'id' => 12, 'name' => 'Brandenburg', 'taxbird_nr' => '3', 'elster_format' => 'FFF/BBB/UUUUP', },
......
{ 'id' => 14, 'name' => 'Sachsen', 'taxbird_nr' => '12', 'elster_format' => 'FFF/BBB/UUUUP', },
{ 'id' => 15, 'name' => 'Sachsen-Anhalt', 'taxbird_nr' => '13', 'elster_format' => 'FFF/BBB/UUUUP', },
{ 'id' => 1, 'name' => 'Schleswig-Holstein', 'taxbird_nr' => '14', 'elster_format' => 'FF BBB UUUUP', },
{ 'id' => 16, 'name' => 'Th?ringen', 'taxbird_nr' => '15', 'elster_format' => 'FFF/BBB/UUUUP', },
{ 'id' => 16, 'name' => 'Thüringen', 'taxbird_nr' => '15', 'elster_format' => 'FFF/BBB/UUUUP', },
);
sub new {
......
foreach (@tax_office_information) {
my $entry = \%{ $_ };
$entry->{name} = $main::locale->{iconv_iso8859}->convert($entry->{name});
$entry->{name} = $::locale->{iconv_utf8}->convert($entry->{name});
push @{ $self->{tax_office_information} }, $entry;
}
}
......
# use SL::Form;
# Referenz wird ?bergeben, hash of hash wird nicht
# in neues Hash kopiert, sondern direkt ?ber die Referenz ver?ndert
# Prototyp f?r diese Konstruktion
# Referenz wird übergeben, hash of hash wird nicht
# in neues Hash kopiert, sondern direkt über die Referenz verändert
# Prototyp für diese Konstruktion
my ($self, $land, $elsterFFFF, $elster_init) = @_;
......
var elsterBLAuswahl = document.verzeichnis.elsterland_new;
var elsterFAAuswahl = document.verzeichnis.elsterFFFF_new;
elsterFAAuswahl.options.length = 0; // dropdown aufr?umen
elsterFAAuswahl.options.length = 0; // dropdown aufräumen
|;
foreach my $elster_land (sort keys %$elster_init) {
......
$main::lxdebug->enter_sub();
# noch nicht fertig
# soll mal eine Erinnerungsfunktion f?r USTVA Abgaben werden, die automatisch
# den Termin der n?chsten USTVA anzeigt.
# soll mal eine Erinnerungsfunktion für USTVA Abgaben werden, die automatisch
# den Termin der nächsten USTVA anzeigt.
#
#
my ($today, $FA_dauerfrist, $FA_voranmeld) = @_;
......
#There is no table, read the table from sql/finanzamt.sql
print qq|<p>Bitte warten, Tabelle $table wird einmalig in Datenbank:
$myconfig->{dbname} als Benutzer: $myconfig->{dbuser} hinzugef?gt...</p>|;
$myconfig->{dbname} als Benutzer: $myconfig->{dbuser} hinzugefügt...</p>|;
process_query($form, $dbh, $filename) || $self->error(DBI->errstr);
#execute second last call
......
}
# Fixme: Wird auch noch f?r Oesterreich gebraucht,
# Fixme: Wird auch noch für Oesterreich gebraucht,
# weil kein eigenes Ausgabeformular
# sotte aber aus der allgem?inen Steuerberechnung verschwinden
# sotte aber aus der allgeméinen Steuerberechnung verschwinden
#
# Berechnung der USTVA Formularfelder laut Bogen 207
#
......
#########################################
# Ausgaben und Gl Buchungen sind gleich
# f?r Ist- und Soll-Versteuerung
# für Ist- und Soll-Versteuerung
#########################################
$query .= qq|
UNION -- alle Ausgaben AP erfassen
bin/mozilla/am.pl
#
#======================================================================
use utf8;
use SL::Auth;
use SL::AM;
use SL::CA;
......
my $select_eur = q|<option value=""> |. $locale->text('None') .q|</option>\n|;
my %eur = (
1 => "Umsatzerl?se",
2 => "sonstige Erl?se",
1 => "Umsatzerlöse",
2 => "sonstige Erlöse",
3 => "Privatanteile",
4 => "Zinsertr?ge",
5 => "Ausserordentliche Ertr?ge",
4 => "Zinserträge",
5 => "Ausserordentliche Erträge",
6 => "Vereinnahmte Umsatzst.",
7 => "Umsatzsteuererstattungen",
8 => "Wareneing?nge",
9 => "L?hne und Geh?lter",
8 => "Wareneingänge",
9 => "Löhne und Gehälter",
10 => "Gesetzl. sozialer Aufw.",
11 => "Mieten",
12 => "Gas, Strom, Wasser",
13 => "Instandhaltung",
14 => "Steuern, Versich., Beitr?ge",
14 => "Steuern, Versich., Beiträge",
15 => "Kfz-Steuern",
16 => "Kfz-Versicherungen",
17 => "Sonst. Fahrzeugkosten",
18 => "Werbe- und Reisekosten",
19 => "Instandhaltung u. Werkzeuge",
20 => "Fachzeitschriften, B?cher",
21 => "Miete f?r Einrichtungen",
20 => "Fachzeitschriften, Bücher",
21 => "Miete für Einrichtungen",
22 => "Rechts- und Beratungskosten",
23 => "B?robedarf, Porto, Telefon",
23 => "Bürobedarf, Porto, Telefon",
24 => "Sonstige Aufwendungen",
25 => "Abschreibungen auf Anlagever.",
26 => "Abschreibungen auf GWG",
......
30 => "Ausserordentlicher Aufwand",
31 => "Betriebliche Steuern");
foreach my $item (sort({ $a <=> $b } keys(%eur))) {
my $text = H(SL::Iconv::convert("ISO-8859-15", $main::dbcharset, $eur{$item}));
my $text = H($::locale->{iconv_utf8}->convert($eur{$item}));
if ($item == $form->{pos_eur}) {
$select_eur .= qq|<option value=$item selected>|. sprintf("%.2d", $item) .qq|. $text</option>\n|;
} else {
......
my $select_bwa = q|<option value=""> |. $locale->text('None') .q|</option>\n|;
my %bwapos = (
1 => 'Umsatzerl?se',
1 => 'Umsatzerlöse',
2 => 'Best.Verdg.FE/UE',
3 => 'Aktiv.Eigenleistung',
4 => 'Mat./Wareneinkauf',
5 => 'So.betr.Erl?se',
5 => 'So.betr.Erlöse',
10 => 'Personalkosten',
11 => 'Raumkosten',
12 => 'Betriebl.Steuern',
13 => 'Vers./Beitr?ge',
13 => 'Vers./Beiträge',
14 => 'Kfz.Kosten o.St.',
15 => 'Werbe-Reisek.',
16 => 'Kosten Warenabgabe',
17 => 'Abschreibungen',
18 => 'Rep./instandhlt.',
19 => '?brige Steuern',
19 => 'Übrige Steuern',
20 => 'Sonst.Kosten',
30 => 'Zinsauwand',
31 => 'Sonst.neutr.Aufw.',
32 => 'Zinsertr?ge',
32 => 'Zinserträge',
33 => 'Sonst.neutr.Ertrag',
34 => 'Verr.kalk.Kosten',
35 => 'Steuern Eink.u.Ertr.');
foreach my $item (sort({ $a <=> $b } keys %bwapos)) {
my $text = H(SL::Iconv::convert("ISO-8859-15", $main::dbcharset, $bwapos{$item}));
my $text = H($::locale->{iconv_utf8}->convert($bwapos{$item}));
if ($item == $form->{pos_bwa}) {
$select_bwa .= qq|<option value="$item" selected>|. sprintf("%.2d", $item) .qq|. $text\n|;
} else {
......
}
# Wieder hinzugef?gt zu evaluationszwecken (us) 09.03.2007
# Wieder hinzugefügt zu evaluationszwecken (us) 09.03.2007
my $select_bilanz = q|<option value=""> |. $locale->text('None') .q|</option>\n|;
foreach my $item ((1, 2, 3, 4)) {
if ($item == $form->{pos_bilanz}) {
bin/mozilla/gl.pl
#
#======================================================================
use utf8;
use strict;
use POSIX qw(strftime);
use List::Util qw(sum);
......
require "bin/mozilla/drafts.pl";
require "bin/mozilla/reportgenerator.pl";
use strict;
# this is for our long dates
# $locale->text('January')
# $locale->text('February')
......
my %charts = ();
my $taxchart_init;
foreach my $item (@{ $form->{ALL_CHARTS} }) {
if ($item->{charttype} eq 'H'){ #falls ?berschrift
next; #?berspringen (Bug 1150)
if ($item->{charttype} eq 'H'){ #falls überschrift
next; #überspringen (Bug 1150)
}
my $key = $item->{accno} . "--" . $item->{tax_id};
$taxchart_init = $item->{tax_id} unless (@chart_values);
......
print qq|<input class=submit type=submit name=action value="| . $locale->text('Storno') . qq|">|;
}
# L?schen und ?ndern von Buchungen nicht mehr m?glich (GoB) nur am selben Tag m?glich
# Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich
if (!$form->{locked} && $radieren) {
print qq|
<input class=submit type=submit name=action value="| . $locale->text('Post') . qq|" accesskey="b">
bin/mozilla/menuXML.pl
# 2007-10-14 - XMLified - Holger Will <holger@treebuilder.de>
#######################################################################
use utf8;
use SL::Menu;
use CGI::Carp qw(fatalsToBrowser);
......
. qq|<?xml version="1.0" encoding="${charset}"?>
<?xml-stylesheet href="xslt/xulmenu.xsl" type="text/xsl"?>
<!DOCTYPE doc [
<!ENTITY szlig "| . $::locale->{iconv_iso8859}->convert('?') . qq|">
<!ENTITY auml "| . $::locale->{iconv_iso8859}->convert('?') . qq|">
<!ENTITY ouml "| . $::locale->{iconv_iso8859}->convert('?') . qq|">
<!ENTITY uuml "| . $::locale->{iconv_iso8859}->convert('?') . qq|">
<!ENTITY szlig "| . $::locale->{iconv_utf8}->convert('ß') . qq|">
<!ENTITY auml "| . $::locale->{iconv_utf8}->convert('ä') . qq|">
<!ENTITY ouml "| . $::locale->{iconv_utf8}->convert('ö') . qq|">
<!ENTITY uuml "| . $::locale->{iconv_utf8}->convert('ü') . qq|">
]>
<doc>
bin/mozilla/menujs.pl
# 2004-12-14 - Holger Lindemann
#######################################################################
use utf8;
use strict;
use SL::Menu;
use CGI::Carp qw(fatalsToBrowser);
use strict;
1;
# end of main
......
} else {
if ($menu->{$item}{module}) {
#Untermen?punkte
#Untermenüpunkte
my $target = $menu->{$item}{target};
my $uri = $menu->menuitem_js(\%myconfig, \%$form, $item, $level);
bin/mozilla/ustva.pl
# German Tax authority Module and later ELSTER Interface
#======================================================================
use utf8;
require "bin/mozilla/common.pl";
#use strict;
......
$ustva->get_config($userspath, 'finanzamt.ini');
# Hier Einlesen der user-config
# steuernummer entfernt f?r prerelease
# steuernummer entfernt für prerelease
my @a = qw(
signature name company address businessnumber
tel fax email co_chief co_department
......
# Anpassungen der Variablennamen auf pre 2.1.1 Namen
# kl?ren, ob $form->{company_street|_address} gesetzt sind
# klären, ob $form->{company_street|_address} gesetzt sind
if ($form->{address} ne '') {
my $temp = $form->{address};
$temp =~ s/\n/<br \/>/;
......
$sel = '';
my $dfv = '';
# Offset f?r Dauerfristverl?ngerung
# Offset für Dauerfristverlängerung
$dfv = '100' if ($form->{FA_dauerfrist} eq '1');
SWITCH: {
......
my $yy = $form->{year} * 10000;
$yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
$sel = '';
my $dfv = ''; # Offset f?r Dauerfristverl?ngerung
my $dfv = ''; # Offset für Dauerfristverlängerung
$dfv = '100' if ($form->{FA_dauerfrist} eq '1');
SWITCH: {
......
};
}
# Kontrollvariable f?r die Templates
# Kontrollvariable für die Templates
$form->{'year2007'} = ($form->{year} >= 2007 ) ? "1":"0";
......
$form->{endbold} = "}";
$form->{br} = '\\\\';
# Zahlenformatierung f?r Latex USTVA Formulare
# Zahlenformatierung für Latex USTVA Formulare
foreach my $number (@category_euro) {
$form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
......
$form->{$number} =~ s/${decimal_comma}/~~/g;
}
} elsif ( $form->{format} eq 'html') { # Formatierungen f?r HTML Ausgabe
} elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
$form->{IN} = $form->{type} . '.html';
$form->{padding} = "&nbsp;&nbsp;";
......
$file .= sprintf("%02d", $form->{year} % 100);
#6. to 18. char = Elstersteuernummer
#Beispiel: Steuernummer in Bayern
#111/222/33334 ergibt f?r UStVA Jan 2004: U01049111022233334
#111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
$file .= $form->{elsterFFFF};
$file .= $form->{elstersteuernummer};
#file suffix
......
$form->{attachment_filename} = $file;
# Zahlenformatierung f?r Winston
# Zahlenformatierung für Winston
my $temp_numberformat = $myconfig{numberformat};
......
$form->{USTVA} = [];
if ( $form->{format} eq 'generic') { # Formatierungen f?r HTML Ausgabe
if ( $form->{format} eq 'generic') { # Formatierungen für HTML Ausgabe
my $rec_ref = {};
for my $kennziffer (@category_cent, @category_euro) {
......
$ustva->get_coa($form, \%myconfig);
# h?? kann die weg?
# hä? kann die weg?
my $steuernummer_new = '';
# Variablen f?r das Template zur Verf?gung stellen
# Variablen für das Template zur Verfügung stellen
my $template_ref = {
select_tax_office => $select_tax_office,
checked_accrual => $checked_accrual,
......
$ustva->get_config($userspath, 'finanzamt.ini')
if ($form->{saved} eq $locale->text('saved'));
# Auf ?bergabefehler checken
# Auf Übergabefehler checken
USTVA::info( $locale->text('Missing Tax Authoritys Preferences') . "\n"
. $locale->text('USTVA-Hint: Tax Authoritys'))
if ( $form->{elsterFFFF_new} eq 'Auswahl'
......
. $locale->text('USTVA-Hint: Method'))
if ($form->{method} eq '');
# Kl?ren, ob Variablen bereits bef?llt sind UND ob ver?derungen auf
# Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
# der vorherigen Maske stattfanden: $change = 1(in der edit sub,
# mittels get_config)
......
if ($change eq '1') {
# Daten ?ndern
# Daten ändern
$elsterland = $form->{elsterland_new};
$elsterFFFF = $form->{elsterFFFF_new};
$form->{elsterland} = $elsterland;
......
FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
FA_71 FA_dauerfrist);
# Hier kommt dann die Plausibilit?tspr?fung der ELSTERSteuernummer
# Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
if ($form->{elstersteuernummer} ne '000000000') {
$form->{elster} = '1';
config/authentication.pl.default
#!/usr/bin/perl
# Das Passwort f?r den Zugang zum Administrationsfrontend im Klartext.
# Kann nur in dieser Datei ge?ndert werden, nicht im Administrationsfrontend
# Das Passwort für den Zugang zum Administrationsfrontend im Klartext.
# Kann nur in dieser Datei geändert werden, nicht im Administrationsfrontend
# selber.
$self->{admin_password} = 'admin';
......
# Entweder 'DB' oder 'LDAP'.
#
# Wenn LDAP-Authentifizierung benutzt wird, dann kann der Benutzer sein
# Passwort nicht ?ber Lx-Office ?ndern.
# Passwort nicht über Lx-Office ändern.
$self->{module} = 'DB';
# Verbindungsinformationen zur Datenbank mit den Benutzer- und
# Gruppeninformationen. Wird auch dann ben?tigt, wenn gegen einen
# LDAP-Server authentifiziert wird, weil dieser nur zur Passwort?berpr?fung
# Gruppeninformationen. Wird auch dann benötigt, wenn gegen einen
# LDAP-Server authentifiziert wird, weil dieser nur zur Passwortüberprüfung
# benutzt wird. Der Rest der Benutzerdaten ist in der Datenbank hinterlegt.
#
# Ist 'module' = 'DB' dann wird diese Datenbank auch f?r die
# Passwort?berpr?fung benutzt.
# Ist 'module' = 'DB' dann wird diese Datenbank auch für die
# Passwortüberprüfung benutzt.
$self->{DB_config} = {
'host' => 'localhost',
'port' => 5432,
......
'password' => '',
};
# Wird nur ben?tigt, wenn 'module' = 'LDAP' ist. An diesem LDAP-Server
# werden die Benutzerpassw?rter durch einen LDAP-Bind ?berpr?ft.
# Wird nur benötigt, wenn 'module' = 'LDAP' ist. An diesem LDAP-Server
# werden die Benutzerpasswörter durch einen LDAP-Bind überprüft.
#
# Es m?ssen mindestens die Parameter host, attribute und base_dn
# Es müssen mindestens die Parameter host, attribute und base_dn
# angegeben werden.
#
# tls: Verschl?sselung per TLS erzwingen
# attribute: Das LDAP-Attribut, das den Loginnamen enth?lt
# tls: Verschlüsselung per TLS erzwingen
# attribute: Das LDAP-Attribut, das den Loginnamen enthält
# base_dn: Basis-DN, ab der der LDAP-Baum durchsucht wird
# filter: Ein optionaler LDAP-Filter. Die Zeichenkette '<%login%>' wird
# innerhalb des Filters durch den Loginnamen ersetzt.
# bind_dn und bind_password:
# Wenn zum Durchsuchen des LDAP-Baumes eine Anmeldung erforderlich
# ist (z.B. beim ActiveDirectory), dann m?ssen diese beiden
# ist (z.B. beim ActiveDirectory), dann müssen diese beiden
# Parameter gesetzt sein.
$self->{LDAP_config} = {
'host' => 'localhost',
......
'bind_password' => undef,
};
# Der Name des Cookies kann ge?ndert werden, sofern gew?nscht.
# Der Name des Cookies kann geändert werden, sofern gewünscht.
# $self->{cookie_name} = 'lx_office_erp_session_id';
# Die Zeitspanne, bis eine inaktive Session ung?ltig wird, kann
# hier ge?ndert werden. Der Standardwert ist acht Stunden.
# Die Zeitspanne, bis eine inaktive Session ungültig wird, kann
# hier geändert werden. Der Standardwert ist acht Stunden.
# Die Angabe ist in Minuten.
# $self->{session_timeout} = 8 * 60;
config/lx-erp.conf
# member file
$memberfile = "users/members";
# Wenn Einnahmen-?berschussrechnung, dann auf 1 setzen
# Wenn Einnahmen-Überschussrechnung, dann auf 1 setzen
# Wenn Bilanzierung (z.B. GmbH), dann auf 0 setzen
$eur = 1;
......
$webdav = 0;
$lizenzen = 1;
$vertreter = 0;
$excel_templates = 0; # Minimalunterst?tzung f?r Excel-Druckvorlagen
$excel_templates = 0; # Minimalunterstützung für Excel-Druckvorlagen
# Zeige Felder f?r Mindesthaltbarkeitsdatum
# Zeige Felder für Mindesthaltbarkeitsdatum
$show_best_before = 0;
## Support fuer OpenDocument-Vorlagen
......
$xvfb_bin = "/usr/bin/Xvfb";
# Das charset, in dem die Daten in der Datenbank abgelegt sind.
$dbcharset = 'UTF-8'; # F?r UNICODE UTF-8
$dbcharset = 'UTF-8'; # Für UNICODE UTF-8
# $dbcharset = "ISO-8859-15";
......
$latex_bin = 'pdflatex';
# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollst?ndige
# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
# so wird der Men?punkt zum Backup von Datenbanken im Administrationsfrontend
# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
# nicht angeboten.
# Das gleiche gilt analog f?r das Wiederherstellen mittels "pg_restore".
# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
$pg_dump_exe = "pg_dump";
$pg_restore_exe = "pg_restore";
# Rose::DB::Object Environment laden.
# Die RDBO Klassen bieten f?r Addon Schreiber sehr einfache Interfaces zu den
# Die RDBO Klassen bieten für Addon Schreiber sehr einfache Interfaces zu den
# bestehenden Klassen, haben aber den Nachteil, dass der Start des Programms
# etwa 2s mehr dauert. Damit f?llt die M?glichkeit Lx-Office ?ber CGI zu
# etwa 2s mehr dauert. Damit fällt die Möglichkeit Lx-Office über CGI zu
# betreiben weg.
$use_rdbo = 1;
......
# LXDebug::DEBUG2
# LXDebug::QUERY - SQL Queries
# LXDebug::TRACE - Tracing von Funktionsaufrufen
# LXDebug::BACKTRACE_ON_ERROR - Vollst?ndiger Aufrufpfad, wenn $form->error() aufgerufen wird
# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
# LXDebug::REQUEST_TIMER - Timing von Requests loggen
# LXDebug::WARN - warnings
# LXDebug::ALL - alle Debugausgaben
......
# $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
$LXDebug::global_level = LXDebug->NONE;
# ?berwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
# dann k?nnen einzelne Variablen mit
# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
# dann können einzelne Variablen mit
# $form->{"Watchdog::<variablenname>"} = 1;
# ?berwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
# weshalb sie normalerweise deaktiviert ist.
$LXDebug::watch_form = 0;
# Zum debuggen von Latexausgaben. Wenn diese Option auf 1 gesetzt wird, werden
# tempor?re Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
# nach Abschlu? der Erstellung oder im Fehlerfall nicht gel?scht, damit man sie
# temporäre Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
# nach Abschluß der Erstellung oder im Fehlerfall nicht gelöscht, damit man sie
# untersuchen kann.
$::keep_temp_files = 0;
config/lx-erp.conf.default
$lizenzen = 1;
$vertreter = 0;
# Zeige Felder f?r Mindesthaltbarkeitsdatum
# Zeige Felder für Mindesthaltbarkeitsdatum
$show_best_before = 0;
## Support fuer OpenDocument-Vorlagen
......
$xvfb_bin = "/usr/bin/Xvfb";
# Das charset, in dem die Daten in der Datenbank abgelegt sind.
$dbcharset = 'UTF-8'; # F?r UNICODE UTF-8
$dbcharset = 'UTF-8'; # Für UNICODE UTF-8
# $dbcharset = "ISO-8859-15";
......
$latex_bin = 'pdflatex';
# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollst?ndige
# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
# so wird der Men?punkt zum Backup von Datenbanken im Administrationsfrontend
# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
# nicht angeboten.
# Das gleiche gilt analog f?r das Wiederherstellen mittels "pg_restore".
# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
$pg_dump_exe = "pg_dump";
$pg_restore_exe = "pg_restore";
......
# LXDebug::DEBUG2
# LXDebug::QUERY - SQL Queries
# LXDebug::TRACE - Tracing von Funktionsaufrufen
# LXDebug::BACKTRACE_ON_ERROR - Vollst?ndiger Aufrufpfad, wenn $form->error() aufgerufen wird
# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
# LXDebug::REQUEST_TIMER - Timing von Requests loggen
# LXDebug::WARN - warnings
# LXDebug::ALL - alle Debugausgaben
......
# $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
$LXDebug::global_level = LXDebug::NONE;
# ?berwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
# dann k?nnen einzelne Variablen mit
# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
# dann können einzelne Variablen mit
# $form->{"Watchdog::<variablenname>"} = 1;
# ?berwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
# weshalb sie normalerweise deaktiviert ist.
$LXDebug::watch_form = 0;
# Zum debuggen von Latexausgaben. Wenn diese Option auf 1 gesetzt wird, werden
# tempor?re Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
# nach Abschlu? der Erstellung oder im Fehlerfall nicht gel?scht, damit man sie
# temporäre Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
# nach Abschluß der Erstellung oder im Fehlerfall nicht gelöscht, damit man sie
# untersuchen kann.
$::keep_temp_files = 0;
css/lx-office-erp.css
}
/*
?berschriftsbalken
Überschriftsbalken
*/
.listtop {
background-color: rgb(236,233,216);
doc/INSTALL.fcgi
ist sie deutlich leichter zu lesen.
=head1 FastCGI f?r Lx-Office
=head1 FastCGI für Lx-Office
=head2 Was ist FastCGI?
Direkt aus L<http://de.wikipedia.org/wiki/FastCGI> kopiert:
FastCGI ist ein Standard f?r die Einbindung externer Software zur Generierung
FastCGI ist ein Standard für die Einbindung externer Software zur Generierung
dynamischer Webseiten in einem Webserver. FastCGI ist vergleichbar zum Common
Gateway Interface (CGI), wurde jedoch entwickelt, um dessen
Performance-Probleme zu umgehen.
......
=head2 Warum FastCGI?
Perl Programme (wie Lx-Office eines ist) werden nicht statisch kompiliert.
Stattdessen werden die Quelldateien bei jedem Start ?bersetzt, was bei kurzen
Laufzeiten einen Gro?teil der Laufzeit ausmacht. W?hrend SQL Ledger einen
Gro?teil der Funktionalit?t in einzelne Module kapselt, um immer nur einen
kleinen Teil laden zu m?ssen, ist die Funktionalit?t von Lx-Office soweit
Stattdessen werden die Quelldateien bei jedem Start übersetzt, was bei kurzen
Laufzeiten einen Großteil der Laufzeit ausmacht. Während SQL Ledger einen
Großteil der Funktionalität in einzelne Module kapselt, um immer nur einen
kleinen Teil laden zu müssen, ist die Funktionalität von Lx-Office soweit
gewachsen, dass immer mehr Module auf den Rest des Programms zugreifen.
Zus?tzlich benutzen wir umfangreiche Bibliotheken um Funktionalt?t nicht selber
entwickeln zu m?ssen, die zus?tzliche Ladezeit kosten. All dies f?hrt dazu dass
ein Lx-Office Aufruf der Kernmasken mittlerweile deutlich l?nger dauert als
fr?her, und dass davon 90% f?r das Laden der Module verwendet wird.
Zusätzlich benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies führt dazu dass
ein Lx-Office Aufruf der Kernmasken mittlerweile deutlich länger dauert als
früher, und dass davon 90% für das Laden der Module verwendet wird.
Mit FastCGI werden nun die Module einmal geladen, und danach wird nur die
eigentliche Programmlogik ausgef?hrt.
eigentliche Programmlogik ausgeführt.
=head2 Kombinationen aus Webservern und Plugin.
......
* Apache 2.2.11 (Ubuntu) und mod_fcgid:
Als Perl Backend wird das Modul FCGI.pm verwendet. Vorsicht: FCGI 0.69 und
h?her ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte
höher ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte
Eingaben von Lx-Office. Solange diese Probleme nicht behoben sind, muss auf die
Vorg?ngerversion FCGI 0.68 ausgewichen werden.
Vorgängerversion FCGI 0.68 ausgewichen werden.
Mit cpan l?sst sie sich wie folgt installieren:
Mit cpan lässt sie sich wie folgt installieren:
force install M/MS/MSTROUT/FCGI-0.68.tar.gz
......
Bevor Sie versuchen eine Lx-Office Installation unter FCGI laufen zu lassen,
empfliehlt es sich die Installation ersteinmal unter CGI aufzusetzen. FCGI
macht es nicht einfach Fehler zu debuggen die beim ersten aufsetzen auftreten
k?nnen. Sollte die Installation schon funktionieren, lesen Sie weiter.
können. Sollte die Installation schon funktionieren, lesen Sie weiter.
Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann unter
Debian/Ubuntu z.B. mit folgendem Befehl geschehen:
......
a2enmod fcgid
Die Konfiguration f?r die Verwendung von Lx-Office mit FastCGI erfolgt
Die Konfiguration für die Verwendung von Lx-Office mit FastCGI erfolgt
durch Anpassung der vorhandenen Alias- und Directory-Direktiven. Dabei
wird zwischen dem Installationspfad von Lx-Office im Dateisystem
("/path/to/lx-office-erp") und der URL unterschieden, unter der
......
Deny from All
</DirectoryMatch>
...und f?r mod_fcgid muss die erste Zeile ge?ndert werden in:
...und für mod_fcgid muss die erste Zeile geändert werden in:
AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle Zugriffe
auf die einzelnen Scripte werden auf diesen umgeleitet. Dadurch, dass
zur Laufzeit ?fter mal Scripte neu geladen werden, gibt es hier kleine
Performance-Einbu?en. Trotzdem ist diese Variante einer globalen
zur Laufzeit öfter mal Scripte neu geladen werden, gibt es hier kleine
Performance-Einbußen. Trotzdem ist diese Variante einer globalen
Benutzung von "AddHandler fastcgi-script .pl" vorzuziehen.
Es ist m?glich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
betreiben. Daf?r bleiben Directorydirektiven bleiben wie oben beschrieben, die
Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
betreiben. Dafür bleiben Directorydirektiven bleiben wie oben beschrieben, die
URLs werden aber umgeleitet:
# Zugriff ohne FastCGI
......
Achtung:
Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
anscheinend nicht lokal auf das Verzeichnis beschr?nkt sondern global im
anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
vhost.
=head2 Entwicklungsaspekte
Wenn ?nderungen in der Konfiguration von Lx-Office gemacht werden, muss der
Wenn Änderungen in der Konfiguration von Lx-Office gemacht werden, muss der
Server neu gestartet werden.
Bei der Entwicklung f?r FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
dass das Programm in einer Endlosschleife l?uft, m?ssen folgende Aspekte
Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
dass das Programm in einer Endlosschleife läuft, müssen folgende Aspekte
geachtet werden:
=head3 Programmende und Ausnahmen: C<warn>, C<die>, C<exit>, C<carp>, C<confess>
......
Gleiche, mit ein paar Extraoptionen. C<warn> und C<exit> hingegen werden nicht
abgefangen. C<warn> wird direkt nach STDERR, also in Server Log eine Nachricht
schreiben (sofern in der Konfiguration nicht die Warnungen in das Lx-Office Log
umgeleitet wurden), und C<exit> wird die Ausf?hrung beenden.
umgeleitet wurden), und C<exit> wird die Ausführung beenden.
Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
......
=head3 Globale Variablen
Um zu vermeiden, dass Informationen von einem Request in einen anderen gelangen,
m?ssen alle globalen Variablen vor einem Request sauber initialisiert werden.
müssen alle globalen Variablen vor einem Request sauber initialisiert werden.
Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
gel?scht werden pro Instanz, sondern persistent gehalten werden.
gelöscht werden pro Instanz, sondern persistent gehalten werden.
In C<SL::Dispatcher> gibt es einen sauber abgetrennten Block der alle
kanonischen globalen Variablen listet und erkl?rt. Bitte keine anderen
einf?hren ohne das sauber zu dokumentieren.
kanonischen globalen Variablen listet und erklärt. Bitte keine anderen
einführen ohne das sauber zu dokumentieren.
Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sichergeht,
dass man die richtige erwischt.
......
=head3 Encoding Awareness
UTF-8 kodierte Installationen sind sehr anf?llig gegen fehlerhfate Encodings
UTF-8 kodierte Installationen sind sehr anfällig gegen fehlerhfate Encodings
unter FCGI. latin9 Installationen behandeln falsch kodierte Zeichen eher
unwissend, und geben sie einfach weiter. UTF-8 verweigert bei fehlerhaften
Programmpfaden kurzerhand aus ausliefern. Es wird noch daran gearbeitet alles
doc/excel_templates.txt
1 Zusammenfassung
2 Bedienung
3 Exceltemplate Syntax
4 Einschr?nkungen
4 Einschränkungen
......
---------------
Dieses Dokument beschreibt den Mechanismus, mit dem Exceltemplates abgearbeitet
werden, und die Einschr?nkungen die damit einhergehen.
werden, und die Einschränkungen die damit einhergehen.
......
---------
Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert werden. Die
Konfigurationsoption hei?t:
Konfigurationsoption heißt:
$excel_templates = 1;
Eine Excelvorlage kann dann unter dem Namen einer beliebigen anderen Vorlage mit
der Endung .xls gespeichert werden. In den normalen Verkaufsmasken taucht nun
"Excel" als ausw?hlbares Format auf, und kann von da an bnutzt weren wie Latex
"Excel" als auswählbares Format auf, und kann von da an bnutzt weren wie Latex
oder OpenOffice Vorlagen.
Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls eine
......
Einfache Syntax: <<varname>>
Wobei "<<" und ">>" die Delimiter sind. Da Excel auf festen Breiten besteht,
kann der Tag k?nstlich verl?ngert werden, indem weitere "<" oder ">" gegef?gt
kann der Tag künstlich verlängert werden, indem weitere "<" oder ">" gegefügt
werden. Der Tag muss nicht symmetrisch sein.
Beispiel: <<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Um die Limitierung der festen Breite zu reduzieren, k?nnen weitere Variablen in
Um die Limitierung der festen Breite zu reduzieren, können weitere Variablen in
einem Block interpoliert werden. Whitespace wird dazwishen dann erhalten.
Beispiel: <<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>>
Die Variablen werden interpoliert, und linksb?ndig mit Leerzeichen auf die
gew?nschte L?nge aufgef?llt. Ist der String zu lang, werden ?berz?hlige Zeichen
Die Variablen werden interpoliert, und linksbündig mit Leerzeichen auf die
gewünschte Länge aufgefüllt. Ist der String zu lang, werden überzählige Zeichen
abgeschnitten.
Es ist ausserdem m?glich Daten rechtsb?ndig darzustellen, wenn der Block mit
einem Leerzeichen anf?ngt.
Es ist ausserdem möglich Daten rechtsbündig darzustellen, wenn der Block mit
einem Leerzeichen anfängt.
Beispiel: <<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
w?rde rechtsb?ndig triggern. Wenn bei rechtsb?ndiger Ausrichtung Text
würde rechtsbündig triggern. Wenn bei rechtsbündiger Ausrichtung Text
abgeschnitten werden muss, wird er vom linken Ende entfernt.
Einschr?nkungen
Einschränkungen
---------------
Das Excelformat bis 2002 ist ein bin?res Format, und kann nicht mit vertretbarem
Aufwand editiert werden. Der Templatemechanismus beschr?nkt sich daher darauf,
Das Excelformat bis 2002 ist ein binäres Format, und kann nicht mit vertretbarem
Aufwand editiert werden. Der Templatemechanismus beschränkt sich daher darauf,
Textstellen _exakt_ durch einen anderen Text zu ersetzen.
Aus dem gleichen Grund sind die Templatekonstrukte <% if %> und <% foreach %>
locale/de/Num2text
2 => 'zwei',
3 => 'drei',
4 => 'vier',
5 => 'f?nf',
5 => 'fünf',
6 => 'sechs',
7 => 'sieben',
8 => 'acht',
9 => 'neun',
10 => 'zehn',
11 => 'elf',
12 => 'zw?lf',
12 => 'zwölf',
13 => 'dreizehn',
14 => 'vierzehn',
15 => 'f?nfzehn',
15 => 'fünfzehn',
16 => 'sechzehn',
17 => 'siebzehn',
18 => 'achtzehn',
......
20 => 'zwanzig',
30 => 'dreissig',
40 => 'vierzig',
50 => 'f?nfzig',
50 => 'fünfzig',
60 => 'sechzig',
70 => 'siebzig',
80 => 'achtzig',
locale/de/all
#!/usr/bin/perl
# -*- coding: iso-8859-15; -*-
# vim: fenc=ISO-8859-15
# -*- coding: utf-8; -*-
# vim: fenc=UTF-8
# These are all the texts to build the translations files.
# The file has the form of 'english text' => 'foreign text',
......
'&lt;%total%&gt; -- Amount payable' => '&lt;%total%&gt; -- Noch zu bezahlender Betrag',
'&lt;%total_wo_skonto%&gt; -- Amount payable less discount' => '&lt;%total_wo_skonto%&gt; -- Noch zu bezahlender Betrag abz&uuml;glich Skonto',
'*/' => '*/',
'---please select---' => '---bitte ausw?hlen---',
'---please select---' => '---bitte auswählen---',
'...after loggin in' => '...nach dem Anmelden',
'...done' => '...fertig',
'...on the TODO list' => '...auf der Aufgabenliste',
......
'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => 'Eine Buchungsgruppe besteht aus einem deskriptiven Namen, den Erl&ouml;s- und Aufwandskonten f&uuml;r diese vier Steuerzonen sowie aus einem Inventarkonto.',
'A group named &quot;Full Access&quot; has been created.' => 'Eine Gruppe namens &quot;Vollzugriff&quot; wurde angelegt.',
'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von Lx-Office wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit m?glich ist, jeden Aspekt von Lx-Office auch ohne Javascript zu benutzen, empfehlen wir es. In einer zuk?nftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von Lx-Office wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit möglich ist, jeden Aspekt von Lx-Office auch ohne Javascript zu benutzen, empfehlen wir es. In einer zukünftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => 'Eine tempor?re Datei konnte nicht angelegt werden. Bitte stellen Sie sicher, dass das Verzeichnis "#1" vom Webserver beschrieben werden darf.',
'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => 'Eine temporäre Datei konnte nicht angelegt werden. Bitte stellen Sie sicher, dass das Verzeichnis "#1" vom Webserver beschrieben werden darf.',
'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
'A variable marked as \'editable\' can be changed in each quotation, order, invoice etc.' => 'Eine als \'editierbar\' markierte Variable kann in jedem Angebot, Auftrag, jeder Rechnung etc f?r jede Position ge?ndert werden.',
'ADDED' => 'Hinzugef?gt',
'A variable marked as \'editable\' can be changed in each quotation, order, invoice etc.' => 'Eine als \'editierbar\' markierte Variable kann in jedem Angebot, Auftrag, jeder Rechnung etc für jede Position geändert werden.',
'ADDED' => 'Hinzugefügt',
'AP' => 'Einkauf',
'AP Aging' => 'Offene Verbindlichkeiten',
'AP Transaction' => 'Kreditorenbuchung',
......
'AP Transaction Storno (one letter abbreviation)' => 'S',
'AP Transaction with Storno (abbreviation)' => 'K(S)',
'AP Transactions' => 'Kreditorenbuchungen',
'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => 'Kreditorenbuchungen mit Umsatzsteuer-Steuerschl?sseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschl?sseln',
'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => 'Kreditorenbuchungen mit Umsatzsteuer-Steuerschlüsseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschlüsseln',
'AR' => 'Verkauf',
'AR Aging' => 'Offene Forderungen',
'AR Transaction' => 'Debitorenbuchung',
......
'Account Category C' => 'Kosten',
'Account Category E' => 'Aufwandskonto',
'Account Category G' => '?Gegenkonto?',
'Account Category I' => 'Erl?skonto',
'Account Category I' => 'Erlöskonto',
'Account Category L' => 'Passiva/Mittelherkunft',
'Account Category Q' => 'Passiva',
'Account Description missing!' => 'Beschreibung fehlt!',
......
'Account Link AP_paid' => 'Verbindlichkeiten Zahlungsausgang',
'Account Link AP_tax' => 'Verbindlichkeiten Steuer',
'Account Link AR' => 'Verkauf',
'Account Link AR_amount' => 'Forderungen Erl?skonto',
'Account Link AR_amount' => 'Forderungen Erlöskonto',
'Account Link AR_paid' => 'Forderungen Zahlungseingang',
'Account Link AR_tax' => 'Forderungen Steuer',
'Account Link CT_tax' => 'Kunde/Lieferant Steuer',
'Account Link IC' => 'Inventar',
'Account Link IC_cogs' => 'Warenliste Aufwandskonto',
'Account Link IC_expense' => 'Dienstleistungen Aufwandskonto',
'Account Link IC_income' => 'Dienstleistungen Erl?skonto',
'Account Link IC_sale' => 'Warenliste Erl?skonto',
'Account Link IC_income' => 'Dienstleistungen Erlöskonto',
'Account Link IC_sale' => 'Warenliste Erlöskonto',
'Account Link IC_taxpart' => 'Warenliste Steuer',
'Account Link IC_taxservice' => 'Dienstleistungen Steuer',
'Account Number' => 'Kontonummer',
......
'Account Nummer' => 'Kontonummer',
'Account Type' => 'Kontoart',
'Account Type missing!' => 'Kontoart fehlt!',
'Account deleted!' => 'Konto gel?scht!',
'Account deleted!' => 'Konto gelöscht!',
'Account for fees' => 'Konto f&uuml;r Geb&uuml;hren',
'Account for interest' => 'Konto f&uuml;r Zinsen',
'Account number' => 'Kontonummer',
......
'Add Follow-Up for #1' => 'Wiedervorlage f&uuml;r #1 erstellen',
'Add General Ledger Transaction' => 'Dialogbuchen',
'Add Group' => 'Warengruppe erfassen',
'Add Language' => 'Sprache hinzuf?gen',
'Add Language' => 'Sprache hinzufügen',
'Add Lead' => 'Kundenquelle erfassen',
'Add License' => 'Lizenz erfassen',
'Add Part' => 'Ware erfassen',
'Add Payment Terms' => 'Zahlungskonditionen hinzuf?gen',
'Add Payment Terms' => 'Zahlungskonditionen hinzufügen',
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff