+++ /dev/null
-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.
+++ /dev/null
-
-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.
-
+++ /dev/null
-<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ächstes: <a rel="next" accesskey="n" href="#Aktuelle-Hinweise">Aktuelle Hinweise</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>,
-voriges: <a rel="previous" accesskey="p" href="#Top">Top</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>,
-voriges: <a rel="previous" accesskey="p" href="#Aktuelle-Hinweise">Aktuelle Hinweise</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Pakete">Pakete</a>,
-aufwärts: <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: <a rel="previous" accesskey="p" href="#Betriebssystem">Betriebssystem</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
-voriges: <a rel="previous" accesskey="p" href="#Ben_00c3_00b6tigte-Software-und-Pakete">Benötigte Software und Pakete</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-voriges: <a rel="previous" accesskey="p" href="#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#g_t_00c3_0084nderungen-an-Konfigurationsdateien">Änderungen an Konfigurationsdateien</a>,
-aufwärts: <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
-“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:
-
- <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ächstes: <a rel="next" accesskey="n" href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">Erweiterung für servergespeicherte Prozeduren</a>,
-voriges: <a rel="previous" accesskey="p" href="#Zeichens_00c3_00a4tze_002fdie-Verwendung-von-UTF_002d8">Zeichensätze/die Verwendung von UTF-8</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Datenbankbenutzer-anlegen">Datenbankbenutzer anlegen</a>,
-voriges: <a rel="previous" accesskey="p" href="#g_t_00c3_0084nderungen-an-Konfigurationsdateien">Änderungen an Konfigurationsdateien</a>,
-aufwärts: <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 “postgres”
-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: <a rel="previous" accesskey="p" href="#Erweiterung-f_00c3_00bcr-servergespeicherte-Prozeduren">Erweiterung für servergespeicherte Prozeduren</a>,
-aufwärts: <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 “postgres” 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 “postgres” auf “lxoffice”
-bzw. den hier gewählten Benutzernamen.
-
-<!-- -->
-<div class="node">
-<p><hr>
-<a name="Apache-Konfiguration"></a>
-<a name="Apache_002dKonfiguration"></a>
-nächstes: <a rel="next" accesskey="n" href="#Der-Task_002dServer">Der Task-Server</a>,
-voriges: <a rel="previous" accesskey="p" href="#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
-aufwärts: <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>
-<Directory /var/www/lx-erp>
-<br>
- Options ExecCGI Includes FollowSymlinks
-<br>
-</Directory>
-<br>
-<br>
-<Directory /var/www/lx-erp/users>
-<br>
- Order Deny,Allow
-<br>
- Deny from All
-<br>
-</Directory>
-<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 ‘<samp><span class="samp">+</span></samp>’ 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ächstes: <a rel="next" accesskey="n" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
-voriges: <a rel="previous" accesskey="p" href="#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Prozesskontrolle">Prozesskontrolle</a>,
-aufwärts: <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: <a rel="previous" accesskey="p" href="#Prozesskontrolle">Prozesskontrolle</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Einbinden-in-den-Boot_002dProzess">Einbinden in den Boot-Prozess</a>,
-voriges: <a rel="previous" accesskey="p" href="#Konfiguration-des-Task_002dServers">Konfiguration des Task-Servers</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
-voriges: <a rel="previous" accesskey="p" href="#Der-Task_002dServer">Der Task-Server</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Administratorpasswort">Administratorpasswort</a>,
-aufwärts: <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 “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.
-
- <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ächstes: <a rel="next" accesskey="n" href="#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
-voriges: <a rel="previous" accesskey="p" href="#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>,
-aufwärts: <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->{admin_password}</code>.
-
-<div class="node">
-<p><hr>
-<a name="Authentifizierungsdatenbank"></a>
-nächstes: <a rel="next" accesskey="n" href="#Passwort_00c3_00bcberpr_00c3_00bcfung">Passwortüberprüfung</a>,
-voriges: <a rel="previous" accesskey="p" href="#Administratorpasswort">Administratorpasswort</a>,
-aufwärts: <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->{DB_config}</code> konfiguriert. Hier sind die folgenden
-Parameter anzugeben:
-
- <ul>
-<li>‘<samp><span class="samp">host</span></samp>’ – Der Rechnername oder die IP-Adresse des Datenbankservers
-<li>‘<samp><span class="samp">port</span></samp>’ – Die Portnummer des Datenbankservers, meist 5432
-<li>‘<samp><span class="samp">db</span></samp>’ – Der Name der Authentifizierungsdatenbank
-<li>‘<samp><span class="samp">user</span></samp>’ – Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. “postgres”)
-<li>‘<samp><span class="samp">password</span></samp>’ – 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ächstes: <a rel="next" accesskey="n" href="#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
-voriges: <a rel="previous" accesskey="p" href="#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
-aufwärts: <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->{module}</code>.
-
- <p>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
-gespeichert werden, so muss der Parameter <code>$self->{module}</code> den
-Wert ‘<samp><span class="samp">DB</span></samp>’ 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->{module}</code> auf ‘<samp><span class="samp">LDAP</span></samp>’
-gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
-den LDAP-Server in <code>$self->{LDAP_config}</code> angegeben werden:
-
- <ul>
-<li>‘<samp><span class="samp">host</span></samp>’ – Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend erforderlich.
-<li>‘<samp><span class="samp">port</span></samp>’ – Die Portnummer des LDAP-Servers; meist 389.
-<li>‘<samp><span class="samp">tls</span></samp>’ – Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf ‘<samp><span class="samp">1</span></samp>’ setzen, andernfalls auf ‘<samp><span class="samp">0</span></samp>’ belassen
-<li>‘<samp><span class="samp">attribute</span></samp>’ – Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server
- ist dies meist ‘<samp><span class="samp">sAMAccountName</span></samp>’, für andere LDAP-Server hingegen ‘<samp><span class="samp">uid</span></samp>’. Diese Angabe ist zwingend erforderlich.
-<li>‘<samp><span class="samp">base_dn</span></samp>’ – Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich.
-<li>‘<samp><span class="samp">filter</span></samp>’ – Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort <code><%login%></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>‘<samp><span class="samp">bind_dn</span></samp>’ und ‘<samp><span class="samp">bind_password</span></samp>’ – 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><span class="samp">bind_dn</span></samp>’ entweder eine
- komplette LDAP-DN wie z.B. ‘<samp><span class="samp">cn=Martin Mustermann,cn=Users,dc=firmendomain</span></samp>’ auch nur der volle Name des Benutzers
- eingegeben werden; in diesem Beispiel also ‘<samp><span class="samp">Martin Mustermann</span></samp>’.
-</ul>
-
-<div class="node">
-<p><hr>
-<a name="Name-des-Session-Cookies"></a>
-<a name="Name-des-Session_002dCookies"></a>
-nächstes: <a rel="next" accesskey="n" href="#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>,
-voriges: <a rel="previous" accesskey="p" href="#Passwort_00c3_00bcberpr_00c3_00bcfung">Passwortüberprüfung</a>,
-aufwärts: <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->{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: <a rel="previous" accesskey="p" href="#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Drucken-mit-Lx_002dOffice">Drucken mit Lx-Office</a>,
-voriges: <a rel="previous" accesskey="p" href="#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Datenbanken-anlegen">Datenbanken anlegen</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Gruppen-anlegen">Gruppen anlegen</a>,
-voriges: <a rel="previous" accesskey="p" href="#Zusammenh_00c3_00a4nge">Zusammenhänge</a>,
-aufwärts: <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 ‘<samp><span class="samp">lxoffice</span></samp>’).
-
- <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 ‘<samp><span class="samp">UTF-8</span></samp>’ setzen. Zusätzlich
-muss beim Anlegen der Datenbank ‘<samp><span class="samp">UTF-8 Unicode</span></samp>’ 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ächstes: <a rel="next" accesskey="n" href="#Benutzer-anlegen">Benutzer anlegen</a>,
-voriges: <a rel="previous" accesskey="p" href="#Datenbanken-anlegen">Datenbanken anlegen</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
-voriges: <a rel="previous" accesskey="p" href="#Gruppen-anlegen">Gruppen anlegen</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Migration-alter-Installationen">Migration alter Installationen</a>,
-voriges: <a rel="previous" accesskey="p" href="#Benutzer-anlegen">Benutzer anlegen</a>,
-aufwärts: <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: <a rel="previous" accesskey="p" href="#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-voriges: <a rel="previous" accesskey="p" href="#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
-aufwärts: <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ächstes: <a rel="next" accesskey="n" href="#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
-voriges: <a rel="previous" accesskey="p" href="#Drucken-mit-Lx_002dOffice">Drucken mit Lx-Office</a>,
-aufwärts: <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 ‘<samp><span class="samp">1</span></samp>’ 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 “X virtual frame buffer”
-(xvfb) installiert werden. Bei Debian ist er im Paket “xvfb”
-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 “X virtual frame buffer”
-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 “Standard.Conversion.ConvertSelfToPDF()”
-heißen. Die Beispielvorlage ‘<samp><span class="samp">templates/mastertemplates/German/invoice.odt</span></samp>’
-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: <a rel="previous" accesskey="p" href="#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-aufwärts: <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:
-
--->
+++ /dev/null
-\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
+++ /dev/null
-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:
--- /dev/null
+<?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/ <Directory /var/www/lx-erp> Options ExecCGI
+ Includes FollowSymlinks </Directory> <Directory
+ /var/www/lx-erp/users> Order Deny,Allow Deny from All
+ </Directory> </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/
+
+<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></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
+
+<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></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->{admin_password}</literal>.</para>
+ </sect2>
+
+ <sect2 id="Authentifizierungsdatenbank">
+ <title>Authentifizierungsdatenbank</title>
+
+ <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den
+ Parametern in <literal>$self->{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->{module}</literal>.</para>
+
+ <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+ gespeichert werden, so muss der Parameter
+ <literal>$self->{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->{module}</literal> auf ‘<literal>LDAP</literal>’
+ gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
+ den LDAP-Server in <literal>$self->{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><%login%></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->{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->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->{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><%var%></function> zeigt auf
+ <varname>$::form->{var}</varname>. Innerhalb von Schleifen wird
+ <varname>$::form->{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->{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->{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->{cache}{all_units}</varname></para>
+ </listitem>
+
+ <listitem>
+ <para>Wird nur in
+ <function>AM->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><%variablenname%></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'
+ => '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><%variablenname%></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><%variablenname FLAG1 FLAG2%></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><%quototal NOFORMAT%></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 <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></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><%customer%></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><!-- config: tag-style=($ $) --></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 < 30
+ Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c30total</term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
+ und < 60 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c60total</term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
+ und < 90 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c90total</term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 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 < 30
+ Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c30</term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
+ < 60 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c60</term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
+ < 90 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>c90</term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 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><%anweisung%> ... <%end%></command></para>
+
+ <para>Anmerkung zum <command><%end%></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><%if type == "sales_quotation"%></command>, so könnte
+ er mit <command><%end%></command> genauso abgeschlossen werden
+ wie mit <command><%end if%></command> oder auch
+ <command><%end type == "sales_quotation"%></command>.</para>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
+ <title>Der if-Block</title>
+
+ <programlisting><%if variablenname%>
+...
+<%end%></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><%if not cp_greeting%>
+...
+<%end%></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><%if var1 == "Wert"%></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%></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><%if intnotes =~ "schwierig"%></programlisting>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
+ <title>Der foreach-Block</title>
+
+ <programlisting><%foreach variablenname%>
+...
+<%end%></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><%foreach number%>
+Position: <%runningnumber%>
+Anzahl: <%qty%>
+Artikelnummer: <%number%>
+Beschreibung: <%description%>
+...
+<%end%></programlisting>
+
+ <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
+ <function><%foreach%></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><%foreach%></function> und
+ <function><%end%></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><b>Text</b></term>
+
+ <listitem>
+ <para>Text wird in Fettdruck gesetzt.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><i>Text</i></term>
+
+ <listitem>
+ <para>Text wird kursiv gesetzt.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><u>Text</u></term>
+
+ <listitem>
+ <para>Text wird unterstrichen.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><s>Text</s></term>
+
+ <listitem>
+ <para>Text wird durchgestrichen. Diese Formatierung ist nicht
+ bei der Ausgabe als PDF über LaTeX verfügbar.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><bullet></term>
+
+ <listitem>
+ <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
+ unten).</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Der Befehl <command><bullet></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><<varname>></command></para>
+
+ <para>Dabei sind <constant><<</constant> und
+ <constant>>></constant> die Delimiter. Da Excel auf festen
+ Breiten besteht, kann der Tag künstlich verlängert werden, indem
+ weitere <constant><</constant> oder <constant>></constant>
+ eingefügt werden. Der Tag muss nicht symmetrisch sein.
+ Beispiel:</para>
+
+ <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></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><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></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><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></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><%if%></command> und
+ <command><%foreach%></command> nicht vorhanden. Der Delimiter
+ <constant><% %></constant> kommt in den Headerinformationen
+ evtl. vor. Deshalb wurde auf den sichereren Delimiter
+ <constant><<</constant> und <constant>>></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()> 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. "a" -> "b",
+ "b" -> "c" und "c" -> "a").
+ </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/<langcode>/</programlisting>
+
+ <para>where <langcode> 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 <langcode></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 => 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=& < > \n
+&=&amp;
+<=&lt;
+>=&gt;
+\n=<br></programlisting>
+
+ <para>Note the importance of the order in this example.
+ Substituting < and > befor & would lead to $gt; become
+ &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->{modules} = MODULE->retrieve(
+ id => $row->{id},
+ date => $use_now ? localtime() : $row->{time},
+ );
+ }
+
+ $report->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->{item_rows} > 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->{sum} > 1000) {
+ ...
+} elsif ($form->{sum} > 0) {
+ ...
+} else {
+ ...
+}
+
+do {
+ ...
+} until ($a > 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->message("Could not find file.");
+%options = map { $_ => 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->{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;</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->prepare("SELECT * FROM some_table WHERE col = ?",
+ $form->{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->{"row_$i"} ? $i
+ : $form->{oldcount} ? $form->{oldcount} + 1
+ : $form->{rowcount} - $form->{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->{sum} = 0;
+$form->{"row_$i"} = $form->{"row_$i"} - 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>
+++ /dev/null
-<html>
- <head>
- <title>Dokumentenvorlagen und verfü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ü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ü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ä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 über den Bearbeiter</a></li>
-
- <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_verkaeufer">
- Informationen über den Verkäufer</a></li>
-
- <li><a href="dokumentenvorlagen-und-variablen.html#allgemein_steuern">
- Variablen fü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ür jeden Posten auf der Rechnung</a></li>
-
- <li><a href="dokumentenvorlagen-und-variablen.html#invoice_zahlungen">
- Variablen für die Zahlungseingä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 über Mahngebü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ür jede gemahnte Rechnung in einer Mahnung</a></li>
-
- <li><a href="dokumentenvorlagen-und-variablen.html#dunning_invoice">
- Variablen in automatisch erzeugten Rechnungen über Mahngebü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ätigungen und Lieferantenaufträ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ö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ührung</a></h2>
-
- <p>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
- <code><%variablenname%></code> verwendet wird. Für LaTeX-
- und HTML-Vorlagen kann man die Form dieser Tags auch
- <a href="dokumentenvorlagen-und-variablen.html#tag_style">
- verändern</a>.
- </p>
-
- <p>Einige Zahlenwerte werden auch in unformatierter Form zur Verfü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ür no-format) aufrufen
- (also z.B. netprice = 12,30 -- netprice_nofmt = 12.3). Variabeln die zusätzlich
- unformatiert zur Verfügung stehen sind unten als variable[_nofmt] gelistet.
- Die Eckigen Klammern weisen also auf eine optionale Verwändung der Erweiterung hin.
- </p>
-
- <p>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.</p>
-
- <p>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:</p>
-
- <ol>
-
- <li><code>SL/Form.pm</code> öffnen und am Anfang die Zeile
- <pre>"use Data::Dumper;"</pre> einfü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ügen.</li>
-
- <li>Einmal per Browser die gewünschte Vorlage "benutzen", z.B. ein PDF
- fü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' => 'value',</code>. Alle
- <code>key</code>s sind verfü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><%variablenname%></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><%variablenname FLAG1 FLAG2%></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"><%quototal NOFORMAT%></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 <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></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ändern</a></h2>
-
- <p>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 <code><%customer%></code>. 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.</p>
-
- <p>Dazu werden in die Datei Zeilen geschrieben, die mit dem für
- das Format gültigen Kommentarzeichen anfangen,
- dann <code>config:</code> enthalten, die entsprechende Option setzen
- und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
- enden. Beispiel für LaTeX:</p>
-
- <p><code>% config: tag-style=($ $)</code></p>
-
- <p>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
- wenn sie wie folgt aussehen: <code>($customer$)</code>. Das
- äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so
- aus:</p>
-
- <p><code><!-- config: tag-style=($ $) --></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 ".ext"
- geeignet zu ersetzen: ".tex" fü LaTeX-Vorlagen und
- ".odt" fü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 über Mahngebü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ürzel in den Dateinamen mit eingearbeitet. So wird aus der Vorlage <code>sales_order.ext</code> bei Sprache <code>de</code> und Druckerkürzel <code>lpr2</code> der Vorlagenname <code>sales_order_de_lpr2.ext</code>. Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese bekommen dann noch das Kürzel <code>_email</code>, der vollständige Vorlagenname wäre dann <code>sales_order_email_de_lpr2.ext</code>. In allen Fällen kann eine Standarddatei <code>default.ext</code> hinterlegt werden. Diese wird verwendet, wenn keine der anderen Varianten gefunden wird.</p>
-
- <p>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:</p>
- <p>
- <table border='1'>
- <tr><th>Reihenfolge der mö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ü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ü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.</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ä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ürzel der verwendeten Sprache, identisch mit dem Kü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ü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ü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ür Bildschirm, <code>email</code> für E-Mmail (triggert das <code>_email</code> Kürzel im Dateinamen), <code>printer</code> für Drucker, und <code>queue</code> für Warteschlange enthalten.</td>
- </tr>
- <tr>
- <td><code>template_meta.printer.description</code></td>
- <td>Beschreibung des ausgewählten Druckers</td>
- </tr>
- <tr>
- <td><code>template_meta.printer.template_code</code></td>
- <td>Vorlagenürzel des ausgewählten Druckers, identisch mit dem Kü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ür Kunden</td>
- </tr>
- <tr>
- <td><code>customerfax</code></td>
- <td>Faxnummer des Kunden; nur für Kunden</td>
- </tr>
- <tr>
- <td><code>customernotes</code></td>
- <td>Bemerkungen beim Kunden; nur für Kunden</td>
- </tr>
- <tr>
- <td><code>customernumber</code></td>
- <td>Kundennummer; nur für Kunden</td>
- </tr>
- <tr>
- <td><code>customerphone</code></td>
- <td>Telefonnummer des Kunden; nur fü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ß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ß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ür Lieferanten</td>
- </tr>
- <tr>
- <td><code>vendorfax</code></td>
- <td>Faxnummer des Lieferanten; nur für Lieferanten</td>
- </tr>
- <tr>
- <td><code>vendornotes</code></td>
- <td>Bemerkungen beim Lieferanten; nur für Lieferanten</td>
- </tr>
- <tr>
- <td><code>vendornumber</code></td>
- <td>Lieferantennummer; nur für Lieferanten</td>
- </tr>
- <tr>
- <td><code>vendorphone</code></td>
- <td>Telefonnummer des Lieferanten; nur fü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 ü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 über den Verkä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ü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ä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ä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ü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ü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ür jeden Posten gibt es ein Unterarray mit den Informationen über
- Lieferanten und Lieferantenartikelnummer. Diese müssen mit
- einer <code>foreach</code>-Schleife ausgegeben werden, da für jeden
- Artikel mehrere Lieferanteninformationen hinterlegt sein können. Die
- Variablen dafü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ür die einzelnen Zahlungseingä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ür Kunden und
- Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
- ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem
- Prä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ält. Diese Variable steht
- dann unter dem Namen <code>vc_cvar_number_of_employees</code> zur
- Verfü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 über Mahngebühren</a></h2>
-
- <h3><a name="dunning_vorlagennamen">Namen der Vorlagen</a></h3>
-
- <p>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 <code>_invoice</code> gebildet. Weiterhin werden die
- Kürzel für die ausgewählte Sprache und den
- ausgewählten Drucker angehängt.</p>
-
- <h3><a name="dunning_allgemein">Allgemeine Variablen in Mahnungen:</a></h3>
-
- <p>Die Variablen des Verkäufers stehen wie gewohnt
- als <code>employee_...</code> zur Verfü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ü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älligkeitsdatum fü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ü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 über alle Rechnungen</td>
- </tr>
- <tr>
- <td><code>total_open_amount</code></td>
- <td>Summe über alle offene Beträge der Rechnungen</td>
- </tr>
- </table>
- </p>
-
- <h3><a name="dunning_details">
- Variablen fü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ä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älligkeitsdatum der Mahnung</td>
- </tr>
- <tr>
- <td><code>dn_fee</code></td>
- <td>Kummulative Mahngebühr</td>
- </tr>
- <tr>
- <td><code>dn_interest</code></td>
- <td>Zinsen per anno fü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ährung, in der die Rechnung erstellt wurde. (Die Rechnungsbeträge
- sind aber immer in der Hauptwährung)</td>
- </tr>
- </table>
- </p>
-
- <h3><a name="dunning_invoice">Variablen in automatisch erzeugten
- Rechnungen über Mahngebühren</a></h3>
-
- <p>Die Variablen des Verkäufers stehen wie gewohnt
- als <code>employee_...</code> zur Verfü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ü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älligkeitsdatum der Rechnung</td>
- </tr>
- <tr>
- <td><code>dunning_id</code></td>
- <td>Mahnungsnummer</td>
- </tr>
- <tr>
- <td><code>fee</code></td>
- <td>Mahngebü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 ähnlich wie in der
- Rechnung. Allerdings heißen die Variablen, die mit <code>inv</code>
- beginnen, jetzt anders. Bei den Angeboten fangen sie mit <code>quo</code>
- für "quotation" an: <code>quodate</code> für Angebotsdatum
- etc. Bei Bestellungen wiederum fangen sie mit <code>ord</code> für
- "order" an: <code>ordnumber</code> für Bestellnummer etc.</p>
-
- <p>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.</p>
-
- <p>Im Folgenden werden nur wichtige Unterschiede zu den Variablen in
- Rechnungen aufgefü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ü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ätigungen und Lieferantenaufträ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ü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 <code>foreach</code>-Schleife ausgegeben werden. Diese
- Variablen sind:</p>
-
-
- <p>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 <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ü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älligkeit < 30 Tage</td>
- </tr>
- <tr>
- <td><code>c30total</code></td>
- <td>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30 und < 60 Tage</td>
- </tr>
- <tr>
- <td><code>c60total</code></td>
- <td>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60 und < 90 Tage</td>
- </tr>
- <tr>
- <td><code>c90total</code></td>
- <td>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90 Tage</td>
- </tr>
- <tr>
- <td><code>total</code></td>
- <td>Gesamtbetrag aller Rechnungen</td>
- </tr>
- </table>
- </p>
-
- <h3> Variablen fü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ä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älligkeit < 30 Tage</td>
- </tr>
- <tr>
- <td><code>c30</code></td>
- <td>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und < 60 Tage</td>
- </tr>
- <tr>
- <td><code>c60</code></td>
- <td>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und < 90 Tage</td>
- </tr>
- <tr>
- <td><code>c90</code></td>
- <td>Noch offener Rechnungsbetrag mit Fälligkeit >= 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ö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><%anweisung%>
- ... <%end%></code></p>
-
- <p>Anmerkung zum <code><%end%></code>: Der besseren
- Verständlichkeit halber kann man nach dem <code>end</code> noch
- beliebig weitere Wö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"><%if type ==
- "sales_quotation"%></code>, so könnte er mit
- <code class="blue"><%end%></code> genauso abgeschlossen werden
- wie mit
- <code class="blue"><%end if%></code> oder auch
- <code class="blue"><%end type ==
- "sales_quotation"%></code>.</p>
-
- <h3><a name="bloecke_if">Der <code>if</code>-Block</a></h3>
-
- <p class="blue"><code><%if variablenname%><br>
- ...<br>
- <%end%></code></p>
-
- <p>Eine normale "if-then"-Bedingung. Die Zeilen zwischen
- dem "if" und dem "end" werden nur ausgegeben,
- wenn die Variable "variablenname" gesetzt und ungleich 0
- ist.</p>
-
- <p>Die Bedingung kann auch negiert werden, indem das Wort
- "not" nach dem "if" verwendet
- wird. Beispiel: <code class="blue"><%if not
- cp_greeting%></code></p>
-
- <p>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:</p>
-
- <p><code class="blue"><%if var1 == "Wert"%></code>
- testet die Variable "var1" auf Übereinstimmung mit der
- Zeichenkette "Wert". Mittels "!=" anstelle von
- "==" würde auf Ungleichheit getestet.</p>
-
- <p><code class="blue"><%if var1 == var2%></code> testet die
- Variable "var1" auf Übereinstimmung mit der Variablen
- "var2". Mittels "!=" anstelle von "=="
- würde auf Ungleichheit getestet.</p>
-
- <p>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 "=~" und "!~"
- als Vergleichsoperatoren.</p>
-
- <p>Beispiel für einen Test, ob die Variable "intnotes"
- (interne Bemerkungen) das Wort "schwierig" enthält:
- <code class="blue"><%if intnotes =~
- "schwierig"%></code></p>
-
- <h3><a name="bloecke_foreach">Die <code>foreach</code>-Schleife</a></h3>
-
- <p class="blue"><code><%foreach variablenname%><br>
- ...<br>
- <%end%></code></p>
-
- <p>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein, wie das
- Perl-Array der Variablen "variablenname" 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 <a href="dokumentenvorlagen-und-variablen.html#invoice_posten">zeilenbezogenen
- Variablen</a> jeweils auf den Wert für die aktuelle Position
- gesetzt.</p>
-
- <p>Die Syntax sieht normalerweise wie folgt aus:</p>
-
- <p class="blue"><code><%foreach number%><br>
- Position: <%runningnumber%><br>
- Anzahl: <%qty%><br>
- Artikelnummer: <%number%><br>
- Beschreibung: <%description%><br>
- ...<br>
- <%end%></code></p>
-
- <p>Besonderheit in OpenDocument-Vorlagen: Tritt ein
- <code><%foreach%></code>-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 <code><%foreach%></code> und <code><%end%></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ö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.</p>
-
- <p>Die unterstützen Formatierungen sind:</p>
-
- <p>
- <table border="1">
- <tr><th>Formatierung</th><th>Auswirkung</th></tr>
- <tr>
- <td><code><b>Text</b></code></td>
- <td>Text wird in <b>fettdruck</b> gesetzt.</td>
- </tr>
- <tr>
- <td><code><i>Text</i></code></td>
- <td>Text wird <i>kursiv</i> gesetzt.</td>
- </tr>
- <tr>
- <td><code><u>Text</u></code></td>
- <td>Text wird <u>unterstrichen</u>.</td>
- </tr>
- <tr>
- <td><code><s>Text</s></code></td>
- <td>Text wird <s>durchgestrichen</s>. Diese Formatierung ist nicht bei der
- Ausgabe als PDF über LaTeX verfügbar.</td>
- </tr>
- <tr>
- <td><code><pagebreak></code></td>
- <td>Erzwingt einen Seitenumbruch (siehe unten).</td>
- </tr>
- <tr>
- <td><code><bullet></code></td>
- <td>Erzeugt einen ausgefüllten Kreis für Aufzählungen (•) (siehe unten).</td>
- </tr>
- </table>
- </p>
-
- <p>Eine Besonderheit ist der Befehl <code><pagebreak></code>,
- der nur in LaTeX-Vorlagen funktioniert und in anderen Vorlagen
- einfach gelöscht wird. Dieser erzwingt einen Seitenumbruch nach
- der aktuellen Rechnungsposition. Dementsprechend funktioniert er nur
- innerhalb von
- <code><%foreach...%></code>-Schleifen. Weiterhin benötigt
- er kein Endtag.</p>
-
- <p>Auch <code><bullet></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>
+++ /dev/null
-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.
-
+++ /dev/null
-== 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.
+++ /dev/null
-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
- &=&
- <=<
- >=>
- \n=<br>
-
-Note the importance of the order in this example. Substituting < and > befor &
-would lead to $gt; become &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.
-
-
-
+++ /dev/null
-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.
+++ /dev/null
-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.
-