Migration der einzelnen Dokumentationsdateien in eine DocBook-Datei
authorMoritz Bunkus <moritz@bunkus.org>
Tue, 10 Jan 2012 21:11:28 +0000 (22:11 +0100)
committerMoritz Bunkus <moritz@bunkus.org>
Tue, 10 Jan 2012 21:11:28 +0000 (22:11 +0100)
13 files changed:
doc/20111013_globale_variablen.txt [deleted file]
doc/INSTALL.fcgi [deleted file]
doc/INSTALL.html [deleted file]
doc/INSTALL.texi [deleted file]
doc/INSTALL.txt [deleted file]
doc/Lx-Office_Installation_DE.pdf [deleted file]
doc/dokumentation.xml [new file with mode: 0644]
doc/dokumentenvorlagen-und-variablen.html [deleted file]
doc/excel_templates.txt [deleted file]
doc/konfigurationsdatei.txt [deleted file]
doc/languages_howto.txt [deleted file]
doc/programmierstilrichtlinien.txt [deleted file]
doc/sql-upgrade-dateien.txt [deleted file]

diff --git a/doc/20111013_globale_variablen.txt b/doc/20111013_globale_variablen.txt
deleted file mode 100644 (file)
index fb6b3da..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-nachdem Holger heute den Bug eingestellt hat den ich schon lange befürchtet
-habe, bin ich heute mal die globalen Variablen angegangen. Das ganze ist über
-die Jahre leider recht komfus geworden, deshalb hier ne Erklärung, die
-hoffentlich sowas in Zukunft vermeidet.
-
-
-Wie sehen globale Variablen in Perl aus?
-----------------------------------------
-
-Globale Variablen liegen in einem speziellen namespace namens "main", der von
-überall erreichbar ist. Darüber hinaus sind bareword globs global und die
-meisten speziellen Variablen sind... speziell.
-
-Daraus ergeben sich folgende Formen:
-
-  $main::form           - expliziter namespace main
-  $::form               - impliziter namespace main
-  open FILE, "file.txt" - FILE ist global
-  $_                    - speziell.
-
-(Ja, da fehlen noch ein paar Sachen, ich weiß)
-
-Im Gegensatz zu PHP gibt es kein Schlüsselwort wir "global" mit dem man
-importieren kann, my, our und local machen was anderes.
-
-  my $form              - lexikalische Variable, gültig bis zum Ende des scopes
-  our $form             - $form referenziert ab hier $PACKAGE::form.
-  local $form           - Alle Änderungen an $form werden am Ende des scopes zurückgesetzt
-
-Warum ist das ein Problem?
---------------------------
-
-Das erste Problem ist FCGI.
-
-sql-ledger hat fast alles im globalen namespace abgelegt, und erwartet, dass es
-da auch wiederzufinden ist. Unter FCGI müssen diese Sachen auch wieder
-aufgeräumt werden, damit sie nicht in den nächsten Request kommen. Einige
-Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
-Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren brauchen.
-
-Das zweite Problem ist strict.
-
-Unter strict werden alle Variablen die nicht explizit mit Package, my oder our
-angegeben werden als Tippfehler angemarkert, was einen vor so mancher Stunde
-suchen nach einem Bug erspart. Da globale Variablen aber implizit mit Package
-angegeben werden, werden die nicht geprüft, und ein Tippfehler da fällt
-niemandem auf.
-
-Kanonische globale Variablen
-----------------------------
-
-Um dieses Problem im Griff zu halten gibt es einige wenige globale Variablen,
-die kanonisch sind, und alles andere sollte anderweitig umhergereicht werden.
-
-Diese Variablen sind im Moment die folgenden neun:
-
-  $::form
-  %::myconfig
-  $::locale
-  $::lxdebug
-  $::auth
-  $::lx_office_conf
-  $::instance_conf
-  $::dispatcher
-  $::request
-
-Damit diese nicht als Müllhalde misbrauch werden, im Folgenden eine kurze
-Erläuterung was man von denn erwarten kann.
-
-
-$::form
-
-- Ist ein Objekt der Klasse "Form"
-- Wird nach jedem Request gelöscht
-- Muss auch in Tests und Konsolenscripts vorhanden sein.
-- Enthält am Anfang eines Requests die Requestparameter vom User
-- Kann zwar intern über Requestgrenzen ein Datenbankhandle cachen, das wird
-  aber momentan absichtlich zerstört
-
-$::form wurde unter sql ledger als Gottobjekt für alles misbraucht. Sämtliche alten
-Funktionen unter SL/ mutieren $::form, das heißt, alles was einem lieb ist,
-sollte man vor einem Aufruf von zum Beispiel IS->retrieve_customer  in Sicherheit bringen.
-
-Das Objekt der Klasse Form  hat leider im Moment noch viele zentrale Funktionen
-Gdie vom internen Zustand abhängen, deshalb bitte nie einfach zerstören oder
-überschreiben. Es geht ziemlich sicher etwas kaputt.
-
-$::form ist gleichzeitig der Standard Scope in den Template::Toolkit Templates
-ausserhalb der Controller, der Ausdruck [% var %] greift auf $::form->{var} zu.
-Unter Controllern ist der Standard Scope anders, da lautet der Zugriff [%
-FORM.var %]. In Druckvorlagen sind normale Variablen ebenfall im $::form Scope,
-d.h. <%var%> zeigt auf $::form->{var}. Innerhalb von Schleifen
-wird $::form->{TEMPLATE_ARRAYS}{var}[$index] bevorzugt wenn vorhanden.
-
-
-%::myconfig
-
-- Das einzige Hash unter den globalen Variablen
-- Wird spätestens benötigt wenn auf die Datenbank zugegriffen wird
-- Wird bei jedem Request neu erstellt.
-- Enthält die Userdaten des aktuellen Logins
-- Sollte nicht ohne Filterung irgendwo gedumpt werden oder extern serialisiert
-  werden, weil da auch der Datenbankzugriff für diesen user drinsteht.
-- Enthält unter anderem Listenbegrenzung vclimit, Datumsformat dateformat und
-  Nummernformat numberformat
-- Enthält Datenbankzugriffinformationen
-
-%::myconfig ist im Moment der Ersatz für ein Userobjekt. Die meisten Funktionen,
-die etwas anhand des aktuellen Users entscheiden müssen befragen %::myconfig.
-
-
-$::locale
-
-- Objekt der Klasse "Locale"
-- Wird pro Request erstellt
-- Muss auch für Tests und Scripte immer verfügbar sein.
-- Cached intern über Requestgrenzen hinweg benutzte Locales
-
-Lokalisierung für den aktuellen User. Alle Übersetzungen, Zahlen- und
-Datumsformatierungen laufen über dieses Objekt.
-
-
-$::lxdebug
-
-- Objekt der Klasse "LXDebug"
-- Wird global gecached
-- Muss immer verfügbar sein, in nahezu allen Funktionen
-
-$::lxdebug stellt Debuggingfunktionen bereit, wie "enter_sub" und "leave_sub",
-mit denen in den alten Modulen ein brauchbares Tracing gebaut ist, "log_time",
-mit der man die Wallclockzeit seit Requeststart loggen kann, und  "message" und
-"dump" mit denen man flott Informationen ins Log packen kann.
-
-
-$::auth
-
-- Objekt der Klasse "SL::Auth"
-- Wird global gecached
-- Hat eine permanente DB Verbindung zur Authdatenbank
-- Wird nach jedem Request resettet.
-
-$::auth stellt Funktionen bereit um die Rechte des aktuellen Users abzufragen.
-Obwohl diese Informationen vom aktuellen User abhängen wird das Objekt aus
-Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem Request kurz
-resettet.
-
-
-$::lx_office_conf
-
-- Objekt der Klasse "SL::LxOfficeConf"
-- Global gecached
-- Repräsentation der config/lx_office.conf[.default] Dateien
-
-Globale Konfiguration.
-
-Configdateien werden zum Start gelesen, und nicht mehr angefasst. Es ist
-derzeit nicht geplant, dass das Programm die Konfiguration ändern kann oder
-sollte.
-
-Der Konfigurationskey
-
-  [Debug]
-
-  file = /tmp/lxoffice_debug_log.txt
-
-ist im Programm als $::lx_office_conf->{Debug}{file} erreichbar.
-
-Warnung: Zugriff auf die Konfiguration erfolgt im Moment über Hashkeys, sind
-also nicht gegen Tippfehler abgesichert.
-
-
-$::instance_conf
-
-- Objekt der Klasse "SL::InstanceConfiguration"
-- wird pro Request neu erstellt.
-
-Funktioniert wie $::lx_office_conf, speichert aber Daten die von der Instanz
-abhängig sind. Eine Instanz ist hier eine Mandantendatenbank. Prominentestes
-Datum ist "eur", die Information ob Bilanz oder Einnahmenüberschussrechnung
-gemacht wird.
-
-
-
-$::dispatcher
-
-- Objekt der Klasse "SL::Dispatcher"
-- wird pro Serverprozess erstellt.
-- enthält Informationen über die technische Verbindung zum Server
-
-Der dritte Punkt ist auch der einzige Grund warum das Objekt global gespeichert
-wird. Wird vermutlich irgendwann in einem anderen Objekt untergebracht.
-
-
-
-$::request
-
-- Hashref (evtl später Objekt)
-- Wird pro Request neu initialisiert.
-- Keine Unterstruktur garantiert.
-
-$::request ist ein generischer Platz um Daten "für den aktuellen Request"
-abzulegen. Sollte nicht für action at a distance benutzt werden, sondern um
-lokales memoizing zu ermöglichen, das garantiert am Ende des Requests zerstört
-wird.
-
-Vieles von dem was im moment in $::form  liegt sollte eigentlich hier liegen.
-Die groben Differentialkriterien sind:
-
-- Kommt es vom User, und soll unverändert wieder an den User?
-  => $::form, steht da eh schon
-
-- Sind es Daten aus der Datenbank, die nur bis zum Ende des Requests gebraucht werden?
-  => $::request
-
-- Muss ich von anderen Teilen des Programms lesend drauf zugreifen?
-  => $::request, aber Zugriff über Wrappermethode
-
-
-
-
-Ehemalige globale Variablen
----------------------------
-
-Die folgenden Variablen waren einmal im Programm, und wurden entfernt.
-
-
-$::cgi
-
-- war nötig, weil cookie Methoden nicht als Klassenfunktionen funktionieren
-- Aufruf als Klasse erzeugt Dummyobjekt was im Klassennamespace gehalten wird
-  und über Requestgrenzen leaked
-- liegt jetzt unter $::request->{cgi}
-
-
-$::all_units
-
-- war nötig, weil einige Funktionen in Schleifen zum Teil ein paar hundert mal
-  pro Request eine Liste der Einheiten brauchen, und die als Parameter durch
-  einen Riesenstack von Funktionen geschleift werden müssten.
-- Liegt jetzt unter $::request->{cache}{all_units}
-- Wird nur in AM->retrieve_all_units gesetzt oder gelesen.
-
-
-%::called_subs
-
-- wurde benutzt um callsub deep recursions abzufangen.
-- Wurde entfernt, weil callsub nur einen Bruchteil der möglichen Rekursioenen
-  darstellt, und da nie welche auftreten.
-- komplette recursion protection wurde entfernt.
diff --git a/doc/INSTALL.fcgi b/doc/INSTALL.fcgi
deleted file mode 100644 (file)
index 31ba60f..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-
-Diese Datei ist in Plain Old Documentation geschrieben. Mit
-
-> perldoc INSTALL.fcgi
-
-ist sie deutlich leichter zu lesen.
-
-=encoding utf8
-
-=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
-  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
-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.
-
-Mit FastCGI werden nun die Module einmal geladen, und danach wird nur die
-eigentliche Programmlogik ausgeführt.
-
-=head2 Kombinationen aus Webservern und Plugin.
-
-Folgende Kombinationen sind getestet:
-
- * Apache 2.2.11 (Ubuntu) und mod_fcgid.
- * Apache 2.2.11 (Ubuntu) und mod_fastcgi.
-
-Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer Zeit
-nicht mehr weiter entwickelt wird.
-
-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
-Eingaben von Lx-Office. Solange diese Probleme nicht behoben sind, muss auf die
-Vorgängerversion FCGI 0.68 ausgewichen werden.
-
-Mit cpan lässt sie sich wie folgt installieren:
-
- force install M/MS/MSTROUT/FCGI-0.68.tar.gz
-
-=head2 Konfiguration des Webservers.
-
-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.
-
-Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann unter
-Debian/Ubuntu z.B. mit folgendem Befehl geschehen:
-
-  a2enmod fcgid
-
-bzw.
-
-  a2enmod fastcgi
-
-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
-Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
-
-Folgendes Template funktioniert mit mod_fastcgi:
-
-  AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
-  Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
-
-  <Directory /path/to/lx-office-erp>
-    AllowOverride All
-    Options ExecCGI Includes FollowSymlinks
-    Order Allow,Deny
-    Allow from All
-  </Directory>
-
-  <DirectoryMatch /path/to/lx-office-erp/users>
-    Order Deny,Allow
-    Deny from All
-  </DirectoryMatch>
-
-Für mod_fcgid muss ein AddHandler ergänzt werden und die erste Zeile geändert werden:
-
-  AddHandler fcgid-script .fpl
-  AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
-
-Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für die
-maximale Größe eines Requests. Diese sollte wie folgt hochgesetzt werden:
-
-  FcgidMaxRequestLen 10485760
-
-Das ganze sollte dann so aussehen:
-
-  AddHandler fcgid-script .fpl
-  AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
-  Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
-  FcgidMaxRequestLen 10485760
-
-  <Directory /path/to/lx-office-erp>
-    AllowOverride All
-    Options ExecCGI Includes FollowSymlinks
-    Order Allow,Deny
-    Allow from All
-  </Directory>
-
-  <DirectoryMatch /path/to/lx-office-erp/users>
-    Order Deny,Allow
-    Deny from All
-  </DirectoryMatch>
-
-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.
-
-
-Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
-betreiben. Dafür bleiben die Directorydirektiven wie oben beschrieben, die URLs
-werden aber umgeleitet:
-
-  # Zugriff über cgi
-  Alias       /web/path/to/lx-office-erp                /path/to/lx-office-erp
-
-  # Zugriff mit mod_fcgid:
-  AliasMatch ^/web/path/to/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
-  Alias       /web/path/to/lx-office-erp-fcgid/          /path/to/lx-office-erp/
-
-  # Zugriff mit mod_fastcgi:
-  AliasMatch ^/web/path/to/lx-office-erp-fastcgi/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
-  Alias       /web/path/to/lx-office-erp-fastcgi/          /path/to/lx-office-erp/
-
-Dann ist unter C</web/path/to/lx-office-erp/> die normale Version erreichbar,
-und unter C</web/path/to/lx-office-erp-fcgid/> bzw.
-C</web/path/to/lx-office-erp-fastcgi/> die FastCGI Version.
-
-=head2 Entwicklungsaspekte
-
-Wenn Änderungen in der Konfiguration von Lx-Office gemacht werden, muss der
-Webserver 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
-geachtet werden:
-
-=head3 Programmende und Ausnahmen: C<warn>, C<die>, C<exit>, C<carp>, C<confess>
-
-Fehler, die dass Programm normalerweise sofort beenden (fatale Fehler), werden
-mit dem FastCGI Dispatcher abgefangen, um das Programm am Laufen zu halten. Man
-kann mit C<die>, C<confess> oder C<carp> Fehler ausgeben, die dann vom Dispatcher
-angezeigt werden. Die Lx-Office eigene C<$::form->error()> tut im Prinzip das
-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.
-
-Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
-sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
-kein C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
-
-=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.
-Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
-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.
-
-Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sicher geht,
-dass man die richtige erwischt.
-
-=head2 Performance und Statistiken
-
-Die kritischen Pfade des Programms sind die Belegmasken, und unter diesen ganz
-besonders die Verkaufsrechnungsmaske. Ein Aufruf der Rechnungsmaske in
-Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 4GB Arbeitsspeicher und
-Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0 sind es je nach Menge der
-definierten Variablen 1-2s. Ab der Moose/Rose::DB Version sind es 5-6s.
-
-Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in den kritischen
-Pfaden, unter 0,15 sonst.
-
-=head2 Bekannte Probleme
-
-=head3 Encoding Awareness
-
-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 das Ausliefern. Es wird noch daran gearbeitet, alle
-Fehler da zu beseitigen.
-
diff --git a/doc/INSTALL.html b/doc/INSTALL.html
deleted file mode 100644 (file)
index 31ccd43..0000000
+++ /dev/null
@@ -1,1191 +0,0 @@
-<html lang="en">
-<head>
-<title>Lx-Office Installationsanleitung</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta name="description" content="Lx-Office Installationsanleitung">
-<meta name="generator" content="makeinfo 4.11">
-<link title="Top" rel="top" href="#Top">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
-  pre.display { font-family:inherit }
-  pre.format  { font-family:inherit }
-  pre.smalldisplay { font-family:inherit; font-size:smaller }
-  pre.smallformat  { font-family:inherit; font-size:smaller }
-  pre.smallexample { font-size:smaller }
-  pre.smalllisp    { font-size:smaller }
-  span.sc    { font-variant:small-caps }
-  span.roman { font-family:serif; font-weight:normal; } 
-  span.sansserif { font-family:sans-serif; font-weight:normal; } 
---></style>
-</head>
-<body>
-<h1 class="settitle">Lx-Office Installationsanleitung</h1>
-   <div class="contents">
-<h2>Table of Contents</h2>
-<ul>
-<li><a name="toc_Top" href="#Top">Inhalt der Anleitung</a>
-<li><a name="toc_Aktuelle-Hinweise" href="#Aktuelle-Hinweise">1 Aktuelle Hinweise</a>
-<li><a name="toc_Ben_00c3_00b6tigte-Software-und-Pakete" href="#Ben_00c3_00b6tigte-Software-und-Pakete">2 Benötigte Software und Pakete</a>
-<ul>
-<li><a href="#Betriebssystem">2.1 Betriebssystem</a>
-<li><a href="#Pakete">2.2 Pakete</a>
-</li></ul>
-<li><a name="toc_Manuelle-Installation-des-Programmpaketes" href="#Manuelle-Installation-des-Programmpaketes">3 Manuelle Installation des Programmpaketes</a>
-<li><a name="toc_Anpassung-der-PostgreSQL_002dKonfiguration" href="#Anpassung-der-PostgreSQL_002dKonfiguration">4 Anpassung der PostgreSQL-Konfiguration</a>
-<ul>
-<li><a href="#Zeichens_00c3_00a4tze_002fdie-Verwendung-von-UTF_002d8">4.1 Zeichensätze/die Verwendung von UTF-8</a>
-<li><a href="#_00c3_0084nderungen-an-Konfigurationsdateien">4.2 Änderungen an Konfigurationsdateien</a>
-<li><a href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">4.3 Erweiterung für servergespeicherte Prozeduren</a>
-<li><a href="#Datenbankbenutzer-anlegen">4.4 Datenbankbenutzer anlegen</a>
-</li></ul>
-<li><a name="toc_Apache_002dKonfiguration" href="#Apache_002dKonfiguration">5 Apache-Konfiguration</a>
-<li><a name="toc_Der-Task_002dServer" href="#Der-Task_002dServer">6 Der Task-Server</a>
-<ul>
-<li><a href="#Konfiguration-des-Task_002dServers">6.1 Verfügbare und notwendige Konfigurationsoptionen</a>
-<li><a href="#Einbinden-in-den-Boot_002dProzess">6.2 Automatisches Starten des Task-Servers beim Booten</a>
-<ul>
-<li><a href="#Einbinden-in-den-Boot_002dProzess">6.2.1 SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora Core)</a>
-<li><a href="#Einbinden-in-den-Boot_002dProzess">6.2.2 Upstart-basierende Systeme (z.B. Ubuntu)</a>
-</li></ul>
-<li><a href="#Prozesskontrolle">6.3 Wie der Task-Server gestartet und beendet wird</a>
-</li></ul>
-<li><a name="toc_Benutzerauthentifizierung-und-Administratorpasswort" href="#Benutzerauthentifizierung-und-Administratorpasswort">7 Benutzerauthentifizierung und Administratorpasswort</a>
-<ul>
-<li><a href="#Grundlagen-zur-Benutzerauthentifizierung">7.1 Grundlagen zur Benutzerauthentifizierung</a>
-<li><a href="#Administratorpasswort">7.2 Administratorpasswort</a>
-<li><a href="#Authentifizierungsdatenbank">7.3 Authentifizierungsdatenbank</a>
-<li><a href="#Passwort_00c3_00bcberpr_00c3_00bcfung">7.4 Passwortüberprüfung</a>
-<li><a href="#Name-des-Session_002dCookies">7.5 Name des Session-Cookies</a>
-<li><a href="#Anlegen-der-Authentifizierungsdatenbank">7.6 Anlegen der Authentifizierungsdatenbank</a>
-</li></ul>
-<li><a name="toc_Benutzer_002d-und-Gruppenverwaltung" href="#Benutzer_002d-und-Gruppenverwaltung">8 Benutzer- und Gruppenverwaltung</a>
-<ul>
-<li><a href="#Zusammenh_00c3_00a4nge">8.1 Zusammenhänge</a>
-<li><a href="#Datenbanken-anlegen">8.2 Datenbanken anlegen</a>
-<li><a href="#Gruppen-anlegen">8.3 Gruppen anlegen</a>
-<li><a href="#Benutzer-anlegen">8.4 Benutzer anlegen</a>
-<li><a href="#Gruppenmitgliedschaften-verwalten">8.5 Gruppenmitgliedschaften verwalten</a>
-<li><a href="#Migration-alter-Installationen">8.6 Migration alter Installationen</a>
-</li></ul>
-<li><a name="toc_Drucken-mit-Lx_002dOffice" href="#Drucken-mit-Lx_002dOffice">9 Drucken mit Lx-Office</a>
-<li><a name="toc_OpenDocument_002dVorlagen" href="#OpenDocument_002dVorlagen">10 OpenDocument-Vorlagen</a>
-<li><a name="toc_Lx_002dOffice-ERP-verwenden" href="#Lx_002dOffice-ERP-verwenden">11 Lx-Office ERP verwenden</a>
-</li></ul>
-</div>
-
-
-
-<div class="node">
-<p><hr>
-<a name="Top"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Aktuelle-Hinweise">Aktuelle Hinweise</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#dir">(dir)</a>
-
-</div>
-
-<h2 class="unnumbered">Inhalt der Anleitung</h2>
-
-<ul class="menu">
-<li><a accesskey="1" href="#Aktuelle-Hinweise">Aktuelle Hinweise</a>:  Andere Informationsquellen als diese Anleitung
-<li><a accesskey="2" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>:  Vorraussetzungen zum Betrieb von Lx-Office
-<li><a accesskey="3" href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>:  Installationsort, Berechtigungen
-<li><a accesskey="4" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>:  Verschiedene Aspekte der Datenbankkonfiguration
-<li><a accesskey="5" href="#Apache_002dKonfiguration">Apache-Konfiguration</a>:  Einrichtung eines Aliases und Optionen für das Ausführen von CGI-Scripten
-<li><a accesskey="6" href="#Der-Task_002dServer">Der Task-Server</a>:  Konfiguration und Einrichtung des Task-Server-Dämonen
-<li><a accesskey="7" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>:  Einrichtung der Authentifizierungsdatenbank und der Passwortüberprüfung
-<li><a accesskey="8" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>:  Einrichten von Benutzern, Gruppen und Datenbanken
-<li><a accesskey="9" href="#Drucken-mit-Lx_002dOffice">Drucken mit Lx-Office</a>:  Voraussetzungen, Einrichtung und Fehlerdiagnose
-<li><a href="#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>:  Wichtige Hinweise zum Erstellen und zur Verwendung von Dokumentenvorlagen
-<li><a href="#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>:  Die URLs zur Anmeldung und Administration
-</ul>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Aktuelle-Hinweise"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Top">Top</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">1 Aktuelle Hinweise</h2>
-
-<p>Aktuelle Installations- und Konfigurationshinweise gibt es:
-
-     <ul>
-<li>auf der Lx-Office Homepage unter <a href="http://lx-office.org/index.php?id=dokumentation">http://lx-office.org/index.php?id=dokumentation</a>
-
-     <li>im Lx-Office-Wiki unter Dokumentation (<a href="http://wiki.lx-office.org/index.php/Lx-Office_ERP">http://wiki.lx-office.org/index.php/Lx-Office_ERP</a>)
-
-     <li>im Lx-Office-Forum: <a href="http://www.lx-office.org/forum/">http://www.lx-office.org/forum/</a>
-</ul>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Ben%c3%b6tigte-Software-und-Pakete"></a>
-<a name="Ben_00c3_00b6tigte-Software-und-Pakete"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Aktuelle-Hinweise">Aktuelle Hinweise</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">2 Benötigte Software und Pakete</h2>
-
-<ul class="menu">
-<li><a accesskey="1" href="#Betriebssystem">Betriebssystem</a>:  Unterstützte Betriebsysteme und Hinweise für ältere Systeme
-<li><a accesskey="2" href="#Pakete">Pakete</a>:  Benötigte Software und Perlpakete sowie deren Quellen
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Betriebssystem"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Pakete">Pakete</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>
-
-</div>
-
-<h3 class="section">2.1 Betriebssystem</h3>
-
-<p>Lx-Office ist für Linux konzipiert, und sollte auf jedem unixoiden
-Betriebssystem zum Laufen zu kriegen sein. Getestet ist diese Version im
-speziellen auf Debian und Ubuntu, grundsätzlich wurde bei der Auswahl der
-Pakete aber darauf Rücksicht genommen, dass es ohne große Probleme auf den
-derzeit aktuellen verbreiteten Distributionen läuft.
-
-   <p>Anfang 2011 sind das folgende Systeme:
-
-     <ul>
-<li>Ubuntu 8.04 LTS Hardy Heron
-<li>Ubuntu 9.10 Karmic Koala
-<li>Ubuntu 10.04 Lucid Lynx
-<li>Ubuntu 10.10 Maverick Meerkat
-<li>Debian 5.0 Lenny
-<li>Debian 6.0 Squeeze
-<li>openSUSE 11.2
-<li>openSUSE 11.3
-<li>SuSE Linux Enterprice Server 11
-<li>Fedora 13
-<li>Fedora 14
-</ul>
-
-   <p>Für die debianoiden Betriebssysteme existiert ein .deb, das deutlich einfacher
-zu installieren ist.
-
-   <p>Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die Module im Archiv
-recht alt sind, und das viele der benötigten Module nicht einfach zu
-installieren sind. Dafür sollte es kurz nach dem Release ein eigenes .deb
-geben.
-
-   <p>Alternativ dazu kann die normale Installation durchgeführt werden
-(siehe <a href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>), wenn vorher ein
-Kompatibilitätspaket installiert wird, das die fehlenden Pakete bereitstellt. 
-Das Paket ist auf <a href="https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/">Sourceforge</a> unter dem Namen <code>lx-erp-perl-libs-compat-v2.tar.gz</code> hinterlegt.
-
-   <p>Zur Installation das Paket in das entpackte Lx-Office Verzeichnis entpacken:
-
-   <p><code>tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/</code>
-
-   <p>Zusätzlich müssen dann noch die folgenden Pakete installiert weerden
-
-   <p><code>libbit-vector-perl libsub-exporter-perl libclone-perl libclass-factory-util-perl</code>
-
-   <p>Danach sollte der Installationscheck (siehe <a href="#Pakete">Pakete</a>) die enthaltenen Pakete erkennen.
-
-<div class="node">
-<p><hr>
-<a name="Pakete"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Betriebssystem">Betriebssystem</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>
-
-</div>
-
-<h3 class="section">2.2 Pakete</h3>
-
-<p>Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache)
-und ein Datenbankserver (PostgreSQL, mindestens v8.2) benötigt.
-
-   <p>Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht Bestandteil
-einer Standard-Perl-Installation sind:
-
-     <ul>
-<li>parent
-<li>Archive::Zip
-<li>Config::Std
-<li>DateTime
-<li>DBI
-<li>DBD::Pg
-<li>Email::Address
-<li>JSON
-<li>List::MoreUtils
-<li>Params::Validate
-<li>PDF::API2
-<li>Rose::Object
-<li>Rose::DB
-<li>Rose::DB::Object
-<li>Template
-<li>Text::CSV_XS
-<li>Text::Iconv
-<li>URI
-<li>XML::Writer
-<li>YAML
-</ul>
-
-   <p>Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete hinzugekommen, <code>URI</code>
-und <code>XML::Writer</code> sind notwendig. Ohne startet Lx-Office nicht.
-
-   <p>Gegenüber Version 2.6.1 sind <code>parent</code>, <code>DateTime</code>,
-<code>Rose::Object</code>, <code>Rose::DB</code> und <code>Rose::DB::Object</code> neu
-hinzugekommen. <code>IO::Wrap</code> wurde entfernt.
-
-   <p>Gegenüber Version 2.6.3 ist <code>JSON</code> neu hinzugekommen.
-
-   <p><code>Email::Address</code> und <code>List::MoreUtils</code> sind schon länger feste
-Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert.  Beide sind auch
-in 2.6.1 weiterhin mit ausgeliefert, wurden in einer zukünftigen Version aber
-aus dem Paket entfernt werden. Es wird empfohlen diese Module zusammen mit den
-anderen als Bibliotheken zu installieren.
-
-   <p>Die zu installierenden Pakete können in den verschiedenen Distributionen unterschiedlich heißen.
-
-   <p>Für Debian oder Ubuntu benötigen Sie diese Pakete:
-
-   <p><code>apache2 postgresql libparent-perl libarchive-zip-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl liblist-moreutils-perl libpdf-api2-perl librose-object-perl librose-db-perl librose-db-object-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl libconfig-std-perl libparams-validate-perl libjson-perl</code>
-
-   <p>Für Fedora Core benötigen Sie diese Pakete:
-
-   <p><code>httpd postgresql-server perl-parent perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
-
-   <p>Für OpenSuSE benötigen Sie diese Pakete:
-
-   <p><code>apache2 postgresql-server perl-Archive-Zip perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
-
-   <p>Bei openSuSE 11 ist <code>parent</code> bereits enthalten, und braucht nicht nachinstalliert werden. Die <code>Rose::*</code> Pakete sind derzeit nicht für SuSE gepackt, und müssen anderweitig nachinstalliert werden.
-
-   <p>Lx-Office enthält ein Script, mit dem überprüft werden kann, ob alle
-benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
-
-   <p><code>./scripts/installation_check.pl</code>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Manuelle-Installation-des-Programmpaketes"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">3 Manuelle Installation des Programmpaketes</h2>
-
-<p>Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird im
-Dokumentenverzeichnis des Webservers (z.B. <code>/var/www/html/</code>,
-<code>/srv/www/htdocs</code> oder <code>/var/www/</code>) entpackt:
-
-   <p><code>cd /var/www
-<br>
-tar xvzf lxoffice-erp-2.6.2.tgz</code>
-
-   <p>Verändern Sie evtl. noch den Namen des Verzeichnisses mit
-
-   <p><code>mv lxoffice-erp/ lx-erp/</code>
-
-   <p>Alternativ können Sie auch einen Alias in der Webserverkonfiguration
-benutzen, um auf das tatsächliche Installationsverzeichnis zu
-verweisen.
-
-   <p>Die Verzeichnisse <code>users</code>, <code>spool</code> und <code>webdav</code> müssen
-für den Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
-restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
-Benutzername ist bei verschiedenen Distributionen unterschiedlich
-(z.B. bei Debian/Ubuntu <code>www-data</code>, bei Fedora core <code>apache</code>
-oder bei OpenSuSE <code>wwwrun</code>).
-
-   <p>Der folgende Befehl ändert den Besitzer für die oben genannten
-Verzeichnisse auf einem Debian/Ubuntu-System:
-
-   <p><code>chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav</code>
-
-   <p>Weiterhin muss der Webserver-Benutzer im Verzeichnis <code>templates</code> Verzeichnisse für
-jeden neuen Benutzer, der in lx-office angelegt wird, anlegen dürfen:
-
-   <p><code>chgrp www-data lx-office-erp/templates; chmod g+w lx-office-erp/templates</code>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Anpassung-der-PostgreSQL-Konfiguration"></a>
-<a name="Anpassung-der-PostgreSQL_002dKonfiguration"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">4 Anpassung der PostgreSQL-Konfiguration</h2>
-
-<p>PostgreSQL muss auf verschiedene Weisen angepasst werden.
-
-<ul class="menu">
-<li><a accesskey="1" href="#Zeichens_00c3_00a4tze_002fdie-Verwendung-von-UTF_002d8">Zeichensätze/die Verwendung von UTF-8</a>:  Was bei der Verwendung von UTF-8 zu beachten ist
-<li><a accesskey="2" href="#g_t_00c3_0084nderungen-an-Konfigurationsdateien">Änderungen an Konfigurationsdateien</a>:  Anpassungen für Anmeldung am Server und Featureunterstützung
-<li><a accesskey="3" href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">Erweiterung für servergespeicherte Prozeduren</a>:  Lx-Office benutzt servergespeicherte Prozeduren
-<li><a accesskey="4" href="#Datenbankbenutzer-anlegen">Datenbankbenutzer anlegen</a>:  Um den Zugriff besser zu reglementieren
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Zeichens%c3%a4tze%2fdie-Verwendung-von-UTF-8"></a>
-<a name="Zeichens_00c3_00a4tze_002fdie-Verwendung-von-UTF_002d8"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#g_t_00c3_0084nderungen-an-Konfigurationsdateien">Änderungen an Konfigurationsdateien</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>
-
-</div>
-
-<h3 class="section">4.1 Zeichensätze/die Verwendung von UTF-8</h3>
-
-<p>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
-werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
-Version 8.0 oder neuer benutzt werden, und der
-PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
-angelegt worden sein.
-
-   <p>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
-&ldquo;template1&rdquo; &ldquo;UTF8&rdquo;, so kann auch Lx-Office mit UTF-8 betrieben
-werden. Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
-UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
-Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:
-
-   <p><code>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername</code>
-
-   <p>Die Datenbankversionsnummer muss an die tatsächlich verwendete
-Versionsnummer angepasst werden.
-
-   <p>Unter anderen Distributionen gibt es ähnliche Methoden.
-
-   <p>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und ist
-ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
-Lx-Office mit ISO-8859-15 als Encoding betrieben werden.
-
-   <p>Das Encoding einer Datenbank kann in <code>psql</code> mit <code>\l</code> geprüft werden.
-
-<div class="node">
-<p><hr>
-<a name="%c3%84nderungen-an-Konfigurationsdateien"></a>
-<a name="g_t_00c3_0084nderungen-an-Konfigurationsdateien"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">Erweiterung für servergespeicherte Prozeduren</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Zeichens_00c3_00a4tze_002fdie-Verwendung-von-UTF_002d8">Zeichensätze/die Verwendung von UTF-8</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>
-
-</div>
-
-<h3 class="section">4.2 Änderungen an Konfigurationsdateien</h3>
-
-<p>In der Datei <code>postgresql.conf</code>, die je nach Distribution in
-verschiedenen Verzeichnissen liegen kann
-(z.B. <code>/var/lib/pgsql/data/</code> oder <code>/etc/postgresql/</code>, muss
-sichergestellt werden, dass TCP/IP-Verbindungen aktiviert sind. Das
-Verhalten wird über den Parameter <code>listen_address</code>
-gesteuert. Laufen PostgreSQL und Lx-Office auf demselben Rechner, so
-kann dort der Wert <code>localhost</code> verwendet werden. Andernfalls
-müssen Datenbankverbindungen auch von anderen Rechnern aus zugelassen
-werden, was mit dem Wert \<code>*</code> geschieht.
-
-   <p>In der Datei <code>pg_hba.conf</code>, die im gleichen Verzeichnis wie die
-<code>postgresql.conf</code> zu finden sein sollte, müssen die
-Berichtigungen für den Zugriff geändert werden. Hier gibt es mehrere
-Möglichkeiten. Eine besteht darin, lokale Verbindungen immer
-zuzulassen
-
-   <p><code>local all all trust
-<br>
-host all all 127.0.0.1 255.0.0.0 trust</code>
-
-   <p>Besser ist es, für eine bestimmte Datenbank Zugriff nur per Passwort
-zuzulassen. Beispielsweise:
-
-   <p><code>local   all         lxoffice                                           password
-<br>
-host    all         lxoffice      127.0.0.1         255.255.255.255    password</code>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Erweiterung-f%c3%bcr-servergespeicherte-Prozeduren"></a>
-<a name="Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Datenbankbenutzer-anlegen">Datenbankbenutzer anlegen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#g_t_00c3_0084nderungen-an-Konfigurationsdateien">Änderungen an Konfigurationsdateien</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>
-
-</div>
-
-<h3 class="section">4.3 Erweiterung für servergespeicherte Prozeduren</h3>
-
-<p>In der Datenbank <code>template1</code> muss die Unterstützung für servergespeicherte
-Prozeduren eingerichet werden. Melden Sie sich dafür als Benutzer &ldquo;postgres&rdquo;
-an der Datenbank an, und führen Sie die folgenden Kommandos aus:
-
-   <p><code>create language 'plpgsql';</code>
-
-   <p>Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler für die
-Sprache manuell anlelegt werden, diese Versionen werden aber nicht mehr
-offiziell von Lx-Office unterstützt. Dafür dann die folgenden Kommandos:
-
-   <p><code>create function plpgsql_call_handler () returns opaque as '/usr/lib/pgsql/plpgsql.so' language 'c';
-<br>
-create language 'plpgsql' handler plpgsql_call_handler lancompiler 'pl/pgsql';</code>
-
-   <p>Bitte beachten Sie, dass der Pfad zur Datei <code>plpgsql.so</code> von Distribution
-zu Distribution verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich
-unter <code>/usr/lib/postgresql/lib/plpgsql.so</code>.
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Datenbankbenutzer-anlegen"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">Erweiterung für servergespeicherte Prozeduren</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>
-
-</div>
-
-<h3 class="section">4.4 Datenbankbenutzer anlegen</h3>
-
-<p>Wenn Sie nicht den Datenbanksuperuser &ldquo;postgres&rdquo; zum Zugriff
-benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
-anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen können:
-
-   <p><code>su - postgres
-<br>
-createuser -d -P lxoffice</code>
-
-   <p>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern Sie
-den evtl. voreingestellten Benutzer &ldquo;postgres&rdquo; auf &ldquo;lxoffice&rdquo;
-bzw. den hier gewählten Benutzernamen.
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Apache-Konfiguration"></a>
-<a name="Apache_002dKonfiguration"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Der-Task_002dServer">Der Task-Server</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">5 Apache-Konfiguration</h2>
-
-<p>Hinweis: Für einen deutlichen Performanceschub sorgt die Ausführung
-mittels FCGI. Die Einrichtung wird ausführlich in der Datei
-<code>INSTALL.fcgi</code> beschrieben.
-
-   <p>Der Zugriff auf das Programmverzeichnis muss in der Apache
-Webserverkonfigurationsdatei <code>httpd.conf</code> eingestellt
-werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
-anderen Datei hinzu, die beim Starten des Webservers eingelesen wird:
-
-   <p><code><br>
-AddHandler cgi-script .pl
-<br>
-Alias /lx-erp/ /var/www/lx-erp/
-<br>
-&lt;Directory /var/www/lx-erp&gt;
-<br>
-  Options ExecCGI Includes FollowSymlinks
-<br>
-&lt;/Directory&gt;
-<br>
-<br>
-&lt;Directory /var/www/lx-erp/users&gt;
-<br>
-  Order Deny,Allow
-<br>
-  Deny from All
-<br>
-&lt;/Directory&gt;
-<br>
-</code>
-
-   <p>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher das
-Lx-Office-Archiv entpacket haben.
-
-   <p>Achtung: Vor den einzelnen Optionen muss bei einigen Distributionen ein
-Plus &lsquo;<samp><span class="samp">+</span></samp>&rsquo; gesetzt werden.
-
-   <p>Auf einigen Webservern werden manchmal die Grafiken und Style-Sheets
-nicht ausgeliefert. In solchen Fällen hat es oft geholfen, die
-folgende Option in die Konfiguration aufzunehmen:
-
-   <p><code>EnableSendfile Off</code>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Der-Task-Server"></a>
-<a name="Der-Task_002dServer"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">6 Der Task-Server</h2>
-
-<p>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
-regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese
-zu festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser
-Prozess wird bisher nur für die Erzeugung der wiederkehrenden
-Rechnungen benutzt, wird aber in Zukunft deutlich mehr Aufgaben
-übertragen bekommen.
-
-<ul class="menu">
-<li><a accesskey="1" href="#Konfiguration-des-Task_002dServers">Konfiguration des Task-Servers</a>:  Verfügbare und notwendige Konfigurationsoptionen
-<li><a accesskey="2" href="#Prozesskontrolle">Prozesskontrolle</a>:  Wie der Task-Server gestartet und beendet wird
-<li><a accesskey="3" href="#Einbinden-in-den-Boot_002dProzess">Einbinden in den Boot-Prozess</a>:  Automatisches Starten des Task-Servers beim Booten
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Konfiguration-des-Task-Servers"></a>
-<a name="Konfiguration-des-Task_002dServers"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Prozesskontrolle">Prozesskontrolle</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Der-Task_002dServer">Der Task-Server</a>
-
-</div>
-
-<h3 class="section">6.1 Verfügbare und notwendige Konfigurationsoptionen</h3>
-
-<p>Die Konfiguration erfolgt über den Abschnitt <code>[task_server]</code> in
-der Datei <samp><span class="file">config/lx_office.conf</span></samp>. Die dort verfügbaren Optionen
-sind:
-
-     <ul>
-<li><code>login</code>: gültiger Lx-Office-Benutzername, der benutzt wird, um die zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss in der Administration angelegt werden. Diese Option muss angegeben werden. 
-<li><code>run_as</code>: Wird der Server vom Systembenutzer <code>root</code> gestartet, so wechselt er auf den mit <code>run_as</code> angegebenen Systembenutzer. Der Systembenutzer muss dieselben Lese- und Schreibrechte haben, wie auch der Webserverbenutzer (siehe siehe <a href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>). Daher ist es sinnvoll, hier denselben Systembenutzer einzutragen, unter dem auch der Webserver läuft. 
-<li><code>debug</code>: Schaltet Debug-Informationen an und aus. 
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Einbinden-in-den-Boot-Prozess"></a>
-<a name="Einbinden-in-den-Boot_002dProzess"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Prozesskontrolle">Prozesskontrolle</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Der-Task_002dServer">Der Task-Server</a>
-
-</div>
-
-<h3 class="section">6.2 Automatisches Starten des Task-Servers beim Booten</h3>
-
-<p>Der Task-Server verhält sich von seinen Optionen her wie ein reguläres
-SystemV-kompatibles Boot-Script. Außerdem wechselt er beim Starten
-automatisch in das Lx-Office-Installationsverzeichnis.
-
-   <p>Deshalb ist es möglich, ihn durch Setzen eines symbolischen Links aus
-einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
-einzubinden. Da das bei neueren Linux-Distributionen aber nicht
-zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
-anstelle eines symbolischen Links verwendet werden können.
-
-<h4 class="subsection">6.2.1 SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora Core)</h4>
-
-<p>Kopieren Sie die Datei
-<samp><span class="file">scripts/boot/system-v/lx-office-task-server</span></samp> nach
-<samp><span class="file">/etc/init.d/lx-office-task-server</span></samp>. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile <code>DAEMON=....</code>). Binden
-Sie das Script in den Boot-Prozess ein. Dies ist distributionsabhängig:
-
-     <ul>
-<li>Debian-basierende Systeme:
-<br>
-<code>update-rc.d lx-office-task-server defaults
-<br>
-# Nur bei Debian Squeeze und neuer:
-<br>
-insserv lx-office-task-server</code>
-<li>OpenSuSE und Fedora Core:
-<br>
-<code>chkconfig --add lx-office-task-server</code>
-</ul>
-
-   <p>Danach kann der Task-Server mit dem folgenden Befehl gestartet werden:
-<code>/etc/init.d/lx-office-task-server start</code>
-
-<h4 class="subsection">6.2.2 Upstart-basierende Systeme (z.B. Ubuntu)</h4>
-
-<p>Kopieren Sie die Datei
-<samp><span class="file">scripts/boot/upstart/lx-office-task-server.conf</span></samp> nach
-<samp><span class="file">/etc/init/lx-office-task-server.conf</span></samp>. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile <code>exec ....</code>).
-
-   <p>Danach kann der Task-Server mit dem folgenden Befehl gestartet werden:
-<code>service lx-office-task-server start</code>
-
-<div class="node">
-<p><hr>
-<a name="Prozesskontrolle"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Einbinden-in-den-Boot_002dProzess">Einbinden in den Boot-Prozess</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Konfiguration-des-Task_002dServers">Konfiguration des Task-Servers</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Der-Task_002dServer">Der Task-Server</a>
-
-</div>
-
-<h3 class="section">6.3 Wie der Task-Server gestartet und beendet wird</h3>
-
-<p>Der Task-Server wird wie folgt kontrolliert:
-
-   <p><code>./scripts/task_server.pl Befehl</code>
-
-   <p><code>Befehl</code> ist dabei eine der folgenden Optionen:
-
-     <ul>
-<li><code>start</code> startet eine neue Instanz des Task-Servers. Die Prozess-ID wird innerhalb des <samp><span class="file">users</span></samp>-Verzeichnisses abgelegt. 
-<li><code>stop</code> beendet einen laufenden Task-Server. 
-<li><code>restart</code> beendet und startet ihn neu. 
-<li><code>status</code> berichtet, ob der Task-Server läuft. 
-</ul>
-
-   <p>Der Task-Server wechselt beim Starten automatisch in das Lx-Office-Installationsverzeichnis.
-
-   <p>Dieselben Optionen können auch für die SystemV-basierenden
-Runlevel-Scripte benutzt werden (siehe oben).
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Benutzerauthentifizierung-und-Administratorpasswort"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Der-Task_002dServer">Der Task-Server</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">7 Benutzerauthentifizierung und Administratorpasswort</h2>
-
-<p>Informationen über die Einrichtung der Benutzerauthentifizierung, über
-die Verwaltung von Gruppen und weitere Einstellungen
-
-<ul class="menu">
-<li><a accesskey="1" href="#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>:  Verfügbare Methoden, Name der Konfigurationsdatei
-<li><a accesskey="2" href="#Administratorpasswort">Administratorpasswort</a>:  Wo das Administratorpasswort gesetzt werden kann
-<li><a accesskey="3" href="#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>:  Verbindungseinstellungen zur Authentifizierungsdatenbank
-<li><a accesskey="4" href="#Passwort_00c3_00bcberpr_00c3_00bcfung">Passwortüberprüfung</a>:  Einstellungen zur Überprüfung der Benutzerpasswörter
-<li><a accesskey="5" href="#Name-des-Session_002dCookies">Name des Session-Cookies</a>:  Ändern des Cookie-Namens bei Verwendung mehrerer Lx-Office-Installationen auf einem Server
-<li><a accesskey="6" href="#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>:  Wie die Authentifizierungsdatenbank angelegt wird
-</ul>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Grundlagen-zur-Benutzerauthentifizierung"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Administratorpasswort">Administratorpasswort</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.1 Grundlagen zur Benutzerauthentifizierung</h3>
-
-<p>Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
-im folgenden &ldquo;Authentifizierungsdatenbank&rdquo; genannt wird. Für jeden
-Benutzer kann dort eine eigene Datenbank für die eigentlichen
-Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
-aber nicht unterschiedlich sein.
-
-   <p>Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
-in der sowohl die Benutzerinformationen als auch die Daten abgelegt
-werden.
-
-   <p>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
-entweder gegen die Authentifizierungsdatenbank oder gegen einen
-LDAP-Server überprüft werden.
-
-   <p>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie Lx-Office
-die Authentifizierungsdatenbank erreichen kann, wird in der
-Konfigurationsdatei <samp><span class="file">config/lx_office.conf</span></samp> festgelegt. Diese
-muss bei der Installation und bei einem Upgrade von einer Version vor
-v2.6.0 angelegt werden. Eine Beispielkonfigurationsdatei
-<samp><span class="file">config/lx_office.conf.default</span></samp> existiert, die als Vorlage
-benutzt werden kann.
-
-<div class="node">
-<p><hr>
-<a name="Administratorpasswort"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.2 Administratorpasswort</h3>
-
-<p>Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt wird,
-wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort und nicht
-mehr im Administrationsinterface selber geändert werden. Der Parameter dazu
-heißt <code>$self-&gt;{admin_password}</code>.
-
-<div class="node">
-<p><hr>
-<a name="Authentifizierungsdatenbank"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Passwort_00c3_00bcberpr_00c3_00bcfung">Passwortüberprüfung</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Administratorpasswort">Administratorpasswort</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.3 Authentifizierungsdatenbank</h3>
-
-<p>Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
-in <code>$self-&gt;{DB_config}</code> konfiguriert. Hier sind die folgenden
-Parameter anzugeben:
-
-     <ul>
-<li>&lsquo;<samp><span class="samp">host</span></samp>&rsquo; &ndash; Der Rechnername oder die IP-Adresse des Datenbankservers
-<li>&lsquo;<samp><span class="samp">port</span></samp>&rsquo; &ndash; Die Portnummer des Datenbankservers, meist 5432
-<li>&lsquo;<samp><span class="samp">db</span></samp>&rsquo; &ndash; Der Name der Authentifizierungsdatenbank
-<li>&lsquo;<samp><span class="samp">user</span></samp>&rsquo; &ndash; Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. &ldquo;postgres&rdquo;)
-<li>&lsquo;<samp><span class="samp">password</span></samp>&rsquo; &ndash; Das Passwort für den Datenbankbenutzer
-</ul>
-
-   <p>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
-automatisch anlegen (mehr dazu siehe unten).
-
-<div class="node">
-<p><hr>
-<a name="Passwort%c3%bcberpr%c3%bcfung"></a>
-<a name="Passwort_00c3_00bcberpr_00c3_00bcfung"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.4 Passwortüberprüfung</h3>
-
-<p>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
-Authentifizierungsdatenbank und gegen einen externen LDAP- oder
-Active-Directory-Server. Welche davon benutzt wird, regelt der
-Parameter <code>$self-&gt;{module}</code>.
-
-   <p>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
-gespeichert werden, so muss der Parameter <code>$self-&gt;{module}</code> den
-Wert &lsquo;<samp><span class="samp">DB</span></samp>&rsquo; enthalten. In diesem Fall können sowohl der
-Administrator als auch die Benutzer selber ihre Psaswörter in
-Lx-Office ändern.
-
-   <p>Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
-werden, so muss der Parameter <code>$self-&gt;{module}</code> auf &lsquo;<samp><span class="samp">LDAP</span></samp>&rsquo;
-gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
-den LDAP-Server in <code>$self-&gt;{LDAP_config}</code> angegeben werden:
-
-     <ul>
-<li>&lsquo;<samp><span class="samp">host</span></samp>&rsquo; &ndash; Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend erforderlich. 
-<li>&lsquo;<samp><span class="samp">port</span></samp>&rsquo; &ndash; Die Portnummer des LDAP-Servers; meist 389. 
-<li>&lsquo;<samp><span class="samp">tls</span></samp>&rsquo; &ndash; Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf &lsquo;<samp><span class="samp">1</span></samp>&rsquo; setzen, andernfalls auf &lsquo;<samp><span class="samp">0</span></samp>&rsquo; belassen
-<li>&lsquo;<samp><span class="samp">attribute</span></samp>&rsquo; &ndash; Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server
-  ist dies meist &lsquo;<samp><span class="samp">sAMAccountName</span></samp>&rsquo;, für andere LDAP-Server hingegen &lsquo;<samp><span class="samp">uid</span></samp>&rsquo;. Diese Angabe ist zwingend erforderlich. 
-<li>&lsquo;<samp><span class="samp">base_dn</span></samp>&rsquo; &ndash; Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich. 
-<li>&lsquo;<samp><span class="samp">filter</span></samp>&rsquo; &ndash; Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort <code>&lt;%login%&gt;</code>, so wird dieses durch den vom Benutzer
-  eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum nach einem Element durchsucht, bei dem das oben angegebene Attribut
-  mit dem Benutzernamen identisch ist. 
-<li>&lsquo;<samp><span class="samp">bind_dn</span></samp>&rsquo; und &lsquo;<samp><span class="samp">bind_password</span></samp>&rsquo; &ndash; Wenn der LDAP-Server eine Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist dies bei
-  Active-Directory-Servern der Fall), so kann diese hier angegeben werden. Für Active-Directory-Server kann als &lsquo;<samp><span class="samp">bind_dn</span></samp>&rsquo; entweder eine
-  komplette LDAP-DN wie z.B. &lsquo;<samp><span class="samp">cn=Martin Mustermann,cn=Users,dc=firmendomain</span></samp>&rsquo; auch nur der volle Name des Benutzers
-  eingegeben werden; in diesem Beispiel also &lsquo;<samp><span class="samp">Martin Mustermann</span></samp>&rsquo;. 
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Name-des-Session-Cookies"></a>
-<a name="Name-des-Session_002dCookies"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Passwort_00c3_00bcberpr_00c3_00bcfung">Passwortüberprüfung</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.5 Name des Session-Cookies</h3>
-
-<p>Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
-werden, so müssen die Namen der Session-Cookies für alle
-Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
-Parameter <code>$self-&gt;{cookie_name}</code> gesetzt.
-
-   <p>Diese Angabe ist optional, wenn nur eine Installation auf dem Server
-existiert.
-
-<div class="node">
-<p><hr>
-<a name="Anlegen-der-Authentifizierungsdatenbank"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
-
-</div>
-
-<h3 class="section">7.6 Anlegen der Authentifizierungsdatenbank</h3>
-
-<p>Nachdem alle Einstellungen in <samp><span class="file">config/lx_office.conf</span></samp>
-vorgenommen wurden, muss Lx-Office die Authentifizierungsdatenbank
-anlegen. Dieses geschieht automatisch, wenn Sie sich im
-Administrationsmodul anmelden, das unter der folgenden URL erreichbar
-sein sollte:
-
-   <p><a href="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</a>
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Benutzer--und-Gruppenverwaltung"></a>
-<a name="Benutzer_002d-und-Gruppenverwaltung"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Drucken-mit-Lx_002dOffice">Drucken mit Lx-Office</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">8 Benutzer- und Gruppenverwaltung</h2>
-
-<p>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
-angelegt werden.  Dieses geschieht im Administrationsmenü, das Sie
-unter folgender URL finden:
-
-   <p><a href="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</a>
-
-   <p>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
-<samp><span class="file">config/lx_office.conf</span></samp> eingetragen haben.
-
-<ul class="menu">
-<li><a accesskey="1" href="#Zusammenh_00c3_00a4nge">Zusammenhänge</a>:  Übersicht über Benutzer, Gruppen, Berechtigungen und Datenbanken
-<li><a accesskey="2" href="#Datenbanken-anlegen">Datenbanken anlegen</a>:  Hinweise zum Anlegen von Datenbanken
-<li><a accesskey="3" href="#Gruppen-anlegen">Gruppen anlegen</a>:  Hinweise zum Anlegen von Gruppen
-<li><a accesskey="4" href="#Benutzer-anlegen">Benutzer anlegen</a>:  Hinweise zum Anlegen von Benutzern
-<li><a accesskey="5" href="#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>:  Wie man Gruppen Benutzer zuordnet
-<li><a accesskey="6" href="#Migration-alter-Installationen">Migration alter Installationen</a>:  Automatische Übernahme bei Update von einer älteren Version
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Zusammenh%c3%a4nge"></a>
-<a name="Zusammenh_00c3_00a4nge"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Datenbanken-anlegen">Datenbanken anlegen</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.1 Zusammenhänge</h3>
-
-<p>Lx-Office verwendet eine Datenbank zum Speichern all seiner
-Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
-mit Lx-Office arbeiten zu können, muss eine Person einen
-Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
-Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
-möglich und normal, dass mehreren Benutzern die selbe Datenbank
-zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
-
-   <p>Die Basisdaten der Benutzer, die in der Administration eingegeben
-werden können, werden in einer zweiten Datenbank gespeichert, der
-bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
-Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
-Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
-aber beliebig viele Datenbanken mit Firmendaten.
-
-   <p>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
-Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
-gestattet, so werden der entsprechenden Menüpunkte auch nicht
-angezeigt. Diese Rechte werden ebenfalls in der
-Authentifizierungsdatenbank gespeichert.
-
-   <p>Um Rechte verteilen zu können, verwendet Lx-Office ein
-Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
-erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
-mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
-Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
-Benutzer Mitglied ist.
-
-   <p>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
-angelegt werden sollten, lautet:
-
-     <ol type=1 start=1>
-<li>Datenbank anlegen
-<li>Gruppen anlegen
-<li>Benutzer anlegen
-<li>Benutzer den Gruppen zuordnen
-        </ol>
-
-<div class="node">
-<p><hr>
-<a name="Datenbanken-anlegen"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Gruppen-anlegen">Gruppen anlegen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Zusammenh_00c3_00a4nge">Zusammenhänge</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.2 Datenbanken anlegen</h3>
-
-<p>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
-Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
-ist dies &lsquo;<samp><span class="samp">lxoffice</span></samp>&rsquo;).
-
-   <p>Wenn Sie für die Lx-Office-Installation nicht den europäischen
-Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei
-<samp><span class="file">config/lx_office.conf</span></samp> die Variable <code>dbcharset</code> im
-Abschnitt <code>system</code> auf den Wert &lsquo;<samp><span class="samp">UTF-8</span></samp>&rsquo; setzen. Zusätzlich
-muss beim Anlegen der Datenbank &lsquo;<samp><span class="samp">UTF-8 Unicode</span></samp>&rsquo; als Schriftsatz
-ausgewählt werden.
-
-   <p>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
-verwenden müssen, da diese Einstellungen momentan global in Lx-Office
-vorgenommen wird und nicht nach Datenbank unterschieden werden
-kann. Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
-angelegt worden sein.
-
-<div class="node">
-<p><hr>
-<a name="Gruppen-anlegen"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Benutzer-anlegen">Benutzer anlegen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Datenbanken-anlegen">Datenbanken anlegen</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.3 Gruppen anlegen</h3>
-
-<p>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
-gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
-Anlegen können Sie die verschiedenen Bereiche wählen, auf die
-Mitglieder dieser Gruppe Zugriff haben sollen.
-
-   <p>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
-Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
-Datenbanken, die in dieser Installation verwaltet werden.
-
-<div class="node">
-<p><hr>
-<a name="Benutzer-anlegen"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Gruppen-anlegen">Gruppen anlegen</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.4 Benutzer anlegen</h3>
-
-<p>Beim Anlegen von Benutzern werden für viele Parameter
-Standardeinstellungen vorgenommen, die den Gepflogenheiten des
-deutschen Raumes entsprechen.
-
-   <p>Zwingend anzugeben sind der Loginname sowie die komplette
-Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
-Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
-gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
-aktiv, so ist das Passwort-Feld deaktiviert.
-
-   <p>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
-angelegten Datenbanken eingetragen werden.
-
-<div class="node">
-<p><hr>
-<a name="Gruppenmitgliedschaften-verwalten"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Migration-alter-Installationen">Migration alter Installationen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Benutzer-anlegen">Benutzer anlegen</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.5 Gruppenmitgliedschaften verwalten</h3>
-
-<p>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
-zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
-
-     <ol type=1 start=1>
-<li>In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
-Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen. 
-<li>In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
-Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
-System angelegten Gruppen und Benutzer enthält. Durch Setzen der
-Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in der
-ausgewählten Spalte hinzugefügt.
-        </ol>
-
-<div class="node">
-<p><hr>
-<a name="Migration-alter-Installationen"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
-
-</div>
-
-<h3 class="section">8.6 Migration alter Installationen</h3>
-
-<p>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird, in der
-die Benutzerdaten noch im Dateisystem im Verzeichnis <code>users</code>
-verwaltet wurden, so bietet Lx-Office die Möglichkeit, diese
-Benutzerdaten automatisch in die Authentifizierungsdatenbank zu
-übernehmen. Dies geschieht, wenn man sich nach dem Update der
-Installation das erste Mal im Administrationsbereich anmeldet. Findet
-Lx-Office die Datei <code>users/members</code>, so wird der
-Migrationsprozess gestartet.
-
-   <p>Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
-können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
-die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt
-wird. Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office
-gewährt. Alle migrierten Benutzern werden Mitglied in dieser
-Gruppe. Damit wird das Verhalten von Lx-Office bis Version 2.4.3
-inklusive wiederhergestellt, und die Benutzer können sich sofort
-wieder anmelden und mit dem System arbeiten.
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Drucken-mit-Lx-Office"></a>
-<a name="Drucken-mit-Lx_002dOffice"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">9 Drucken mit Lx-Office</h2>
-
-<p>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen. Um drucken
-zu können, braucht der Server ein geeignetes LaTeX System. Am einfachsten ist
-dazu eine <code>texlive</code> Installation. Unter Debianoiden Betriebssystemen sind
-das die Pakete:
-
-   <p><code>texlive-latex-base texlive-latex-extra texlive-fonts-recommended</code>
-
-   <p>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die von den
-Standardvorlagen verwendet werden.
-
-   <p>TODO: rpm Pakete.
-
-   <p>In den allermeisten Installationen sollte drucken jetzt schon funktionieren. 
-Sollte ein Fehler auftreten wirft TeX sehr lange Fehlerbeschreibungen, der
-eigentliche Fehler ist immer die erste Zeite die mit einem Ausrufezeichen
-anfängt. Häufig auftretende Fehler sind zum Beispiel:
-
-     <ul>
-<li>! LaTeX Error: File `eurosym.sty' not found. 
-Die entsprechende LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem
-bei Vorlagen aus der Community auf. Installieren Sie die entsprechenden Pakete. 
-<li>! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for use with LaTeX. 
-Dieser Fehler tritt auf, wenn sie versuchen mit einer Standardinstallation
-exotische utf8 Zeichen zu drucken. TeXLive unterstützt von Haus nur romanische
-Schriften und muss mit diversen Tricks dazu gebracht werden andere Zeichen zu
-akzeptieren. Adere TeX Systeme wie XeTeX schaffen hier Abhilfe. 
-</ul>
-
-   <p>Wird garkein Fehler angezeigt sondern nur der Name des Templates, heißt das
-normalerweise, dass das LaTeX Binary nicht gefunden wurde. Prüfen Sie den Namen
-in der Konfiguration (Standard: <code>pdflatex</code>), und stellen Sie sicher, dass
-pdflatex (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
-darf.
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="OpenDocument-Vorlagen"></a>
-<a name="OpenDocument_002dVorlagen"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#Drucken-mit-Lx_002dOffice">Drucken mit Lx-Office</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">10 OpenDocument-Vorlagen</h2>
-
-<p>Lx-Office unterstützt die Verwendung von Vorlagen im
-OpenDocument-Format, wie es OpenOffice.org ab Version 2
-erzeugt. Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als
-auch aus diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei
-<samp><span class="file">config/lx_office.conf</span></samp> die Variable <code>opendocument</code> im
-Abschnitt <code>print_templates</code> auf &lsquo;<samp><span class="samp">1</span></samp>&rsquo; stehen.  Dieses ist die
-Standardeinstellung.
-
-   <p>Weiterhin muss in der Datei <samp><span class="file">config/lx_office.conf</span></samp> die Variable
-<code>dbcharset</code> im Abschnitt <code>system</code> auf die Zeichenkodierung
-gesetzt werden, die auch bei der Speicherung der Daten in der
-Datenbank verwendet wird. Diese ist in den meisten Fällen "UTF-8".
-
-   <p>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
-weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
-OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
-neben OpenOffice.org ab Version 2 auch der &ldquo;X virtual frame buffer&rdquo;
-(xvfb) installiert werden.  Bei Debian ist er im Paket &ldquo;xvfb&rdquo;
-enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
-
-   <p>Nach der Installation müssen in der Datei <samp><span class="file">config/lx_config.conf</span></samp>
-zwei weitere Variablen angepasst werden: <code>openofficeorg_writer</code>
-muss den vollständigen Pfad zur OpenOffice.org Writer-Anwendung
-enthalten. <code>xvfb</code> muss den Pfad zum &ldquo;X virtual frame buffer&rdquo;
-enthalten. Beide stehen im Abschnitt <code>applications</code>.
-
-   <p>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
-OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
-die Variable <code>$openofficeorg_daemon</code> gesetzt ist, startet ein
-OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
-bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
-benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
-reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
-werden muss. Der Nachteil ist, dass diese Methode Python und die
-Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2 sind.
-
-   <p>Ist <code>$openofficeorg_daemon</code> nicht gesetzt, so wird für jedes
-Dokument OpenOffice neu gestartet und die Konvertierung mit Hilfe
-eines Makros durchgeführt. Dieses Makro muss in der Dokumentenvorlage
-enthalten sein und &ldquo;Standard.Conversion.ConvertSelfToPDF()&rdquo;
-heißen. Die Beispielvorlage &lsquo;<samp><span class="samp">templates/mastertemplates/German/invoice.odt</span></samp>&rsquo;
-enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
-ebenfalls enthalten sein muss.
-
-   <p>Als letztes muss herausgefunden werden, welchen Namen OpenOffice.org
-Writer dem Verzeichnis mit den Benutzereinstellungen gibt. Unter
-Debian ist dies momentan <code>~/.openoffice.org2</code>. Sollte der Name
-bei Ihrer OpenOffice.org-Installation anders sein, so muss das
-Verzeichnis <code>users/.openoffice.org2</code> entsprechend umbenannt
-werden. Ist der Name z.B. einfach nur <code>.openoffice</code>, so wäre
-folgender Befehl auszuführen:
-
-   <p><code>mv users/.openoffice.org2 users/.openoffice</code>
-
-   <p>Dieses Verzeichnis, wie auch das komplette <code>users</code>-Verzeichnis, muss vom
-Webserver beschreibbar sein. Dieses wurde bereits erledigt
-(siehe <a href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>), kann aber erneut überprüft
-werden, wenn die Konvertierung nach PDF fehlschlägt.
-
-<!--  -->
-<div class="node">
-<p><hr>
-<a name="Lx-Office-ERP-verwenden"></a>
-<a name="Lx_002dOffice-ERP-verwenden"></a>
-voriges:&nbsp;<a rel="previous" accesskey="p" href="#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
-
-</div>
-
-<h2 class="chapter">11 Lx-Office ERP verwenden</h2>
-
-<p>Nach erfolgreicher Installation ist der Loginbildschirm unter
-folgender URL erreichbar:
-
-   <p><a href="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</a>
-
-   <p>Die Administrationsseite erreichen Sie unter:
-
-   <p><a href="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</a>
-
-</body></html>
-
-<!--
-\1f
-Local Variables:
-coding: utf-8
-End:
-
--->
diff --git a/doc/INSTALL.texi b/doc/INSTALL.texi
deleted file mode 100644 (file)
index 785f25c..0000000
+++ /dev/null
@@ -1,926 +0,0 @@
-\input texinfo   @c -*-texinfo-*-
-@c %**start of header
-@setfilename INSTALL.info
-@documentencoding UTF-8
-@afourpaper
-@settitle Lx-Office Installationsanleitung
-@c %**end of header
-
-@c @copying
-@c Die Lx-Office Installationsanleitung kann beliebig weiter verwendet
-@c werden.
-@c @end copying
-
-@titlepage
-@title Lx-Office Installationsanleitung
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top Inhalt der Anleitung
-@end ifnottex
-
-@menu
-* Aktuelle Hinweise:: Andere Informationsquellen als diese Anleitung
-* Benötigte Software und Pakete:: Vorraussetzungen zum Betrieb von Lx-Office
-* Manuelle Installation des Programmpaketes:: Installationsort, Berechtigungen
-* Anpassung der PostgreSQL-Konfiguration:: Verschiedene Aspekte der Datenbankkonfiguration
-* Apache-Konfiguration:: Einrichtung eines Aliases und Optionen für das Ausführen von CGI-Scripten
-* Der Task-Server:: Konfiguration und Einrichtung des Task-Server-Dämonen
-* Benutzerauthentifizierung und Administratorpasswort:: Einrichtung der Authentifizierungsdatenbank und der Passwortüberprüfung
-* Benutzer- und Gruppenverwaltung:: Einrichten von Benutzern, Gruppen und Datenbanken
-* Drucken mit Lx-Office:: Voraussetzungen, Einrichtung und Fehlerdiagnose
-* OpenDocument-Vorlagen:: Wichtige Hinweise zum Erstellen und zur Verwendung von Dokumentenvorlagen
-* Lx-Office ERP verwenden:: Die URLs zur Anmeldung und Administration
-@end menu
-
-@c ---------------------------------------------------------------
-
-@node Aktuelle Hinweise
-@chapter Aktuelle Hinweise
-
-Aktuelle Installations- und Konfigurationshinweise gibt es:
-
-@itemize
-@item
-auf der Lx-Office Homepage unter @uref{http://lx-office.org/index.php?id=dokumentation}
-
-@item
-im Lx-Office-Wiki unter Dokumentation (@uref{http://wiki.lx-office.org/index.php/Lx-Office_ERP})
-
-@item
-im Lx-Office-Forum: @uref{http://www.lx-office.org/forum/}
-@end itemize
-
-@c ---------------------------------------------------------------
-
-@node Benötigte Software und Pakete
-@chapter Benötigte Software und Pakete
-
-@menu
-* Betriebssystem:: Unterstützte Betriebsysteme und Hinweise für ältere Systeme
-* Pakete:: Benötigte Software und Perlpakete sowie deren Quellen
-@end menu
-
-@node Betriebssystem
-@section Betriebssystem
-
-Lx-Office ist für Linux konzipiert, und sollte auf jedem unixoiden
-Betriebssystem zum Laufen zu kriegen sein. Getestet ist diese Version im
-speziellen auf Debian und Ubuntu, grundsätzlich wurde bei der Auswahl der
-Pakete aber darauf Rücksicht genommen, dass es ohne große Probleme auf den
-derzeit aktuellen verbreiteten Distributionen läuft.
-
-Anfang 2011 sind das folgende Systeme:
-
-@itemize
-@item
-Ubuntu 8.04 LTS Hardy Heron
-@item
-Ubuntu 9.10 Karmic Koala
-@item
-Ubuntu 10.04 Lucid Lynx
-@item
-Ubuntu 10.10 Maverick Meerkat
-@item
-Debian 5.0 Lenny
-@item
-Debian 6.0 Squeeze
-@item
-openSUSE 11.2
-@item
-openSUSE 11.3
-@item
-SuSE Linux Enterprice Server 11
-@item
-Fedora 13
-@item
-Fedora 14
-@end itemize
-
-Für die debianoiden Betriebssysteme existiert ein .deb, das deutlich einfacher
-zu installieren ist.
-
-Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die Module im Archiv
-recht alt sind, und das viele der benötigten Module nicht einfach zu
-installieren sind. Dafür sollte es kurz nach dem Release ein eigenes .deb
-geben.
-
-Alternativ dazu kann die normale Installation durchgeführt werden
-(@pxref{Manuelle Installation des Programmpaketes}), wenn vorher ein
-Kompatibilitätspaket installiert wird, das die fehlenden Pakete bereitstellt.
-Das Paket ist auf @uref{https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/, Sourceforge} unter dem Namen @code{lx-erp-perl-libs-compat-v2.tar.gz} hinterlegt.
-
-Zur Installation das Paket in das entpackte Lx-Office Verzeichnis entpacken:
-
-@code{tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/}
-
-Zusätzlich müssen dann noch die folgenden Pakete installiert weerden
-
-@code{libbit-vector-perl libsub-exporter-perl libclone-perl libclass-factory-util-perl}
-
-Danach sollte der Installationscheck (@pxref{Pakete}) die enthaltenen Pakete erkennen.
-
-@node Pakete
-@section Pakete
-
-Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache)
-und ein Datenbankserver (PostgreSQL, mindestens v8.2) benötigt.
-
-Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht Bestandteil
-einer Standard-Perl-Installation sind:
-
-@itemize
-@item
-parent
-@item
-Archive::Zip
-@item
-Config::Std
-@item
-DateTime
-@item
-DBI
-@item
-DBD::Pg
-@item
-Email::Address
-@item
-JSON
-@item
-List::MoreUtils
-@item
-Params::Validate
-@item
-PDF::API2
-@item
-Rose::Object
-@item
-Rose::DB
-@item
-Rose::DB::Object
-@item
-Template
-@item
-Text::CSV_XS
-@item
-Text::Iconv
-@item
-URI
-@item
-XML::Writer
-@item
-YAML
-@end itemize
-
-Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete hinzugekommen, @code{URI}
-und @code{XML::Writer} sind notwendig. Ohne startet Lx-Office nicht.
-
-Gegenüber Version 2.6.1 sind @code{parent}, @code{DateTime},
-@code{Rose::Object}, @code{Rose::DB} und @code{Rose::DB::Object} neu
-hinzugekommen. @code{IO::Wrap} wurde entfernt.
-
-Gegenüber Version 2.6.3 ist @code{JSON} neu hinzugekommen.
-
-@code{Email::Address} und @code{List::MoreUtils} sind schon länger feste
-Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert.  Beide sind auch
-in 2.6.1 weiterhin mit ausgeliefert, wurden in einer zukünftigen Version aber
-aus dem Paket entfernt werden. Es wird empfohlen diese Module zusammen mit den
-anderen als Bibliotheken zu installieren.
-
-Die zu installierenden Pakete können in den verschiedenen Distributionen unterschiedlich heißen.
-
-Für Debian oder Ubuntu benötigen Sie diese Pakete:
-
-@code{apache2 postgresql libparent-perl libarchive-zip-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl liblist-moreutils-perl libpdf-api2-perl librose-object-perl librose-db-perl librose-db-object-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl libconfig-std-perl libparams-validate-perl libjson-perl}
-
-Für Fedora Core benötigen Sie diese Pakete:
-
-@code{httpd postgresql-server perl-parent perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
-
-Für OpenSuSE benötigen Sie diese Pakete:
-
-@code{apache2 postgresql-server perl-Archive-Zip perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
-
-Bei openSuSE 11 ist @code{parent} bereits enthalten, und braucht nicht nachinstalliert werden. Die @code{Rose::*} Pakete sind derzeit nicht für SuSE gepackt, und müssen anderweitig nachinstalliert werden.
-
-Lx-Office enthält ein Script, mit dem überprüft werden kann, ob alle
-benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
-
-@code{./scripts/installation_check.pl}
-
-@c ---------------------------------------------------------------
-
-@node Manuelle Installation des Programmpaketes
-@chapter Manuelle Installation des Programmpaketes
-
-Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird im
-Dokumentenverzeichnis des Webservers (z.B. @code{/var/www/html/},
-@code{/srv/www/htdocs} oder @code{/var/www/}) entpackt:
-
-@code{cd /var/www
-@*
-tar xvzf lxoffice-erp-2.6.2.tgz}
-
-Verändern Sie evtl. noch den Namen des Verzeichnisses mit
-
-@code{mv lxoffice-erp/ lx-erp/}
-
-Alternativ können Sie auch einen Alias in der Webserverkonfiguration
-benutzen, um auf das tatsächliche Installationsverzeichnis zu
-verweisen.
-
-Die Verzeichnisse @code{users}, @code{spool} und @code{webdav} müssen
-für den Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
-restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
-Benutzername ist bei verschiedenen Distributionen unterschiedlich
-(z.B. bei Debian/Ubuntu @code{www-data}, bei Fedora core @code{apache}
-oder bei OpenSuSE @code{wwwrun}).
-
-Der folgende Befehl ändert den Besitzer für die oben genannten
-Verzeichnisse auf einem Debian/Ubuntu-System:
-
-@code{chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav}
-
-Weiterhin muss der Webserver-Benutzer im Verzeichnis @code{templates} Verzeichnisse für
-jeden neuen Benutzer, der in lx-office angelegt wird, anlegen dürfen:
-
-@code{chgrp www-data lx-office-erp/templates; chmod g+w lx-office-erp/templates}
-
-
-@c ---------------------------------------------------------------
-
-@node Anpassung der PostgreSQL-Konfiguration
-@chapter Anpassung der PostgreSQL-Konfiguration
-
-PostgreSQL muss auf verschiedene Weisen angepasst werden.
-
-@menu
-* Zeichensätze/die Verwendung von UTF-8:: Was bei der Verwendung von UTF-8 zu beachten ist
-* Änderungen an Konfigurationsdateien:: Anpassungen für Anmeldung am Server und Featureunterstützung
-* Erweiterung für servergespeicherte Prozeduren:: Lx-Office benutzt servergespeicherte Prozeduren
-* Datenbankbenutzer anlegen:: Um den Zugriff besser zu reglementieren
-@end menu
-
-@node Zeichensätze/die Verwendung von UTF-8
-@section Zeichensätze/die Verwendung von UTF-8
-
-Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
-werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
-Version 8.0 oder neuer benutzt werden, und der
-PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
-angelegt worden sein.
-
-Dieses ist kann überprüft werden: ist das Encoding der Datenbank
-``template1'' ``UTF8'', so kann auch Lx-Office mit UTF-8 betrieben
-werden. Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
-UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
-Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:
-
-@code{pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername}
-
-Die Datenbankversionsnummer muss an die tatsächlich verwendete
-Versionsnummer angepasst werden.
-
-Unter anderen Distributionen gibt es ähnliche Methoden.
-
-Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und ist
-ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
-Lx-Office mit ISO-8859-15 als Encoding betrieben werden.
-
-Das Encoding einer Datenbank kann in @code{psql} mit @code{\l} geprüft werden.
-
-@node Änderungen an Konfigurationsdateien
-@section Änderungen an Konfigurationsdateien
-
-In der Datei @code{postgresql.conf}, die je nach Distribution in
-verschiedenen Verzeichnissen liegen kann
-(z.B. @code{/var/lib/pgsql/data/} oder @code{/etc/postgresql/}, muss
-sichergestellt werden, dass TCP/IP-Verbindungen aktiviert sind. Das
-Verhalten wird über den Parameter @code{listen_address}
-gesteuert. Laufen PostgreSQL und Lx-Office auf demselben Rechner, so
-kann dort der Wert @code{localhost} verwendet werden. Andernfalls
-müssen Datenbankverbindungen auch von anderen Rechnern aus zugelassen
-werden, was mit dem Wert \@code{*} geschieht.
-
-In der Datei @code{pg_hba.conf}, die im gleichen Verzeichnis wie die
-@code{postgresql.conf} zu finden sein sollte, müssen die
-Berichtigungen für den Zugriff geändert werden. Hier gibt es mehrere
-Möglichkeiten. Eine besteht darin, lokale Verbindungen immer
-zuzulassen
-
-@code{local all all trust
-@*
-host all all 127.0.0.1 255.0.0.0 trust}
-
-Besser ist es, für eine bestimmte Datenbank Zugriff nur per Passwort
-zuzulassen. Beispielsweise:
-
-@code{local   all         lxoffice                                           password
-@*
-host    all         lxoffice      127.0.0.1         255.255.255.255    password}
-
-@c ---------------------------------------------------------------
-
-@node Erweiterung für servergespeicherte Prozeduren
-@section Erweiterung für servergespeicherte Prozeduren
-
-In der Datenbank @code{template1} muss die Unterstützung für servergespeicherte
-Prozeduren eingerichet werden. Melden Sie sich dafür als Benutzer ``postgres''
-an der Datenbank an, und führen Sie die folgenden Kommandos aus:
-
-@code{create language 'plpgsql';}
-
-Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler für die
-Sprache manuell anlelegt werden, diese Versionen werden aber nicht mehr
-offiziell von Lx-Office unterstützt. Dafür dann die folgenden Kommandos:
-
-@code{create function plpgsql_call_handler () returns opaque as '/usr/lib/pgsql/plpgsql.so' language 'c';
-@*
-create language 'plpgsql' handler plpgsql_call_handler lancompiler 'pl/pgsql';}
-
-Bitte beachten Sie, dass der Pfad zur Datei @code{plpgsql.so} von Distribution
-zu Distribution verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich
-unter @code{/usr/lib/postgresql/lib/plpgsql.so}.
-
-@c ---------------------------------------------------------------
-
-@node Datenbankbenutzer anlegen
-@section Datenbankbenutzer anlegen
-
-Wenn Sie nicht den Datenbanksuperuser ``postgres'' zum Zugriff
-benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
-anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen können:
-
-@code{su - postgres
-@*
-createuser -d -P lxoffice}
-
-Wenn Sie später einen Datenbankzugriff konfigurieren, verändern Sie
-den evtl. voreingestellten Benutzer ``postgres'' auf ``lxoffice''
-bzw. den hier gewählten Benutzernamen.
-
-@c ---------------------------------------------------------------
-
-@node Apache-Konfiguration
-@chapter Apache-Konfiguration
-
-Hinweis: Für einen deutlichen Performanceschub sorgt die Ausführung
-mittels FCGI. Die Einrichtung wird ausführlich in der Datei
-@code{INSTALL.fcgi} beschrieben.
-
-Der Zugriff auf das Programmverzeichnis muss in der Apache
-Webserverkonfigurationsdatei @code{httpd.conf} eingestellt
-werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
-anderen Datei hinzu, die beim Starten des Webservers eingelesen wird:
-
-@code{@*
-AddHandler cgi-script .pl
-@*
-Alias /lx-erp/ /var/www/lx-erp/
-@*
-<Directory /var/www/lx-erp>
-@*
-  Options ExecCGI Includes FollowSymlinks
-@*
-</Directory>
-@*
-@*
-<Directory /var/www/lx-erp/users>
-@*
-  Order Deny,Allow
-@*
-  Deny from All
-@*
-</Directory>
-@*
-}
-
-Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher das
-Lx-Office-Archiv entpacket haben.
-
-Achtung: Vor den einzelnen Optionen muss bei einigen Distributionen ein
-Plus @samp{+} gesetzt werden.
-
-Auf einigen Webservern werden manchmal die Grafiken und Style-Sheets
-nicht ausgeliefert. In solchen Fällen hat es oft geholfen, die
-folgende Option in die Konfiguration aufzunehmen:
-
-@code{EnableSendfile Off}
-
-@c ---------------------------------------------------------------
-
-@node Der Task-Server
-@chapter Der Task-Server
-
-Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
-regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese
-zu festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser
-Prozess wird bisher nur für die Erzeugung der wiederkehrenden
-Rechnungen benutzt, wird aber in Zukunft deutlich mehr Aufgaben
-übertragen bekommen.
-
-@menu
-* Konfiguration des Task-Servers:: Verfügbare und notwendige Konfigurationsoptionen
-* Prozesskontrolle:: Wie der Task-Server gestartet und beendet wird
-* Einbinden in den Boot-Prozess:: Automatisches Starten des Task-Servers beim Booten
-@end menu
-
-@node Konfiguration des Task-Servers
-@section Verfügbare und notwendige Konfigurationsoptionen
-
-Die Konfiguration erfolgt über den Abschnitt @code{[task_server]} in
-der Datei @file{config/lx_office.conf}. Die dort verfügbaren Optionen
-sind:
-
-@itemize
-@item @code{login}: gültiger Lx-Office-Benutzername, der benutzt wird, um die zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss in der Administration angelegt werden. Diese Option muss angegeben werden.
-@item @code{run_as}: Wird der Server vom Systembenutzer @code{root} gestartet, so wechselt er auf den mit @code{run_as} angegebenen Systembenutzer. Der Systembenutzer muss dieselben Lese- und Schreibrechte haben, wie auch der Webserverbenutzer (siehe @pxref{Manuelle Installation des Programmpaketes}). Daher ist es sinnvoll, hier denselben Systembenutzer einzutragen, unter dem auch der Webserver läuft.
-@item @code{debug}: Schaltet Debug-Informationen an und aus.
-@end itemize
-
-@node Einbinden in den Boot-Prozess
-@section Automatisches Starten des Task-Servers beim Booten
-
-Der Task-Server verhält sich von seinen Optionen her wie ein reguläres
-SystemV-kompatibles Boot-Script. Außerdem wechselt er beim Starten
-automatisch in das Lx-Office-Installationsverzeichnis.
-
-Deshalb ist es möglich, ihn durch Setzen eines symbolischen Links aus
-einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
-einzubinden. Da das bei neueren Linux-Distributionen aber nicht
-zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
-anstelle eines symbolischen Links verwendet werden können.
-
-@subsection SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora Core)
-
-Kopieren Sie die Datei
-@file{scripts/boot/system-v/lx-office-task-server} nach
-@file{/etc/init.d/lx-office-task-server}. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile @code{DAEMON=....}). Binden
-Sie das Script in den Boot-Prozess ein. Dies ist distributionsabhängig:
-
-@itemize
-@item Debian-basierende Systeme:
-@*
-@code{update-rc.d lx-office-task-server defaults
-@*
-# Nur bei Debian Squeeze und neuer:
-@*
-insserv lx-office-task-server}
-@item OpenSuSE und Fedora Core:
-@*
-@code{chkconfig --add lx-office-task-server}
-@end itemize
-
-Danach kann der Task-Server mit dem folgenden Befehl gestartet werden:
-@code{/etc/init.d/lx-office-task-server start}
-
-@subsection Upstart-basierende Systeme (z.B. Ubuntu)
-
-Kopieren Sie die Datei
-@file{scripts/boot/upstart/lx-office-task-server.conf} nach
-@file{/etc/init/lx-office-task-server.conf}. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile @code{exec ....}).
-
-Danach kann der Task-Server mit dem folgenden Befehl gestartet werden:
-@code{service lx-office-task-server start}
-
-@node Prozesskontrolle
-@section Wie der Task-Server gestartet und beendet wird
-
-Der Task-Server wird wie folgt kontrolliert:
-
-@code{./scripts/task_server.pl Befehl}
-
-@code{Befehl} ist dabei eine der folgenden Optionen:
-
-@itemize
-@item @code{start} startet eine neue Instanz des Task-Servers. Die Prozess-ID wird innerhalb des @file{users}-Verzeichnisses abgelegt.
-@item @code{stop} beendet einen laufenden Task-Server.
-@item @code{restart} beendet und startet ihn neu.
-@item @code{status} berichtet, ob der Task-Server läuft.
-@end itemize
-
-Der Task-Server wechselt beim Starten automatisch in das Lx-Office-Installationsverzeichnis.
-
-Dieselben Optionen können auch für die SystemV-basierenden
-Runlevel-Scripte benutzt werden (siehe oben).
-
-@c ---------------------------------------------------------------
-
-@node Benutzerauthentifizierung und Administratorpasswort
-@chapter Benutzerauthentifizierung und Administratorpasswort
-
-Informationen über die Einrichtung der Benutzerauthentifizierung, über
-die Verwaltung von Gruppen und weitere Einstellungen
-
-@menu
-* Grundlagen zur Benutzerauthentifizierung:: Verfügbare Methoden, Name der Konfigurationsdatei
-* Administratorpasswort:: Wo das Administratorpasswort gesetzt werden kann
-* Authentifizierungsdatenbank:: Verbindungseinstellungen zur Authentifizierungsdatenbank
-* Passwortüberprüfung:: Einstellungen zur Überprüfung der Benutzerpasswörter
-* Name des Session-Cookies:: Ändern des Cookie-Namens bei Verwendung mehrerer Lx-Office-Installationen auf einem Server
-* Anlegen der Authentifizierungsdatenbank:: Wie die Authentifizierungsdatenbank angelegt wird
-@end menu
-
-@c ---------------------------------------------------------------
-
-@node Grundlagen zur Benutzerauthentifizierung
-@section Grundlagen zur Benutzerauthentifizierung
-
-Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
-im folgenden ``Authentifizierungsdatenbank'' genannt wird. Für jeden
-Benutzer kann dort eine eigene Datenbank für die eigentlichen
-Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
-aber nicht unterschiedlich sein.
-
-Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
-in der sowohl die Benutzerinformationen als auch die Daten abgelegt
-werden.
-
-Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
-entweder gegen die Authentifizierungsdatenbank oder gegen einen
-LDAP-Server überprüft werden.
-
-Welche Art der Passwortüberprüfung Lx-Office benutzt und wie Lx-Office
-die Authentifizierungsdatenbank erreichen kann, wird in der
-Konfigurationsdatei @file{config/lx_office.conf} festgelegt. Diese
-muss bei der Installation und bei einem Upgrade von einer Version vor
-v2.6.0 angelegt werden. Eine Beispielkonfigurationsdatei
-@file{config/lx_office.conf.default} existiert, die als Vorlage
-benutzt werden kann.
-
-@node Administratorpasswort
-@section Administratorpasswort
-
-Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt wird,
-wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort und nicht
-mehr im Administrationsinterface selber geändert werden. Der Parameter dazu
-heißt @code{$self->@{admin_password@}}.
-
-@node Authentifizierungsdatenbank
-@section Authentifizierungsdatenbank
-
-Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
-in @code{$self->@{DB_config@}} konfiguriert. Hier sind die folgenden
-Parameter anzugeben:
-
-@itemize
-@item
-@samp{host} -- Der Rechnername oder die IP-Adresse des Datenbankservers
-@item
-@samp{port} -- Die Portnummer des Datenbankservers, meist 5432
-@item
-@samp{db} -- Der Name der Authentifizierungsdatenbank
-@item
-@samp{user} -- Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. ``postgres'')
-@item
-@samp{password} -- Das Passwort für den Datenbankbenutzer
-@end itemize
-
-Die Datenbank muss noch nicht existieren. Lx-Office kann sie
-automatisch anlegen (mehr dazu siehe unten).
-
-@node Passwortüberprüfung
-@section Passwortüberprüfung
-
-Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
-Authentifizierungsdatenbank und gegen einen externen LDAP- oder
-Active-Directory-Server. Welche davon benutzt wird, regelt der
-Parameter @code{$self->@{module@}}.
-
-Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
-gespeichert werden, so muss der Parameter @code{$self->@{module@}} den
-Wert @samp{DB} enthalten. In diesem Fall können sowohl der
-Administrator als auch die Benutzer selber ihre Psaswörter in
-Lx-Office ändern.
-
-Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
-werden, so muss der Parameter @code{$self->@{module@}} auf @samp{LDAP}
-gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
-den LDAP-Server in @code{$self->@{LDAP_config@}} angegeben werden:
-
-@itemize
-@item
-@samp{host} -- Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend erforderlich.
-@item
-@samp{port} -- Die Portnummer des LDAP-Servers; meist 389.
-@item
-@samp{tls} -- Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf @samp{1} setzen, andernfalls auf @samp{0} belassen
-@item
-@samp{attribute} -- Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server
-  ist dies meist @samp{sAMAccountName}, für andere LDAP-Server hingegen @samp{uid}. Diese Angabe ist zwingend erforderlich.
-@item
-@samp{base_dn} -- Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich.
-@item
-@samp{filter} -- Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort @code{<%login%>}, so wird dieses durch den vom Benutzer
-  eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum nach einem Element durchsucht, bei dem das oben angegebene Attribut
-  mit dem Benutzernamen identisch ist.
-@item
-@samp{bind_dn} und @samp{bind_password} -- Wenn der LDAP-Server eine Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist dies bei
-  Active-Directory-Servern der Fall), so kann diese hier angegeben werden. Für Active-Directory-Server kann als @samp{bind_dn} entweder eine
-  komplette LDAP-DN wie z.B. @samp{cn=Martin Mustermann,cn=Users,dc=firmendomain} auch nur der volle Name des Benutzers
-  eingegeben werden; in diesem Beispiel also @samp{Martin Mustermann}.
-@end itemize
-
-@node Name des Session-Cookies
-@section Name des Session-Cookies
-
-Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
-werden, so müssen die Namen der Session-Cookies für alle
-Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
-Parameter @code{$self->@{cookie_name@}} gesetzt.
-
-Diese Angabe ist optional, wenn nur eine Installation auf dem Server
-existiert.
-
-@node Anlegen der Authentifizierungsdatenbank
-@section Anlegen der Authentifizierungsdatenbank
-
-Nachdem alle Einstellungen in @file{config/lx_office.conf}
-vorgenommen wurden, muss Lx-Office die Authentifizierungsdatenbank
-anlegen. Dieses geschieht automatisch, wenn Sie sich im
-Administrationsmodul anmelden, das unter der folgenden URL erreichbar
-sein sollte:
-
-@uref{http://localhost/lx-erp/admin.pl}
-
-
-@c ---------------------------------------------------------------
-
-@node Benutzer- und Gruppenverwaltung
-@chapter Benutzer- und Gruppenverwaltung
-
-Nach der Installation müssen Benutzer, Gruppen und Datenbanken
-angelegt werden.  Dieses geschieht im Administrationsmenü, das Sie
-unter folgender URL finden:
-
-@uref{http://localhost/lx-erp/admin.pl}
-
-Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
-@file{config/lx_office.conf} eingetragen haben.
-
-@menu
-* Zusammenhänge:: Übersicht über Benutzer, Gruppen, Berechtigungen und Datenbanken
-* Datenbanken anlegen:: Hinweise zum Anlegen von Datenbanken
-* Gruppen anlegen:: Hinweise zum Anlegen von Gruppen
-* Benutzer anlegen:: Hinweise zum Anlegen von Benutzern
-* Gruppenmitgliedschaften verwalten:: Wie man Gruppen Benutzer zuordnet
-* Migration alter Installationen:: Automatische Übernahme bei Update von einer älteren Version
-@end menu
-
-@node Zusammenhänge
-@section Zusammenhänge
-
-Lx-Office verwendet eine Datenbank zum Speichern all seiner
-Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
-mit Lx-Office arbeiten zu können, muss eine Person einen
-Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
-Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
-möglich und normal, dass mehreren Benutzern die selbe Datenbank
-zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
-
-Die Basisdaten der Benutzer, die in der Administration eingegeben
-werden können, werden in einer zweiten Datenbank gespeichert, der
-bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
-Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
-Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
-aber beliebig viele Datenbanken mit Firmendaten.
-
-Lx-Office kann seinen Benutzern Zugriff auf bestimmte
-Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
-gestattet, so werden der entsprechenden Menüpunkte auch nicht
-angezeigt. Diese Rechte werden ebenfalls in der
-Authentifizierungsdatenbank gespeichert.
-
-Um Rechte verteilen zu können, verwendet Lx-Office ein
-Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
-erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
-mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
-Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
-Benutzer Mitglied ist.
-
-Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
-angelegt werden sollten, lautet:
-
-@enumerate
-@item
-Datenbank anlegen
-@item
-Gruppen anlegen
-@item
-Benutzer anlegen
-@item
-Benutzer den Gruppen zuordnen
-@end enumerate
-
-@node Datenbanken anlegen
-@section Datenbanken anlegen
-
-Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
-Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
-ist dies @samp{lxoffice}).
-
-Wenn Sie für die Lx-Office-Installation nicht den europäischen
-Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei
-@file{config/lx_office.conf} die Variable @code{dbcharset} im
-Abschnitt @code{system} auf den Wert @samp{UTF-8} setzen. Zusätzlich
-muss beim Anlegen der Datenbank @samp{UTF-8 Unicode} als Schriftsatz
-ausgewählt werden.
-
-Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
-verwenden müssen, da diese Einstellungen momentan global in Lx-Office
-vorgenommen wird und nicht nach Datenbank unterschieden werden
-kann. Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
-angelegt worden sein.
-
-@node Gruppen anlegen
-@section Gruppen anlegen
-
-Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
-gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
-Anlegen können Sie die verschiedenen Bereiche wählen, auf die
-Mitglieder dieser Gruppe Zugriff haben sollen.
-
-Benutzergruppen sind unabhängig von Datenbanken, da sie in der
-Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
-Datenbanken, die in dieser Installation verwaltet werden.
-
-@node Benutzer anlegen
-@section Benutzer anlegen
-
-Beim Anlegen von Benutzern werden für viele Parameter
-Standardeinstellungen vorgenommen, die den Gepflogenheiten des
-deutschen Raumes entsprechen.
-
-Zwingend anzugeben sind der Loginname sowie die komplette
-Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
-Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
-gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
-aktiv, so ist das Passwort-Feld deaktiviert.
-
-In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
-angelegten Datenbanken eingetragen werden.
-
-@node Gruppenmitgliedschaften verwalten
-@section Gruppenmitgliedschaften verwalten
-
-Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
-zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
-
-@enumerate
-@item
-In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
-Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen.
-@item
-In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
-Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
-System angelegten Gruppen und Benutzer enthält. Durch Setzen der
-Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in der
-ausgewählten Spalte hinzugefügt.
-@end enumerate
-
-@node Migration alter Installationen
-@section Migration alter Installationen
-
-Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird, in der
-die Benutzerdaten noch im Dateisystem im Verzeichnis @code{users}
-verwaltet wurden, so bietet Lx-Office die Möglichkeit, diese
-Benutzerdaten automatisch in die Authentifizierungsdatenbank zu
-übernehmen. Dies geschieht, wenn man sich nach dem Update der
-Installation das erste Mal im Administrationsbereich anmeldet. Findet
-Lx-Office die Datei @code{users/members}, so wird der
-Migrationsprozess gestartet.
-
-Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
-können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
-die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt
-wird. Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office
-gewährt. Alle migrierten Benutzern werden Mitglied in dieser
-Gruppe. Damit wird das Verhalten von Lx-Office bis Version 2.4.3
-inklusive wiederhergestellt, und die Benutzer können sich sofort
-wieder anmelden und mit dem System arbeiten.
-
-@c ---------------------------------------------------------------
-
-@node Drucken mit Lx-Office
-@chapter Drucken mit Lx-Office
-
-Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen. Um drucken
-zu können, braucht der Server ein geeignetes LaTeX System. Am einfachsten ist
-dazu eine @code{texlive} Installation. Unter Debianoiden Betriebssystemen sind
-das die Pakete:
-
-@code{texlive-latex-base texlive-latex-extra texlive-fonts-recommended}
-
-Diese hinteren beiden enthalten Bibliotheken und Schriftarten die von den
-Standardvorlagen verwendet werden.
-
-TODO: rpm Pakete.
-
-In den allermeisten Installationen sollte drucken jetzt schon funktionieren.
-Sollte ein Fehler auftreten wirft TeX sehr lange Fehlerbeschreibungen, der
-eigentliche Fehler ist immer die erste Zeite die mit einem Ausrufezeichen
-anfängt. Häufig auftretende Fehler sind zum Beispiel:
-
-@itemize
-@item ! LaTeX Error: File `eurosym.sty' not found.
-Die entsprechende LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem
-bei Vorlagen aus der Community auf. Installieren Sie die entsprechenden Pakete.
-@item ! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for use with LaTeX.
-Dieser Fehler tritt auf, wenn sie versuchen mit einer Standardinstallation
-exotische utf8 Zeichen zu drucken. TeXLive unterstützt von Haus nur romanische
-Schriften und muss mit diversen Tricks dazu gebracht werden andere Zeichen zu
-akzeptieren. Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.
-@end itemize
-
-Wird garkein Fehler angezeigt sondern nur der Name des Templates, heißt das
-normalerweise, dass das LaTeX Binary nicht gefunden wurde. Prüfen Sie den Namen
-in der Konfiguration (Standard: @code{pdflatex}), und stellen Sie sicher, dass
-pdflatex (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
-darf.
-
-@c ---------------------------------------------------------------
-
-@node OpenDocument-Vorlagen
-@chapter OpenDocument-Vorlagen
-
-Lx-Office unterstützt die Verwendung von Vorlagen im
-OpenDocument-Format, wie es OpenOffice.org ab Version 2
-erzeugt. Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als
-auch aus diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei
-@file{config/lx_office.conf} die Variable @code{opendocument} im
-Abschnitt @code{print_templates} auf @samp{1} stehen.  Dieses ist die
-Standardeinstellung.
-
-Weiterhin muss in der Datei @file{config/lx_office.conf} die Variable
-@code{dbcharset} im Abschnitt @code{system} auf die Zeichenkodierung
-gesetzt werden, die auch bei der Speicherung der Daten in der
-Datenbank verwendet wird. Diese ist in den meisten Fällen "UTF-8".
-
-Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
-weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
-OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
-neben OpenOffice.org ab Version 2 auch der ``X virtual frame buffer''
-(xvfb) installiert werden.  Bei Debian ist er im Paket ``xvfb''
-enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
-
-Nach der Installation müssen in der Datei @file{config/lx_config.conf}
-zwei weitere Variablen angepasst werden: @code{openofficeorg_writer}
-muss den vollständigen Pfad zur OpenOffice.org Writer-Anwendung
-enthalten. @code{xvfb} muss den Pfad zum ``X virtual frame buffer''
-enthalten. Beide stehen im Abschnitt @code{applications}.
-
-Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
-OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
-die Variable @code{$openofficeorg_daemon} gesetzt ist, startet ein
-OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
-bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
-benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
-reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
-werden muss. Der Nachteil ist, dass diese Methode Python und die
-Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2 sind.
-
-Ist @code{$openofficeorg_daemon} nicht gesetzt, so wird für jedes
-Dokument OpenOffice neu gestartet und die Konvertierung mit Hilfe
-eines Makros durchgeführt. Dieses Makro muss in der Dokumentenvorlage
-enthalten sein und ``Standard.Conversion.ConvertSelfToPDF()''
-heißen. Die Beispielvorlage @samp{templates/mastertemplates/German/invoice.odt}
-enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
-ebenfalls enthalten sein muss.
-
-Als letztes muss herausgefunden werden, welchen Namen OpenOffice.org
-Writer dem Verzeichnis mit den Benutzereinstellungen gibt. Unter
-Debian ist dies momentan @code{~/.openoffice.org2}. Sollte der Name
-bei Ihrer OpenOffice.org-Installation anders sein, so muss das
-Verzeichnis @code{users/.openoffice.org2} entsprechend umbenannt
-werden. Ist der Name z.B. einfach nur @code{.openoffice}, so wäre
-folgender Befehl auszuführen:
-
-@code{mv users/.openoffice.org2 users/.openoffice}
-
-Dieses Verzeichnis, wie auch das komplette @code{users}-Verzeichnis, muss vom
-Webserver beschreibbar sein. Dieses wurde bereits erledigt
-(@pxref{Manuelle Installation des Programmpaketes}), kann aber erneut überprüft
-werden, wenn die Konvertierung nach PDF fehlschlägt.
-
-@c ---------------------------------------------------------------
-
-@node Lx-Office ERP verwenden
-@chapter Lx-Office ERP verwenden
-
-Nach erfolgreicher Installation ist der Loginbildschirm unter
-folgender URL erreichbar:
-
-@uref{http://localhost/lx-office-erp/login.pl}
-
-Die Administrationsseite erreichen Sie unter:
-
-@uref{http://localhost/lx-office-erp/admin.pl}
-
-@bye
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt
deleted file mode 100644 (file)
index 3539c12..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-Table of Contents
-*****************
-
-Inhalt der Anleitung
-1 Aktuelle Hinweise
-2 Benötigte Software und Pakete
-  2.1 Betriebssystem
-  2.2 Pakete
-3 Manuelle Installation des Programmpaketes
-4 Anpassung der PostgreSQL-Konfiguration
-  4.1 Zeichensätze/die Verwendung von UTF-8
-  4.2 Änderungen an Konfigurationsdateien
-  4.3 Erweiterung für servergespeicherte Prozeduren
-  4.4 Datenbankbenutzer anlegen
-5 Apache-Konfiguration
-6 Der Task-Server
-  6.1 Verfügbare und notwendige Konfigurationsoptionen
-  6.2 Automatisches Starten des Task-Servers beim Booten
-    6.2.1 SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora Core)
-    6.2.2 Upstart-basierende Systeme (z.B. Ubuntu)
-  6.3 Wie der Task-Server gestartet und beendet wird
-7 Benutzerauthentifizierung und Administratorpasswort
-  7.1 Grundlagen zur Benutzerauthentifizierung
-  7.2 Administratorpasswort
-  7.3 Authentifizierungsdatenbank
-  7.4 Passwortüberprüfung
-  7.5 Name des Session-Cookies
-  7.6 Anlegen der Authentifizierungsdatenbank
-8 Benutzer- und Gruppenverwaltung
-  8.1 Zusammenhänge
-  8.2 Datenbanken anlegen
-  8.3 Gruppen anlegen
-  8.4 Benutzer anlegen
-  8.5 Gruppenmitgliedschaften verwalten
-  8.6 Migration alter Installationen
-9 Drucken mit Lx-Office
-10 OpenDocument-Vorlagen
-11 Lx-Office ERP verwenden
-
-
-Inhalt der Anleitung
-********************
-
-1 Aktuelle Hinweise
-*******************
-
-Aktuelle Installations- und Konfigurationshinweise gibt es:
-
-   * auf der Lx-Office Homepage unter
-     `http://lx-office.org/index.php?id=dokumentation'
-
-   * im Lx-Office-Wiki unter Dokumentation
-     (`http://wiki.lx-office.org/index.php/Lx-Office_ERP')
-
-   * im Lx-Office-Forum: `http://www.lx-office.org/forum/'
-
-2 Benötigte Software und Pakete
-********************************
-
-2.1 Betriebssystem
-==================
-
-Lx-Office ist für Linux konzipiert, und sollte auf jedem unixoiden
-Betriebssystem zum Laufen zu kriegen sein. Getestet ist diese Version im
-speziellen auf Debian und Ubuntu, grundsätzlich wurde bei der Auswahl
-der Pakete aber darauf Rücksicht genommen, dass es ohne große Probleme
-auf den derzeit aktuellen verbreiteten Distributionen läuft.
-
-   Anfang 2011 sind das folgende Systeme:
-
-   * Ubuntu 8.04 LTS Hardy Heron
-
-   * Ubuntu 9.10 Karmic Koala
-
-   * Ubuntu 10.04 Lucid Lynx
-
-   * Ubuntu 10.10 Maverick Meerkat
-
-   * Debian 5.0 Lenny
-
-   * Debian 6.0 Squeeze
-
-   * openSUSE 11.2
-
-   * openSUSE 11.3
-
-   * SuSE Linux Enterprice Server 11
-
-   * Fedora 13
-
-   * Fedora 14
-
-   Für die debianoiden Betriebssysteme existiert ein .deb, das deutlich
-einfacher zu installieren ist.
-
-   Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die Module im
-Archiv recht alt sind, und das viele der benötigten Module nicht
-einfach zu installieren sind. Dafür sollte es kurz nach dem Release ein
-eigenes .deb geben.
-
-   Alternativ dazu kann die normale Installation durchgeführt werden
-(*note Manuelle Installation des Programmpaketes::), wenn vorher ein
-Kompatibilitätspaket installiert wird, das die fehlenden Pakete
-bereitstellt.  Das Paket ist auf Sourceforge
-(https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/)
-unter dem Namen `lx-erp-perl-libs-compat-v2.tar.gz' hinterlegt.
-
-   Zur Installation das Paket in das entpackte Lx-Office Verzeichnis
-entpacken:
-
-   `tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/'
-
-   Zusätzlich müssen dann noch die folgenden Pakete installiert weerden
-
-   `libbit-vector-perl libsub-exporter-perl libclone-perl
-libclass-factory-util-perl'
-
-   Danach sollte der Installationscheck (*note Pakete::) die
-enthaltenen Pakete erkennen.
-
-2.2 Pakete
-==========
-
-Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache)
-und ein Datenbankserver (PostgreSQL, mindestens v8.2) benötigt.
-
-   Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht
-Bestandteil einer Standard-Perl-Installation sind:
-
-   * parent
-
-   * Archive::Zip
-
-   * Config::Std
-
-   * DateTime
-
-   * DBI
-
-   * DBD::Pg
-
-   * Email::Address
-
-   * JSON
-
-   * List::MoreUtils
-
-   * Params::Validate
-
-   * PDF::API2
-
-   * Rose::Object
-
-   * Rose::DB
-
-   * Rose::DB::Object
-
-   * Template
-
-   * Text::CSV_XS
-
-   * Text::Iconv
-
-   * URI
-
-   * XML::Writer
-
-   * YAML
-
-   Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete hinzugekommen,
-`URI' und `XML::Writer' sind notwendig. Ohne startet Lx-Office nicht.
-
-   Gegenüber Version 2.6.1 sind `parent', `DateTime', `Rose::Object',
-`Rose::DB' und `Rose::DB::Object' neu hinzugekommen. `IO::Wrap' wurde
-entfernt.
-
-   Gegenüber Version 2.6.3 ist `JSON' neu hinzugekommen.
-
-   `Email::Address' und `List::MoreUtils' sind schon länger feste
-Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert.  Beide
-sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
-zukünftigen Version aber aus dem Paket entfernt werden. Es wird
-empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
-installieren.
-
-   Die zu installierenden Pakete können in den verschiedenen
-Distributionen unterschiedlich heißen.
-
-   Für Debian oder Ubuntu benötigen Sie diese Pakete:
-
-   `apache2 postgresql libparent-perl libarchive-zip-perl
-libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl
-libemail-address-perl liblist-moreutils-perl libpdf-api2-perl
-librose-object-perl librose-db-perl librose-db-object-perl
-libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl
-libxml-writer-perl libyaml-perl libconfig-std-perl
-libparams-validate-perl libjson-perl'
-
-   Für Fedora Core benötigen Sie diese Pakete:
-
-   `httpd postgresql-server perl-parent perl-DateTime perl-DBI
-perl-DBD-Pg perl-Email-Address perl-List-MoreUtils perl-PDF-API2
-perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object perl-Template-Toolkit
-perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML'
-
-   Für OpenSuSE benötigen Sie diese Pakete:
-
-   `apache2 postgresql-server perl-Archive-Zip perl-DateTime perl-DBI
-perl-DBD-Pg perl-MailTools perl-List-MoreUtils perl-PDF-API2
-perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI
-perl-XML-Writer perl-YAML'
-
-   Bei openSuSE 11 ist `parent' bereits enthalten, und braucht nicht
-nachinstalliert werden. Die `Rose::*' Pakete sind derzeit nicht für
-SuSE gepackt, und müssen anderweitig nachinstalliert werden.
-
-   Lx-Office enthält ein Script, mit dem überprüft werden kann, ob alle
-benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
-
-   `./scripts/installation_check.pl'
-
-3 Manuelle Installation des Programmpaketes
-*******************************************
-
-Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird im
-Dokumentenverzeichnis des Webservers (z.B. `/var/www/html/',
-`/srv/www/htdocs' oder `/var/www/') entpackt:
-
-   `cd /var/www
-tar xvzf lxoffice-erp-2.6.2.tgz'
-
-   Verändern Sie evtl. noch den Namen des Verzeichnisses mit
-
-   `mv lxoffice-erp/ lx-erp/'
-
-   Alternativ können Sie auch einen Alias in der Webserverkonfiguration
-benutzen, um auf das tatsächliche Installationsverzeichnis zu verweisen.
-
-   Die Verzeichnisse `users', `spool' und `webdav' müssen für den
-Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
-restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
-Benutzername ist bei verschiedenen Distributionen unterschiedlich (z.B.
-bei Debian/Ubuntu `www-data', bei Fedora core `apache' oder bei
-OpenSuSE `wwwrun').
-
-   Der folgende Befehl ändert den Besitzer für die oben genannten
-Verzeichnisse auf einem Debian/Ubuntu-System:
-
-   `chown -R www-data lx-office-erp/users lx-office-erp/spool
-lx-office-erp/webdav'
-
-   Weiterhin muss der Webserver-Benutzer im Verzeichnis `templates'
-Verzeichnisse für jeden neuen Benutzer, der in lx-office angelegt wird,
-anlegen dürfen:
-
-   `chgrp www-data lx-office-erp/templates; chmod g+w
-lx-office-erp/templates'
-
-4 Anpassung der PostgreSQL-Konfiguration
-****************************************
-
-PostgreSQL muss auf verschiedene Weisen angepasst werden.
-
-4.1 Zeichensätze/die Verwendung von UTF-8
-==========================================
-
-Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet werden.
-Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in Version 8.0
-oder neuer benutzt werden, und der PostgreSQL-Datenbankcluster muss
-ebenfalls mit UTF-8 als Locale angelegt worden sein.
-
-   Dieses ist kann überprüft werden: ist das Encoding der Datenbank
-"template1" "UTF8", so kann auch Lx-Office mit UTF-8 betrieben werden.
-Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
-UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
-Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:
-
-   `pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2
-clustername'
-
-   Die Datenbankversionsnummer muss an die tatsächlich verwendete
-Versionsnummer angepasst werden.
-
-   Unter anderen Distributionen gibt es ähnliche Methoden.
-
-   Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und ist
-ein Neuanlegen eines weiteren Clusters nicht möglich, so kann Lx-Office
-mit ISO-8859-15 als Encoding betrieben werden.
-
-   Das Encoding einer Datenbank kann in `psql' mit `\l' geprüft werden.
-
-4.2 Änderungen an Konfigurationsdateien
-========================================
-
-In der Datei `postgresql.conf', die je nach Distribution in
-verschiedenen Verzeichnissen liegen kann (z.B. `/var/lib/pgsql/data/'
-oder `/etc/postgresql/', muss sichergestellt werden, dass
-TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
-Parameter `listen_address' gesteuert. Laufen PostgreSQL und Lx-Office
-auf demselben Rechner, so kann dort der Wert `localhost' verwendet
-werden. Andernfalls müssen Datenbankverbindungen auch von anderen
-Rechnern aus zugelassen werden, was mit dem Wert \`*' geschieht.
-
-   In der Datei `pg_hba.conf', die im gleichen Verzeichnis wie die
-`postgresql.conf' zu finden sein sollte, müssen die Berichtigungen für
-den Zugriff geändert werden. Hier gibt es mehrere Möglichkeiten. Eine
-besteht darin, lokale Verbindungen immer zuzulassen
-
-   `local all all trust
-host all all 127.0.0.1 255.0.0.0 trust'
-
-   Besser ist es, für eine bestimmte Datenbank Zugriff nur per Passwort
-zuzulassen. Beispielsweise:
-
-   `local   all         lxoffice
-  password
-host    all         lxoffice      127.0.0.1         255.255.255.255
-password'
-
-4.3 Erweiterung für servergespeicherte Prozeduren
-==================================================
-
-In der Datenbank `template1' muss die Unterstützung für
-servergespeicherte Prozeduren eingerichet werden. Melden Sie sich dafür
-als Benutzer "postgres" an der Datenbank an, und führen Sie die
-folgenden Kommandos aus:
-
-   `create language 'plpgsql';'
-
-   Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler für
-die Sprache manuell anlelegt werden, diese Versionen werden aber nicht
-mehr offiziell von Lx-Office unterstützt. Dafür dann die folgenden
-Kommandos:
-
-   `create function plpgsql_call_handler () returns opaque as
-'/usr/lib/pgsql/plpgsql.so' language 'c';
-create language 'plpgsql' handler plpgsql_call_handler lancompiler
-'pl/pgsql';'
-
-   Bitte beachten Sie, dass der Pfad zur Datei `plpgsql.so' von
-Distribution zu Distribution verschiedlich sein kann. Bei Debian/Ubuntu
-befindet sie sich unter `/usr/lib/postgresql/lib/plpgsql.so'.
-
-4.4 Datenbankbenutzer anlegen
-=============================
-
-Wenn Sie nicht den Datenbanksuperuser "postgres" zum Zugriff benutzen
-wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer anlegen. Ein
-Beispiel, wie Sie einen neuen Benutzer anlegen können:
-
-   `su - postgres
-createuser -d -P lxoffice'
-
-   Wenn Sie später einen Datenbankzugriff konfigurieren, verändern Sie
-den evtl. voreingestellten Benutzer "postgres" auf "lxoffice" bzw. den
-hier gewählten Benutzernamen.
-
-5 Apache-Konfiguration
-**********************
-
-Hinweis: Für einen deutlichen Performanceschub sorgt die Ausführung
-mittels FCGI. Die Einrichtung wird ausführlich in der Datei
-`INSTALL.fcgi' beschrieben.
-
-   Der Zugriff auf das Programmverzeichnis muss in der Apache
-Webserverkonfigurationsdatei `httpd.conf' eingestellt werden. Fügen Sie
-den folgenden Abschnitt dieser Datei oder einer anderen Datei hinzu,
-die beim Starten des Webservers eingelesen wird:
-
-   `
-AddHandler cgi-script .pl
-Alias /lx-erp/ /var/www/lx-erp/
-<Directory /var/www/lx-erp>
-Options ExecCGI Includes FollowSymlinks
-</Directory>
-<Directory /var/www/lx-erp/users>
-Order Deny,Allow
-Deny from All
-</Directory>
-'
-
-   Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher das
-Lx-Office-Archiv entpacket haben.
-
-   Achtung: Vor den einzelnen Optionen muss bei einigen Distributionen
-ein Plus `+' gesetzt werden.
-
-   Auf einigen Webservern werden manchmal die Grafiken und Style-Sheets
-nicht ausgeliefert. In solchen Fällen hat es oft geholfen, die folgende
-Option in die Konfiguration aufzunehmen:
-
-   `EnableSendfile Off'
-
-6 Der Task-Server
-*****************
-
-Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
-regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
-festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
-wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
-benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
-bekommen.
-
-6.1 Verfügbare und notwendige Konfigurationsoptionen
-=====================================================
-
-Die Konfiguration erfolgt über den Abschnitt `[task_server]' in der
-Datei `config/lx_office.conf'. Die dort verfügbaren Optionen sind:
-
-   * `login': gültiger Lx-Office-Benutzername, der benutzt wird, um die
-     zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss
-     in der Administration angelegt werden. Diese Option muss angegeben
-     werden.
-
-   * `run_as': Wird der Server vom Systembenutzer `root' gestartet, so
-     wechselt er auf den mit `run_as' angegebenen Systembenutzer. Der
-     Systembenutzer muss dieselben Lese- und Schreibrechte haben, wie
-     auch der Webserverbenutzer (siehe *note Manuelle Installation des
-     Programmpaketes::). Daher ist es sinnvoll, hier denselben
-     Systembenutzer einzutragen, unter dem auch der Webserver läuft.
-
-   * `debug': Schaltet Debug-Informationen an und aus.
-
-6.2 Automatisches Starten des Task-Servers beim Booten
-======================================================
-
-Der Task-Server verhält sich von seinen Optionen her wie ein reguläres
-SystemV-kompatibles Boot-Script. Außerdem wechselt er beim Starten
-automatisch in das Lx-Office-Installationsverzeichnis.
-
-   Deshalb ist es möglich, ihn durch Setzen eines symbolischen Links aus
-einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
-einzubinden. Da das bei neueren Linux-Distributionen aber nicht
-zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
-anstelle eines symbolischen Links verwendet werden können.
-
-6.2.1 SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora Core)
----------------------------------------------------------------------
-
-Kopieren Sie die Datei `scripts/boot/system-v/lx-office-task-server'
-nach `/etc/init.d/lx-office-task-server'. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile `DAEMON=....'). Binden Sie das
-Script in den Boot-Prozess ein. Dies ist distributionsabhängig:
-
-   * Debian-basierende Systeme:
-     `update-rc.d lx-office-task-server defaults
-     # Nur bei Debian Squeeze und neuer:
-     insserv lx-office-task-server'
-
-   * OpenSuSE und Fedora Core:
-     `chkconfig --add lx-office-task-server'
-
-   Danach kann der Task-Server mit dem folgenden Befehl gestartet
-werden: `/etc/init.d/lx-office-task-server start'
-
-6.2.2 Upstart-basierende Systeme (z.B. Ubuntu)
-----------------------------------------------
-
-Kopieren Sie die Datei
-`scripts/boot/upstart/lx-office-task-server.conf' nach
-`/etc/init/lx-office-task-server.conf'. Passen Sie in der kopierten
-Datei den Pfad zum Task-Server an (Zeile `exec ....').
-
-   Danach kann der Task-Server mit dem folgenden Befehl gestartet
-werden: `service lx-office-task-server start'
-
-6.3 Wie der Task-Server gestartet und beendet wird
-==================================================
-
-Der Task-Server wird wie folgt kontrolliert:
-
-   `./scripts/task_server.pl Befehl'
-
-   `Befehl' ist dabei eine der folgenden Optionen:
-
-   * `start' startet eine neue Instanz des Task-Servers. Die Prozess-ID
-     wird innerhalb des `users'-Verzeichnisses abgelegt.
-
-   * `stop' beendet einen laufenden Task-Server.
-
-   * `restart' beendet und startet ihn neu.
-
-   * `status' berichtet, ob der Task-Server läuft.
-
-   Der Task-Server wechselt beim Starten automatisch in das
-Lx-Office-Installationsverzeichnis.
-
-   Dieselben Optionen können auch für die SystemV-basierenden
-Runlevel-Scripte benutzt werden (siehe oben).
-
-7 Benutzerauthentifizierung und Administratorpasswort
-*****************************************************
-
-Informationen über die Einrichtung der Benutzerauthentifizierung, über
-die Verwaltung von Gruppen und weitere Einstellungen
-
-7.1 Grundlagen zur Benutzerauthentifizierung
-============================================
-
-Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
-im folgenden "Authentifizierungsdatenbank" genannt wird. Für jeden
-Benutzer kann dort eine eigene Datenbank für die eigentlichen
-Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
-aber nicht unterschiedlich sein.
-
-   Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
-in der sowohl die Benutzerinformationen als auch die Daten abgelegt
-werden.
-
-   Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
-entweder gegen die Authentifizierungsdatenbank oder gegen einen
-LDAP-Server überprüft werden.
-
-   Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
-Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
-Konfigurationsdatei `config/lx_office.conf' festgelegt. Diese muss bei
-der Installation und bei einem Upgrade von einer Version vor v2.6.0
-angelegt werden. Eine Beispielkonfigurationsdatei
-`config/lx_office.conf.default' existiert, die als Vorlage benutzt
-werden kann.
-
-7.2 Administratorpasswort
-=========================
-
-Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt
-wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort
-und nicht mehr im Administrationsinterface selber geändert werden. Der
-Parameter dazu heißt `$self->{admin_password}'.
-
-7.3 Authentifizierungsdatenbank
-===============================
-
-Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
-in `$self->{DB_config}' konfiguriert. Hier sind die folgenden Parameter
-anzugeben:
-
-   * `host' - Der Rechnername oder die IP-Adresse des Datenbankservers
-
-   * `port' - Die Portnummer des Datenbankservers, meist 5432
-
-   * `db' - Der Name der Authentifizierungsdatenbank
-
-   * `user' - Der Benutzername, mit dem sich Lx-Office beim
-     Datenbankserver anmeldet (z.B. "postgres")
-
-   * `password' - Das Passwort für den Datenbankbenutzer
-
-   Die Datenbank muss noch nicht existieren. Lx-Office kann sie
-automatisch anlegen (mehr dazu siehe unten).
-
-7.4 Passwortüberprüfung
-=========================
-
-Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
-Authentifizierungsdatenbank und gegen einen externen LDAP- oder
-Active-Directory-Server. Welche davon benutzt wird, regelt der
-Parameter `$self->{module}'.
-
-   Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
-gespeichert werden, so muss der Parameter `$self->{module}' den Wert
-`DB' enthalten. In diesem Fall können sowohl der Administrator als auch
-die Benutzer selber ihre Psaswörter in Lx-Office ändern.
-
-   Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
-werden, so muss der Parameter `$self->{module}' auf `LDAP' gesetzt
-werden. In diesem Fall müssen zusätzliche Informationen über den
-LDAP-Server in `$self->{LDAP_config}' angegeben werden:
-
-   * `host' - Der Rechnername oder die IP-Adresse des LDAP- oder
-     Active-Directory-Servers. Diese Angabe ist zwingend erforderlich.
-
-   * `port' - Die Portnummer des LDAP-Servers; meist 389.
-
-   * `tls' - Wenn Verbindungsverschlüsselung gewünscht ist, so diesen
-     Wert auf `1' setzen, andernfalls auf `0' belassen
-
-   * `attribute' - Das LDAP-Attribut, in dem der Benutzername steht,
-     den der Benutzer eingegeben hat. Für Active-Directory-Server   ist
-     dies meist `sAMAccountName', für andere LDAP-Server hingegen
-     `uid'. Diese Angabe ist zwingend erforderlich.
-
-   * `base_dn' - Der Abschnitt des LDAP-Baumes, der durchsucht werden
-     soll. Diese Angabe ist zwingend erforderlich.
-
-   * `filter' - Ein optionaler LDAP-Filter. Enthält dieser Filter das
-     Wort `<%login%>', so wird dieses durch den vom Benutzer
-     eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum
-     nach einem Element durchsucht, bei dem das oben angegebene Attribut
-      mit dem Benutzernamen identisch ist.
-
-   * `bind_dn' und `bind_password' - Wenn der LDAP-Server eine
-     Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist
-     dies bei   Active-Directory-Servern der Fall), so kann diese hier
-     angegeben werden. Für Active-Directory-Server kann als `bind_dn'
-     entweder eine   komplette LDAP-DN wie z.B. `cn=Martin
-     Mustermann,cn=Users,dc=firmendomain' auch nur der volle Name des
-     Benutzers   eingegeben werden; in diesem Beispiel also `Martin
-     Mustermann'.
-
-7.5 Name des Session-Cookies
-============================
-
-Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
-werden, so müssen die Namen der Session-Cookies für alle Installationen
-unterschiedlich sein. Der Name des Cookies wird mit dem Parameter
-`$self->{cookie_name}' gesetzt.
-
-   Diese Angabe ist optional, wenn nur eine Installation auf dem Server
-existiert.
-
-7.6 Anlegen der Authentifizierungsdatenbank
-===========================================
-
-Nachdem alle Einstellungen in `config/lx_office.conf' vorgenommen
-wurden, muss Lx-Office die Authentifizierungsdatenbank anlegen. Dieses
-geschieht automatisch, wenn Sie sich im Administrationsmodul anmelden,
-das unter der folgenden URL erreichbar sein sollte:
-
-   `http://localhost/lx-erp/admin.pl'
-
-8 Benutzer- und Gruppenverwaltung
-*********************************
-
-Nach der Installation müssen Benutzer, Gruppen und Datenbanken angelegt
-werden.  Dieses geschieht im Administrationsmenü, das Sie unter
-folgender URL finden:
-
-   `http://localhost/lx-erp/admin.pl'
-
-   Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
-`config/lx_office.conf' eingetragen haben.
-
-8.1 Zusammenhänge
-==================
-
-Lx-Office verwendet eine Datenbank zum Speichern all seiner
-Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
-mit Lx-Office arbeiten zu können, muss eine Person einen
-Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
-Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
-möglich und normal, dass mehreren Benutzern die selbe Datenbank
-zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
-
-   Die Basisdaten der Benutzer, die in der Administration eingegeben
-werden können, werden in einer zweiten Datenbank gespeichert, der
-bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
-Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
-Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
-aber beliebig viele Datenbanken mit Firmendaten.
-
-   Lx-Office kann seinen Benutzern Zugriff auf bestimmte
-Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
-gestattet, so werden der entsprechenden Menüpunkte auch nicht
-angezeigt. Diese Rechte werden ebenfalls in der
-Authentifizierungsdatenbank gespeichert.
-
-   Um Rechte verteilen zu können, verwendet Lx-Office ein
-Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
-erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
-mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
-Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
-Benutzer Mitglied ist.
-
-   Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
-angelegt werden sollten, lautet:
-
-  1. Datenbank anlegen
-
-  2. Gruppen anlegen
-
-  3. Benutzer anlegen
-
-  4. Benutzer den Gruppen zuordnen
-
-8.2 Datenbanken anlegen
-=======================
-
-Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
-Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
-ist dies `lxoffice').
-
-   Wenn Sie für die Lx-Office-Installation nicht den europäischen
-Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei
-`config/lx_office.conf' die Variable `dbcharset' im Abschnitt `system'
-auf den Wert `UTF-8' setzen. Zusätzlich muss beim Anlegen der Datenbank
-`UTF-8 Unicode' als Schriftsatz ausgewählt werden.
-
-   Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
-verwenden müssen, da diese Einstellungen momentan global in Lx-Office
-vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
-Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
-angelegt worden sein.
-
-8.3 Gruppen anlegen
-===================
-
-Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
-gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
-Anlegen können Sie die verschiedenen Bereiche wählen, auf die
-Mitglieder dieser Gruppe Zugriff haben sollen.
-
-   Benutzergruppen sind unabhängig von Datenbanken, da sie in der
-Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
-Datenbanken, die in dieser Installation verwaltet werden.
-
-8.4 Benutzer anlegen
-====================
-
-Beim Anlegen von Benutzern werden für viele Parameter
-Standardeinstellungen vorgenommen, die den Gepflogenheiten des
-deutschen Raumes entsprechen.
-
-   Zwingend anzugeben sind der Loginname sowie die komplette
-Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
-Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
-gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
-aktiv, so ist das Passwort-Feld deaktiviert.
-
-   In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
-angelegten Datenbanken eingetragen werden.
-
-8.5 Gruppenmitgliedschaften verwalten
-=====================================
-
-Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
-zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
-
-  1. In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
-     Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen.
-
-  2. In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
-     Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
-     System angelegten Gruppen und Benutzer enthält. Durch Setzen der
-     Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in
-     der ausgewählten Spalte hinzugefügt.
-
-8.6 Migration alter Installationen
-==================================
-
-Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird, in der
-die Benutzerdaten noch im Dateisystem im Verzeichnis `users' verwaltet
-wurden, so bietet Lx-Office die Möglichkeit, diese Benutzerdaten
-automatisch in die Authentifizierungsdatenbank zu übernehmen. Dies
-geschieht, wenn man sich nach dem Update der Installation das erste Mal
-im Administrationsbereich anmeldet. Findet Lx-Office die Datei
-`users/members', so wird der Migrationsprozess gestartet.
-
-   Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
-können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
-die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt wird.
-Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office gewährt.
-Alle migrierten Benutzern werden Mitglied in dieser Gruppe. Damit wird
-das Verhalten von Lx-Office bis Version 2.4.3 inklusive
-wiederhergestellt, und die Benutzer können sich sofort wieder anmelden
-und mit dem System arbeiten.
-
-9 Drucken mit Lx-Office
-***********************
-
-Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen. Um
-drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
-einfachsten ist dazu eine `texlive' Installation. Unter Debianoiden
-Betriebssystemen sind das die Pakete:
-
-   `texlive-latex-base texlive-latex-extra texlive-fonts-recommended'
-
-   Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
-von den Standardvorlagen verwendet werden.
-
-   TODO: rpm Pakete.
-
-   In den allermeisten Installationen sollte drucken jetzt schon
-funktionieren.  Sollte ein Fehler auftreten wirft TeX sehr lange
-Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
-die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind
-zum Beispiel:
-
-   * ! LaTeX Error: File `eurosym.sty' not found.  Die entsprechende
-     LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
-     Vorlagen aus der Community auf. Installieren Sie die
-     entsprechenden Pakete.
-
-   * ! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for use
-     with LaTeX.  Dieser Fehler tritt auf, wenn sie versuchen mit einer
-     Standardinstallation exotische utf8 Zeichen zu drucken. TeXLive
-     unterstützt von Haus nur romanische Schriften und muss mit
-     diversen Tricks dazu gebracht werden andere Zeichen zu
-     akzeptieren. Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.
-
-   Wird garkein Fehler angezeigt sondern nur der Name des Templates,
-heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
-Prüfen Sie den Namen in der Konfiguration (Standard: `pdflatex'), und
-stellen Sie sicher, dass pdflatex (oder das von Ihnen verwendete
-System) vom Webserver ausgeführt werden darf.
-
-10 OpenDocument-Vorlagen
-************************
-
-Lx-Office unterstützt die Verwendung von Vorlagen im
-OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
-Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
-diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei
-`config/lx_office.conf' die Variable `opendocument' im Abschnitt
-`print_templates' auf `1' stehen.  Dieses ist die Standardeinstellung.
-
-   Weiterhin muss in der Datei `config/lx_office.conf' die Variable
-`dbcharset' im Abschnitt `system' auf die Zeichenkodierung gesetzt
-werden, die auch bei der Speicherung der Daten in der Datenbank
-verwendet wird. Diese ist in den meisten Fällen "UTF-8".
-
-   Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
-weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
-OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
-neben OpenOffice.org ab Version 2 auch der "X virtual frame buffer"
-(xvfb) installiert werden.  Bei Debian ist er im Paket "xvfb"
-enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
-
-   Nach der Installation müssen in der Datei `config/lx_config.conf'
-zwei weitere Variablen angepasst werden: `openofficeorg_writer' muss
-den vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
-`xvfb' muss den Pfad zum "X virtual frame buffer" enthalten. Beide
-stehen im Abschnitt `applications'.
-
-   Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
-OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
-Variable `$openofficeorg_daemon' gesetzt ist, startet ein OpenOffice,
-das auch nach der Umwandlung des Dokumentes gestartet bleibt. Bei
-weiteren Umwandlungen wird dann diese laufende Instanz benutzt. Der
-Vorteil ist, dass die Zeit zur Umwandlung deutlich reduziert wird, weil
-nicht für jedes Dokument ein OpenOffice gestartet werden muss. Der
-Nachteil ist, dass diese Methode Python und die Python-UNO-Bindings
-benötigt, die Bestandteil von OpenOffice 2 sind.
-
-   Ist `$openofficeorg_daemon' nicht gesetzt, so wird für jedes
-Dokument OpenOffice neu gestartet und die Konvertierung mit Hilfe eines
-Makros durchgeführt. Dieses Makro muss in der Dokumentenvorlage
-enthalten sein und "Standard.Conversion.ConvertSelfToPDF()" heißen. Die
-Beispielvorlage `templates/mastertemplates/German/invoice.odt' enthält
-ein solches Makro, das in jeder anderen Dokumentenvorlage ebenfalls
-enthalten sein muss.
-
-   Als letztes muss herausgefunden werden, welchen Namen OpenOffice.org
-Writer dem Verzeichnis mit den Benutzereinstellungen gibt. Unter Debian
-ist dies momentan `~/.openoffice.org2'. Sollte der Name bei Ihrer
-OpenOffice.org-Installation anders sein, so muss das Verzeichnis
-`users/.openoffice.org2' entsprechend umbenannt werden. Ist der Name
-z.B. einfach nur `.openoffice', so wäre folgender Befehl auszuführen:
-
-   `mv users/.openoffice.org2 users/.openoffice'
-
-   Dieses Verzeichnis, wie auch das komplette `users'-Verzeichnis, muss
-vom Webserver beschreibbar sein. Dieses wurde bereits erledigt (*note
-Manuelle Installation des Programmpaketes::), kann aber erneut überprüft
-werden, wenn die Konvertierung nach PDF fehlschlägt.
-
-11 Lx-Office ERP verwenden
-**************************
-
-Nach erfolgreicher Installation ist der Loginbildschirm unter folgender
-URL erreichbar:
-
-   `http://localhost/lx-office-erp/login.pl'
-
-   Die Administrationsseite erreichen Sie unter:
-
-   `http://localhost/lx-office-erp/admin.pl'
-
-
-\1f
-Local Variables:
-coding: utf-8
-End:
diff --git a/doc/Lx-Office_Installation_DE.pdf b/doc/Lx-Office_Installation_DE.pdf
deleted file mode 100644 (file)
index 02c0543..0000000
Binary files a/doc/Lx-Office_Installation_DE.pdf and /dev/null differ
diff --git a/doc/dokumentation.xml b/doc/dokumentation.xml
new file mode 100644 (file)
index 0000000..6e7248b
--- /dev/null
@@ -0,0 +1,5196 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<book id="ding.xml" lang="de">
+  <title>Lx-Office: Installation, Konfiguration, Entwicklung</title>
+
+  <chapter id="Aktuelle-Hinweise">
+    <title>Aktuelle Hinweise</title>
+
+    <para>Aktuelle Installations- und Konfigurationshinweise gibt es:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>auf der Lx-Office-Homepage unter <ulink
+        url="http://lx-office.org/index.php?id=dokumentation">http://lx-office.org/index.php?id=dokumentation</ulink></para>
+      </listitem>
+
+      <listitem>
+        <para>im Lx-Office-Wiki unter Dokumentation (<ulink
+        url="http://wiki.lx-office.org/index.php/Lx-Office_ERP">http://wiki.lx-office.org/index.php/Lx-Office_ERP</ulink>)</para>
+      </listitem>
+
+      <listitem>
+        <para>im Lx-Office-Forum: <ulink
+        url="http://www.lx-office.org/forum/">http://www.lx-office.org/forum/</ulink></para>
+      </listitem>
+    </itemizedlist>
+
+    <!--  -->
+  </chapter>
+
+  <chapter>
+    <title>Installation und Grundkonfiguration</title>
+
+    <sect1 id="Benötigte-Software-und-Pakete">
+      <title>Benötigte Software und Pakete</title>
+
+      <sect2 id="Betriebssystem">
+        <title>Betriebssystem</title>
+
+        <para>Lx-Office ist für Linux konzipiert, und sollte auf jedem
+        unixoiden Betriebssystem zum Laufen zu kriegen sein. Getestet ist
+        diese Version im speziellen auf Debian und Ubuntu, grundsätzlich wurde
+        bei der Auswahl der Pakete aber darauf Rücksicht genommen, dass es
+        ohne große Probleme auf den derzeit aktuellen verbreiteten
+        Distributionen läuft.</para>
+
+        <para>Anfang 2011 sind das folgende Systeme:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>Ubuntu 8.04 LTS Hardy Heron</para>
+          </listitem>
+
+          <listitem>
+            <para>Ubuntu 9.10 Karmic Koala</para>
+          </listitem>
+
+          <listitem>
+            <para>Ubuntu 10.04 Lucid Lynx</para>
+          </listitem>
+
+          <listitem>
+            <para>Ubuntu 10.10 Maverick Meerkat</para>
+          </listitem>
+
+          <listitem>
+            <para>Debian 5.0 Lenny</para>
+          </listitem>
+
+          <listitem>
+            <para>Debian 6.0 Squeeze</para>
+          </listitem>
+
+          <listitem>
+            <para>openSUSE 11.2</para>
+          </listitem>
+
+          <listitem>
+            <para>openSUSE 11.3</para>
+          </listitem>
+
+          <listitem>
+            <para>SuSE Linux Enterprice Server 11</para>
+          </listitem>
+
+          <listitem>
+            <para>Fedora 13</para>
+          </listitem>
+
+          <listitem>
+            <para>Fedora 14</para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Für die debianoiden Betriebssysteme existiert ein .deb, das
+        deutlich einfacher zu installieren ist.</para>
+
+        <para>Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die
+        Module im Archiv recht alt sind, und das viele der benötigten Module
+        nicht einfach zu installieren sind. Dafür sollte es kurz nach dem
+        Release ein eigenes .deb geben.</para>
+
+        <para>Alternativ dazu kann die normale Installation durchgeführt
+        werden (siehe <xref
+        linkend="Manuelle-Installation-des-Programmpaketes"/>), wenn vorher
+        ein Kompatibilitätspaket installiert wird, das die fehlenden Pakete
+        bereitstellt. Das Paket ist auf <ulink
+        url="https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/">Sourceforge</ulink>
+        unter dem Namen <filename>lx-erp-perl-libs-compat-v2.tar.gz</filename>
+        hinterlegt.</para>
+
+        <para>Zur Installation das Paket in das entpackte Lx-Office
+        Verzeichnis entpacken:</para>
+
+        <para><literal>tar xzf lx-erp-perl-libs-compat-v2.tar.gz
+        /path/to/lx-office/</literal></para>
+
+        <para>Zusätzlich müssen dann noch die folgenden Pakete installiert
+        weerden</para>
+
+        <para><literal>libbit-vector-perl libsub-exporter-perl libclone-perl
+        libclass-factory-util-perl</literal></para>
+
+        <para>Danach sollte der Installationscheck (siehe <xref
+        linkend="Pakete"/>) die enthaltenen Pakete erkennen.</para>
+      </sect2>
+
+      <sect2 id="Pakete" xreflabel="Pakete">
+        <title>Pakete</title>
+
+        <para>Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist
+        Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
+        benötigt.</para>
+
+        <para>Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die
+        nicht Bestandteil einer Standard-Perl-Installation sind:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>parent</para>
+          </listitem>
+
+          <listitem>
+            <para>Archive::Zip</para>
+          </listitem>
+
+          <listitem>
+            <para>Config::Std</para>
+          </listitem>
+
+          <listitem>
+            <para>DateTime</para>
+          </listitem>
+
+          <listitem>
+            <para>DBI</para>
+          </listitem>
+
+          <listitem>
+            <para>DBD::Pg</para>
+          </listitem>
+
+          <listitem>
+            <para>Email::Address</para>
+          </listitem>
+
+          <listitem>
+            <para>JSON</para>
+          </listitem>
+
+          <listitem>
+            <para>List::MoreUtils</para>
+          </listitem>
+
+          <listitem>
+            <para>Params::Validate</para>
+          </listitem>
+
+          <listitem>
+            <para>PDF::API2</para>
+          </listitem>
+
+          <listitem>
+            <para>Rose::Object</para>
+          </listitem>
+
+          <listitem>
+            <para>Rose::DB</para>
+          </listitem>
+
+          <listitem>
+            <para>Rose::DB::Object</para>
+          </listitem>
+
+          <listitem>
+            <para>Template</para>
+          </listitem>
+
+          <listitem>
+            <para>Text::CSV_XS</para>
+          </listitem>
+
+          <listitem>
+            <para>Text::Iconv</para>
+          </listitem>
+
+          <listitem>
+            <para>URI</para>
+          </listitem>
+
+          <listitem>
+            <para>XML::Writer</para>
+          </listitem>
+
+          <listitem>
+            <para>YAML</para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
+        hinzugekommen, <literal>URI</literal> und
+        <literal>XML::Writer</literal> sind notwendig. Ohne startet Lx-Office
+        nicht.</para>
+
+        <para>Gegenüber Version 2.6.1 sind <literal>parent</literal>,
+        <literal>DateTime</literal>, <literal>Rose::Object</literal>,
+        <literal>Rose::DB</literal> und <literal>Rose::DB::Object</literal>
+        neu hinzugekommen. <literal>IO::Wrap</literal> wurde entfernt.</para>
+
+        <para>Gegenüber Version 2.6.3 ist <literal>JSON</literal> neu
+        hinzugekommen.</para>
+
+        <para><literal>Email::Address</literal> und
+        <literal>List::MoreUtils</literal> sind schon länger feste
+        Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert. Beide
+        sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
+        zukünftigen Version aber aus dem Paket entfernt werden. Es wird
+        empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
+        installieren.</para>
+
+        <para>Die zu installierenden Pakete können in den verschiedenen
+        Distributionen unterschiedlich heißen.</para>
+
+        <para>Für Debian oder Ubuntu benötigen Sie diese Pakete:</para>
+
+        <para><literal>apache2 postgresql libparent-perl libarchive-zip-perl
+        libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl
+        libemail-address-perl liblist-moreutils-perl libpdf-api2-perl
+        librose-object-perl librose-db-perl librose-db-object-perl
+        libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl
+        libxml-writer-perl libyaml-perl libconfig-std-perl
+        libparams-validate-perl libjson-perl</literal></para>
+
+        <para>Für Fedora Core benötigen Sie diese Pakete:</para>
+
+        <para><literal>httpd postgresql-server perl-parent perl-DateTime
+        perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils
+        perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object
+        perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI
+        perl-XML-Writer perl-YAML</literal></para>
+
+        <para>Für OpenSuSE benötigen Sie diese Pakete:</para>
+
+        <para><literal>apache2 postgresql-server perl-Archive-Zip
+        perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils
+        perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
+        perl-URI perl-XML-Writer perl-YAML</literal></para>
+
+        <para>Bei openSuSE 11 ist <literal>parent</literal> bereits enthalten,
+        und braucht nicht nachinstalliert werden. Die
+        <literal>Rose::*</literal> Pakete sind derzeit nicht für SuSE gepackt,
+        und müssen anderweitig nachinstalliert werden.</para>
+
+        <para>Lx-Office enthält ein Script, mit dem überprüft werden kann, ob
+        alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
+        folgt:</para>
+
+        <programlisting>./scripts/installation_check.pl</programlisting>
+      </sect2>
+    </sect1>
+
+    <sect1 id="Manuelle-Installation-des-Programmpaketes"
+           xreflabel="Manuelle Installation des Programmpaketes">
+      <title>Manuelle Installation des Programmpaketes</title>
+
+      <para>Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird
+      im Dokumentenverzeichnis des Webservers (z.B.
+      <filename>/var/www/html/</filename>,
+      <filename>/srv/www/htdocs</filename> oder
+      <filename>/var/www/</filename>) entpackt:</para>
+
+      <programlisting>cd /var/www tar xvzf
+lxoffice-erp-2.6.2.tgz</programlisting>
+
+      <para>Verändern Sie evtl. noch den Namen des Verzeichnisses mit</para>
+
+      <programlisting>mv lxoffice-erp/ lx-erp/</programlisting>
+
+      <para>Alternativ können Sie auch einen Alias in der
+      Webserverkonfiguration benutzen, um auf das tatsächliche
+      Installationsverzeichnis zu verweisen.</para>
+
+      <para>Die Verzeichnisse <filename>users</filename>,
+      <filename>spool</filename> und <filename>webdav</filename> müssen für
+      den Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
+      restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
+      Benutzername ist bei verschiedenen Distributionen unterschiedlich (z.B.
+      bei Debian/Ubuntu <constant>www-data</constant>, bei Fedora core
+      <constant>apache</constant> oder bei OpenSuSE
+      <constant>wwwrun</constant>).</para>
+
+      <para>Der folgende Befehl ändert den Besitzer für die oben genannten
+      Verzeichnisse auf einem Debian/Ubuntu-System:</para>
+
+      <programlisting>chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav</programlisting>
+
+      <para>Weiterhin muss der Webserver-Benutzer im Verzeichnis
+      <filename>templates</filename> Verzeichnisse für jeden neuen Benutzer,
+      der in lx-office angelegt wird, anlegen dürfen:</para>
+
+      <programlisting>chgrp www-data lx-office-erp/templates
+chmod g+w lx-office-erp/templates</programlisting>
+    </sect1>
+
+    <sect1 id="config.config-file">
+     <title>Lx-Office-Konfigurationsdatei</title>
+
+     <sect2 id="config.config-file.introduction" xreflabel="Einführung in die Konfigurationsdatei">
+      <title>Einführung</title>
+
+      <para>
+       Seit Lx-Office 2.6.3. gibt es nur noch eine Konfigurationsdatei die benötigt wird: <filename>config/lx_office.conf</filename> (kurz:
+       "die Hauptkonfigurationsdatei"). Diese muss bei der Erstinstallation von Lx-Office bzw. der Migration von älteren Versionen angelegt
+       werden.
+      </para>
+
+      <para>
+       Als Vorlage dient die Datei <filename>config/lx_office.conf.default</filename> (kurz: "die Default-Datei"):
+      </para>
+
+      <programlisting>$ cp config/lx_office.conf.default config/lx_office.conf</programlisting>
+
+      <para>
+       Die Default-Datei wird immer zuerst eingelesen. Werte, die in der Hauptkonfigurationsdatei stehen, überschreiben die
+       Werte aus der Default-Datei. Die Hauptkonfigurationsdatei muss also nur die Abschintte und Werte
+       enthalten, die von denen der Default-Datei abweichen.
+      </para>
+
+      <para>
+       Diese Hauptkonfigurationsdatei ist dann eine installationsspezifische Datei, d.h. sie enthält bspw. lokale Passwörter und wird auch
+       nicht im Versionsmanagement (git) verwaltet.
+      </para>
+
+      <para>
+       Die Konfiguration ist ferner serverabhängig, d.h. für alle Mandaten, bzw. Datenbanken gleich.
+      </para>
+     </sect2>
+
+     <sect2 id="config.config-file.sections-parameters">
+      <title>Abschnitte und Parameter</title>
+
+      <para>
+       Die Konfigurationsdatei besteht aus mehreren Teilen, die entsprechend kommentiert sind:
+      </para>
+
+      <itemizedlist>
+       <listitem><para><literal>authentication</literal></para></listitem>
+       <listitem><para><literal>authentication/database</literal></para></listitem>
+       <listitem><para><literal>authentication/ldap</literal></para></listitem>
+       <listitem><para><literal>system</literal></para></listitem>
+       <listitem><para><literal>features</literal></para></listitem>
+       <listitem><para><literal>paths</literal></para></listitem>
+       <listitem><para><literal>applications</literal></para></listitem>
+       <listitem><para><literal>environment</literal></para></listitem>
+       <listitem><para><literal>print_templates</literal></para></listitem>
+       <listitem><para><literal>task_server</literal></para></listitem>
+       <listitem><para><literal>periodic_invoices</literal></para></listitem>
+       <listitem><para><literal>console</literal></para></listitem>
+       <listitem><para><literal>debug</literal></para></listitem>
+      </itemizedlist>
+
+      <para>
+       Die üblicherweise wichtigsten Parameter, die am Anfang einzustellen oder zu kontrollieren sind, sind:
+      </para>
+
+      <programlisting>[authentication]
+admin_password = geheim
+
+[authentication/database]
+host     = localhost
+port     = 5432
+db       = lxerp_auth
+user     = postgres
+password =
+
+[system]
+eur = 1
+dbcharset = UTF-8</programlisting>
+
+       <para>
+        Nutzt man wiederkehrende Rechnungen, kann man unter <literal>[periodic_invoices]</literal> den Login eines Benutzers angeben, der
+        nach Erstellung der Rechnungen eine entsprechende E-Mail mit Informationen über die erstellten Rechnungen bekommt.
+       </para>
+
+       <para>
+        Nutzt man den Taskserver für wiederkehrende Rechnungen, muss unter <literal>[task_server]</literal> ein Login eines Benutzers
+        angegeben werden, mit dem sich der Taskserver an Lx-Office bei der Datenbank anmeldet, die dem Benutzer zugewiesen ist.
+       </para>
+
+       <para>
+        Für Entwickler finden sich unter <literal>[debug]</literal> wichtige Funktionen, um die Fehlersuche zu erleichtern.
+       </para>
+     </sect2>
+
+     <sect2 id="config.config-file.prior-versions">
+      <title>Versionen vor 2.6.3</title>
+
+      <para>
+       In älteren Lx-Office Versionen gab es im Verzeichnis <filename>config</filename> die Dateien <filename>authentication.pl</filename>
+       und <filename>lx-erp.conf</filename>, die jeweils Perl-Dateien waren. Es gab auch die Möglichkeit, eine lokale Version der
+       Konfigurationsdatei zu erstellen (<literal>lx-erp-local.conf</literal>). Dies ist ab 2.6.3 nicht mehr möglich, aber auch nicht mehr
+       nötig.
+      </para>
+
+      <para>
+       Beim Update von einer Lx-Office-Version vor 2.6.3 auf 2.6.3 oder jünger müssen die Einstellungen aus den alten Konfigurationsdateien
+       manuell übertragen und die alten Konfigurationsdateien anschließend gelöscht oder verschoben werden. Ansonsten zeigt Lx-Office eine
+       entsprechende Fehlermeldung an.
+      </para>
+     </sect2>
+    </sect1>
+
+    <sect1 id="Anpassung-der-PostgreSQL-Konfiguration">
+      <title>Anpassung der PostgreSQL-Konfiguration</title>
+
+      <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
+
+      <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
+        <title>Zeichensätze/die Verwendung von UTF-8</title>
+
+        <para>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
+        werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
+        Version 8.0 oder neuer benutzt werden, und der
+        PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
+        angelegt worden sein.</para>
+
+        <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
+        “template1” “UTF8”, so kann auch Lx-Office mit UTF-8 betrieben werden.
+        Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
+        UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
+        Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:</para>
+
+        <para><literal>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8
+        8.2 clustername</literal></para>
+
+        <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete
+        Versionsnummer angepasst werden.</para>
+
+        <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
+
+        <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
+        ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
+        Lx-Office mit ISO-8859-15 als Encoding betrieben werden.</para>
+
+        <para>Das Encoding einer Datenbank kann in <literal>psql</literal> mit
+        <literal>\l</literal> geprüft werden.</para>
+      </sect2>
+
+      <sect2 id="Änderungen-an-Konfigurationsdateien">
+        <title>Änderungen an Konfigurationsdateien</title>
+
+        <para>In der Datei <literal>postgresql.conf</literal>, die je nach
+        Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
+        <literal>/var/lib/pgsql/data/</literal> oder
+        <literal>/etc/postgresql/</literal>, muss sichergestellt werden, dass
+        TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
+        Parameter <literal>listen_address</literal> gesteuert. Laufen
+        PostgreSQL und Lx-Office auf demselben Rechner, so kann dort der Wert
+        <literal>localhost</literal> verwendet werden. Andernfalls müssen
+        Datenbankverbindungen auch von anderen Rechnern aus zugelassen werden,
+        was mit dem Wert \<literal>*</literal> geschieht.</para>
+
+        <para>In der Datei <literal>pg_hba.conf</literal>, die im gleichen
+        Verzeichnis wie die <literal>postgresql.conf</literal> zu finden sein
+        sollte, müssen die Berichtigungen für den Zugriff geändert werden.
+        Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
+        Verbindungen immer zuzulassen</para>
+
+        <para><literal>local all all trust host all all 127.0.0.1 255.0.0.0
+        trust</literal></para>
+
+        <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
+        Passwort zuzulassen. Beispielsweise:</para>
+
+        <para><literal>local all lxoffice password host all lxoffice 127.0.0.1
+        255.255.255.255 password</literal></para>
+
+        <!--  -->
+      </sect2>
+
+      <sect2 id="Erweiterung-für-servergespeicherte-Prozeduren">
+        <title>Erweiterung für servergespeicherte Prozeduren</title>
+
+        <para>In der Datenbank <literal>template1</literal> muss die
+        Unterstützung für servergespeicherte Prozeduren eingerichet werden.
+        Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
+        führen Sie die folgenden Kommandos aus:</para>
+
+        <para><literal>create language 'plpgsql';</literal></para>
+
+        <para>Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler
+        für die Sprache manuell anlelegt werden, diese Versionen werden aber
+        nicht mehr offiziell von Lx-Office unterstützt. Dafür dann die
+        folgenden Kommandos:</para>
+
+        <para><literal>create function plpgsql_call_handler () returns opaque
+        as '/usr/lib/pgsql/plpgsql.so' language 'c'; create language 'plpgsql'
+        handler plpgsql_call_handler lancompiler 'pl/pgsql';</literal></para>
+
+        <para>Bitte beachten Sie, dass der Pfad zur Datei
+        <literal>plpgsql.so</literal> von Distribution zu Distribution
+        verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich unter
+        <literal>/usr/lib/postgresql/lib/plpgsql.so</literal>.</para>
+
+        <!--  -->
+      </sect2>
+
+      <sect2 id="Datenbankbenutzer-anlegen">
+        <title>Datenbankbenutzer anlegen</title>
+
+        <para>Wenn Sie nicht den Datenbanksuperuser “postgres” zum Zugriff
+        benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
+        anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
+        können:</para>
+
+        <para><literal>su - postgres createuser -d -P
+        lxoffice</literal></para>
+
+        <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
+        Sie den evtl. voreingestellten Benutzer “postgres” auf “lxoffice” bzw.
+        den hier gewählten Benutzernamen.</para>
+
+        <!--  -->
+      </sect2>
+    </sect1>
+
+    <sect1 id="Apache-Konfiguration">
+      <title>Webserver-Konfiguration</title>
+
+      <sect2>
+        <title>Grundkonfiguration mittels CGI</title>
+
+        <note>
+          <para>Für einen deutlichen Performanceschub sorgt die Ausführung
+          mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
+          <xref linkend="Apache-Konfiguration.FCGI"/> beschrieben.</para>
+        </note>
+
+        <para>Der Zugriff auf das Programmverzeichnis muss in der Apache
+        Webserverkonfigurationsdatei <literal>httpd.conf</literal> eingestellt
+        werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
+        anderen Datei hinzu, die beim Starten des Webservers eingelesen
+        wird:</para>
+
+        <para><literal> AddHandler cgi-script .pl Alias /lx-erp/
+        /var/www/lx-erp/ &lt;Directory /var/www/lx-erp&gt; Options ExecCGI
+        Includes FollowSymlinks &lt;/Directory&gt; &lt;Directory
+        /var/www/lx-erp/users&gt; Order Deny,Allow Deny from All
+        &lt;/Directory&gt; </literal></para>
+
+        <para>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher
+        das Lx-Office-Archiv entpacket haben.</para>
+
+        <para>Achtung: Vor den einzelnen Optionen muss bei einigen
+        Distributionen ein Plus ‘<literal>+</literal>’ gesetzt werden.</para>
+
+        <para>Auf einigen Webservern werden manchmal die Grafiken und
+        Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft
+        geholfen, die folgende Option in die Konfiguration aufzunehmen:</para>
+
+        <para><literal>EnableSendfile Off</literal></para>
+      </sect2>
+
+      <sect2 id="Apache-Konfiguration.FCGI"
+             xreflabel="Konfiguration für FastCGI/FCGI">
+        <title>Konfiguration für FastCGI/FCGI</title>
+
+        <sect3 id="Apache-Konfiguration.FCGI.WasIstEs">
+          <title>Was ist FastCGI?</title>
+
+          <para>Direkt aus <ulink
+          url="http://de.wikipedia.org/wiki/FastCGI">Wikipedia</ulink>
+          kopiert:</para>
+
+          <para><citation> 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. </citation></para>
+        </sect3>
+
+        <sect3 id="Apache-Konfiguration.FCGI.Warum">
+          <title>Warum FastCGI?</title>
+
+          <para>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 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.</para>
+
+          <para>Mit FastCGI werden nun die Module einmal geladen, und danach
+          wird nur die eigentliche Programmlogik ausgeführt.</para>
+        </sect3>
+
+        <sect3 id="Apache-Konfiguration.FCGI.WebserverUndPlugin">
+          <title>Getestete Kombinationen aus Webservern und Plugin</title>
+
+          <para>Folgende Kombinationen sind getestet:</para>
+
+          <itemizedlist>
+            <listitem>
+              <para>Apache 2.2.11 (Ubuntu) und mod_fcgid.</para>
+            </listitem>
+
+            <listitem>
+              <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer
+          Zeit nicht mehr weiter entwickelt wird. Im Folgenden wird auf
+          mod_fastcgi nicht mehr explizit eingegangen.</para>
+
+          <para>Als Perl Backend wird das Modul <filename>FCGI.pm</filename>
+          verwendet.</para>
+
+          <warning>
+            <para>FCGI 0.69 und höher ist extrem strict in der Behandlung von
+            Unicode, und verweigert bestimmte Eingaben von Lx-Office. Falls es
+            Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
+            Vorgängerversion FCGI 0.68 ausgewichen werden.</para>
+          </warning>
+
+          <para>Mit CPAN lässt sie sich die Vorgängerversion wie folgt
+          installieren:</para>
+
+          <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
+        </sect3>
+
+        <sect3 id="Apache-Konfiguration.FCGI.Konfiguration">
+          <title>Konfiguration des Webservers</title>
+
+          <para>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.</para>
+
+          <para>Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann
+          unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:</para>
+
+          <programlisting>a2enmod fcgid</programlisting>
+
+          <para>Die Konfiguration für die Verwendung von Lx-Office mit FastCGI
+          erfolgt durch Anpassung der vorhandenen <function>Alias</function>-
+          und <function>Directory</function>-Direktiven. Dabei wird zwischen
+          dem Installationspfad von Lx-Office im Dateisystem
+          ("<filename>/path/to/lx-office-erp</filename>") und der URL
+          unterschieden, unter der Lx-Office im Webbrowser erreichbar ist
+          ("<filename>/web/path/to/lx-office-erp</filename>").</para>
+
+          <para>Folgender Konfigurationsschnipsel funktioniert mit
+          mod_fastcgi:</para>
+
+          <programlisting>AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
+Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
+
+&lt;Directory /path/to/lx-office-erp&gt;
+  AllowOverride All
+  Options ExecCGI Includes FollowSymlinks
+  Order Allow,Deny
+  Allow from All
+&lt;/Directory&gt;
+
+&lt;DirectoryMatch /path/to/lx-office-erp/users&gt;
+  Order Deny,Allow
+  Deny from All
+&lt;/DirectoryMatch&gt;</programlisting>
+
+          <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
+          die maximale Größe eines Requests. Diese sollte wie folgt
+          hochgesetzt werden:</para>
+
+          <programlisting>FcgidMaxRequestLen 10485760</programlisting>
+
+          <para>Das ganze sollte dann so aussehen:</para>
+
+          <programlisting>AddHandler fcgid-script .fpl
+AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
+Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
+FcgidMaxRequestLen 10485760
+
+&lt;Directory /path/to/lx-office-erp&gt;
+  AllowOverride All
+  Options ExecCGI Includes FollowSymlinks
+  Order Allow,Deny
+  Allow from All
+&lt;/Directory&gt;
+
+&lt;DirectoryMatch /path/to/lx-office-erp/users&gt;
+  Order Deny,Allow
+  Deny from All
+&lt;/DirectoryMatch&gt;</programlisting>
+
+          <para>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.</para>
+
+          <para>Es ist möglich, die gleiche Lx-Office Version parallel unter
+          CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven
+          wie oben beschrieben, die URLs werden aber umgeleitet:</para>
+
+          <programlisting># Zugriff über CGI
+Alias       /web/path/to/lx-office-erp                /path/to/lx-office-erp
+
+# Zugriff mit mod_fcgid:
+AliasMatch ^/web/path/to/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
+Alias       /web/path/to/lx-office-erp-fcgid/          /path/to/lx-office-erp/</programlisting>
+
+          <para>Dann ist unter
+          <filename>/web/path/to/lx-office-erp/</filename> die normale Version
+          erreichbar, und unter
+          <constant>/web/path/to/lx-office-erp-fcgid/</constant> die
+          FastCGI-Version.</para>
+        </sect3>
+      </sect2>
+    </sect1>
+
+    <sect1 id="Der-Task-Server">
+      <title>Der Task-Server</title>
+
+      <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
+      regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
+      festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
+      wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
+      benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
+      bekommen.</para>
+
+      <sect2 id="Konfiguration-des-Task-Servers">
+        <title>Verfügbare und notwendige Konfigurationsoptionen</title>
+
+        <para>Die Konfiguration erfolgt über den Abschnitt
+        <literal>[task_server]</literal> in der Datei
+        <filename>config/lx_office.conf</filename>. Die dort verfügbaren
+        Optionen sind:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><literal>login</literal>: gültiger Lx-Office-Benutzername,
+            der benutzt wird, um die zu verwendende Datenbankverbindung
+            auszulesen. Der Benutzer muss in der Administration angelegt
+            werden. Diese Option muss angegeben werden.</para>
+          </listitem>
+
+          <listitem>
+            <para><literal>run_as</literal>: Wird der Server vom
+            Systembenutzer <literal>root</literal> gestartet, so wechselt er
+            auf den mit <literal>run_as</literal> angegebenen Systembenutzer.
+            Der Systembenutzer muss dieselben Lese- und Schreibrechte haben,
+            wie auch der Webserverbenutzer (siehe see <xref
+            linkend="Manuelle-Installation-des-Programmpaketes"/>). Daher ist
+            es sinnvoll, hier denselben Systembenutzer einzutragen, unter dem
+            auch der Webserver läuft.</para>
+          </listitem>
+
+          <listitem>
+            <para><literal>debug</literal>: Schaltet Debug-Informationen an
+            und aus.</para>
+          </listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="Einbinden-in-den-Boot-Prozess">
+        <title>Automatisches Starten des Task-Servers beim Booten</title>
+
+        <para>Der Task-Server verhält sich von seinen Optionen her wie ein
+        reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim
+        Starten automatisch in das Lx-Office-Installationsverzeichnis.</para>
+
+        <para>Deshalb ist es möglich, ihn durch Setzen eines symbolischen
+        Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
+        einzubinden. Da das bei neueren Linux-Distributionen aber nicht
+        zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
+        anstelle eines symbolischen Links verwendet werden können.</para>
+
+        <sect3>
+          <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
+          Core)</title>
+
+          <para>Kopieren Sie die Datei
+          <filename>scripts/boot/system-v/lx-office-task-server</filename>
+          nach <filename>/etc/init.d/lx-office-task-server</filename>. Passen
+          Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
+          <literal>DAEMON=....</literal>). Binden Sie das Script in den
+          Boot-Prozess ein. Dies ist distributionsabhängig:</para>
+
+          <itemizedlist>
+            <listitem>
+              <para>Debian-basierende Systeme:</para>
+
+              <para><literal>update-rc.d lx-office-task-server defaults # Nur
+              bei Debian Squeeze und neuer: insserv
+              lx-office-task-server</literal></para>
+            </listitem>
+
+            <listitem>
+              <para>OpenSuSE und Fedora Core:</para>
+
+              <para><literal>chkconfig --add
+              lx-office-task-server</literal></para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
+          werden: <literal>/etc/init.d/lx-office-task-server
+          start</literal></para>
+        </sect3>
+
+        <sect3>
+          <title>Upstart-basierende Systeme (z.B. Ubuntu)</title>
+
+          <para>Kopieren Sie die Datei
+          <filename>scripts/boot/upstart/lx-office-task-server.conf</filename>
+          nach <filename>/etc/init/lx-office-task-server.conf</filename>.
+          Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
+          <literal>exec ....</literal>).</para>
+
+          <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
+          werden: <literal>service lx-office-task-server
+          start</literal></para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="Prozesskontrolle">
+        <title>Wie der Task-Server gestartet und beendet wird</title>
+
+        <para>Der Task-Server wird wie folgt kontrolliert:</para>
+
+        <para><literal>./scripts/task_server.pl Befehl</literal></para>
+
+        <para><literal>Befehl</literal> ist dabei eine der folgenden
+        Optionen:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><literal>start</literal> startet eine neue Instanz des
+            Task-Servers. Die Prozess-ID wird innerhalb des
+            <filename>users</filename>-Verzeichnisses abgelegt.</para>
+          </listitem>
+
+          <listitem>
+            <para><literal>stop</literal> beendet einen laufenden
+            Task-Server.</para>
+          </listitem>
+
+          <listitem>
+            <para><literal>restart</literal> beendet und startet ihn
+            neu.</para>
+          </listitem>
+
+          <listitem>
+            <para><literal>status</literal> berichtet, ob der Task-Server
+            läuft.</para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Der Task-Server wechselt beim Starten automatisch in das
+        Lx-Office-Installationsverzeichnis.</para>
+
+        <para>Dieselben Optionen können auch für die SystemV-basierenden
+        Runlevel-Scripte benutzt werden (siehe oben).</para>
+
+        <!--  -->
+      </sect2>
+    </sect1>
+
+    <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
+      <title>Benutzerauthentifizierung und Administratorpasswort</title>
+
+      <para>Informationen über die Einrichtung der Benutzerauthentifizierung,
+      über die Verwaltung von Gruppen und weitere Einstellungen</para>
+
+      <!--  -->
+
+      <sect2 id="Grundlagen-zur-Benutzerauthentifizierung">
+        <title>Grundlagen zur Benutzerauthentifizierung</title>
+
+        <para>Lx-Office verwaltet die Benutzerinformationen in einer
+        Datenbank, die im folgenden “Authentifizierungsdatenbank” genannt
+        wird. Für jeden Benutzer kann dort eine eigene Datenbank für die
+        eigentlichen Finanzdaten hinterlegt sein. Diese beiden Datenbanken
+        können, müssen aber nicht unterschiedlich sein.</para>
+
+        <para>Im einfachsten Fall gibt es für Lx-Office nur eine einzige
+        Datenbank, in der sowohl die Benutzerinformationen als auch die Daten
+        abgelegt werden.</para>
+
+        <para>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
+        entweder gegen die Authentifizierungsdatenbank oder gegen einen
+        LDAP-Server überprüft werden.</para>
+
+        <para>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
+        Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
+        Konfigurationsdatei <filename>config/lx_office.conf</filename>
+        festgelegt. Diese muss bei der Installation und bei einem Upgrade von
+        einer Version vor v2.6.0 angelegt werden. Eine
+        Beispielkonfigurationsdatei
+        <filename>config/lx_office.conf.default</filename> existiert, die als
+        Vorlage benutzt werden kann.</para>
+      </sect2>
+
+      <sect2 id="Administratorpasswort">
+        <title>Administratorpasswort</title>
+
+        <para>Das Passwort, das zum Zugriff auf das Aministrationsinterface
+        benutzt wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch
+        nur dort und nicht mehr im Administrationsinterface selber geändert
+        werden. Der Parameter dazu heißt
+        <literal>$self-&gt;{admin_password}</literal>.</para>
+      </sect2>
+
+      <sect2 id="Authentifizierungsdatenbank">
+        <title>Authentifizierungsdatenbank</title>
+
+        <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den
+        Parametern in <literal>$self-&gt;{DB_config}</literal> konfiguriert.
+        Hier sind die folgenden Parameter anzugeben:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>‘<literal>host</literal>’ – Der Rechnername oder die
+            IP-Adresse des Datenbankservers</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>port</literal>’ – Die Portnummer des
+            Datenbankservers, meist 5432</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>db</literal>’ – Der Name der
+            Authentifizierungsdatenbank</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>user</literal>’ – Der Benutzername, mit dem sich
+            Lx-Office beim Datenbankserver anmeldet (z.B. “postgres”)</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>password</literal>’ – Das Passwort für den
+            Datenbankbenutzer</para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
+        automatisch anlegen (mehr dazu siehe unten).</para>
+      </sect2>
+
+      <sect2 id="Passwortüberprüfung">
+        <title>Passwortüberprüfung</title>
+
+        <para>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen
+        die Authentifizierungsdatenbank und gegen einen externen LDAP- oder
+        Active-Directory-Server. Welche davon benutzt wird, regelt der
+        Parameter <literal>$self-&gt;{module}</literal>.</para>
+
+        <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+        gespeichert werden, so muss der Parameter
+        <literal>$self-&gt;{module}</literal> den Wert ‘<literal>DB</literal>’
+        enthalten. In diesem Fall können sowohl der Administrator als auch die
+        Benutzer selber ihre Psaswörter in Lx-Office ändern.</para>
+
+        <para>Soll hingegen ein externer LDAP- oder Active-Directory-Server
+        benutzt werden, so muss der Parameter
+        <literal>$self-&gt;{module}</literal> auf ‘<literal>LDAP</literal>’
+        gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
+        den LDAP-Server in <literal>$self-&gt;{LDAP_config}</literal>
+        angegeben werden:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>‘<literal>host</literal>’ – Der Rechnername oder die
+            IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe
+            ist zwingend erforderlich.</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>port</literal>’ – Die Portnummer des LDAP-Servers;
+            meist 389.</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>tls</literal>’ – Wenn Verbindungsverschlüsselung
+            gewünscht ist, so diesen Wert auf ‘<literal>1</literal>’ setzen,
+            andernfalls auf ‘<literal>0</literal>’ belassen</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>attribute</literal>’ – Das LDAP-Attribut, in dem
+            der Benutzername steht, den der Benutzer eingegeben hat. Für
+            Active-Directory-Server ist dies meist
+            ‘<literal>sAMAccountName</literal>’, für andere LDAP-Server
+            hingegen ‘<literal>uid</literal>’. Diese Angabe ist zwingend
+            erforderlich.</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>base_dn</literal>’ – Der Abschnitt des
+            LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend
+            erforderlich.</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>filter</literal>’ – Ein optionaler LDAP-Filter.
+            Enthält dieser Filter das Wort <literal>&lt;%login%&gt;</literal>,
+            so wird dieses durch den vom Benutzer eingegebenen Benutzernamen
+            ersetzt. Andernfalls wird der LDAP-Baum nach einem Element
+            durchsucht, bei dem das oben angegebene Attribut mit dem
+            Benutzernamen identisch ist.</para>
+          </listitem>
+
+          <listitem>
+            <para>‘<literal>bind_dn</literal>’ und
+            ‘<literal>bind_password</literal>’ – Wenn der LDAP-Server eine
+            Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist
+            dies bei Active-Directory-Servern der Fall), so kann diese hier
+            angegeben werden. Für Active-Directory-Server kann als
+            ‘<literal>bind_dn</literal>’ entweder eine komplette LDAP-DN wie
+            z.B. ‘<literal>cn=Martin
+            Mustermann,cn=Users,dc=firmendomain</literal>’ auch nur der volle
+            Name des Benutzers eingegeben werden; in diesem Beispiel also
+            ‘<literal>Martin Mustermann</literal>’.</para>
+          </listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="Name-des-Session-Cookies">
+        <title>Name des Session-Cookies</title>
+
+        <para>Sollen auf einem Server mehrere Lx-Office-Installationen
+        aufgesetzt werden, so müssen die Namen der Session-Cookies für alle
+        Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
+        Parameter <literal>$self-&gt;{cookie_name}</literal> gesetzt.</para>
+
+        <para>Diese Angabe ist optional, wenn nur eine Installation auf dem
+        Server existiert.</para>
+      </sect2>
+
+      <sect2 id="Anlegen-der-Authentifizierungsdatenbank">
+        <title>Anlegen der Authentifizierungsdatenbank</title>
+
+        <para>Nachdem alle Einstellungen in
+        <filename>config/lx_office.conf</filename> vorgenommen wurden, muss
+        Lx-Office die Authentifizierungsdatenbank anlegen. Dieses geschieht
+        automatisch, wenn Sie sich im Administrationsmodul anmelden, das unter
+        der folgenden URL erreichbar sein sollte:</para>
+
+        <para><ulink
+        url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
+
+        <!--  -->
+      </sect2>
+    </sect1>
+
+    <sect1 id="Benutzer--und-Gruppenverwaltung">
+      <title>Benutzer- und Gruppenverwaltung</title>
+
+      <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
+      angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
+      folgender URL finden:</para>
+
+      <para><ulink
+      url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
+
+      <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
+      <filename>config/lx_office.conf</filename> eingetragen haben.</para>
+
+      <sect2 id="Zusammenhänge">
+        <title>Zusammenhänge</title>
+
+        <para>Lx-Office verwendet eine Datenbank zum Speichern all seiner
+        Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
+        mit Lx-Office arbeiten zu können, muss eine Person einen
+        Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
+        Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
+        möglich und normal, dass mehreren Benutzern die selbe Datenbank
+        zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
+        können.</para>
+
+        <para>Die Basisdaten der Benutzer, die in der Administration
+        eingegeben werden können, werden in einer zweiten Datenbank
+        gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
+        ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
+        Pro Lx-Office-Installation gibt es nur eine
+        Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
+        Firmendaten.</para>
+
+        <para>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
+        Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
+        gestattet, so werden der entsprechenden Menüpunkte auch nicht
+        angezeigt. Diese Rechte werden ebenfalls in der
+        Authentifizierungsdatenbank gespeichert.</para>
+
+        <para>Um Rechte verteilen zu können, verwendet Lx-Office ein
+        Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
+        erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
+        mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
+        Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
+        Benutzer Mitglied ist.</para>
+
+        <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
+        Benutzer angelegt werden sollten, lautet:</para>
+
+        <orderedlist numeration="arabic">
+          <listitem>
+            <para>Datenbank anlegen</para>
+          </listitem>
+
+          <listitem>
+            <para>Gruppen anlegen</para>
+          </listitem>
+
+          <listitem>
+            <para>Benutzer anlegen</para>
+          </listitem>
+
+          <listitem>
+            <para>Benutzer den Gruppen zuordnen</para>
+          </listitem>
+        </orderedlist>
+      </sect2>
+
+      <sect2 id="Datenbanken-anlegen">
+        <title>Datenbanken anlegen</title>
+
+        <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
+        den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
+        Beispielen ist dies ‘<literal>lxoffice</literal>’).</para>
+
+        <para>Wenn Sie für die Lx-Office-Installation nicht den europäischen
+        Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
+        müssen Sie vor dem Anlegen der Datenbank in der Datei
+        <filename>config/lx_office.conf</filename> die Variable
+        <literal>dbcharset</literal> im Abschnitt <literal>system</literal>
+        auf den Wert ‘<literal>UTF-8</literal>’ setzen. Zusätzlich muss beim
+        Anlegen der Datenbank ‘<literal>UTF-8 Unicode</literal>’ als
+        Schriftsatz ausgewählt werden.</para>
+
+        <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
+        verwenden müssen, da diese Einstellungen momentan global in Lx-Office
+        vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
+        Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
+        angelegt worden sein.</para>
+      </sect2>
+
+      <sect2 id="Gruppen-anlegen">
+        <title>Gruppen anlegen</title>
+
+        <para>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
+        Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
+        Anlegen können Sie die verschiedenen Bereiche wählen, auf die
+        Mitglieder dieser Gruppe Zugriff haben sollen.</para>
+
+        <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
+        Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
+        Datenbanken, die in dieser Installation verwaltet werden.</para>
+      </sect2>
+
+      <sect2 id="Benutzer-anlegen">
+        <title>Benutzer anlegen</title>
+
+        <para>Beim Anlegen von Benutzern werden für viele Parameter
+        Standardeinstellungen vorgenommen, die den Gepflogenheiten des
+        deutschen Raumes entsprechen.</para>
+
+        <para>Zwingend anzugeben sind der Loginname sowie die komplette
+        Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
+        Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
+        gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
+        aktiv, so ist das Passwort-Feld deaktiviert.</para>
+
+        <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
+        eben angelegten Datenbanken eingetragen werden.</para>
+      </sect2>
+
+      <sect2 id="Gruppenmitgliedschaften-verwalten">
+        <title>Gruppenmitgliedschaften verwalten</title>
+
+        <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
+        Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
+
+        <orderedlist numeration="arabic">
+          <listitem>
+            <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
+            folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
+            hinzufügen.</para>
+          </listitem>
+
+          <listitem>
+            <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
+            der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
+            alle im System angelegten Gruppen und Benutzer enthält. Durch
+            Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
+            Gruppe in der ausgewählten Spalte hinzugefügt.</para>
+          </listitem>
+        </orderedlist>
+      </sect2>
+
+      <sect2 id="Migration-alter-Installationen">
+        <title>Migration alter Installationen</title>
+
+        <para>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird,
+        in der die Benutzerdaten noch im Dateisystem im Verzeichnis
+        <literal>users</literal> verwaltet wurden, so bietet Lx-Office die
+        Möglichkeit, diese Benutzerdaten automatisch in die
+        Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
+        sich nach dem Update der Installation das erste Mal im
+        Administrationsbereich anmeldet. Findet Lx-Office die Datei
+        <literal>users/members</literal>, so wird der Migrationsprozess
+        gestartet.</para>
+
+        <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
+        Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
+        Lx-Office noch die Möglichkeit an, dass automatisch eine
+        Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
+        Funktionen von Lx-Office gewährt. Alle migrierten Benutzern werden
+        Mitglied in dieser Gruppe. Damit wird das Verhalten von Lx-Office bis
+        Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
+        sich sofort wieder anmelden und mit dem System arbeiten.</para>
+
+        <!--  -->
+      </sect2>
+    </sect1>
+
+    <sect1 id="Drucken-mit-Lx-Office">
+      <title>Drucken mit Lx-Office</title>
+
+      <para>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen.
+      Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
+      einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
+      Debianoiden Betriebssystemen sind das die Pakete:</para>
+
+      <para><literal>texlive-latex-base texlive-latex-extra
+      texlive-fonts-recommended</literal></para>
+
+      <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
+      von den Standardvorlagen verwendet werden.</para>
+
+      <para>TODO: rpm Pakete.</para>
+
+      <para>In den allermeisten Installationen sollte drucken jetzt schon
+      funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
+      Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
+      die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
+      Beispiel:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
+          LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
+          Vorlagen aus der Community auf. Installieren Sie die entsprechenden
+          Pakete.</para>
+        </listitem>
+
+        <listitem>
+          <para>! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for
+          use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
+          einer Standardinstallation exotische utf8 Zeichen zu drucken.
+          TeXLive unterstützt von Haus nur romanische Schriften und muss mit
+          diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
+          Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
+      heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
+      Prüfen Sie den Namen in der Konfiguration (Standard:
+      <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
+      (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
+      darf.</para>
+
+      <!--  -->
+    </sect1>
+
+    <sect1 id="OpenDocument-Vorlagen">
+      <title>OpenDocument-Vorlagen</title>
+
+      <para>Lx-Office unterstützt die Verwendung von Vorlagen im
+      OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
+      Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
+      diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
+      OpenDocument-Vorlagen zu aktivieren muss in der Datei
+      <filename>config/lx_office.conf</filename> die Variable
+      <literal>opendocument</literal> im Abschnitt
+      <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
+      Dieses ist die Standardeinstellung.</para>
+
+      <para>Weiterhin muss in der Datei
+      <filename>config/lx_office.conf</filename> die Variable
+      <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
+      die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
+      Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
+      "UTF-8".</para>
+
+      <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
+      weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
+      OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
+      neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
+      (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
+      Andere Distributionen enthalten ihn in anderen Paketen.</para>
+
+      <para>Nach der Installation müssen in der Datei
+      <filename>config/lx_config.conf</filename> zwei weitere Variablen
+      angepasst werden: <literal>openofficeorg_writer</literal> muss den
+      vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
+      <literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
+      enthalten. Beide stehen im Abschnitt
+      <literal>applications</literal>.</para>
+
+      <para>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
+      OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
+      Variable <literal>$openofficeorg_daemon</literal> gesetzt ist, startet
+      ein OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
+      bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
+      benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
+      reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
+      werden muss. Der Nachteil ist, dass diese Methode Python und die
+      Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
+      sind.</para>
+
+      <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
+      wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
+      mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
+      Dokumentenvorlage enthalten sein und
+      “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
+      ‘<literal>templates/mastertemplates/German/invoice.odt</literal>’
+      enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
+      ebenfalls enthalten sein muss.</para>
+
+      <para>Als letztes muss herausgefunden werden, welchen Namen
+      OpenOffice.org Writer dem Verzeichnis mit den Benutzereinstellungen
+      gibt. Unter Debian ist dies momentan
+      <literal>~/.openoffice.org2</literal>. Sollte der Name bei Ihrer
+      OpenOffice.org-Installation anders sein, so muss das Verzeichnis
+      <literal>users/.openoffice.org2</literal> entsprechend umbenannt werden.
+      Ist der Name z.B. einfach nur <literal>.openoffice</literal>, so wäre
+      folgender Befehl auszuführen:</para>
+
+      <para><literal>mv users/.openoffice.org2
+      users/.openoffice</literal></para>
+
+      <para>Dieses Verzeichnis, wie auch das komplette
+      <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
+      sein. Dieses wurde bereits erledigt (siehe <xref
+      linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber erneut
+      überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</para>
+
+      <!--  -->
+    </sect1>
+
+    <sect1 id="Lx-Office-ERP-verwenden">
+      <title>Lx-Office ERP verwenden</title>
+
+      <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
+      folgender URL erreichbar:</para>
+
+      <para><ulink
+      url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
+
+      <para>Die Administrationsseite erreichen Sie unter:</para>
+
+      <para><ulink
+      url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
+    </sect1>
+  </chapter>
+
+  <chapter>
+    <title>Entwicklerdokumentation</title>
+
+    <sect1 id="devel.globals" xreflabel="Globale Variablen">
+      <title>Globale Variablen</title>
+
+      <sect2>
+        <title>Wie sehen globale Variablen in Perl aus?</title>
+
+        <para>Globale Variablen liegen in einem speziellen namespace namens
+        "main", der von überall erreichbar ist. Darüber hinaus sind bareword
+        globs global und die meisten speziellen Variablen sind...
+        speziell.</para>
+
+        <para>Daraus ergeben sich folgende Formen:</para>
+
+        <variablelist>
+          <varlistentry>
+            <term>$main::form</term>
+
+            <listitem>
+              <para>expliziter Namespace "main"</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$::form</term>
+
+            <listitem>
+              <para>impliziter Namespace "main"</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>open FILE, "file.txt"</term>
+
+            <listitem>
+              <para><varname>FILE</varname> ist global</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$_</term>
+
+            <listitem>
+              <para>speziell</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+
+        <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
+        Schlüsselwort wie "<function>global</function>", mit dem man
+        importieren kann. <function>my</function>, <function>our</function>
+        und <function>local</function> machen was anderes.</para>
+
+        <variablelist>
+          <varlistentry>
+            <term>my $form</term>
+
+            <listitem>
+              <para>lexikalische Variable, gültig bis zum Ende des
+              Scopes</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>our $form</term>
+
+            <listitem>
+              <para><varname>$form</varname> referenziert ab hier
+              <varname>$PACKAGE::form</varname>.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>local $form</term>
+
+            <listitem>
+              <para>Alle Änderungen an <varname>$form</varname> werden am Ende
+              des scopes zurückgesetzt</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </sect2>
+
+      <sect2>
+        <title>Warum sind globale Variablen ein Problem?</title>
+
+        <para>Das erste Problem ist <productname>FCGI</productname>.</para>
+
+        <para><productname>SQL-Ledger</productname> hat fast alles im globalen
+        namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
+        Unter <productname>FCGI</productname> müssen diese Sachen auch wieder
+        aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
+        Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
+        Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren
+        brauchen.</para>
+
+        <para>Das zweite Problem ist <function>strict</function>. Unter
+        <function>strict</function> werden alle Variablen die nicht explizit
+        mit <function>Package</function>, <function>my</function> oder
+        <function>our</function> angegeben werden als Tippfehler angemarkert,
+        was einen vor so mancher Stunde suchen nach einem Bug erspart. Da
+        globale Variablen aber implizit mit Package angegeben werden, werden
+        die nicht geprüft, und ein Tippfehler da fällt niemandem auf.</para>
+      </sect2>
+
+      <sect2>
+        <title>Kanonische globale Variablen</title>
+
+        <para>Um dieses Problem im Griff zu halten gibt es einige wenige
+        globale Variablen, die kanonisch sind, und alles andere sollte
+        anderweitig umhergereicht werden.</para>
+
+        <para>Diese Variablen sind im Moment die folgenden neun:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><varname>$::form</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>%::myconfig</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::locale</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::lxdebug</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::auth</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::lx_office_conf</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::instance_conf</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::dispatcher</varname></para>
+          </listitem>
+
+          <listitem>
+            <para><varname>$::request</varname></para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Damit diese nicht als Müllhalde misbrauch werden, im Folgenden
+        eine kurze Erläuterung was man von denn erwarten kann.</para>
+
+        <sect3>
+          <title>$::form</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Ist ein Objekt der Klasse
+              "<classname>Form</classname>"</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird nach jedem Request gelöscht</para>
+            </listitem>
+
+            <listitem>
+              <para>Muss auch in Tests und Konsolenscripts vorhanden
+              sein.</para>
+            </listitem>
+
+            <listitem>
+              <para>Enthält am Anfang eines Requests die Requestparameter vom
+              User</para>
+            </listitem>
+
+            <listitem>
+              <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
+              cachen, das wird aber momentan absichtlich zerstört</para>
+            </listitem>
+          </itemizedlist>
+
+          <para><varname>$::form</varname> wurde unter <productname>SQL
+          Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
+          alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
+          heißt, alles was einem lieb ist, sollte man vor einem Aufruf von zum
+          Beispiel <function>IS-&gt;retrieve_customer()</function> in
+          Sicherheit bringen.</para>
+
+          <para>Das Objekt der Klasse Form hat leider im Moment noch viele
+          zentrale Funktionen Gdie vom internen Zustand abhängen, deshalb
+          bitte nie einfach zerstören oder überschreiben. Es geht ziemlich
+          sicher etwas kaputt.</para>
+
+          <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
+          in den <productname>Template::Toolkit</productname> Templates
+          außerhalb der Controller: der Ausdruck <function>[% var
+          %]</function> greift auf <varname>$::form-&gt;{var}</varname> zu.
+          Unter Controllern ist der Standard Scope anders, da lautet der
+          Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
+          normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
+          <function>&lt;%var%&gt;</function> zeigt auf
+          <varname>$::form-&gt;{var}</varname>. Innerhalb von Schleifen wird
+          <varname>$::form-&gt;{TEMPLATE_ARRAYS}{var}[$index]</varname>
+          bevorzugt, wenn vorhanden.</para>
+        </sect3>
+
+        <sect3>
+          <title>%::myconfig</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Das einzige Hash unter den globalen Variablen</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird spätestens benötigt wenn auf die Datenbank
+              zugegriffen wird</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird bei jedem Request neu erstellt.</para>
+            </listitem>
+
+            <listitem>
+              <para>Enthält die Userdaten des aktuellen Logins</para>
+            </listitem>
+
+            <listitem>
+              <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
+              extern serialisiert werden, weil da auch der Datenbankzugriff
+              für diesenuser drinsteht.</para>
+            </listitem>
+
+            <listitem>
+              <para>Enthält unter anderem Listenbegrenzung vclimit,
+              Datumsformat dateformat und Nummernformat numberformat</para>
+            </listitem>
+
+            <listitem>
+              <para>Enthält Datenbankzugriffinformationen</para>
+            </listitem>
+          </itemizedlist>
+
+          <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
+          ein Userobjekt. Die meisten Funktionen, die etwas anhand des
+          aktuellen Users entscheiden müssen, befragen
+          <varname>%::myconfig</varname>.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::locale</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse "Locale"</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird pro Request erstellt</para>
+            </listitem>
+
+            <listitem>
+              <para>Muss auch für Tests und Scripte immer verfügbar
+              sein.</para>
+            </listitem>
+
+            <listitem>
+              <para>Cached intern über Requestgrenzen hinweg benutzte
+              Locales</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
+          Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::lxdebug</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse "LXDebug"</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird global gecached</para>
+            </listitem>
+
+            <listitem>
+              <para>Muss immer verfügbar sein, in nahezu allen
+              Funktionen</para>
+            </listitem>
+          </itemizedlist>
+
+          <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
+          bereit, wie "<function>enter_sub</function>" und
+          "<function>leave_sub</function>", mit denen in den alten Modulen ein
+          brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
+          der man die Wallclockzeit seit Requeststart loggen kann, sowie
+          "<function>message</function>" und "<function>dump</function>" mit
+          denen man flott Informationen ins Log packen kann.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::auth</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse "SL::Auth"</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird global gecached</para>
+            </listitem>
+
+            <listitem>
+              <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird nach jedem Request resettet.</para>
+            </listitem>
+          </itemizedlist>
+
+          <para><varname>$::auth</varname> stellt Funktionen bereit um die
+          Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
+          vom aktuellen User abhängen wird das Objekt aus
+          Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
+          Request kurz resettet.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::lx_office_conf</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse
+              "<classname>SL::LxOfficeConf</classname>"</para>
+            </listitem>
+
+            <listitem>
+              <para>Global gecached</para>
+            </listitem>
+
+            <listitem>
+              <para>Repräsentation der
+              <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Globale Konfiguration. Configdateien werden zum Start gelesen,
+          und nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
+          Programm die Konfiguration ändern kann oder sollte.</para>
+
+          <para>Für die folgende Konfigurationsdatei:</para>
+
+          <programlisting>[debug]
+       file = /tmp/lxoffice_debug_log.txt</programlisting>
+
+          <para>ist der Key <varname>file</varname> im Programm als
+          <varname>$::lx_office_conf-&gt;{debug}{file}</varname>
+          erreichbar.</para>
+
+          <warning>
+            <para>Zugriff auf die Konfiguration erfolgt im Moment über
+            Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
+          </warning>
+        </sect3>
+
+        <sect3>
+          <title>$::instance_conf</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse
+              "<classname>SL::InstanceConfiguration</classname>"</para>
+            </listitem>
+
+            <listitem>
+              <para>wird pro Request neu erstellt</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
+          speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
+          ist hier eine Mandantendatenbank. Prominentestes Datum ist "eur",
+          die Information ob Bilanz oder Einnahmenüberschussrechnung gemacht
+          wird.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::dispatcher</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Objekt der Klasse
+              "<varname>SL::Dispatcher</varname>"</para>
+            </listitem>
+
+            <listitem>
+              <para>wird pro Serverprozess erstellt.</para>
+            </listitem>
+
+            <listitem>
+              <para>enthält Informationen über die technische Verbindung zum
+              Server</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
+          global gespeichert wird. Wird vermutlich irgendwann in einem anderen
+          Objekt untergebracht.</para>
+        </sect3>
+
+        <sect3>
+          <title>$::request</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>Hashref (evtl später Objekt)</para>
+            </listitem>
+
+            <listitem>
+              <para>Wird pro Request neu initialisiert.</para>
+            </listitem>
+
+            <listitem>
+              <para>Keine Unterstruktur garantiert.</para>
+            </listitem>
+          </itemizedlist>
+
+          <para><varname>$::request</varname> ist ein generischer Platz um
+          Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
+          at a distance benutzt werden, sondern um lokales memoizing zu
+          ermöglichen, das garantiert am Ende des Requests zerstört
+          wird.</para>
+
+          <para>Vieles von dem, was im moment in <varname>$::form</varname>
+          liegt, sollte eigentlich hier liegen. Die groben
+          Differentialkriterien sind:</para>
+
+          <itemizedlist>
+            <listitem>
+              <para>Kommt es vom User, und soll unverändert wieder an den
+              User? Dann $::form, steht da eh schon</para>
+            </listitem>
+
+            <listitem>
+              <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des
+              Requests gebraucht werden? Dann $::request</para>
+            </listitem>
+
+            <listitem>
+              <para>Muss ich von anderen Teilen des Programms lesend drauf
+              zugreifen? Dann $::request, aber Zugriff über
+              Wrappermethode</para>
+            </listitem>
+          </itemizedlist>
+        </sect3>
+      </sect2>
+
+      <sect2>
+        <title>Ehemalige globale Variablen</title>
+
+        <para>Die folgenden Variablen waren einmal im Programm, und wurden
+        entfernt.</para>
+
+        <sect3>
+          <title>$::cgi</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>war nötig, weil cookie Methoden nicht als
+              Klassenfunktionen funktionieren</para>
+            </listitem>
+
+            <listitem>
+              <para>Aufruf als Klasse erzeugt Dummyobjekt was im
+              Klassennamespace gehalten wird und über Requestgrenzen
+              leaked</para>
+            </listitem>
+
+            <listitem>
+              <para>liegt jetzt unter
+              <varname>$::request-&gt;{cgi}</varname></para>
+            </listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3>
+          <title>$::all_units</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>war nötig, weil einige Funktionen in Schleifen zum Teil
+              ein paar hundert mal pro Request eine Liste der Einheiten
+              brauchen, und de als Parameter durch einen Riesenstack von
+              Funktionen geschleift werden müssten.</para>
+            </listitem>
+
+            <listitem>
+              <para>Liegt jetzt unter
+              <varname>$::request-&gt;{cache}{all_units}</varname></para>
+            </listitem>
+
+            <listitem>
+              <para>Wird nur in
+              <function>AM-&gt;retrieve_all_units()</function> gesetzt oder
+              gelesen.</para>
+            </listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3>
+          <title>%::called_subs</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>wurde benutzt um callsub deep recursions
+              abzufangen.</para>
+            </listitem>
+
+            <listitem>
+              <para>Wurde entfernt, weil callsub nur einen Bruchteil der
+              möglichen Rekursioenen darstellt, und da nie welche
+              auftreten.</para>
+            </listitem>
+
+            <listitem>
+              <para>komplette recursion protection wurde entfernt.</para>
+            </listitem>
+          </itemizedlist>
+        </sect3>
+      </sect2>
+    </sect1>
+
+    <sect1 id="dokumentenvorlagen-und-variablen">
+      <title>Dokumentenvorlagen und verfügbare Variablen</title>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.einführung">
+        <title>Einführung</title>
+
+        <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
+        aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
+        einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
+        <function>&lt;%variablenname%&gt;</function> verwendet wird. Für
+        LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
+        (siehe <xref
+        linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
+
+        <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
+        unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
+        ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
+        alle Vorlagenarten.</para>
+
+        <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
+        verfügbar als hier aufgelistet werden. Die meisten davon können
+        allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
+        werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
+        diese wie folgt erhalten werden:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
+            Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
+          </listitem>
+
+          <listitem>
+            <para>In <filename>Form.pm</filename> die Funktion
+            <function>parse_template</function> suchen und hier die Zeile
+            <command>print(STDERR Dumper($self));</command> einfügen.</para>
+          </listitem>
+
+          <listitem>
+            <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
+            ein PDF für eine Rechnung erzeugen.</para>
+          </listitem>
+
+          <listitem>
+            <para>Im <filename>error.log</filename> Apache steht die Ausgabe
+            der Variablen <varname>$self</varname> in der Form <varname>'key'
+            =&gt; 'value',</varname>. Alle <varname>key</varname>s sind
+            verfügbar.</para>
+          </listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
+        <title>Variablen ausgeben</title>
+
+        <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
+        Tags geschrieben werden, also z.B.
+        <varname>&lt;%variablenname%&gt;</varname>.</para>
+
+        <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
+        die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
+        <varname>&lt;%variablenname FLAG1 FLAG2%&gt;</varname>. Momentan
+        werden die folgenden Flags unterstützt:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
+            den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
+            mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
+            damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
+          </listitem>
+
+          <listitem>
+            <para><parameter>NOESCAPE</parameter> unterdrückt das Escapen von
+            Sonderzeichen für die Vorlagensprache. Wenn also in einer
+            Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
+            auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
+            ist dieses Flag sinnvoll.</para>
+          </listitem>
+        </itemizedlist>
+
+        <para>Beispiel:</para>
+
+        <programlisting>&lt;%quototal NOFORMAT%&gt;</programlisting>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
+        <title>Verwendung in Druckbefehlen</title>
+
+        <para>In der Admininstration können Drucker definiert werden. Auch im
+        dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
+        und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
+        den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
+        <function>`...`</function> nicht zu unerwünschtem Verhalten
+        führen.</para>
+
+        <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
+        für das die Telefonnummer eines Ansprechpartners als Teil der
+        Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
+        z.B. wie folgt aussehen:</para>
+
+        <programlisting>send_fax --number &lt;%if cp_phone2%&gt;&lt;%cp_phone2%&gt;&lt;%else%&gt;&lt;%cp_phone1%&gt;&lt;%end%&gt;</programlisting>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
+             xreflabel="Anfang und Ende der Tags verändern">
+        <title>Anfang und Ende der Tags verändern</title>
+
+        <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
+        Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
+        Prozentzeichen und dem Größerzeichen endet, beispielsweise
+        <function>&lt;%customer%&gt;</function>. Da diese Form aber z.B. in
+        LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
+        Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
+        Stil umgestellt werden.</para>
+
+        <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
+        Format gültigen Kommentarzeichen anfangen, dann
+        <function>config:</function> enthalten, die entsprechende Option
+        setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
+        enden. Beispiel für LaTeX:</para>
+
+        <programlisting>% config: tag-style=($ $)</programlisting>
+
+        <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
+        wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
+        äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
+
+        <programlisting>&lt;!-- config: tag-style=($ $) --&gt;</programlisting>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
+        <title>Zuordnung von den Dateinamen zu den Funktionen</title>
+
+        <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
+        welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
+        "<filename>.ext</filename>" geeignet zu ersetzen:
+        "<filename>.tex</filename>" für LaTeX-Vorlagen und
+        "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
+
+        <variablelist>
+          <varlistentry>
+            <term><filename>bin_list.ext</filename></term>
+
+            <listitem>
+              <para>Lagerliste</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>check.ext</filename></term>
+
+            <listitem>
+              <para>?</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>invoice.ext</filename></term>
+
+            <listitem>
+              <para>Rechnung</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>packing_list.ext</filename></term>
+
+            <listitem>
+              <para>Packliste</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>pick_list.ext</filename></term>
+
+            <listitem>
+              <para>Sammelliste</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>purchase_delivery_order.ext</filename></term>
+
+            <listitem>
+              <para>Lieferschein (Einkauf)</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>purcharse_order.ext</filename></term>
+
+            <listitem>
+              <para>Bestellung an Lieferanten</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>request_quotation.ext</filename></term>
+
+            <listitem>
+              <para>Anfrage an Lieferanten</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>sales_delivery_order.ext</filename></term>
+
+            <listitem>
+              <para>Lieferschein (Verkauf)</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>sales_order.ext</filename></term>
+
+            <listitem>
+              <para>Bestellung</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>sales_quotation.ext</filename></term>
+
+            <listitem>
+              <para>Angebot an Kunden</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>zahlungserinnerung.ext</filename></term>
+
+            <listitem>
+              <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><filename>zahlungserinnerung_invoice.ext</filename></term>
+
+            <listitem>
+              <para>Rechnung über Mahngebühren (Dateiname im Programm
+              konfigurierbar)</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
+        <title>Sprache, Drucker und E-Mail</title>
+
+        <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
+        eingearbeitet. So wird aus der Vorlage
+        <filename>sales_order.ext</filename> bei Sprache
+        <function>de</function> und Druckerkürzel <function>lpr2</function>
+        der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
+        Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
+        bekommen dann noch das Kürzel <filename>_email</filename>, der
+        vollständige Vorlagenname wäre dann
+        <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
+        kann eine Standarddatei <filename>default.ext</filename> hinterlegt
+        werden. Diese wird verwendet, wenn keine der anderen Varianten
+        gefunden wird.</para>
+
+        <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
+        der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
+        verschickt wird, ist:</para>
+
+        <orderedlist>
+          <listitem>
+            <para><filename>sales_order_email_de_lpr2.tex</filename></para>
+          </listitem>
+
+          <listitem>
+            <para><filename>sales_order_de_lpr2.tex</filename></para>
+          </listitem>
+
+          <listitem>
+            <para><filename>sales_order.tex</filename></para>
+          </listitem>
+
+          <listitem>
+            <para><filename>default.tex</filename></para>
+          </listitem>
+        </orderedlist>
+
+        <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
+        Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
+        siehe dazu <xref
+        linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"/>.</para>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
+        <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
+        sind</title>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
+               xreflabel="Metainformationen zur angeforderten Vorlage">
+          <title>Metainformationen zur angeforderten Vorlage</title>
+
+          <para>Diese Variablen liefern Informationen darüber welche Variante
+          einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
+          Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
+          Formulare einbinden möchten.</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>template_meta.formname</term>
+
+              <listitem>
+                <para>Basisname der Vorlage. Identisch mit der <link
+                linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
+                zu den Dateinamen</link> ohne die Erweiterung. Ein
+                Verkaufsauftrag enthält hier
+                <constant>sales_order</constant>.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.language.description</term>
+
+              <listitem>
+                <para>Beschreibung der verwendeten Sprache</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.language.template_code</term>
+
+              <listitem>
+                <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
+                Kürzel das im Dateinamen verwendetet wird.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.language.output_numberformat</term>
+
+              <listitem>
+                <para>Zahlenformat der verwendeten Sprache in der Form
+                "<constant>1.000,00</constant>". Experimentell! Nur
+                interessant für Vorlagen die mit unformatierten Werten
+                arbeiten.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.language.output_dateformat</term>
+
+              <listitem>
+                <para>Datumsformat der verwendeten Sprache in der Form
+                "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
+                interessant für Vorlagen die mit unformatierten Werten
+                arbeiten.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.format</term>
+
+              <listitem>
+                <para>Das angeforderte Format. Kann im Moment die Werte
+                <constant>pdf</constant>, <constant>postscript</constant>,
+                <constant>html</constant>, <constant>opendocument</constant>,
+                <constant>opendocument_pdf</constant> und
+                <constant>excel</constant> enthalten.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.extension</term>
+
+              <listitem>
+                <para>Dateierweiterung, wie im Dateinamen. Wird aus
+                <constant>format</constant> entschieden.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.media</term>
+
+              <listitem>
+                <para>Ausgabemedium. Kann zur Zeit die Werte
+                <constant>screen</constant> für Bildschirm,
+                <constant>email</constant> für E-Mmail (triggert das
+                <constant>_email</constant> Kürzel im Dateinamen),
+                <constant>printer</constant> für Drucker, und
+                <constant>queue</constant> für Warteschlange enthalten.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.printer.description</term>
+
+              <listitem>
+                <para>Beschreibung des ausgewählten Druckers</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>template_meta.printer.template_code</term>
+
+              <listitem>
+                <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
+                dem Kürzel das im Dateinamen verwendetet wird.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
+          <title>Stammdaten von Kunden und Lieferanten</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>account_number</term>
+
+              <listitem>
+                <para>Kontonummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>bank</term>
+
+              <listitem>
+                <para>Name der Bank</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>bank_code</term>
+
+              <listitem>
+                <para>Bankleitzahl</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>bic</term>
+
+              <listitem>
+                <para>Bank-Identifikations-Code (Bank Identifier Code,
+                BIC)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>business</term>
+
+              <listitem>
+                <para>Kunden-/Lieferantentyp</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>city</term>
+
+              <listitem>
+                <para>Stadt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>contact</term>
+
+              <listitem>
+                <para>Kontakt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>country</term>
+
+              <listitem>
+                <para>Land</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_email</term>
+
+              <listitem>
+                <para>Email des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_givenname</term>
+
+              <listitem>
+                <para>Vorname des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_greeting</term>
+
+              <listitem>
+                <para>Anrede des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_name</term>
+
+              <listitem>
+                <para>Name des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_phone1</term>
+
+              <listitem>
+                <para>Telefonnummer 1 des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_phone2</term>
+
+              <listitem>
+                <para>Telefonnummer 2 des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cp_title</term>
+
+              <listitem>
+                <para>Titel des Ansprechpartners</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>creditlimit</term>
+
+              <listitem>
+                <para>Kreditlimit</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>customeremail</term>
+
+              <listitem>
+                <para>Email des Kunden; nur für Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>customerfax</term>
+
+              <listitem>
+                <para>Faxnummer des Kunden; nur für Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>customernotes</term>
+
+              <listitem>
+                <para>Bemerkungen beim Kunden; nur für Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>customernumber</term>
+
+              <listitem>
+                <para>Kundennummer; nur für Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>customerphone</term>
+
+              <listitem>
+                <para>Telefonnummer des Kunden; nur für Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>discount</term>
+
+              <listitem>
+                <para>Rabatt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>email</term>
+
+              <listitem>
+                <para>Emailadresse</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>fax</term>
+
+              <listitem>
+                <para>Faxnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>homepage</term>
+
+              <listitem>
+                <para>Homepage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>iban</term>
+
+              <listitem>
+                <para>Internationale Kontonummer (International Bank Account
+                Number, IBAN)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>language</term>
+
+              <listitem>
+                <para>Sprache</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>name</term>
+
+              <listitem>
+                <para>Firmenname</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>payment_description</term>
+
+              <listitem>
+                <para>Name der Zahlart</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>payment_terms</term>
+
+              <listitem>
+                <para>Zahlungskonditionen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>phone</term>
+
+              <listitem>
+                <para>Telefonnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptocity</term>
+
+              <listitem>
+                <para>Stadt (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptocontact</term>
+
+              <listitem>
+                <para>Kontakt (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptocountry</term>
+
+              <listitem>
+                <para>Land (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptodepartment1</term>
+
+              <listitem>
+                <para>Abteilung 1 (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptodepartment2</term>
+
+              <listitem>
+                <para>Abteilung 2 (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptoemail</term>
+
+              <listitem>
+                <para>Email (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptofax</term>
+
+              <listitem>
+                <para>Fax (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptoname</term>
+
+              <listitem>
+                <para>Firmenname (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptophone</term>
+
+              <listitem>
+                <para>Telefonnummer (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptostreet</term>
+
+              <listitem>
+                <para>Straße und Hausnummer (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shiptozipcode</term>
+
+              <listitem>
+                <para>Postleitzahl (Lieferadresse) <link
+                linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>street</term>
+
+              <listitem>
+                <para>Straße und Hausnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>taxnumber</term>
+
+              <listitem>
+                <para>Steuernummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>ustid</term>
+
+              <listitem>
+                <para>Umsatzsteuer-Identifikationsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>vendoremail</term>
+
+              <listitem>
+                <para>Email des Lieferanten; nur für Lieferanten</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>vendorfax</term>
+
+              <listitem>
+                <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>vendornotes</term>
+
+              <listitem>
+                <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>vendornumber</term>
+
+              <listitem>
+                <para>Lieferantennummer; nur für Lieferanten</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>vendorphone</term>
+
+              <listitem>
+                <para>Telefonnummer des Lieferanten; nur für
+                Lieferanten</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>zipcode</term>
+
+              <listitem>
+                <para>Postleitzahl</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+
+          <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
+            <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
+            Stammdaten nicht eingetragen, so haben die Variablen
+            <varname>shipto*</varname> den gleichen Wert wie die die
+            entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
+            einige <varname>shipto*</varname>-Variablen so nicht in den
+            Stammdaten wiederfinden sondern schlicht Kopien der
+            Lieferdatenvariablen sind (z.B.
+            <varname>shiptocontact</varname>).</para>
+          </note>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
+          <title>Informationen über den Bearbeiter</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>employee_address</term>
+
+              <listitem>
+                <para>Adressfeld</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_businessnumber</term>
+
+              <listitem>
+                <para>Firmennummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_company</term>
+
+              <listitem>
+                <para>Firmenname</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_co_ustid</term>
+
+              <listitem>
+                <para>Usatzsteuer-Identifikationsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_duns</term>
+
+              <listitem>
+                <para>DUNS-Nummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_email</term>
+
+              <listitem>
+                <para>Email</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_fax</term>
+
+              <listitem>
+                <para>Fax</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_name</term>
+
+              <listitem>
+                <para>voller Name</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_signature</term>
+
+              <listitem>
+                <para>Signatur</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_taxnumber</term>
+
+              <listitem>
+                <para>Steuernummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>employee_tel</term>
+
+              <listitem>
+                <para>Telefonnummer</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
+          <title>Informationen über den Bearbeiter</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>salesman_address</term>
+
+              <listitem>
+                <para>Adressfeld</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_businessnumber</term>
+
+              <listitem>
+                <para>Firmennummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_company</term>
+
+              <listitem>
+                <para>Firmenname</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_co_ustid</term>
+
+              <listitem>
+                <para>Usatzsteuer-Identifikationsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_duns</term>
+
+              <listitem>
+                <para>DUNS-Nummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_email</term>
+
+              <listitem>
+                <para>Email</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_fax</term>
+
+              <listitem>
+                <para>Fax</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_name</term>
+
+              <listitem>
+                <para>voller Name</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_signature</term>
+
+              <listitem>
+                <para>Signatur</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_taxnumber</term>
+
+              <listitem>
+                <para>Steuernummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>salesman_tel</term>
+
+              <listitem>
+                <para>Telefonnummer</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
+          <title>Variablen für die einzelnen Steuern</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>tax</term>
+
+              <listitem>
+                <para>Steuer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>taxbase</term>
+
+              <listitem>
+                <para>zu versteuernder Betrag</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>taxdescription</term>
+
+              <listitem>
+                <para>Name der Steuer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>taxrate</term>
+
+              <listitem>
+                <para>Steuersatz</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.invoice">
+        <title>Variablen in Rechnungen</title>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
+          <title>Allgemeine Variablen</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>creditremaining</term>
+
+              <listitem>
+                <para>Verbleibender Kredit</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>currency</term>
+
+              <listitem>
+                <para>Währung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>cusordnumber</term>
+
+              <listitem>
+                <para>Bestellnummer beim Kunden</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>deliverydate</term>
+
+              <listitem>
+                <para>Lieferdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>duedate</term>
+
+              <listitem>
+                <para>Fälligkeitsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>globalprojectnumber</term>
+
+              <listitem>
+                <para>Projektnummer des ganzen Beleges</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>globalprojectdescription</term>
+
+              <listitem>
+                <para>Projekbeschreibung des ganzen Beleges</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>intnotes</term>
+
+              <listitem>
+                <para>Interne Bemerkungen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invdate</term>
+
+              <listitem>
+                <para>Rechnungsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invnumber</term>
+
+              <listitem>
+                <para>Rechnungsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invtotal</term>
+
+              <listitem>
+                <para>gesamter Rechnungsbetrag</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>notes</term>
+
+              <listitem>
+                <para>Bemerkungen der Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>orddate</term>
+
+              <listitem>
+                <para>Auftragsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>ordnumber</term>
+
+              <listitem>
+                <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
+                erstellt wurde</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>payment_description</term>
+
+              <listitem>
+                <para>Name der Zahlart</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>payment_terms</term>
+
+              <listitem>
+                <para>Zahlungskonditionen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>quodate</term>
+
+              <listitem>
+                <para>Angebotsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>quonumber</term>
+
+              <listitem>
+                <para>Angebotsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shippingpoint</term>
+
+              <listitem>
+                <para>Versandort</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>shipvia</term>
+
+              <listitem>
+                <para>Transportmittel</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>subtotal</term>
+
+              <listitem>
+                <para>Zwischensumme aller Posten ohne Steuern</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>total</term>
+
+              <listitem>
+                <para>Restsumme der Rechnung (Summe abzüglich bereits
+                bezahlter Posten)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transaction_description</term>
+
+              <listitem>
+                <para>Vorgangsbezeichnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transdate</term>
+
+              <listitem>
+                <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
+                erstellt wurde</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
+          <title>Variablen für jeden Posten auf der Rechnung</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>bin</term>
+
+              <listitem>
+                <para>Stellage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>description</term>
+
+              <listitem>
+                <para>Artikelbeschreibung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>discount</term>
+
+              <listitem>
+                <para>Rabatt als Betrag</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>discount_sub</term>
+
+              <listitem>
+                <para>Zwischensumme mit Rabatt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>drawing</term>
+
+              <listitem>
+                <para>Zeichnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>ean</term>
+
+              <listitem>
+                <para>EAN-Code</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>image</term>
+
+              <listitem>
+                <para>Grafik</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>linetotal</term>
+
+              <listitem>
+                <para>Zeilensumme (Anzahl * Einzelpreis)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>longdescription</term>
+
+              <listitem>
+                <para>Langtext</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>microfiche</term>
+
+              <listitem>
+                <para>Mikrofilm</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>netprice</term>
+
+              <listitem>
+                <para>Nettopreis</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>nodiscount_linetotal</term>
+
+              <listitem>
+                <para>Zeilensumme ohne Rabatt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>nodiscount_sub</term>
+
+              <listitem>
+                <para>Zwischensumme ohne Rabatt</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>number</term>
+
+              <listitem>
+                <para>Artikelnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>ordnumber_oe</term>
+
+              <listitem>
+                <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
+                aus einem Sammelauftrag erstellt wurde</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>p_discount</term>
+
+              <listitem>
+                <para>Rabatt in Prozent</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>partnotes</term>
+
+              <listitem>
+                <para>Die beim Artikel gespeicherten Bemerkungen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>partsgroup</term>
+
+              <listitem>
+                <para>Warengruppe</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>price_factor</term>
+
+              <listitem>
+                <para>Der Preisfaktor als Zahl, sofern einer eingestellt
+                ist</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>price_factor_name</term>
+
+              <listitem>
+                <para>Der Name des Preisfaktors, sofern einer eingestellt
+                ist</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>projectnumber</term>
+
+              <listitem>
+                <para>Projektnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>projectdescription</term>
+
+              <listitem>
+                <para>Projektbeschreibung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>qty</term>
+
+              <listitem>
+                <para>Anzahl</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>reqdate</term>
+
+              <listitem>
+                <para>Lieferdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>runningnumber</term>
+
+              <listitem>
+                <para>Position auf der Rechnung (1, 2, 3...)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>sellprice</term>
+
+              <listitem>
+                <para>Verkaufspreis</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>serialnumber</term>
+
+              <listitem>
+                <para>Seriennummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>tax_rate</term>
+
+              <listitem>
+                <para>Steuersatz</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transdate_oe</term>
+
+              <listitem>
+                <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
+                aus einem Sammelauftrag erstellt wurde</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>unit</term>
+
+              <listitem>
+                <para>Einheit</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>weight</term>
+
+              <listitem>
+                <para>Gewicht</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+
+          <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
+          über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
+          einer <function>foreach</function>-Schleife ausgegeben werden, da
+          für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
+          können. Die Variablen dafür lauten:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>make</term>
+
+              <listitem>
+                <para>Lieferant</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>model</term>
+
+              <listitem>
+                <para>Lieferantenartikelnummer</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
+          <title>Variablen für die einzelnen Zahlungseingänge</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>payment</term>
+
+              <listitem>
+                <para>Betrag</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>paymentaccount</term>
+
+              <listitem>
+                <para>Konto</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>paymentdate</term>
+
+              <listitem>
+                <para>Datum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>paymentmemo</term>
+
+              <listitem>
+                <para>Memo</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>paymentsource</term>
+
+              <listitem>
+                <para>Beleg</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
+          <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
+
+          <para>Die vom Benutzer definierten Variablen für Kunden und
+          Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
+          ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
+          <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
+          Variablennamen zusammen.</para>
+
+          <para>Beispiel: Der Benutzer hat eine Variable namens
+          <varname>number_of_employees</varname> definiert, die die Anzahl der
+          Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
+          unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
+          Verfügung.</para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.dunning">
+        <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
+          <title>Namen der Vorlagen</title>
+
+          <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
+          eingegeben. Wird für ein Mahnlevel die Option zur automatischen
+          Erstellung einer Rechnung über die Mahngebühren und Zinsen
+          aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
+          Vorlagenname für diese Mahnstufe mit dem Zusatz
+          <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
+          für die ausgewählte Sprache und den ausgewählten Drucker
+          angehängt.</para>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
+          <title>Allgemeine Variablen in Mahnungen</title>
+
+          <para>Die Variablen des Verkäufers stehen wie gewohnt als
+          <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
+          Kunden stehen als Variablen <varname>name</varname>,
+          <varname>street</varname>, <varname>zipcode</varname>,
+          <varname>city</varname>, <varname>country</varname>,
+          <varname>department_1</varname>, <varname>department_2</varname>,
+          und <varname>email</varname> zur Verfügung.</para>
+
+          <para>Weitere Variablen beinhalten:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>dunning_date</term>
+
+              <listitem>
+                <para>Datum der Mahnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dunning_duedate</term>
+
+              <listitem>
+                <para>Fälligkeitsdatum für diese Mahhnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dunning_id</term>
+
+              <listitem>
+                <para>Mahnungsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>fee</term>
+
+              <listitem>
+                <para>Kummulative Mahngebühren</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>interest_rate</term>
+
+              <listitem>
+                <para>Zinssatz per anno in Prozent</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>total_amount</term>
+
+              <listitem>
+                <para>Gesamter noch zu zahlender Betrag als
+                <function>fee</function> + <function>total_interest</function>
+                + <function>total_open_amount</function></para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>total_interest</term>
+
+              <listitem>
+                <para>Zinsen per anno über alle Rechnungen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>total_open_amount</term>
+
+              <listitem>
+                <para>Summe über alle offene Beträge der Rechnungen</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
+          <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>dn_amount</term>
+
+              <listitem>
+                <para>Rechnungssumme (brutto)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_duedate</term>
+
+              <listitem>
+                <para>Originales Fälligkeitsdatum der Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_dunning_date</term>
+
+              <listitem>
+                <para>Datum der Mahnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_dunning_duedate</term>
+
+              <listitem>
+                <para>Fälligkeitsdatum der Mahnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_fee</term>
+
+              <listitem>
+                <para>Kummulative Mahngebühr</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_interest</term>
+
+              <listitem>
+                <para>Zinsen per anno für diese Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_invnumber</term>
+
+              <listitem>
+                <para>Rechnungsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_linetotal</term>
+
+              <listitem>
+                <para>Noch zu zahlender Betrag (ergibt sich aus
+                <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
+                + <varname>dn_interest</varname>)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_netamount</term>
+
+              <listitem>
+                <para>Rechnungssumme (netto)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_open_amount</term>
+
+              <listitem>
+                <para>Offener Rechnungsbetrag</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_ordnumber</term>
+
+              <listitem>
+                <para>Bestellnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_transdate</term>
+
+              <listitem>
+                <para>Rechnungsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dn_curr</term>
+
+              <listitem>
+                <para>Währung, in der die Rechnung erstellt wurde. (Die
+                Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
+          <title>Variablen in automatisch erzeugten Rechnungen über
+          Mahngebühren</title>
+
+          <para>Die Variablen des Verkäufers stehen wie gewohnt als
+          <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
+          Kunden stehen als Variablen <varname>name</varname>,
+          <varname>street</varname>, <varname>zipcode</varname>,
+          <varname>city</varname>, <varname>country</varname>,
+          <varname>department_1</varname>, <varname>department_2</varname>,
+          und <varname>email</varname> zur Verfügung.</para>
+
+          <para>Weitere Variablen beinhalten:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>duedate</term>
+
+              <listitem>
+                <para>Fälligkeitsdatum der Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dunning_id</term>
+
+              <listitem>
+                <para>Mahnungsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>fee</term>
+
+              <listitem>
+                <para>Mahngebühren</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>interest</term>
+
+              <listitem>
+                <para>Zinsen</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invamount</term>
+
+              <listitem>
+                <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
+                <varname>interest</varname>)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invdate</term>
+
+              <listitem>
+                <para>Rechnungsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invnumber</term>
+
+              <listitem>
+                <para>Rechnungsnummer</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
+        <title>Variablen in anderen Vorlagen</title>
+
+        <sect3>
+          <title>Einführung</title>
+
+          <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
+          Rechnung. Allerdings heißen die Variablen, die mit
+          <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
+          fangen sie mit <varname>quo</varname> für "quotation" an:
+          <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
+          wiederum fangen sie mit <varname>ord</varname> für "order" an:
+          <varname>ordnumber</varname> für Bestellnummer etc.</para>
+
+          <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
+          vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
+          sind Variablen, die vom Geschäftsablauf her in der entsprechenden
+          Vorlage keine Bedeutung haben oder noch nicht belegt sein
+          können.</para>
+
+          <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
+          in Rechnungen aufgeführt.</para>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
+          <title>Angebote und Preisanfragen</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>quonumber</term>
+
+              <listitem>
+                <para>Angebots- bzw. Anfragenummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>reqdate</term>
+
+              <listitem>
+                <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
+                Preisanfragen)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transdate</term>
+
+              <listitem>
+                <para>Angebots- bzw. Anfragedatum</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
+          <title>Auftragsbestätigungen und Lieferantenaufträge</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>ordnumber</term>
+
+              <listitem>
+                <para>Auftragsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>reqdate</term>
+
+              <listitem>
+                <para>Lieferdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transdate</term>
+
+              <listitem>
+                <para>Auftragsdatum</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
+          <title>Lieferscheine (Verkauf und Einkauf)</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>cusordnumber</term>
+
+              <listitem>
+                <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
+                des Lieferanten (im Einkauf)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>donumber</term>
+
+              <listitem>
+                <para>Lieferscheinnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>transdate</term>
+
+              <listitem>
+                <para>Lieferscheindatum</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+
+          <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
+          mit den Informationen darüber, von welchem Lager und Lagerplatz aus
+          die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
+          Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
+          <function>foreach</function>-Schleife ausgegeben werden. Diese
+          Variablen sind:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>si_bin</term>
+
+              <listitem>
+                <para>Lagerplatz</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_chargenumber</term>
+
+              <listitem>
+                <para>Chargennummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_bestbefore</term>
+
+              <listitem>
+                <para>Mindesthaltbarkeit</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_number</term>
+
+              <listitem>
+                <para>Artikelnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_qty</term>
+
+              <listitem>
+                <para>Anzahl bzw. Menge</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_runningnumber</term>
+
+              <listitem>
+                <para>Positionsnummer (1, 2, 3 etc)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_unit</term>
+
+              <listitem>
+                <para>Einheit</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>si_warehouse</term>
+
+              <listitem>
+                <para>Lager</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
+          <title>Variablen für Sammelrechnung</title>
+
+          <variablelist>
+            <varlistentry>
+              <term>c0total</term>
+
+              <listitem>
+                <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &lt; 30
+                Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c30total</term>
+
+              <listitem>
+                <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 30
+                und &lt; 60 Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c60total</term>
+
+              <listitem>
+                <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 60
+                und &lt; 90 Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c90total</term>
+
+              <listitem>
+                <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 90
+                Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>total</term>
+
+              <listitem>
+                <para>Gesamtbetrag aller Rechnungen</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+
+          <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term>invnumber</term>
+
+              <listitem>
+                <para>Rechnungsnummer</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>invdate</term>
+
+              <listitem>
+                <para>Rechnungsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>duedate</term>
+
+              <listitem>
+                <para>Fälligkeitsdatum</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>amount</term>
+
+              <listitem>
+                <para>Summe der Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>open</term>
+
+              <listitem>
+                <para>Noch offener Betrag der Rechnung</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c0</term>
+
+              <listitem>
+                <para>Noch offener Rechnungsbetrag mit Fälligkeit &lt; 30
+                Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c30</term>
+
+              <listitem>
+                <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 30 und
+                &lt; 60 Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c60</term>
+
+              <listitem>
+                <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 60 und
+                &lt; 90 Tage</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>c90</term>
+
+              <listitem>
+                <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 90
+                Tage</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
+        <title>Blöcke, bedingte Anweisungen und Schleifen</title>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
+          <title>Einfürhung</title>
+
+          <para>Der Parser kennt neben den Variablen einige weitere
+          Konstrukte, die gesondert behandelt werden. Diese sind wie
+          Variablennamen in spezieller Weise markiert:
+          <command>&lt;%anweisung%&gt; ... &lt;%end%&gt;</command></para>
+
+          <para>Anmerkung zum <command>&lt;%end%&gt;</command>: Der besseren
+          Verständlichkeit halber kann man nach dem <command>end</command>
+          noch beliebig weitere Wörter schreiben, um so zu markieren, welche
+          Anweisung (z.B. <command>if</command> oder
+          <command>foreach</command>) damit abgeschlossen wird.</para>
+
+          <para>Beispiel: Lautet der Beginn eines Blockes z.B.
+          <command>&lt;%if type == "sales_quotation"%&gt;</command>, so könnte
+          er mit <command>&lt;%end%&gt;</command> genauso abgeschlossen werden
+          wie mit <command>&lt;%end if%&gt;</command> oder auch
+          <command>&lt;%end type == "sales_quotation"%&gt;</command>.</para>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
+          <title>Der if-Block</title>
+
+          <programlisting>&lt;%if variablenname%&gt;
+...
+&lt;%end%&gt;</programlisting>
+
+          <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
+          und dem "end" werden nur ausgegeben, wenn die Variable
+          <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
+
+          <para>Die Bedingung kann auch negiert werden, indem das Wort
+          <function>not</function> nach dem <filename>if</filename> verwendet
+          wird. Beispiel:</para>
+
+          <programlisting>&lt;%if not cp_greeting%&gt;
+...
+&lt;%end%&gt;</programlisting>
+
+          <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
+          oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
+          einer Variablen mit einer festen Zeichenkette oder einer anderen
+          Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
+          oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
+          die rechte Seite des Vergleichsoperators in Anführungszeichen
+          gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
+          anderer Variablen). Zwei Beispiele, die beide Vergleiche
+          zeigen:</para>
+
+          <programlisting>&lt;%if var1 == "Wert"%&gt;</programlisting>
+
+          <para>Testet die Variable <varname>var1</varname> auf
+          übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
+          Mittels <function>!=</function> anstelle von <function>==</function>
+          würde auf Ungleichheit getestet.</para>
+
+          <programlisting>%if var1 == var2%&gt;</programlisting>
+
+          <para>Testet die Variable <varname>var1</varname> auf
+          übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
+          <function>!=</function> anstelle von <function>==</function> würde
+          auf Ungleichheit getestet.</para>
+
+          <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
+          auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
+          Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
+          dieselbe Syntax wie oben nur mit <function>=~</function> und
+          <function>!~</function> als Vergleichsoperatoren.</para>
+
+          <para>Beispiel für einen Test, ob die Variable
+          <varname>intnotes</varname> (interne Bemerkungen) das Wort
+          <constant>schwierig</constant> enthält:</para>
+
+          <programlisting>&lt;%if intnotes =~ "schwierig"%&gt;</programlisting>
+        </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
+          <title>Der foreach-Block</title>
+
+          <programlisting>&lt;%foreach variablenname%&gt;
+...
+&lt;%end%&gt;</programlisting>
+
+          <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
+          wie das Perl-Array der Variablen <varname>variablenname</varname>
+          Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
+          Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
+          benutzt. In jedem Durchlauf werden die <link
+          linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
+          Variablen</link> jeweils auf den Wert für die aktuelle Position
+          gesetzt.</para>
+
+          <para>Die Syntax sieht normalerweise wie folgt aus:</para>
+
+          <programlisting>&lt;%foreach number%&gt;
+Position: &lt;%runningnumber%&gt;
+Anzahl: &lt;%qty%&gt;
+Artikelnummer: &lt;%number%&gt;
+Beschreibung: &lt;%description%&gt;
+...
+&lt;%end%&gt;</programlisting>
+
+          <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
+          <function>&lt;%foreach%&gt;</function>-Block innerhalb einer
+          Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
+          wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
+          Inhalt zwischen <function>&lt;%foreach%&gt;</function> und
+          <function>&lt;%end%&gt;</function> wiederholt, nicht aber die
+          komplette Zeile, in der er steht.</para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="dokumentenvorlagen-und-variablen.markup">
+        <title>Markup-Code zur Textformatierung innerhalb von
+        Formularen</title>
+
+        <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
+        anders formatiert haben möchte, so ist dies begrenzt möglich.
+        Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
+        Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
+        Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
+        dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
+        (HTML oder PDF über LaTeX) umgesetzt.</para>
+
+        <para>Die unterstützen Formatierungen sind:</para>
+
+        <variablelist>
+          <varlistentry>
+            <term>&lt;b&gt;Text&lt;/b&gt;</term>
+
+            <listitem>
+              <para>Text wird in Fettdruck gesetzt.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>&lt;i&gt;Text&lt;/i&gt;</term>
+
+            <listitem>
+              <para>Text wird kursiv gesetzt.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>&lt;u&gt;Text&lt;/u&gt;</term>
+
+            <listitem>
+              <para>Text wird unterstrichen.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>&lt;s&gt;Text&lt;/s&gt;</term>
+
+            <listitem>
+              <para>Text wird durchgestrichen. Diese Formatierung ist nicht
+              bei der Ausgabe als PDF über LaTeX verfügbar.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>&lt;bullet&gt;</term>
+
+            <listitem>
+              <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
+              unten).</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+
+        <para>Der Befehl <command>&lt;bullet&gt;</command> funktioniert
+        momentan auch nur in Latex-Vorlagen.</para>
+      </sect2>
+    </sect1>
+
+    <sect1 id="excel-templates">
+      <title>Excel-Vorlagen</title>
+
+      <sect2 id="excel-templates.summary">
+        <title>Zusammenfassung</title>
+
+        <para>Dieses Dokument beschreibt den Mechanismus, mit dem
+        Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
+        einhergehen.</para>
+      </sect2>
+
+      <sect2 id="excel-templates.usage">
+        <title>Bedienung</title>
+
+        <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
+        werden. Die Konfigurationsoption heißt <varname>excel_templates =
+        1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
+
+        <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
+        anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
+        werden. In den normalen Verkaufsmasken taucht nun
+        <constant>Excel</constant> als auswählbares Format auf und kann von da
+        an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
+
+        <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
+        eine Angebotsvorlage und wird unter dem internen Namen der Angebote
+        <filename>sales_quotation.xls</filename> gespeichert.</para>
+      </sect2>
+
+      <sect2 id="excel-templates.syntax">
+        <title>Variablensyntax</title>
+
+        <para>Einfache Syntax:
+        <command>&lt;&lt;varname&gt;&gt;</command></para>
+
+        <para>Dabei sind <constant>&lt;&lt;</constant> und
+        <constant>&gt;&gt;</constant> die Delimiter. Da Excel auf festen
+        Breiten besteht, kann der Tag künstlich verlängert werden, indem
+        weitere <constant>&lt;</constant> oder <constant>&gt;</constant>
+        eingefügt werden. Der Tag muss nicht symmetrisch sein.
+        Beispiel:</para>
+
+        <programlisting>&lt;&lt;&lt;&lt;&lt;varname&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
+
+        <para>Um die Limitierung der festen Breite zu reduzieren, können
+        weitere Variablen in einem Block interpoliert werden. Whitespace wird
+        dazwishen dann erhalten. Beispiel:</para>
+
+        <programlisting>&lt;&lt;&lt;&lt;&lt;varname1 varname2   varname3&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
+
+        <para>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.</para>
+
+        <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
+        der Block mit einem Leerzeichen anfängt. Beispiel:</para>
+
+        <programlisting>&lt;&lt;&lt;&lt;&lt;&lt;            varname&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
+
+        <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
+        Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
+        entfernt.</para>
+      </sect2>
+
+      <sect2 id="excel-templates.limitations">
+        <title>Einschränkungen</title>
+
+        <para>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.</para>
+
+        <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
+        <command>&lt;%if%&gt;</command> und
+        <command>&lt;%foreach%&gt;</command> nicht vorhanden. Der Delimiter
+        <constant>&lt;% %&gt;</constant> kommt in den Headerinformationen
+        evtl. vor. Deshalb wurde auf den sichereren Delimiter
+        <constant>&lt;&lt;</constant> und <constant>&gt;&gt;</constant>
+        gewechselt.</para>
+      </sect2>
+    </sect1>
+
+    <sect1 id="devel.fcgi">
+      <title>Entwicklung unter FastCGI</title>
+
+      <sect2 id="devel.fcgi.general">
+        <title>Allgemeines</title>
+
+        <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
+        werden, muss der Webserver neu gestartet werden.</para>
+
+        <para>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 beachtet werden.</para>
+      </sect2>
+
+      <sect2 id="devel.fcgi.exiting">
+        <title>Programmende und Ausnahmen</title>
+
+        <para>Betrifft die Funktionen <function>warn</function>,
+        <function>die</function>, <function>exit</function>,
+        <function>carp</function> und <function>confess</function>.</para>
+
+        <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
+        Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
+        am Laufen zu halten. Man kann mit <function>die</function>,
+        <function>confess</function> oder <function>carp</function> Fehler
+        ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
+        eigene <function>$::form-</function>error()&gt; tut im Prinzip das
+        Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
+        <function>exit</function> hingegen werden nicht abgefangen.
+        <function>warn</function> 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
+        <function>exit</function> wird die Ausführung beenden.</para>
+
+        <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
+        beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
+        Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
+        benutzen, alle anderen Exceptionmechanismen sind ok.</para>
+      </sect2>
+
+      <sect2 id="devel.fcgi.globals">
+        <title>Globale Variablen</title>
+
+        <para>Um zu vermeiden, dass Informationen von einem Request in einen
+        anderen gelangen, müssen alle globalen Variablen vor einem Request
+        sauber initialisiert werden. Das ist besonders wichtig im
+        <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
+        diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
+        werden.</para>
+
+        <para>In <classname>SL::Dispatcher</classname> 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.</para>
+
+        <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
+        man sicher geht, dass man die richtige erwischt.</para>
+      </sect2>
+
+      <sect2 id="devel.fcgi.performance">
+        <title>Performance und Statistiken</title>
+
+        <para>Die kritischen Pfade des Programms sind die Belegmasken, und
+        unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
+        Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
+        4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
+        sind es je nach Menge der definierten Variablen 1-2s. Ab der
+        Moose/Rose::DB Version sind es 5-6s.</para>
+
+        <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
+        den kritischen Pfaden, unter 0,15 sonst.</para>
+      </sect2>
+
+      <sect2 id="devel.fcgi.known-issues">
+        <title>Bekannte Probleme</title>
+
+        <sect3 id="devel.fcgi.known-issues.encoding">
+          <title>Encoding Awareness</title>
+
+          <para>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
+          das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
+          beseitigen.</para>
+        </sect3>
+      </sect2>
+    </sect1>
+
+    <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
+     <title>SQL-Upgradedateien</title>
+
+     <sect2 id="db-upgrade-files.introduction" xreflabel="Einführung in die Datenbank-Upgradedateien">
+      <title>Einführung</title>
+
+      <para>
+       Der alte Mechanismus für SQL-Upgradescripte, der auf einer Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
+       diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele Entwicklung im stable- und unstable-Baum betrifft.
+      </para>
+
+      <para>
+       Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es werden weiterhin alle Scripte aus sql/Pg-upgrade
+       ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
+       Datei existieren, die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige Kontrollinformationen enthält.
+      </para>
+
+      <para>
+       Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten definieren können werden, sodass Datenbankscripte zwar in
+       einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
+       angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern mehr braucht.
+      </para>
+
+      <para>
+       Lx-Office merkt sich dabei, welches der Upgradescripte in sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht erneut
+       aus. Dazu dient die Tabelle "schema_info", die bei der Anmeldung automatisch angelegt wird.
+      </para>
+     </sect2>
+
+     <sect2 id="db-upgrade-files.format" xreflabel="Format der Upgradedateien">
+      <title>Format der Kontrollinformationen</title>
+
+      <para>
+       Die Kontrollinformationen sollten sich am Anfang der jeweiligen Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
+       hat dabei das folgende Format:
+      </para>
+
+      <para>
+       Für SQL-Upgradedateien:
+      </para>
+
+      <programlisting>-- @key: value</programlisting>
+
+      <para>
+       Für Perl-Upgradedateien:
+      </para>
+
+      <programlisting># @key: value</programlisting>
+
+      <para>
+       Leerzeichen vor "<varname>value</varname>" werden entfernt.
+      </para>
+
+      <para>
+       Die folgenden Schlüsselworte werden verarbeitet:
+      </para>
+
+      <variablelist>
+       <varlistentry>
+        <term>tag</term>
+        <listitem>
+         <para>
+          Wird zwingend benötigt. Dies ist der "Name" des Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren Abhängigkeiten
+          verwendet werden (Schlüsselwort "<varname>depends</varname>"). Der "tag" ist auch der Name, der in der Datenbank eingetragen wird.
+         </para>
+
+         <para>
+          Normalerweise sollte die Kontrolldatei genau so heißen wie der "tag", nur mit der Endung ".sql" bzw. "pl".
+         </para>
+
+         <para>
+          Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
+          sollten stattdessen mit Unterstrichen ersetzt werden.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>charset</term>
+        <listitem>
+         <para>
+          Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
+          Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags der Zeichensatz "<literal>ISO-8859-15</literal>"
+          angenommen.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>description</term>
+        <listitem>
+         <para>
+          Benötigt. Eine Beschreibung, was in diesem Update passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
+          angezeigt. Während der Tag in englisch gehalten sein sollte, sollte die Beschreibung auf Deutsch erfolgen.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>depends</term>
+        <listitem>
+         <para>
+          Optional. Eine mit Leerzeichen getrennte Liste von "tags", von denen dieses Upgradescript abhängt. Lx-Office stellt sicher, dass
+          die in dieser Liste aufgeführten Scripte bereits durchgeführt wurden, bevor dieses Script ausgeführt wird.
+         </para>
+
+         <para>
+          Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b" existiert, das von Änderungen in "a" abhängt, und eine neue
+          Kontrolldatei für "c" erstellt wird, die von Änderungen in "a" und "b" abhängt, so genügt es, in "c" nur den Tag "b" als
+          Abhängigkeit zu definieren.
+         </para>
+
+         <para>
+          Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu definieren (z.B. &quot;a&quot; -&gt; &quot;b&quot;,
+          &quot;b&quot; -&gt; &quot;c&quot; und &quot;c&quot; -&gt; &quot;a&quot;).
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>priority</term>
+        <listitem>
+         <para>
+          Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
+          besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
+         </para>
+
+         <para>
+          Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends" benutzt werden. Lx-Office sortiert die auszuführenden Scripte
+          zuerst nach der Abhängigkeitstiefe (wenn "z" von "y" abhängt und "y" von "x", so hat "z" eine Abhängigkeitstiefe von 2, "y" von 1
+          und "x" von 0. "x" würde hier zuerst ausgeführt, dann "y", dann "z"), dann nach der Priorität und bei gleicher Priorität
+          alphabetisch nach dem "tag".
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </sect2>
+
+     <sect2 id="db-upgrade-files.dbupgrade-tool" xreflabel="Hilfsscript dbupgrade2_tool.pl">
+      <title>Hilfsscript dbupgrade2_tool.pl</title>
+
+      <para>
+       Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert ein Hilfsscript namens
+       "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses
+       Tool liest alle Datenbankupgradescripte aus dem Verzeichnis <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die gleichen
+       Methoden wie Lx-Office selber, sodass alle Fehlersituationen von der Kommandozeile überprüft werden können.
+      </para>
+
+      <para>
+       Wird dem Script kein weiterer Parameter übergeben, so wird nur eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
+       sich aber auch Informationen auf verschiedene Art ausgeben lassen:
+      </para>
+
+      <itemizedlist>
+       <listitem>
+        <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl --list</command>"</para>
+
+        <para>
+         Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge sortiert, in der Lx-Office die Scripte ausführen würde. Es
+         werden neben der Listenposition der Tag, die Abhängigkeitstiefe und die Priorität ausgegeben.
+        </para>
+       </listitem>
+
+       <listitem>
+        <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl --tree</command>"</para>
+
+        <para>
+         Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
+         anderen abhängen. Die Unterknoten sind Scripte, die beim übergeordneten Script als Abhängigkeit eingetragen sind.
+        </para>
+       </listitem>
+
+       <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
+        <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl --rtree</command>"</para>
+
+        <para>
+         Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf.  Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
+         Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das übergeordnete Script als Abhängigkeit eingetragen haben.
+        </para>
+       </listitem>
+
+       <listitem>
+        <para>Baumform mit Postscriptausgabe: "<command>./scripts/dbupgrade2_tool.pl --graphviz</command>"</para>
+
+        <para>
+         Benötigt das Tool "<command>graphviz</command>", um mit seiner Hilfe die <link
+         linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte Baumform</link> in eine Postscriptdatei namens
+         "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist vermutlich die übersichtlichste Form, weil hierbei jeder Knoten nur
+         einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben werden.
+        </para>
+       </listitem>
+
+       <listitem>
+        <para>
+         Scripte, von denen kein anderes Script abhängt: "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"
+        </para>
+
+        <para>
+         Listet die Tags aller Scripte auf, von denen keine anderen Scripte abhängen.
+        </para>
+       </listitem>
+      </itemizedlist>
+     </sect2>
+    </sect1>
+
+    <sect1 id="translations-languages" xreflabel="Translations and languages">
+      <title>Translations and languages</title>
+
+      <sect2 id="translations-languages.introduction"
+             xreflabel="Introduction to translations and languages">
+        <title>Introduction</title>
+
+        <note>
+          <para>Dieser Abschnitt ist in Englisch geschrieben, um
+          internationalen Übersetzern die Arbeit zu erleichtern.</para>
+        </note>
+
+        <para>This section describes how localization packages in Lx-Office
+        are built. Currently the only language fully supported is German, and
+        since most of the internal messages are held in English the English
+        version is usable too.</para>
+
+        <para>A stub version of French is included but not functunal at this
+        point.</para>
+      </sect2>
+
+      <sect2 id="translations-languages.file-structure"
+             xreflabel="File structure">
+        <title>File structure</title>
+
+        <para>The structure of locales in Lx-Office is:</para>
+
+        <programlisting>lx-office/locale/&lt;langcode&gt;/</programlisting>
+
+        <para>where &lt;langcode&gt; stands for an abbreviation of the
+        language package. The builtin packages use two letter <ulink
+        url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
+        but the actual name is not relevant for the program and can easily be
+        extended to <ulink
+        url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
+        tags</ulink> (i.e. "en_GB"). In fact the original language packages
+        from SQL Ledger are named in this way.</para>
+
+        <para>In such a language directory the following files are
+        recognized:</para>
+
+        <variablelist>
+          <varlistentry>
+            <term>LANGUAGE</term>
+
+            <listitem>
+              <para>This file is mandatory.</para>
+
+              <para>The <filename>LANGUAGE</filename> file contains the self
+              descripted name of the language. It should contain a native
+              representation first, and in parenthesis an english translation
+              after that. Example:</para>
+
+              <programlisting>Deutsch (German)</programlisting>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>charset</term>
+
+            <listitem>
+              <para>This file should be present.</para>
+
+              <para>The <filename>charset</filename> file describes which
+              charset a language package is written in and applies to all
+              other language files in the package. It is possible to write
+              some language packages without an explicit charset, but it is
+              still strongly recommended. You'll never know in what
+              environment your language package will be used, and neither
+              UTF-8 nor Latin1 are guaranteed.</para>
+
+              <para>The whole content of this file is a string that can be
+              recognized as a valid charset encoding. Example:</para>
+
+              <programlisting>UTF-8</programlisting>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>all</term>
+
+            <listitem>
+              <para>This file is mandatory.</para>
+
+              <para>The central translation file. It is essentially an inline
+              Perl script autogenerated by <command>locales.pl</command>. To
+              generate it, generate the directory and the two files mentioned
+              above, and execute the following command:</para>
+
+              <programlisting>scripts/locales.pl &lt;langcode&gt;</programlisting>
+
+              <para>Otherwise you can simply copy one of the other languages.
+              You will be told how many are missing like this:</para>
+
+              <programlisting>$ scripts/locales.pl en
+English - 0.6% - 2015/2028 missing</programlisting>
+
+              <para>A file named "<filename>missing</filename>" will be
+              generated and can be edited. You can also edit the
+              "<filename>all</filename>" file directly. Edit everything you
+              like to fit the target language and execute
+              <command>locales.pl</command> again. See how the missing words
+              get fewer.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>Num2text</term>
+
+            <listitem>
+              <para>Legacy code from SQL Ledger. It provides a means for
+              numbers to be converted into natural language, like
+              <literal>1523 =&gt; one thousand five hundred twenty
+              three</literal>. If you want to provide it, it must be inlinable
+              Perl code which provides a <function>num2text</function> sub. If
+              an <function>init</function> sub exists it will be executed
+              first.</para>
+
+              <para>Only used in the check and receipt printing module.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>special_chars</term>
+
+            <listitem>
+              <para>Lx-Office comes with a lot of interfaces to different
+              formats, some of which are rather picky with their accepted
+              charset. The <filename>special_chars</filename> file contains a
+              listing of chars not suited for different file format and
+              provides substitutions. It is written in "Simple Ini" style,
+              containing a block for every file format.</para>
+
+              <para>First entry should be the order of substitution for
+              entries as a whitespace separated list. All entries are
+              interpolated, so <literal>\n</literal>, <literal>\x20</literal>
+              and <literal>\\</literal> all work.</para>
+
+              <para>After that every entry is a special char that should be
+              translated when writing text into such a file.</para>
+
+              <para>Example:</para>
+
+              <programlisting>[Template/XML]
+order=&amp; &lt; &gt; \n
+&amp;=&amp;amp;
+&lt;=&amp;lt;
+&gt;=&amp;gt;
+\n=&lt;br&gt;</programlisting>
+
+              <para>Note the importance of the order in this example.
+              Substituting &lt; and &gt; befor &amp; would lead to $gt; become
+              &amp;amp;gt;</para>
+
+              <para>For a list of valid formats, see the German
+              <filename>special_chars</filename> entry. As of this writing the
+              following are recognized:</para>
+
+              <programlisting>HTML
+URL@HTML
+Template/HTML
+Template/XML
+Template/LaTeX
+Template/OpenDocument
+filenames</programlisting>
+
+              <para>The last of which is very machine dependant. Remember that
+              a lot of characters are forbidden by some filesystems, for
+              exmaple MS Windows doesn't like ':' in its files where Linux
+              doesn't mind that. If you want the files created with your
+              language pack to be portable, find all chars that could cause
+              trouble.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>missing</term>
+
+            <listitem>
+              <para>This file is not a part of the language package
+              itself.</para>
+
+              <para>This is a file generated by
+              <command>scripts/locales.pl</command> while processing your
+              locales. It's only to have the missing entries singled out and
+              does not belong to a language package.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>lost</term>
+
+            <listitem>
+              <para>This file is not a part of the language package
+              itself.</para>
+
+              <para>Another file generated by
+              <command>scripts/locales.pl</command>. If for any reason a
+              translation does not appear anymore and can be deleted, it gets
+              moved here. The last 50 or so entries deleted are saved here in
+              case you made a typo, so that you don't have to translate
+              everything again. If a tranlsation is missing, the lost file is
+              checked first. If you maintain a language package, you might
+              want to keep this safe somewhere.</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </sect2>
+
+      <sect2 id="devel.style-guide">
+       <title>Stil-Richtlinien</title>
+
+       <para>
+        Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar zu machen. Dazu gehört zum Einen, dass der Code
+        einheitlich eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte "Klammern" oder "Hash-Keys").
+       </para>
+
+       <para>
+        Diese Regeln sind keine Schikane sondern erleichtern allen das Leben!
+       </para>
+
+       <para>
+        Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
+        nicht.
+       </para>
+
+       <orderedlist>
+        <listitem>
+         <para>
+          Es werden keine echten Tabs sondern Leerzeichen verwendet.
+         </para>
+        </listitem>
+
+        <listitem>
+         <para>
+          Die Einrückung beträgt zwei Leerzeichen. Beispiel:
+         </para>
+
+         <programlisting>foreach my $row (@data) {
+  if ($flag) {
+    # do something with $row
+  }
+
+  if ($use_modules) {
+    $row-&gt;{modules} = MODULE-&gt;retrieve(
+      id   =&gt; $row-&gt;{id},
+      date =&gt; $use_now ? localtime() : $row-&gt;{time},
+    );
+  }
+
+  $report-&gt;add($row);
+}</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie der letzte Befehl. Beispiele:</para>
+
+         <programlisting>sub debug {
+  ...
+}</programlisting>
+
+         <para>oder</para>
+
+         <programlisting>if ($form-&gt;{item_rows} &gt; 0) {
+  ...
+}</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl / die öffnende schließende Klammer, die den Block gestartet
+          hat, und nicht auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
+         </para>
+        </listitem>
+
+        <listitem>
+         <para>
+          Die Wörter "<function>else</function>", "<function>elsif</function>", "<function>while</function>" befinden sich auf der gleichen
+          Zeile wie schließende geschweifte Klammern. Beispiele:
+         </para>
+
+         <programlisting>if ($form-&gt;{sum} &gt; 1000) {
+  ...
+} elsif ($form-&gt;{sum} &gt; 0) {
+  ...
+} else {
+  ...
+}
+
+do {
+  ...
+} until ($a &gt; 0);</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          Parameter von Funktionsaufrufen müssen mit runden Klammern versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
+          und grep-ähnliche Operatoren. Beispiel:
+         </para>
+
+         <programlisting>$main::lxdebug-&gt;message(&quot;Could not find file.&quot;);
+%options = map { $_ =&gt; 1 } grep { !/^#/ } @config_file;</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
+         </para>
+
+         <para>
+          Generell gilt: Hashkeys und Arrayindices sollten nicht durch Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
+          Blöcke schon. Beispiel:
+         </para>
+
+         <programlisting>if (($form-&gt;{debug} == 1) &amp;&amp; ($form-&gt;{sum} - 100 &lt; 0)) {
+  ...
+}
+
+$array[$i + 1]             = 4;
+$form-&gt;{sum}              += $form-&gt;{&quot;row_$i&quot;};
+$form-&gt;{ $form-&gt;{index} } += 1;
+
+map { $form-&gt;{sum} += $form-&gt;{&quot;row_$_&quot;} } 1..$rowcount;</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          Mehrzeilige Befehle
+         </para>
+
+         <orderedlist>
+          <listitem>
+           <para>
+            Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
+            werden, in der die ersten Funktionsparameter in der ersten Zeile stehen. Beispiel:
+           </para>
+
+           <programlisting>$sth = $dbh-&gt;prepare(&quot;SELECT * FROM some_table WHERE col = ?&quot;,
+                     $form-&gt;{some_col_value});</programlisting>
+          </listitem>
+
+          <listitem>
+           <para>
+            Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer übersichtlichen Tabellenstruktur organisiert
+            wird. Beispiel:
+           </para>
+
+           <programlisting>my $rowcount = $form-&gt;{&quot;row_$i&quot;} ? $i
+             : $form-&gt;{oldcount} ? $form-&gt;{oldcount} + 1
+             :                     $form-&gt;{rowcount} - $form-&gt;{rowbase};</programlisting>
+          </listitem>
+         </orderedlist>
+        </listitem>
+
+        <listitem>
+         <para>
+          Kommentare
+         </para>
+
+         <orderedlist>
+          <listitem>
+           <para>Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der Code eingerückt sein.</para>
+          </listitem>
+
+          <listitem>
+           <para>Seitliche hängende Kommentare sollten einheitlich formatiert werden.</para>
+          </listitem>
+
+          <listitem>
+           <para>
+            Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch zu verfassen. So wie ich keine Lust habe, französischen
+            Quelltext zu lesen, sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein. Beispiel:
+           </para>
+
+           <programlisting>my $found = 0;
+while (1) {
+  last if $found;
+
+  # complicated check
+  $found = 1 if //
+}
+
+$i = 0         # initialize $i
+$n = $i;       # save $i
+$i *= $const;  # do something crazy
+$i = $n;       # recover $i</programlisting>
+          </listitem>
+         </orderedlist>
+        </listitem>
+
+        <listitem>
+         <para>
+          Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation gewünscht ist. Beispiel:
+         </para>
+
+         <programlisting>$form-&gt;{sum}      = 0;
+$form-&gt;{&quot;row_$i&quot;} = $form-&gt;{&quot;row_$i&quot;} - 5;
+$some_hash{42}    = 54;</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
+          wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann ist Lesbarkeit vorzuziehen.
+         </para>
+
+         <para>
+          Als Beispiel sei die Funktion <function>print_options</function> aus <filename>bin/mozilla/io.pl</filename> angeführt.
+         </para>
+        </listitem>
+
+        <listitem>
+         <para>
+          Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die
+          diffs verfälschen.
+         </para>
+
+         <para>
+          Emacs und vim haben beide recht einfache Methoden zur Entfernung von trailing whitespace. Emacs kennt das Kommande
+          <command>nuke-trailing-whitespace</command>, vim macht das gleiche manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
+          BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern gebunden.
+         </para>
+        </listitem>
+
+        <listitem>
+         <para>
+          Es wird kein <command>perltidy</command> verwendet.
+         </para>
+
+         <para>
+          In der Vergangenheit wurde versucht, <command>perltidy</command> zu verwenden, um einen einheitlichen Stil zu erlangen. Es hat
+          sich aber gezeigt, dass <command>perltidy</command>s sehr eigenwilliges Verhalten, was Zeilenumbrüche angeht, oftmals gut
+          formatierten Code zerstört. Für den Interessierten sind hier die <command>perltidy</command>-Optionen, die grob den
+          beschriebenen Richtlinien entsprechen:
+         </para>
+
+         <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
+-aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
+-lp -vt=1 -vtc=1</programlisting>
+        </listitem>
+
+        <listitem>
+         <para>
+          <varname>STDERR</varname> ist tabu. Unkonditionale Debugmeldungen auch.
+         </para>
+
+         <para>
+          Lx-Office bietet mit dem Modul <classname>LXDebug</classname> einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
+          Grund, nach <varname>STDERR</varname> zu schreiben.
+         </para>
+
+         <para>
+          Die <classname>LXDebug</classname>-Methode "<function>message</function>" nimmt als ersten Paramter außerdem eine Flagmaske, für
+          die die Meldung angezeigt wird, wobei "0" immer angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden und werden in
+          den meisten Fällen auch vom Repository zurückgewiesen.
+         </para>
+        </listitem>
+
+        <listitem>
+         <para>
+          Alle neuen Module müssen use strict verwenden.
+         </para>
+
+         <para>
+          <varname>$form</varname>, <varname>$auth</varname>, <varname>$locale</varname>, <varname>$lxdebug</varname> und
+          <varname>%myconfig</varname> werden derzeit aus dem main package importiert (siehe <xref linkend="devel.globals"/>. Alle anderen
+          Konstrukte sollten lexikalisch lokal gehalten werden.
+         </para>
+        </listitem>
+       </orderedlist>
+      </sect2>
+    </sect1>
+  </chapter>
+</book>
diff --git a/doc/dokumentenvorlagen-und-variablen.html b/doc/dokumentenvorlagen-und-variablen.html
deleted file mode 100644 (file)
index e1dac11..0000000
+++ /dev/null
@@ -1,1660 +0,0 @@
-<html>
- <head>
-  <title>Dokumentenvorlagen und verf&uuml;gbare Variablen</title>
-  <style type="text/css">
-  <!--
-.blue {
-           color: #000000;
-           background-color: #b0ecff;
-           border: 1px solid blue;
-           padding-left: 2px;
-           padding-right: 2px;
-           }
-
-table {
-        color: #000000;
-        background-color: #fae8b8;
-        border: 1px solid #be5303;
-        border-collapse: collapse;
-        }
-
-td {
-     border: 1px solid #be5303;
-     padding: 3px;
-     }
-    -->
-  </style>
-
- </head>
-
-<body>
-
- <h1>Dokumentenvorlagen und verf&uuml;gbare Variablen</h1>
-
- <p>geschrieben von <a href="mailto:m.bunkus@linet-services.de">Moritz
-   Bunkus</a>. Version: $Id$ </p>
-
- <hr>
-
- <h2><a name="inhaltsverzeichnis">Inhaltsverzeichnis</a></h2>
-
- <ol>
-  <li><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-    Inhaltsverzeichnis</a></li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#einfuehrung">Einf&uuml;hrung</a>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#zuordnung_dateinamen">
-    Zuordnung von Dateinamen zu den Funktionen</a></li>
-
-  <li><a href="#variablen_ausgeben">Variablen ausgeben</a>
-  </li>
-
-  <li><a href="#verwendung_in_druckbefehlen">Verwendung in Druckbefehlen</a>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#tag_style">
-    Anfang und Ende der Tags ver&auml;ndern</a></li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#allgemeine_variablen">
-    Allgemeine Variablen, die in allen Vorlagen vorhanden sind</a><br>
-
-   <ol>
-    <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_stammdaten">
-      Stammdaten von Kunden und Lieferanten</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_bearbeiter">
-      Informationen &uuml;ber den Bearbeiter</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_verkaeufer">
-      Informationen &uuml;ber den Verk&auml;ufer</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_steuern">
-      Variablen f&uuml;r jede Steuer</a></li>
-   </ol>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#invoice">
-    Variablen in Rechnungen</a>
-
-   <ol>
-    <li><a href="dokumentenvorlagen-und-variablen.html#invoice_allgemein">
-      Allgemeine Variablen</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#invoice_posten">
-      Variablen f&uuml;r jeden Posten auf der Rechnung</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#invoice_zahlungen">
-      Variablen f&uuml;r die Zahlungseing&auml;nge</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#invoice_benutzerdefinierte_variablen_vc">
-      Benutzerdefinierte Kunden- und Lieferantenvariablen</a></li>
-   </ol>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#dunning">
-    Variablen in Mahnungen und Rechnungen &uuml;ber Mahngeb&uuml;hren</a>
-
-   <ol>
-    <li><a href="dokumentenvorlagen-und-variablen.html#dunning_vorlagennamen">
-      Namen der Vorlagen</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#dunning_allgemein">
-      Allgemeine Variablen in Mahnungen</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#dunning_details">
-      Variablen f&uuml;r jede gemahnte Rechnung in einer Mahnung</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#dunning_invoice">
-      Variablen in automatisch erzeugten Rechnungen &uuml;ber Mahngeb&uuml;hren</a></li>
-   </ol>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen">
-    Variablen in anderen Vorlagen</a>
-
-   <ol>
-    <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_quotations">Angebote und Preisanfragen</a></li>
-    <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_orders">Auftragsbest&auml;tigungen und Lieferantenauftr&auml;ge</a></li>
-    <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_delivery_orders">Lieferscheine (Verkauf und Einkauf)</a></li>
-    <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_statement">Sammelrechnung</a></li>
-   </ol>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#bloecke">
-    Bl&ouml;cke, bedingte Anweisungen und Schleifen</a>
-
-   <ol>
-    <li><a href="dokumentenvorlagen-und-variablen.html#bloecke_if">
-      Der <code>if</code>-Block</a></li>
-
-    <li><a href="dokumentenvorlagen-und-variablen.html#bloecke_foreach">
-      Die <code>foreach</code>-Schleife</a></li>
-   </ol>
-  </li>
-
-  <li><a href="dokumentenvorlagen-und-variablen.html#markup">
-    Markup-Code, der innerhalb von Formularen zur Textformatierung verwendet
-    werden kann</a></li>
-
- </ol>
-
- <hr>
-
- <h2><a name="einfuehrung">Einf&uuml;hrung</a></h2>
-
- <p>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und aller
-  zur Bearbeitung verf&uuml;gbaren Variablen. Eine Variable wird in
-  einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
-  <code>&lt;%variablenname%&gt;</code> verwendet wird. F&uuml;r LaTeX-
-  und HTML-Vorlagen kann man die Form dieser Tags auch
-  <a href="dokumentenvorlagen-und-variablen.html#tag_style">
-   ver&auml;ndern</a>.
- </p>
-
- <p>Einige Zahlenwerte werden auch in unformatierter Form zur Verf&uuml;gung
-  gestellt (also z.B. 35 statt 35,00 oder 12.3 statt 12,30). Der Dezimaltrenner
-  ist dabei also immer ein Punkt unabhaengig vom eingestellten Zahlenformat.
-  Diese Variabelen kann man mit der Erweiterung _nofmt (f&uuml;r  no-format) aufrufen
-  (also z.B. netprice = 12,30 -- netprice_nofmt = 12.3). Variabeln die zus&auml;tzlich
-  unformatiert zur Verf&uuml;gung stehen sind unten als variable[_nofmt] gelistet.
-  Die Eckigen Klammern weisen also auf eine optionale Verw&auml;ndung der Erweiterung hin.
-  </p>
-
- <p>Fr&uuml;her wurde hier nur &uuml;ber LaTeX gesprochen. Inzwischen
-  unterst&uuml;tzt Lx-Office aber auch OpenDocument-Vorlagen. Sofern
-  es nicht ausdr&uuml;cklich eingeschr&auml;nkt wird, gilt das im
-  Folgenden gesagte f&uuml;r alle Vorlagenarten.</p>
-
- <p>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
-  verf&uuml;gbar als hier aufgelistet werden. Die meisten davon k&ouml;nnen
-  allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
-  werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann diese wie
-  folgt erhalten werden:</p>
-
- <ol>
-
-  <li><code>SL/Form.pm</code> &ouml;ffnen und am Anfang die Zeile
-   <pre>"use Data::Dumper;"</pre> einf&uuml;gen.</li>
-
-  <li>In <code>Form.pm</code> die Funktion <code>parse_template</code>
-   suchen und hier die Zeile <pre>print(STDERR Dumper($self));</pre>
-   einf&uuml;gen.</li>
-
-  <li>Einmal per Browser die gew&uuml;nschte Vorlage "benutzen", z.B. ein PDF
-   f&uuml;r eine Rechnung erzeugen.</li>
-
-  <li>Im <code>error.log</code> vom Apache steht die Ausgabe der Variablen
-   <code>$self</code> in der Form <code>'key' =&gt; 'value',</code>. Alle
-   <code>key</code>s sind verf&uuml;gbar.</li>
-
- </ol>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="variablen_ausgeben">Variablen ausgeben</a></h2>
-
- <p>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
-  Tags geschrieben werden, also
-  z.B. <code>&lt;%variablenname%&gt;</code>.</p>
-
- <p>
-  Optional kann man auch mit Leerzeichen getrennte Flags angeben, die
-  man aber nur selten brauchen wird. Die Syntax sieht also so
-  aus: <code>&lt;%variablenname FLAG1 FLAG2%&gt;</code>. Momentan werden
-  die folgenden Flags unterstützt:
- </p>
-
- <ul>
-  <li>
-   <code>NOFORMAT</code> gilt nur für Zahlenwerte und gibt den Wert
-   ohne Formatierung, also ohne Tausendertrennzeichen mit mit einem
-   Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn damit in der
-   Vorlage z.B. von LaTeX gerechnet werden soll.
-  </li>
-
-  <li>
-   <code>NOESCAPE</code> unterdrückt das Escapen von Sonderzeichen für
-   die Vorlagensprache. Wenn also in einer Variablen bereits gültiger
-   LaTeX-Code steht und dieser von LaTeX auch ausgewertet und nicht
-   wortwörtlich angezeigt werden soll, so ist dieses Flag sinnvoll.
-  </li>
- </ul>
-
- <p>
-  Beispiel: <code class="blue">&lt;%quototal NOFORMAT%&gt;</code>
- </p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="verwendung_in_druckbefehlen">Verwendung in Druckbefehlen</a></h2>
-
- <p>
-  In der Admininstration können Drucker definiert werden. Auch im dort
-  eingebbaren Druckbefehl können die hier aufgelisteten Variablen und
-  Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach den
-  Regeln der gängigen Shells formatiert, sodass Sonderzeichen
-  wie <code>`...`</code> nicht zu unerwünschtem Verhalten führen.
- </p>
-
- <p>
-  Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl, für
-  das die Telefonnummer eines Ansprechpartners als Teil der
-  Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
-  z.B. wie folgt aussehen:
- </p>
-
- <p>
-  <code>send_fax --number &lt;%if cp_phone2%&gt;&lt;%cp_phone2%&gt;&lt;%else%&gt;&lt;%cp_phone1%&gt;&lt;%end%&gt;</code>
- </p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="tag_style">
-   Anfang und Ende der Tags ver&auml;ndern</a></h2>
-
- <p>Der Standardstil f&uuml;r Tags sieht vor, dass ein Tag mit dem
-  Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
-  Prozentzeichen und dem Gr&ouml;&szlig;erzeichen endet,
-  beispielsweise <code>&lt;%customer%&gt;</code>. Da diese Form aber
-  z.B. in LaTeX zu Problemen f&uuml;hren kann, weil das Prozentzeichen
-  dort Kommentare einleitet, kann pro HTML- oder
-  LaTeX-Dokumentenvorlage der Stil umgestellt werden.</p>
-
- <p>Dazu werden in die Datei Zeilen geschrieben, die mit dem f&uuml;r
-  das Format g&uuml;ltigen Kommentarzeichen anfangen,
-  dann <code>config:</code> enthalten, die entsprechende Option setzen
-  und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
-  enden. Beispiel f&uuml;r LaTeX:</p>
-
- <p><code>% config: tag-style=($ $)</code></p>
-
- <p>Dies w&uuml;rde Lx-Office dazu veranlassen, Variablen zu ersetzen,
-  wenn sie wie folgt aussehen: <code>($customer$)</code>. Das
-  &auml;quivalente Beispiel f&uuml;r HTML-Dokumentenvorlagen sieht so
-  aus:</p>
-
- <p><code>&lt;!-- config: tag-style=($ $) --&gt;</code></p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="zuordnung_dateinamen">
-   Zuordnung von den Dateinamen zu den Funktionen</a></h2>
-
- <p>Diese folgende kurze Auflistung zeigt, welche Vorlage bei welcher
-  Funktion ausgelesen wird. Dabei ist die Dateiendung &quot;.ext&quot;
-  geeignet zu ersetzen: &quot;.tex&quot; f&uuml; LaTeX-Vorlagen und
-  &quot;.odt&quot; f&uuml;r OpenDocument-Vorlagen.</p>
-
- <p>
-  <table border="1">
-   <tr>
-    <th>Dateiname</th>
-    <th>Bedeutung</th>
-   </tr>
-   <tr>
-    <td><code>bin_list.ext</code></td>
-    <td>Lagerliste</td>
-   </tr>
-   <tr>
-    <td><code>check.ext</code></td>
-    <td>?</td>
-   </tr>
-   <tr>
-    <td><code>invoice.ext</code></td>
-    <td>Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>packing_list.ext</code></td>
-    <td>Packliste</td>
-   </tr>
-   <tr>
-    <td><code>pick_list.ext</code></td>
-    <td>Sammelliste</td>
-   </tr>
-   <tr>
-    <td><code>purchase_delivery_order.ext</code></td>
-    <td>Lieferschein (Einkauf)</td>
-   </tr>
-   <tr>
-    <td><code>purcharse_order.ext</code></td>
-    <td>Bestellung an Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>request_quotation.ext</code></td>
-    <td>Anfrage an Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>sales_delivery_order.ext</code></td>
-    <td>Lieferschein (Verkauf)</td>
-   </tr>
-   <tr>
-    <td><code>sales_order.ext</code></td>
-    <td>Bestellung</td>
-   </tr>
-   <tr>
-    <td><code>sales_quotation.ext</code></td>
-    <td>Angebot an Kunden</td>
-   </tr>
-   <tr>
-    <td><code>zahlungserinnerung.ext</code></td>
-    <td>Mahnung (Dateiname im Programm konfigurierbar)</td>
-   </tr>
-   <tr>
-    <td><code>zahlungserinnerung_invoice.ext</code></td>
-    <td>Rechnung &uuml;ber Mahngeb&uuml;hren (Dateiname im Programm konfigurierbar)</td>
-   </tr>
-  </table>
- </p>
-
- <a name="#dateinamen_erweitert"<h3>Sprache, Drucker und E-Mail</h3>
-
- <p>Angeforderte Sprache und Druckerk&uuml;rzel in den Dateinamen mit eingearbeitet. So wird aus der Vorlage <code>sales_order.ext</code> bei Sprache <code>de</code> und Druckerk&uuml;rzel <code>lpr2</code> der Vorlagenname <code>sales_order_de_lpr2.ext</code>. Zus&auml;tzlich k&ouml;nnen f&uuml;r E-Mails andere Vorlagen erstellt werden, diese bekommen dann noch das K&uuml;rzel <code>_email</code>, der vollst&auml;ndige Vorlagenname w&auml;re dann <code>sales_order_email_de_lpr2.ext</code>. In allen F&auml;llen kann eine Standarddatei <code>default.ext</code> hinterlegt werden. Diese wird verwendet, wenn keine der anderen Varianten gefunden wird.</p>
-
- <p>Die vollst&auml;ndige Suchreihenfolge f&uuml;r einen Verkaufsauftrag mit der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF verschickt wird, ist:</p>
- <p>
-  <table border='1'>
-   <tr><th>Reihenfolge der m&ouml;glichen Vorlagennamen</th></tr>
-   <tr><td><code>sales_order_email_de_lpr2.tex</code></td></tr>
-   <tr><td><code>sales_order_de_lpr2.tex</code></td></tr>
-   <tr><td><code>sales_order.tex</code></td></tr>
-   <tr><td><code>default.tex</code></td></tr>
-  </table>
- </p>
-
- <p>Die kurzen Varianten dieser Vorlagentitel m&uuml;ssen dann entweder Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten, siehe dazu <a href="#allgemein_meta">Metadaten in Vorlagen</a></p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="allgemeine_variablen">
-   Allgemeine Variablen, die in allen Vorlagen vorhanden sind</a></h2>
-
- <h3><a name="allgemein_meta">
-   Metainformationen zur angeforderten Vorlage:</a></h3>
-
- <p>Diese Variablen liefern Informationen dar&uuml;ber welche Variante einer Vorlage der Benutzer angefragt hat. Sie sind n&uuml;tzlich f&uuml;r Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen Formulare einbinden m&ouml;chten.</p>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>template_meta.formname</code></td>
-    <td>Basisname der Vorlage. Identisch mit der <a href="#zuordnung_dateinamen">Zurordnung zu den Dateinamen</a> ohne die Erweiterung. Ein Verkaufsauftrag enth&auml;lt hier <code>sales_order</code>.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.language.description</code></td>
-    <td>Beschreibung der verwendeten Sprache</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.language.template_code</code></td>
-    <td>Vorlagen&uuml;rzel der verwendeten Sprache, identisch mit dem K&uuml;rzel das im Dateinamen verwendetet wird.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.language.output_numberformat</code></td>
-    <td>Zahlenformat der verwendeten Sprache in der Form "1.000,00". <em>Experimentell!</em>. Nur interessant f&uuml;r Vorlagen die mit unformatierten Werten arbeiten.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.language.output_dateformat</code></td>
-    <td>Datumsformat der verwendeten Sprache in der Form "dd.mm.yyyy". <em>Experimentell!</em>. Nur interessant f&uuml;r Vorlagen die mit unformatierten Werten arbeiten.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.format</code></td>
-    <td>Das angeforderte Format. Kann im Moment die Werte <code>pdf</code>, <code>postscript</code>, <code>html</code>, <code>opendocument</code>, <code>opendocument_pdf</code> und <code>excel</code> enthalten.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.extension</code></td>
-    <td>Dateierweiterung, wie im Dateinamen. Wird aus <code>format</code> entschieden.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.media</code></td>
-    <td>Ausgabemedium. Kann zur Zeit die Werte <code>screen</code> f&uuml;r Bildschirm, <code>email</code> f&uuml;r E-Mmail (triggert das <code>_email</code> K&uuml;rzel im Dateinamen), <code>printer</code> f&uuml;r Drucker, und <code>queue</code> f&uuml;r Warteschlange enthalten.</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.printer.description</code></td>
-    <td>Beschreibung des ausgew&auml;hlten Druckers</td>
-   </tr>
-   <tr>
-    <td><code>template_meta.printer.template_code</code></td>
-    <td>Vorlagen&uuml;rzel des ausgew&auml;hlten Druckers, identisch mit dem K&uuml;rzel das im Dateinamen verwendetet wird.</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="allgemein_stammdaten">
-   Stammdaten von Kunden und Lieferanten:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>account_number</code></td>
-    <td>Kontonummer</td>
-   </tr>
-   <tr>
-    <td><code>bank</code></td>
-    <td>Name der Bank</td>
-   </tr>
-   <tr>
-    <td><code>bank_code</code></td>
-    <td>Bankleitzahl</td>
-   </tr>
-   <tr>
-    <td><code>bic</code></td>
-    <td>Bank-Identifikations-Code (Bank Identifier Code, BIC)</td>
-   </tr>
-   <tr>
-    <td><code>business</code></td>
-    <td>Kunden-/Lieferantentyp</td>
-   </tr>
-   <tr>
-    <td><code>city</code></td>
-    <td>Stadt</td>
-   </tr>
-   <tr>
-    <td><code>contact</code></td>
-    <td>Kontakt</td>
-   </tr>
-   <tr>
-    <td><code>country</code></td>
-    <td>Land</td>
-   </tr>
-   <tr>
-    <td><code>cp_email</code></td>
-    <td>Email des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_givenname</code></td>
-    <td>Vorname des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_greeting</code></td>
-    <td>Anrede des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_name</code></td>
-    <td>Name des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_phone1</code></td>
-    <td>Telefonnummer 1 des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_phone2</code></td>
-    <td>Telefonnummer 2 des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>cp_title</code></td>
-    <td>Titel des Ansprechpartners</td>
-   </tr>
-   <tr>
-    <td><code>creditlimit</code></td>
-    <td>Kreditlimit</td>
-   </tr>
-   <tr>
-    <td><code>customeremail</code></td>
-    <td>Email des Kunden; nur f&uuml;r Kunden</td>
-   </tr>
-   <tr>
-    <td><code>customerfax</code></td>
-    <td>Faxnummer des Kunden; nur f&uuml;r Kunden</td>
-   </tr>
-   <tr>
-    <td><code>customernotes</code></td>
-    <td>Bemerkungen beim Kunden; nur f&uuml;r Kunden</td>
-   </tr>
-   <tr>
-    <td><code>customernumber</code></td>
-    <td>Kundennummer; nur f&uuml;r Kunden</td>
-   </tr>
-   <tr>
-    <td><code>customerphone</code></td>
-    <td>Telefonnummer des Kunden; nur f&uuml;r Kunden</td>
-   </tr>
-   <tr>
-    <td><code>discount</code></td>
-    <td>Rabatt</td>
-   </tr>
-   <tr>
-    <td><code>email</code></td>
-    <td>Emailadresse</td>
-   </tr>
-   <tr>
-    <td><code>fax</code></td>
-    <td>Faxnummer</td>
-   </tr>
-   <tr>
-    <td><code>homepage</code></td>
-    <td>Homepage</td>
-   </tr>
-   <tr>
-    <td><code>iban</code></td>
-    <td>Internationale Kontonummer (International Bank Account Number, IBAN)</td>
-   </tr>
-   <tr>
-    <td><code>language</code></td>
-    <td>Sprache</td>
-   </tr>
-   <tr>
-    <td><code>name</code></td>
-    <td>Firmenname</td>
-   </tr>
-   <tr>
-    <td><code>payment_description</code></td>
-    <td>Name der Zahlart</td>
-   </tr>
-   <tr>
-    <td><code>payment_terms</code></td>
-    <td>Zahlungskonditionen</td>
-   </tr>
-   <tr>
-    <td><code>phone</code></td>
-    <td>Telefonnummer</td>
-   </tr>
-   <tr>
-    <td><code>shiptocity</code></td>
-    <td>Stadt (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptocontact</code></td>
-    <td>Kontakt (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptocountry</code></td>
-    <td>Land (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptodepartment1</code></td>
-    <td>Abteilung 1 (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptodepartment2</code></td>
-    <td>Abteilung 2 (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptoemail</code></td>
-    <td>Email (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptofax</code></td>
-    <td>Fax (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptoname</code></td>
-    <td>Firmenname (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptophone</code></td>
-    <td>Telefonnummer (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptostreet</code></td>
-    <td>Stra&szlig;e und Hausnummer (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>shiptozipcode</code></td>
-    <td>Postleitzahl (Lieferadresse)
-     <a href="dokumentenvorlagen-und-variablen.html#anmerkung_shipto">*</a></td>
-   </tr>
-   <tr>
-    <td><code>street</code></td>
-    <td>Stra&szlig;e und Hausnummer</td>
-   </tr>
-   <tr>
-    <td><code>taxnumber</code></td>
-    <td>Steuernummer</td>
-   </tr>
-   <tr>
-    <td><code>ustid</code></td>
-    <td>Umsatzsteuer-Identifikationsnummer</td>
-   </tr>
-   <tr>
-   <tr>
-    <td><code>vendoremail</code></td>
-    <td>Email des Lieferanten; nur f&uuml;r Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>vendorfax</code></td>
-    <td>Faxnummer des Lieferanten; nur f&uuml;r Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>vendornotes</code></td>
-    <td>Bemerkungen beim Lieferanten; nur f&uuml;r Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>vendornumber</code></td>
-    <td>Lieferantennummer; nur f&uuml;r Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>vendorphone</code></td>
-    <td>Telefonnummer des Lieferanten; nur f&uuml;r Lieferanten</td>
-   </tr>
-   <tr>
-    <td><code>zipcode</code></td>
-    <td>Postleitzahl</td>
-   </tr>
-  </table>
- </p>
-
- <p><a name="anmerkung_shipto"><em>Anmerkung</em></a>: Sind die
-  <code>shipto*</code>-Felder in den Stammdaten nicht eingetragen, so haben
-  die Variablen <code>shipto*</code> den gleichen Wert wie die die
-  entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich einige
-  <code>shipto*</code>-Variablen so nicht in den Stammdaten wiederfinden
-  sondern schlicht Kopien der Lieferdatenvariablen sind
-  (z.B. <code>shiptocontact</code>).</p>
-
- <h3><a name="allgemein_bearbeiter">
-   Informationen &uuml;ber den Bearbeiter:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>employee_address</code></td>
-    <td>Adressfeld</td>
-   </tr>
-   <tr>
-    <td><code>employee_businessnumber</code></td>
-    <td>Firmennummer</td>
-   </tr>
-   <tr>
-    <td><code>employee_company</code></td>
-    <td>Firmenname</td>
-   </tr>
-   <tr>
-    <td><code>employee_co_ustid</code></td>
-    <td>Usatzsteuer-Identifikationsnummer</td>
-   </tr>
-   <tr>
-    <td><code>employee_duns</code></td>
-    <td>DUNS-Nummer</td>
-   </tr>
-   <tr>
-    <td><code>employee_email</code></td>
-    <td>Email</td>
-   </tr>
-   <tr>
-    <td><code>employee_fax</code></td>
-    <td>Fax</td>
-   </tr>
-   <tr>
-    <td><code>employee_name</code></td>
-    <td>voller Name</td>
-   </tr>
-   <tr>
-    <td><code>employee_signature</code></td>
-    <td>Signatur</td>
-   </tr>
-   <tr>
-    <td><code>employee_taxnumber</code></td>
-    <td>Steuernummer</td>
-   </tr>
-   <tr>
-    <td><code>employee_tel</code></td>
-    <td>Telefonnummer</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="allgemein_verkaeufer">
-   Informationen &uuml;ber den Verk&auml;ufer (nur bei Verkaufsmasken):</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>salesman_address</code></td>
-    <td>Adressfeld</td>
-   </tr>
-   <tr>
-    <td><code>salesman_businessnumber</code></td>
-    <td>Firmennummer</td>
-   </tr>
-   <tr>
-    <td><code>salesman_company</code></td>
-    <td>Firmenname</td>
-   </tr>
-   <tr>
-    <td><code>salesman_co_ustid</code></td>
-    <td>Usatzsteuer-Identifikationsnummer</td>
-   </tr>
-   <tr>
-    <td><code>salesman_duns</code></td>
-    <td>DUNS-Nummer</td>
-   </tr>
-   <tr>
-    <td><code>salesman_email</code></td>
-    <td>Email</td>
-   </tr>
-   <tr>
-    <td><code>salesman_fax</code></td>
-    <td>Fax</td>
-   </tr>
-   <tr>
-    <td><code>salesman_name</code></td>
-    <td>voller Name</td>
-   </tr>
-   <tr>
-    <td><code>salesman_signature</code></td>
-    <td>Signatur</td>
-   </tr>
-   <tr>
-    <td><code>salesman_taxnumber</code></td>
-    <td>Steuernummer</td>
-   </tr>
-   <tr>
-    <td><code>salesman_tel</code></td>
-    <td>Telefonnummer</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="allgemein_steuern">
-   Variablen f&uuml;r die einzelnen Steuern:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>tax</code></td>
-    <td>Steuer</td>
-   </tr>
-   <tr>
-    <td><code>taxbase</code></td>
-    <td>zu versteuernder Betrag</td>
-   </tr>
-   <tr>
-    <td><code>taxdescription</code></td>
-    <td>Name der Steuer</td>
-   </tr>
-   <tr>
-    <td><code>taxrate</code></td>
-    <td>Steuersatz</td>
-   </tr>
-  </table>
- </p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="invoice">Variablen in Rechnungen</a></h2>
-
- <h3><a name="invoice_allgemein">Allgemeine Variablen:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>creditremaining</code></td>
-    <td>Verbleibender Kredit</td>
-   </tr>
-   <tr>
-    <td><code>currency</code></td>
-    <td>W&auml;hrung</td>
-   </tr>
-   <tr>
-    <td><code>cusordnumber</code></td>
-    <td>Bestellnummer beim Kunden</td>
-   </tr>
-   <tr>
-    <td><code>deliverydate</code></td>
-    <td>Lieferdatum</td>
-   </tr>
-   <tr>
-    <td><code>duedate</code></td>
-    <td>F&auml;lligkeitsdatum</td>
-   </tr>
-   <tr>
-    <td><code>globalprojectnumber</code></td>
-    <td>Projektnummer des ganzen Beleges</td>
-   </tr>
-   <tr>
-    <td><code>globalprojectdescription</code></td>
-    <td>Projekbeschreibung des ganzen Beleges</td>
-   </tr>
-   <tr>
-    <td><code>intnotes</code></td>
-    <td>Interne Bemerkungen</td>
-   </tr>
-   <tr>
-    <td><code>invdate</code></td>
-    <td>Rechnungsdatum</td>
-   </tr>
-   <tr>
-    <td><code>invnumber</code></td>
-    <td>Rechnungsnummer</td>
-   </tr>
-   <tr>
-    <td><code>invtotal</code></td>
-    <td>gesamter Rechnungsbetrag</td>
-   </tr>
-   <tr>
-    <td><code>notes</code></td>
-    <td>Bemerkungen der Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>orddate</code></td>
-    <td>Auftragsdatum</td>
-   </tr>
-   <tr>
-    <td><code>ordnumber</code></td>
-    <td>Auftragsnummer, wenn die Rechnung aus einem Auftrag erstellt wurde</td>
-   </tr>
-   <tr>
-    <td><code>payment_description</code></td>
-    <td>Name der Zahlart</td>
-   </tr>
-   <tr>
-    <td><code>payment_terms</code></td>
-    <td>Zahlungskonditionen</td>
-   </tr>
-   <tr>
-    <td><code>quodate</code></td>
-    <td>Angebotsdatum</td>
-   </tr>
-   <tr>
-    <td><code>quonumber</code></td>
-    <td>Angebotsnummer</td>
-   </tr>
-   <tr>
-    <td><code>shippingpoint</code></td>
-    <td>Versandort</td>
-   </tr>
-   <tr>
-    <td><code>shipvia</code></td>
-    <td>Transportmittel</td>
-   </tr>
-   <tr>
-    <td><code>subtotal[_nofmt]</code></td>
-    <td>Zwischensumme aller Posten ohne Steuern</td>
-   </tr>
-   <tr>
-    <td><code>total</code></td>
-    <td>Restsumme der Rechnung (Summe abz&uuml;glich bereits bezahlter Posten)</td>
-   </tr>
-   <tr>
-    <td><code>transaction_description</code></td>
-    <td>Vorgangsbezeichnung</td>
-   </tr>
-   <tr>
-    <td><code>transdate</code></td>
-    <td>Auftragsdatum wenn die Rechnung aus einem Auftrag erstellt wurde</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="invoice_posten">
-   Variablen f&uuml;r jeden Posten auf der Rechnung:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>bin</code></td>
-    <td>Stellage</td>
-   </tr>
-   <tr>
-    <td><code>description</code></td>
-    <td>Artikelbeschreibung</td>
-   </tr>
-   <tr>
-    <td><code>discount[_nofmt]</code></td>
-    <td>Rabatt als Betrag</td>
-   </tr>
-   <tr>
-    <td><code>discount_sub[_nofmt]</code></td>
-    <td>Zwischensumme mit Rabatt</td>
-   </tr>
-   <tr>
-    <td><code>drawing</code></td>
-    <td>Zeichnung</td>
-   </tr>
-   <tr>
-    <td><code>ean</code></td>
-    <td>EAN-Code</td>
-   </tr>
-   <tr>
-    <td><code>image</code></td>
-    <td>Grafik</td>
-   </tr>
-   <tr>
-    <td><code>linetotal[_nofmt]</code></td>
-    <td>Zeilensumme (Anzahl * Einzelpreis)</td>
-   </tr>
-   <tr>
-    <td><code>longdescription</code></td>
-    <td>Langtext</td>
-   </tr>
-   <tr>
-    <td><code>microfiche</code></td>
-    <td>Mikrofilm</td>
-   </tr>
-   <tr>
-    <td><code>netprice[_nofmt]</code></td>
-    <td>Nettopreis</td>
-   </tr>
-   <tr>
-    <td><code>nodiscount_linetotal[_nofmt]</code></td>
-    <td>Zeilensumme ohne Rabatt</td>
-   </tr>
-   <tr>
-    <td><code>nodiscount_sub[_nofmt]</code></td>
-    <td>Zwischensumme ohne Rabatt</td>
-   </tr>
-   <tr>
-    <td><code>number</code></td>
-    <td>Artikelnummer</td>
-   </tr>
-   <tr>
-    <td><code>ordnumber_oe</code></td>
-    <td>Auftragsnummer des Originalauftrags, wenn die Rechnung aus einem Sammelauftrag erstellt wurde</td>
-   </tr>
-   <tr>
-   <td><code>p_discount</code></td>
-    <td>Rabatt in Prozent</td>
-   </tr>
-   <tr>
-    <td><code>partnotes</code></td>
-    <td>Die beim Artikel gespeicherten Bemerkungen</td>
-   </tr>
-   <tr>
-    <td><code>partsgroup</code></td>
-    <td>Warengruppe</td>
-   </tr>
-   <tr>
-    <td><code>price_factor</code></td>
-    <td>Der Preisfaktor als Zahl, sofern einer eingestellt ist</td>
-   </tr>
-   <tr>
-    <td><code>price_factor_name</code></td>
-    <td>Der Name des Preisfaktors, sofern einer eingestellt ist</td>
-   </tr>
-   <tr>
-    <td><code>projectnumber</code></td>
-    <td>Projektnummer</td>
-   </tr>
-   <tr>
-    <td><code>projectdescription</code></td>
-    <td>Projektbeschreibung</td>
-   </tr>
-   <tr>
-    <td><code>qty[_nofmt]</code></td>
-    <td>Anzahl</td>
-   </tr>
-   <tr>
-    <td><code>reqdate</code></td>
-    <td>Lieferdatum</td>
-   </tr>
-   <tr>
-    <td><code>runningnumber</code></td>
-    <td>Position auf der Rechnung (1, 2, 3...)</td>
-   </tr>
-   <tr>
-    <td><code>sellprice[_nofmt]</code></td>
-    <td>Verkaufspreis</td>
-   </tr>
-   <tr>
-    <td><code>serialnumber</code></td>
-    <td>Seriennummer</td>
-   </tr>
-   <tr>
-    <td><code>tax_rate</code></td>
-    <td>Steuersatz</td>
-   </tr>
-   <tr>
-    <td><code>transdate_oe</code></td>
-    <td>Auftragsdatum des Originalauftrags, wenn die Rechnung aus einem Sammelauftrag erstellt wurde</td>
-   </tr>
-   <tr>
-    <td><code>unit</code></td>
-    <td>Einheit</td>
-   </tr>
-   <tr>
-    <td><code>weight</code></td>
-    <td>Gewicht</td>
-   </tr>
-  </table>
- </p>
-
- <p>F&uuml;r jeden Posten gibt es ein Unterarray mit den Informationen &uuml;ber
-  Lieferanten und Lieferantenartikelnummer. Diese m&uuml;ssen mit
-  einer <code>foreach</code>-Schleife ausgegeben werden, da f&uuml;r jeden
-  Artikel mehrere Lieferanteninformationen hinterlegt sein k&ouml;nnen. Die
-  Variablen daf&uuml;r lauten:</p>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>make</code></td>
-    <td>Lieferant</td>
-   </tr>
-   <tr>
-    <td><code>model</code></td>
-    <td>Lieferantenartikelnummer</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="invoice_zahlungen">
-   Variablen f&uuml;r die einzelnen Zahlungseing&auml;nge:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>payment</code></td>
-    <td>Betrag</td>
-   </tr>
-   <tr>
-    <td><code>paymentaccount</code></td>
-    <td>Konto</td>
-   </tr>
-   <tr>
-    <td><code>paymentdate</code></td>
-    <td>Datum</td>
-   </tr>
-   <tr>
-    <td><code>paymentmemo</code></td>
-    <td>Memo</td>
-   </tr>
-   <tr>
-    <td><code>paymentsource</code></td>
-    <td>Beleg</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="invoice_benutzerdefinierte_variablen_vc">
-   Benutzerdefinierte Kunden- und Lieferantenvariablen:</a></h3>
-
- <p>
-  Die vom Benutzer definierten Variablen f&uuml;r Kunden und
-  Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
-  ebenfalls zur Verf&uuml;gung. Ihre Namen setzen sich aus dem
-  Pr&auml;fix <code>vc_cvar_</code> und dem vom Benutzer festgelegten
-  Variablennamen zusammen.</p>
-
- <p>Beispiel: Der Benutzer hat eine Variable
-  namens <code>number_of_employees</code> definiert, die die Anzahl
-  der Mitarbeiter des Unternehmens enth&auml;lt. Diese Variable steht
-  dann unter dem Namen <code>vc_cvar_number_of_employees</code> zur
-  Verf&uuml;gung.</p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="dunning">Variablen in Mahnungen und Rechnungen &uuml;ber Mahngeb&uuml;hren</a></h2>
-
- <h3><a name="dunning_vorlagennamen">Namen der Vorlagen</a></h3>
-
- <p>Die Namen der Vorlagen werden im System-Men&uuml; vom Benutzer
-  eingegeben. Wird f&uuml;r ein Mahnlevel die Option zur automatischen
-  Erstellung einer Rechnung &uuml;ber die Mahngeb&uuml;hren und Zinsen
-  aktiviert, so wird der Name der Vorlage f&uuml;r diese Rechnung aus
-  dem Vorlagenname f&uuml;r diese Mahnstufe mit dem
-  Zusatz <code>_invoice</code> gebildet. Weiterhin werden die
-  K&uuml;rzel f&uuml;r die ausgew&auml;hlte Sprache und den
-  ausgew&auml;hlten Drucker angeh&auml;ngt.</p>
-
- <h3><a name="dunning_allgemein">Allgemeine Variablen in Mahnungen:</a></h3>
-
- <p>Die Variablen des Verk&auml;ufers stehen wie gewohnt
-  als <code>employee_...</code> zur Verf&uuml;gung. Die Adressdaten des
-  Kunden stehen als Variablen <code>name</code>, <code>street</code>,
-  <code>zipcode</code>, <code>city</code>, <code>country</code>,
-  <code>department_1</code>, <code>department_2</code>, und
-  <code>email</code> zur Verf&uuml;gung.
- </p>
-
- <p>Weitere Variablen beinhalten:</p>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>dunning_date</code></td>
-    <td>Datum der Mahnung</td>
-   </tr>
-   <tr>
-    <td><code>dunning_duedate</code></td>
-    <td>F&auml;lligkeitsdatum f&uuml;r diese Mahhnung</td>
-   </tr>
-   <tr>
-    <td><code>dunning_id</code></td>
-    <td>Mahnungsnummer</td>
-   </tr>
-   <tr>
-    <td><code>fee</code></td>
-    <td>Kummulative Mahngeb&uuml;hren</td>
-   </tr>
-   <tr>
-    <td><code>interest_rate</code></td>
-    <td>Zinssatz per anno in Prozent</td>
-   </tr>
-   <tr>
-    <td><code>total_amount</code></td>
-    <td>Gesamter noch zu zahlender Betrag als <code>fee</code> + <code>total_interest</code> + <code>total_open_amount</code></td>
-   </tr>
-   <tr>
-    <td><code>total_interest</code></td>
-    <td>Zinsen per anno &uuml;ber alle Rechnungen</td>
-   </tr>
-   <tr>
-    <td><code>total_open_amount</code></td>
-    <td>Summe &uuml;ber alle offene Betr&auml;ge der Rechnungen</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="dunning_details">
-   Variablen f&uuml;r jede gemahnte Rechnung in einer Mahnung:</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>dn_amount</code></td>
-    <td>Rechnungssumme (brutto)</td>
-   </tr>
-   <tr>
-    <td><code>dn_duedate</code></td>
-    <td>Originales F&auml;lligkeitsdatum der Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>dn_dunning_date</code></td>
-    <td>Datum der Mahnung</td>
-   </tr>
-   <tr>
-    <td><code>dn_dunning_duedate</code></td>
-    <td>F&auml;lligkeitsdatum der Mahnung</td>
-   </tr>
-   <tr>
-    <td><code>dn_fee</code></td>
-    <td>Kummulative Mahngeb&uuml;hr</td>
-   </tr>
-   <tr>
-    <td><code>dn_interest</code></td>
-    <td>Zinsen per anno f&uuml;r diese Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>dn_invnumber</code></td>
-    <td>Rechnungsnummer</td>
-   </tr>
-   <tr>
-    <td><code>dn_linetotal</code></td>
-    <td>Noch zu zahlender Betrag (ergibt sich aus <code>dn_open_amount + dn_fee + dn_interest</code>)</td>
-   </tr>
-   <tr>
-    <td><code>dn_netamount</code></td>
-    <td>Rechnungssumme (netto)</td>
-   </tr>
-   <tr>
-    <td><code>dn_open_amount</code></td>
-    <td>Offener Rechnungsbetrag</td>
-   </tr>
-   <tr>
-    <td><code>dn_ordnumber</code></td>
-    <td>Bestellnummer</td>
-   </tr>
-   <tr>
-    <td><code>dn_transdate</code></td>
-    <td>Rechnungsdatum</td>
-   </tr>
-   <tr>
-    <td><code>dn_curr</code></td>
-    <td>W&auml;hrung, in der die Rechnung erstellt wurde. (Die Rechnungsbetr&auml;ge
-      sind aber immer in der Hauptw&auml;hrung)</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="dunning_invoice">Variablen in automatisch erzeugten
-   Rechnungen &uuml;ber Mahngeb&uuml;hren</a></h3>
-
- <p>Die Variablen des Verk&auml;ufers stehen wie gewohnt
-  als <code>employee_...</code> zur Verf&uuml;gung. Die Adressdaten des
-  Kunden stehen als Variablen <code>name</code>, <code>street</code>,
-  <code>zipcode</code>, <code>city</code>, <code>country</code>,
-  <code>department_1</code>, <code>department_2</code>, und
-  <code>email</code> zur Verf&uuml;gung.
- </p>
-
- <p>Weitere Variablen beinhalten:</p>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>duedate</code></td>
-    <td>F&auml;lligkeitsdatum der Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>dunning_id</code></td>
-    <td>Mahnungsnummer</td>
-   </tr>
-   <tr>
-    <td><code>fee</code></td>
-    <td>Mahngeb&uuml;hren</td>
-   </tr>
-   <tr>
-    <td><code>interest</code></td>
-    <td>Zinsen</td>
-   </tr>
-   <tr>
-    <td><code>invamount</code></td>
-    <td>Rechnungssumme (ergibt sich aus <code>fee + interest</code>)</td>
-   </tr>
-   <tr>
-    <td><code>invdate</code></td>
-    <td>Rechnungsdatum</td>
-   </tr>
-   <tr>
-    <td><code>invnumber</code></td>
-    <td>Rechnungsnummer</td>
-   </tr>
-  </table>
- </p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="anderevorlagen">
-   Variablen in anderen Vorlagen</a></h2>
-
- <p>Die Variablen in anderen Vorlagen sind &auml;hnlich wie in der
-  Rechnung. Allerdings hei&szlig;en die Variablen, die mit <code>inv</code>
-  beginnen, jetzt anders. Bei den Angeboten fangen sie mit <code>quo</code>
-  f&uuml;r "quotation" an: <code>quodate</code> f&uuml;r Angebotsdatum
-  etc. Bei Bestellungen wiederum fangen sie mit <code>ord</code> f&uuml;r
-  "order" an: <code>ordnumber</code> f&uuml;r Bestellnummer etc.</p>
-
- <p>Manche Variablen sind in anderen Vorlagen hingegen gar nicht vorhanden wie
-  z.B. die f&uuml;r bereits verbuchte Zahlungseing&auml;nge. Dies sind
-  Variablen, die vom Gesch&auml;ftsablauf her in der entsprechenden Vorlage
-  keine Bedeutung haben oder noch nicht belegt sein k&ouml;nnen.</p>
-
- <p>Im Folgenden werden nur wichtige Unterschiede zu den Variablen in
-  Rechnungen aufgef&uuml;hrt.</p>
-
- <h3><a name="anderevorlagen_quotations">Angebote und Preisanfragen</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>quonumber</code></td>
-    <td>Angebots- bzw. Anfragenummer</td>
-   </tr>
-   <tr>
-    <td><code>reqdate</code></td>
-    <td>G&uuml;ltigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei Preisanfragen)</td>
-   </tr>
-   <tr>
-    <td><code>transdate</code></td>
-    <td>Angebots- bzw. Anfragedatum</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="anderevorlagen_orders">Auftragsbest&auml;tigungen und Lieferantenauftr&auml;ge</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>ordnumber</code></td>
-    <td>Auftragsnummer</td>
-   </tr>
-   <tr>
-    <td><code>reqdate</code></td>
-    <td>Lieferdatum</td>
-   </tr>
-   <tr>
-    <td><code>transdate</code></td>
-    <td>Auftragsdatum</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="anderevorlagen_delivery_orders">Lieferscheine (Verkauf und Einkauf)</a></h3>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>cusordnumber</code></td>
-    <td>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer des Lieferanten (im Einkauf)</td>
-   </tr>
-   <tr>
-    <td><code>donumber</code></td>
-    <td>Lieferscheinnummer</td>
-   </tr>
-   <tr>
-    <td><code>transdate</code></td>
-    <td>Lieferscheindatum</td>
-   </tr>
-  </table>
- </p>
-
- <p>F&uuml;r jede Position eines Lieferscheines gibt es ein Unterarray mit
-  den Informationen dar&uuml;ber, von welchem Lager und Lagerplatz aus die
-  Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
-  Lagerplatz sie eingelagert wurden. Diese m&uuml;ssen mittels
-  einer <code>foreach</code>-Schleife ausgegeben werden. Diese
-  Variablen sind:</p>
-
-
- <p>F&uuml;r jede Position eines Lieferscheines gibt es ein Unterarray mit
-  den Informationen dar&uuml;ber, von welchem Lager und Lagerplatz aus die
-  Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
-  Lagerplatz sie eingelagert wurden. Diese m&uuml;ssen mittels
-  einer <code>foreach</code>-Schleife ausgegeben werden. Diese
-  Variablen sind:</p>
-
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>si_bin</code></td>
-    <td>Lagerplatz</td>
-   </tr>
-   <tr>
-    <td><code>si_chargenumber</code></td>
-    <td>Chargennummer</td>
-   </tr>
-   <tr>
-    <td><code>si_bestbefore</code></td>
-    <td>Mindesthaltbarkeit</td>
-   </tr>
-   <tr>
-    <td><code>si_number</code></td>
-    <td>Artikelnummer</td>
-   </tr>
-   <tr>
-    <td><code>si_qty</code></td>
-    <td>Anzahl bzw. Menge</td>
-   </tr>
-   <tr>
-    <td><code>si_runningnumber</code></td>
-    <td>Positionsnummer (1, 2, 3 etc)</td>
-   </tr>
-   <tr>
-    <td><code>si_unit</code></td>
-    <td>Einheit</td>
-   </tr>
-   <tr>
-    <td><code>si_warehouse</code></td>
-    <td>Lager</td>
-   </tr>
-  </table>
- </p>
-
- <h3><a name="anderevorlagen_statement">Sammelrechnung</a></h3>
-
- <h3> Variablen f&uuml;r Sammelrechnung:</h3>
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>c0total</code></td>
-    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &lt; 30 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c30total</code></td>
-    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 30 und &lt; 60 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c60total</code></td>
-    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 60 und &lt; 90 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c90total</code></td>
-    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 90 Tage</td>
-   </tr>
-   <tr>
-    <td><code>total</code></td>
-    <td>Gesamtbetrag aller Rechnungen</td>
-   </tr>
-  </table>
- </p>
-
- <h3> Variablen f&uuml;r jede Rechnungsposition in Sammelrechnung:</h3>
- <p>
-  <table border="1">
-   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
-   <tr>
-    <td><code>invnumber</code></td>
-    <td>Rechnungsnummer</td>
-   </tr>
-   <tr>
-    <td><code>invdate</code></td>
-    <td>Rechnungsdatum</td>
-   </tr>
-   <tr>
-    <td><code>duedate</code></td>
-    <td>F&auml;lligkeitsdatum</td>
-   </tr>
-   <tr>
-    <td><code>amount</code></td>
-    <td>Summe der Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>open</code></td>
-    <td>Noch offener Betrag der Rechnung</td>
-   </tr>
-   <tr>
-    <td><code>c0</code></td>
-    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &lt; 30 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c30</code></td>
-    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 30 und &lt; 60 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c60</code></td>
-    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 60 und &lt; 90 Tage</td>
-   </tr>
-   <tr>
-    <td><code>c90</code></td>
-    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 90 Tage</td>
-   </tr>
-  </table>
- </p>
-
-
-
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="bloecke">
-   Bl&ouml;cke, bedingte Anweisungen und Schleifen</a></h2>
-
- <p>Der Parser kennt neben den Variablen einige weitere Konstrukte,
-  die gesondert behandelt werden. Diese sind wie Variablennamen in
-  spezieller Weise markiert: <code>&lt;%anweisung%&gt;
-  ... &lt;%end%&gt;</code></p>
-
- <p>Anmerkung zum <code>&lt;%end%&gt;</code>: Der besseren
-  Verst&auml;ndlichkeit halber kann man nach dem <code>end</code> noch
-  beliebig weitere W&ouml;rter schreiben, um so zu markieren, welche
-  Anweisung (z.B. <code>if</code> oder <code>foreach</code>) damit
-  abgeschlossen wird.</p>
-
- <p>Beispiel: Lautet der Beginn eines Blockes
-   z.B. <code class="blue">&lt;%if type ==
-   &quot;sales_quotation&quot;%&gt;</code>, so k&ouml;nnte er mit
-  <code class="blue">&lt;%end%&gt;</code> genauso abgeschlossen werden
-  wie mit
-  <code class="blue">&lt;%end if%&gt;</code> oder auch
-  <code class="blue">&lt;%end type ==
-  &quot;sales_quotation&quot;%&gt;</code>.</p>
-
- <h3><a name="bloecke_if">Der <code>if</code>-Block</a></h3>
-
- <p class="blue"><code>&lt;%if variablenname%&gt;<br>
-   ...<br>
-   &lt;%end%&gt;</code></p>
-
- <p>Eine normale &quot;if-then&quot;-Bedingung. Die Zeilen zwischen
-  dem &quot;if&quot; und dem &quot;end&quot; werden nur ausgegeben,
-  wenn die Variable &quot;variablenname&quot; gesetzt und ungleich 0
-  ist.</p>
-
- <p>Die Bedingung kann auch negiert werden, indem das Wort
-  &quot;not&quot; nach dem &quot;if&quot; verwendet
-  wird. Beispiel: <code class="blue">&lt;%if not
-  cp_greeting%&gt;</code></p>
-
- <p>Zus&auml;tzlich zu dem einfachen Test, ob eine Variable gesetzt ist
-  oder nicht, bietet dieser Block auch die M&ouml;glichkeit, den Inhalt
-  einer Variablen mit einer festen Zeichenkette oder einer anderen
-  Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
-  oder einer anderen Variablen vorgenommen wird, h&auml;ngt davon ab, ob
-  die rechte Seite des Vergleichsoperators in Anf&uuml;hrungszeichen
-  gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
-  anderer Variablen). Zwei Beispiele, die beide Vergleiche zeigen:</p>
-
- <p><code class="blue">&lt;%if var1 == &quot;Wert&quot;%&gt;</code>
-  testet die Variable &quot;var1&quot; auf &Uuml;bereinstimmung mit der
-  Zeichenkette &quot;Wert&quot;. Mittels &quot;!=&quot; anstelle von
-  &quot;==&quot; w&uuml;rde auf Ungleichheit getestet.</p>
-
- <p><code class="blue">&lt;%if var1 == var2%&gt;</code> testet die
-  Variable &quot;var1&quot; auf &Uuml;bereinstimmung mit der Variablen
-  &quot;var2&quot;. Mittels &quot;!=&quot; anstelle von &quot;==&quot;
-  w&uuml;rde auf Ungleichheit getestet.</p>
-
- <p>Erfahrere Benutzer k&ouml;nnen neben der Tests auf (Un-)Gleichheit auch
-  Tests auf &Uuml;bereinstimmung mit regul&auml;ren Ausdr&uuml;cken ohne
-  Ber&uuml;cksichtung der Gro&szlig;- und Kleinschreibung durchf&uuml;hren. Dazu dient
-  dieselbe Syntax wie oben nur mit &quot;=~&quot; und &quot;!~&quot;
-  als Vergleichsoperatoren.</p>
-
- <p>Beispiel f&uuml;r einen Test, ob die Variable &quot;intnotes&quot;
-  (interne Bemerkungen) das Wort &quot;schwierig&quot; enth&auml;lt:
-  <code class="blue">&lt;%if intnotes =~
-  &quot;schwierig&quot;%&gt;</code></p>
-
- <h3><a name="bloecke_foreach">Die <code>foreach</code>-Schleife</a></h3>
-
- <p class="blue"><code>&lt;%foreach variablenname%&gt;<br>
-   ...<br>
-   &lt;%end%&gt;</code></p>
-
- <p>F&uuml;gt die Zeilen zwischen den beiden Anweisungen so oft ein, wie das
-  Perl-Array der Variablen "variablenname" Elemente enth&auml;t. Dieses
-  Konstrukt wird zur Ausgabe der einzelnen Posten einer Rechnung / eines
-  Angebots sowie zur Ausgabe der Steuern benutzt. In jedem Durchlauf werden
-  die <a href="dokumentenvorlagen-und-variablen.html#invoice_posten">zeilenbezogenen
-  Variablen</a> jeweils auf den Wert f&uuml;r die aktuelle Position
-  gesetzt.</p>
-
- <p>Die Syntax sieht normalerweise wie folgt aus:</p>
-
- <p class="blue"><code>&lt;%foreach number%&gt;<br>
-   Position: &lt;%runningnumber%&gt;<br>
-   Anzahl: &lt;%qty%&gt;<br>
-   Artikelnummer: &lt;%number%&gt;<br>
-   Beschreibung: &lt;%description%&gt;<br>
-   ...<br>
-   &lt;%end%&gt;</code></p>
-
- <p>Besonderheit in OpenDocument-Vorlagen: Tritt ein
-  <code>&lt;%foreach%&gt;</code>-Block innerhalb einer Tabellenzelle
-  auf, so wird die komplette Tabellenzeile so oft wiederholt wie
-  notwendig. Tritt er au&szlig;erhalb auf, so wird nur der Inhalt
-  zwischen <code>&lt;%foreach%&gt;</code> und <code>&lt;%end%&gt;</code>
-  wiederholt, nicht aber die komplette Zeile, in der er steht.</p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
- <h2><a name="markup">
-   Markup-Code, der innerhalb von Formularen zur Textformatierung
-   verwendet werden kann</a></h2>
-
- <p>Wenn der Benutzer innhalb von Formularen in Lx-Office Text anders
-  formatiert haben m&ouml;chte, so ist dies begrenzt m&ouml;glich. Lx-Office
-  unterst&uuml;tzt die Textformatierung mit HTML-&auml;hnlichen Tags. Der
-  Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung Teile des
-  Texts zwischen Start- und Endtags setzen. Dieser Teil wird dann automatisch
-  in Anweisungen f&uuml;r das ausgew&auml;hlte Vorlagenformat (HTML oder
-  PDF &uuml;ber LaTeX) umgesetzt.</p>
-
- <p>Die unterst&uuml;tzen Formatierungen sind:</p>
-
- <p>
-  <table border="1">
-   <tr><th>Formatierung</th><th>Auswirkung</th></tr>
-   <tr>
-    <td><code>&lt;b&gt;Text&lt;/b&gt;</code></td>
-    <td>Text wird in <b>fettdruck</b> gesetzt.</td>
-   </tr>
-   <tr>
-    <td><code>&lt;i&gt;Text&lt;/i&gt;</code></td>
-    <td>Text wird <i>kursiv</i> gesetzt.</td>
-   </tr>
-   <tr>
-    <td><code>&lt;u&gt;Text&lt;/u&gt;</code></td>
-    <td>Text wird <u>unterstrichen</u>.</td>
-   </tr>
-   <tr>
-    <td><code>&lt;s&gt;Text&lt;/s&gt;</code></td>
-    <td>Text wird <s>durchgestrichen</s>. Diese Formatierung ist nicht bei der
-     Ausgabe als PDF &uuml;ber LaTeX verf&uuml;gbar.</td>
-   </tr>
-   <tr>
-    <td><code>&lt;pagebreak&gt;</code></td>
-    <td>Erzwingt einen Seitenumbruch (siehe unten).</td>
-   </tr>
-   <tr>
-    <td><code>&lt;bullet&gt;</code></td>
-    <td>Erzeugt einen ausgef&uuml;llten Kreis f&uuml;r Aufz&auml;hlungen (&bull;) (siehe unten).</td>
-   </tr>
-  </table>
- </p>
-
- <p>Eine Besonderheit ist der Befehl <code>&lt;pagebreak&gt;</code>,
-  der nur in LaTeX-Vorlagen funktioniert und in anderen Vorlagen
-  einfach gel&ouml;scht wird. Dieser erzwingt einen Seitenumbruch nach
-  der aktuellen Rechnungsposition. Dementsprechend funktioniert er nur
-  innerhalb von
-  <code>&lt;%foreach...%&gt;</code>-Schleifen. Weiterhin ben&ouml;tigt
-  er kein Endtag.</p>
-
- <p>Auch <code>&lt;bullet&gt;</code> funktioniert momentan auch nur in Latex-Vorlagen.</p>
-
- <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
-   zum Inhaltsverzeichnis</a></small><br>
- <hr>
-
-</body>
-</html>
diff --git a/doc/excel_templates.txt b/doc/excel_templates.txt
deleted file mode 100644 (file)
index fe16d6d..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-Table of Contents
------------------
-
-Inhalt der Anleitung
-1 Zusammenfassung
-2 Bedienung
-3 Exceltemplate Syntax
-4 Einschränkungen
-
-
-
-Zusammenfassung
----------------
-
-Dieses Dokument beschreibt den Mechanismus, mit dem Exceltemplates abgearbeitet
-werden, und die Einschränkungen die damit einhergehen.
-
-
-
-Bedienung
----------
-
-Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert werden. Die
-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
-oder OpenOffice Vorlagen.
-
-Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls eine
-Angebotsvorlage, und wird unter dem internen Namen der Angebote
-"sales_quotation.xls" gespeichert.
-
-
-
-Exceltemplate Syntax
---------------------
-
-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
-werden. Der Tag muss nicht symmetrisch sein.
-
-Beispiel: <<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-
-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
-abgeschnitten.
-
-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
-abgeschnitten werden muss, wird er vom linken Ende entfernt.
-
-
-
-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,
-Textstellen _exakt_ durch einen anderen Text zu ersetzen.
-
-Aus dem gleichen Grund sind die Templatekonstrukte <% if %> und <% foreach %>
-nicht vorhanden. Der Delimiter <% %> kommt in den Headerinformationen evtl vor,
-deshalb wurde auf den sichereren "<<"/">>" gewechselt.
-
diff --git a/doc/konfigurationsdatei.txt b/doc/konfigurationsdatei.txt
deleted file mode 100644 (file)
index 128365b..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-== Lx-Office Konfigurationsdatei ab Version 2.6.3 ==
-
-Seit Lx-Office 2.6.3. gibt es nur noch eine Konfigurationsdatei die benötigt wird -  die: config/lx_office.conf.
-
-Diese muß bei der Erstinstallation von Lx-Office (oder Migration von älteren Versionen) angelegt werden.
-
-Als Vorlage dient die Datei config/lx_office.conf.default.
-
- $ cp config/lx_office.conf.default config/lx_office.conf
-
-Die Datei config/lx_office.conf.default wird immer eingelesen, Werte die in
-config/lx_office.conf stehen überschreiben die Werte aus
-config/lx_office.conf.default. Die Datei config/lx_office.conf muss also nur
-die Abschintte und Werte enthalten die von config/lx_office.conf.default abweichen.
-
-Diese Datei (lx_office.conf) ist dann eine installationsspezifische Datei,
-d.h. sie enthält bspw. lokale Passwörter und wird auch nicht im Versionsmanagement (git) verwaltet.
-
-Die Konfiguration ist ferner serverabhängig, d.h. für alle Mandaten, bzw. Datenbanken gleich.
-
-
-Die Konfigurationsdatei besteht aus mehreren Teilen, die entsprechend kommentiert sind:
-
-* authentication
-* authentication/database
-* authentication/ldap
-* system
-* features
-* paths
-* applications
-* environment
-* print_templates
-* task_server
-* periodic_invoices
-* console
-* debug
-
-Die üblicherweise wichtigsten Parameter, die am Anfang einzustellen oder zu kontrollieren sind, sind:
-
-[authentication]
-admin_password = geheim
-
-[authentication/database]
-host     = localhost
-port     = 5432
-db       = lxerp_auth
-user     = postgres
-password =
-
-[system]:
-* eur
-* dbcharset
-
-Nutzt man wiederkehrende Rechnungen kann man unter [periodic_invoices] den
-Login eines Benutzers angeben, der nach Erstellung der Rechnungen eine
-entsprechende E-Mail mit Informationen über die erstellten Rechnungen bekommt.
-
-Nutzt man den Taskserver für wiederkehrende Rechnungen, muß unter [task_server]
-ein Login eines Benutzers angegeben werden, mit dem sich der Taskserver an
-Lx-Office bei der Datenbank anmeldet, die dem Benutzer zugewiesen ist.
-
-Für Entwickler finden sich unter [debug] wichtige Funktionen, um die
-Fehlersuche zu erleichtern.
-
-
-== Versionen vor 2.6.3 ==
-
-In älteren Lx-Office Versionen gab es im Verzeichnis config die Dateien
-authentication.pl und lx-erp.conf, die jeweils Perl-Dateien waren. Es gab auch
-die Möglichkeit, eine lokale Version der Konfigurationsdatei zu erstellen
-(lx-erp-local.conf), dies ist ab 2.6.3 auch nicht mehr möglich/nötig.
-
-Beim Update von einer älteren Lx-Office Version auf 2.6.3 müssen die
-Einstellungen aus den alten Konfigurationsdateien manuell übertragen werden und
-die alten Konfigurationsdateien gelöscht oder verschoben werden, sonst kommt es
-zu einer Fehlermeldung.
diff --git a/doc/languages_howto.txt b/doc/languages_howto.txt
deleted file mode 100644 (file)
index 15c3b2d..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-Table of Contents
-=================
-
-1. What's this?
-2. File Structue
-  * LANGUAGE
-  * charset
-  * all
-  * Num2text
-  * special_chars
-  * missing
-  * lost
-
-
-What's this?
-============
-
-This document describes how localization packages in Lx-Office are built.
-Currently the only language fully supported is german, and since most of the
-internal messages are held in english the english version is usable too.
-
-A stub version of french is included, but not functunal at this point.
-
-
-File Structure
-==============
-
-The structure of locales in Lx-Office is:
-
-  lx-office/locale/<langcode>/
-
-where <langcode> stands for an abbreviation of the language package. The builtin
-packages use two letter ISO 639-1 codes, but the actual name is not relevant for
-the program and can easily be extended to IETF language tags (i.e.  "en_GB"). In
-fact the original language packages from sql ledger are named in this way.
-
-In such a language directory the following files are recognized:
-
-LANGUAGE (mandatory)
---------------------
-
-The LANGUAGE file contains the self descripted name of the language. It should
-contain a native representation first, and in parenthesis an english
-translation after that.
-
-Example:
-
-  Deutsch (German)
-
-
-charset (encouraged)
---------------------
-
-The charset file describes which charset a language package is written in and
-applies to all other language files in the package. It is possible to write some
-language packages without an explicit charset, but it is still strongly
-recommended. You'll never know in what environment your language package will be
-used, and neither utf-8 nor latin1 are guaranteed.
-
-The whole content of this file is a string that can be recognized as a valid
-charset encoding.
-
-Example:
-
-  ISO-8859-1
-
-
-all (mandatory)
----------------
-
-The central translation file. It is essentially an inline perlscript
-autogenerated by locales.pl. To generate it, generate the directory and the two
-files mentioned above, and execute
-
-  scripts/locales.pl <langcode>
-
-or simply copy one of the other languages. You will be told how many are missing
-like this:
-
-  $ scripts/locales.pl en
-
-  English - 0.6% - 2015/2028 missing
-
-A "missing" file will be generated and can be edited. You can also edit the "all" file
-directly. Edit everything you like to fit the target language, and execute
-locales.pl again. See how the missing words get fewer.
-
-
-
-These three files are necessary for a localization to be working. Other files
-are optional, but will have special effects:
-
-
-Num2text (optional)
--------------------
-
-Legacy code from sql ledger. It provides a means for numbers to be converted
-into natural language, like 1523 => one thousand five hundred twenty three. If
-you want to provide it, it must be inlinable perl code which provides a num2text
-sub. If an init sub exists, it will be executed first.
-
-Only used in the check and receipt printing module.
-
-special_chars
--------------
-
-Lx-Office comes with a lot of interfaces to different formats, some of which are
-rather picky with their accepted charset. The special_chars file contains a
-listing of chars not suited for different file format, and provides
-substitutions. It is written in "Simple Ini" style, containing a block for every
-file format.
-
-First entry should be the order of substitution for entries as a whitespace
-separated list. All entries are interpolated, so \n, \x20 and \\ all work.
-
-After that every entry is a special char that should be translated when writing
-text into such a file.
-
-Example:
-
-  [Template/XML]
-  order=& < > \n
-  &=&amp;
-  <=&lt;
-  >=&gt;
-  \n=<br>
-
-Note the importance of the order in this example. Substituting < and > befor &
-would lead to $gt; become &amp;gt;
-
-For a list of valid formats, see the german special_chars entry. As of this
-writing the following are recognized:
-
-  HTML
-  URL@HTML
-  Template/HTML
-  Template/XML
-  Template/LaTeX
-  Template/OpenDocument
-  filenames
-
-The last of which is very machine dependant. Remember that a lot of characters
-are forbidden by some filesystems, for exmaple MS Windows doesn't like ':' in
-its files where Linux doesn't mind that. If you want the files created with your
-language pack to be portable, find all chars that could cause trouble.
-
-
-missing (not part of language package)
---------------------------------------
-
-This is a file generated by scripts/locales.pl while processing your locales.
-It's only to have the missing entries singled out and does not belong to a
-language package.
-
-
-lost (not part of language package)
------------------------------------
-
-Another file generated by scripts/locales.pl. If for any reason a translation
-does not appear anymore and can be deleted, it gets moved here. The last 50 or
-so entries deleted are saved here in case you made a typo, so that you don't
-have to translate everything again. If a tranlsation is missing, the lost file
-is checked first. If you maintain a language package, you might want to keep
-this safe somewhere.  It is not part of a language package.
-
-
-
diff --git a/doc/programmierstilrichtlinien.txt b/doc/programmierstilrichtlinien.txt
deleted file mode 100644 (file)
index 4b8b201..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-Lx-Office Style Guide
----------------------
-
-Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar
-zu machen. Dazu gehört zum Einen, dass der Code einheitlich eingerückt ist,
-aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte
-"Klammern" oder "Hash-Keys").
-
-Diese Regeln sind keine Schikane, sondern erleichtern allen das Leben!
-
-Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen.
-Einige der Regeln lassen sich automatisch überprüfen, andere nicht.
-
---------------------------------------------------------------------------
-
-1. Es werden keine echten iTabs sondern Leerzeichen verwendet.
-
-2. Die Einrückung beträgt zwei Leerzeichen.
-   Beispiel:
-
-   foreach my $row (@data) {
-     if ($flag) {
-       # do something with $row
-     }
-
-     if ($use_modules) {
-       $row->{modules} = MODULE->retrieve(
-         id   => $row->{id},
-         date => $use_now ? localtime() : $row->{time},
-       );
-     }
-
-     $report->add($row);
-   }
-
-
-3. Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie
-   der letzte Befehl.
-   Beispiele:
-
-   sub debug {
-     ...
-   }
-
-   oder
-
-   if ($form->{item_rows} > 0) {
-     ...
-   }
-
-4. Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl/
-   die öffnende schließende Klammer, die den Block gestartet hat, und nicht
-   auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
-
-5. Die Wörter "else" "elsif", "while" befinden sich auf der gleichen
-   Zeile wie schließende geschweifte Klammern.
-   Beispiele:
-
-   if ($form->{sum} > 1000) {
-     ...
-   } elsif ($form->{sum} > 0) {
-     ...
-   } else {
-     ...
-   }
-
-   do {
-     ...
-   } until ($a > 0);
-
-6. Parameter von Funktionsaufrufen müssen mit runden Klammern versehen
-   werden. Davon nicht betroffen sind interne perl Funktionen,
-   und grep ähnliche Operatoren.
-
-   Beispiel:
-
-   $main::lxdebug->message("Could not find file.");
-   %options = map { $_ => 1 } grep { !/^#/ } @config_file;
-
-7. Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
-
-  Generell gilt: Hashkeys und Arrayindices sollten _nicht_ durch Leerzeichen
-  abgesetzt werden. Logische Klammerungen ebensowenig, Blöcke schon.
-
-
-  Beispiel:
-
-      if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
-        ...
-      }
-
-      $array[$i + 1]             = 4;
-      $form->{sum}              += $form->{"row_$i"};
-      $form->{ $form->{index} } += 1;
-
-      map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;
-
-8. Mehrzeilige Befehle
-
-  8.1 Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen
-      aufgeteilt, so sollten diese bis zu der Spalte eingerückt werden,
-      in der die ersten Funktionsparameter in der ersten Zeile stehen.
-      Beispiel:
-
-      $sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
-                           $form->{some_col_value});
-
-  8.3 Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer
-      übersichtlichen Tabellenstruktur organisiert wird.
-
-      Beispiel:
-
-      my $rowcount = $form->{"row_$i"} ? $i
-                   : $form->{oldcount} ? $form->{oldcount} + 1
-                   :                     $form->{rowcount} - $form->{rowbase};
-
-9. Kommentare
-
-  9.1 Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der
-      Code eingerückt sein.
-  9.2 Seitliche hängende Kommentare sollten einheitlich formatiert werden.
-
-  9.3 Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch
-      zu verfassen. So wie ich keine Lust habe französischen Quelltext zu lesen,
-      sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein.
-
-      Beispiel:
-
-      my $found = 0;
-      while (1) {
-        last if $found;
-
-        # complicated check
-        $found = 1 if //
-      }
-
-      $i = 0         # initialize $i
-      $n = $i;       # save $i
-      $i *= $const;  # do something crazy
-      $i = $n;       # recover $i
-
-10. Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation
-    gewünscht ist.
-
-    Beispiele:
-
-    $form->{sum}      = 0;
-    $form->{"row_$i"} = $form->{"row_$i"} - 5;
-    $some_hash{42}    = 54;
-
-11. Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen <= 79
-    helfen unter bestimmten Bedingungen, aber wenn die Lesbarkeit unter
-    kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann
-    ist Lesbarkeit vorzuziehen.
-
-    Als Beispiel sei print_options aus bin/mozilla/io.pl angeführt.
-
-12. Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht.
-    Sie führen zu unnötigen Whitespaceänderungen die diffs verfälschen.
-
-    Emacs und vim haben beide recht einfache Methoden dafür:
-    emacs kennt das Kommande nuke-trailing-whitespace,
-    vim macht das gleiche manuell über :%s/\s\+$//e, mit
-      :au BufWritePre * :%s/\s\+$//e
-    wird das an speichern gebunden.
-
-12. Es wird kein perltidy verwendet.
-
-    In der Vergangenheit wurde versucht perltidy zu verwenden um einen
-    einheitlichen Stil zu erlangen, es hat sich aber gezeigt, dass Perltidys
-    sehr eigenwilliges Verhaltes was Zeilenumbrüche angeht oftmals gut
-    formatierten Code zerstört. Für den Interessierten sind hier die perltidy
-    Optionen, die grob den beschriebenen Richtlinien entsprechen.
-
-  -syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
-  -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
-  -lp -vt=1 -vtc=1
-
-13. STDERR ist tabu. Unkonditionale Debugmeldungen auch.
-
-    Lx-Office bietet mit dem LXDebug Modul einen brauchbaren Trace/Debug
-    Mechanismus, es gibt also keinen Grund nach STDERR zu schreiben.
-
-    Die LXDebug Methode "message" nimmt als ersten Paramter außerdem eine
-    Flagmaske, für die die Meldung angezeigt wird, wobei "0" immer angezeigt
-    wird. Sollte Meldungen sollten nicht eingecheckt werden, und werden in den
-    meisten Fällen auch vom Repository zurückgewiesen.
-
-14. Alle neuen Module müssen use strict verwenden.
-
-    $form, $auth, $locale, $lxdebug und %myconfig werden derzeit aus dem main
-    package importiert. Alle anderen Konstrukte sollten lexikalisch lokal
-    gehalten werden.
diff --git a/doc/sql-upgrade-dateien.txt b/doc/sql-upgrade-dateien.txt
deleted file mode 100644 (file)
index 0d75069..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-Neuer Mechanismus für SQL-Upgradedateien
-----------------------------------------
-
-Der alte Mechanismus für SQL-Upgradescripte, der auf einer
-Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
-diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele
-Entwicklung im stable- und unstable-Baum betrifft.
-
-Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es
-werden weiterhin alle Scripte aus sql/Pg-upgrade
-ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis,
-sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
-Datei existieren, die neben den eigentlich auszuführenden SQL- oder
-Perl-Befehlen einige Kontrollinformationen enthält.
-
-Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten
-definieren können werden, sodass Datenbankscripte zwar in einer
-sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE"
-erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE" angelegt
-wurde), diese Reihenfolge aber so flexibel ist, dass man keine
-Versionsnummern mehr braucht.
-
-Lx-Office merkt sich dabei, welches der Upgradescripte in
-sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht
-erneut aus. Dazu dient die Tabelle "schema_info", die bei der
-Anmeldung automatisch angelegt wird.
-
-Format der Kontrollinformationen
---------------------------------
-
-Die Kontrollinformationen sollten sich am Anfang der jeweiligen
-Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
-hat dabei das folgende Format:
-
-Für SQL-Upgradedateien:
-
--- @key: value
-
-
-Für Perl-Upgradedateien:
-
-# @key: value
-
-
-Leerzeichen vor "value" werden entfernt.
-
-Die folgenden Schlüsselworte werden verarbeitet:
-
-* tag: Wird zwingend benötigt. Dies ist der "Name" des
-  Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren
-  Abhängigkeiten verwendet werden (Schlüsselwort "depends"). Der "tag"
-  ist auch der Name, der in der Datenbank eingetragen wird.
-
-  Normalerweise sollte die Kontrolldatei genau so heißen wie der
-  "tag", nur mit der Endung ".sql" bzw. "pl".
-
-  Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ -
-  ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
-  sollten stattdessen mit Unterstrichen ersetzt werden.
-
-* description: Benötigt. Eine Beschreibung, was in diesem Update
-  passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
-  angezeigt. Während der Tag in englisch gehalten sein sollte, sollte
-  die Beschreibung auf Deutsch erfolgen.
-
-* depends: Optional. Eine mit Leerzeichen getrennte Liste von "tags",
-  von denen dieses Upgradescript abhängt. Lx-Office stellt sicher,
-  dass die in dieser Liste aufgeführten Scripte bereits durchgeführt
-  wurden, bevor dieses Script ausgeführt wird.
-
-  Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b"
-  existiert, das von Änderungen in "a" abhängt, und eine neue
-  Kontrolldatei für "c" erstellt wird, die von Änderungen in "a" und
-  "b" abhängt, so genügt es, in "c" nur den Tag "b" als Abhängigkeit
-  zu definieren.
-
-  Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu
-  definieren (z.B. "a" -> "b", "b" -> "c" und "c" -> "a").
-
-* priority: Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in
-  der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
-  besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
-
-  Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends"
-  benutzt werden. Lx-Office sortiert die auszuführenden Scripte zuerst
-  nach der Abhängigkeitstiefe (wenn "z" von "y" abhängt und "y" von
-  "x", so hat "z" eine Abhängigkeitstiefe von 2, "y" von 1 und "x" von
-  0. "x" würde hier zuerst ausgeführt, dann "y", dann "z"), dann nach
-  der Priorität und bei gleicher Priorität alphabetisch nach dem
-  "tag".
-
-Hilfsscript dbupgrade2_tool.pl
-------------------------------
-
-Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert
-ein Hilfsscript namens "scripts/dbupgrade2_tool.pl". Es muss aus dem
-Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses Tool
-liest alle Datenbankupgradescripte aus dem Verzeichnis sql/Pg-upgrade2
-aus. Es benutzt dafür die gleichen Methoden wie Lx-Office selber,
-sodass alle Fehlersituationen von der Kommandozeile überprüft werden
-können.
-
-Wird dem Script kein weiterer Parameter übergeben, so wird nur eine
-Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann sich
-aber auch Informationen auf verschiedene Art ausgeben lassen:
-
-1. Listenform: "./scripts/dbupgrade2_tool.pl --list"
-
-   Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge
-   sortiert, in der Lx-Office die Scripte ausführen würde. Es werden
-   neben der Listenposition der Tag, die Abhängigkeitstiefe und die
-   Priorität ausgegeben.
-
-2. Baumform: "./scripts/dbupgrade2_tool.pl --tree"
-
-   Listet alle Tags in Baumform basierend auf den Abhängigkeiten
-   auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
-   anderen abhängen. Die Unterknoten sind Scripte, die beim
-   übergeordneten Script als Abhängigkeit eingetragen sind.
-
-3. Umgekehrte Baumform: "./scripts/dbupgrade2_tool.pl --rtree"
-
-   Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf.
-   Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
-   Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das
-   übergeordnete Script als Abhängigkeit eingetragen haben.
-
-4. Baumform mit Postscriptausgabe: "./scripts/dbupgrade2_tool.pl --graphviz"
-
-   Benötigt das Tool "graphviz", um mit seiner Hilfe die Baumform aus
-   3. in eine Postscriptdatei namens "db_dependencies.ps"
-   auszugeben. Dies ist vermutlich die übersichtlichste Form, weil
-   hierbei jeder Knoten nur einmal ausgegeben wird. Bei den
-   Textmodusbaumformen hingegen können Knoten und all ihre
-   Abhängigkeiten mehrfach ausgegeben werden.
-
-5. Scripte, von denen kein anderes Script abhängt:
-   "./scripts/dbupgrade2_tool.pl --nodeps"
-
-   Listet die Tags aller Scripte auf, von denen keine anderen Scripte
-   abhängen.
-