Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
[kivitendo-erp.git] / doc / dokumentation.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4 <book id="ding.xml" lang="de">
5   <title>Lx-Office: Installation, Konfiguration, Entwicklung</title>
6
7   <chapter id="Aktuelle-Hinweise">
8     <title>Aktuelle Hinweise</title>
9
10     <para>Aktuelle Installations- und Konfigurationshinweise gibt es:</para>
11
12     <itemizedlist>
13       <listitem>
14         <para>auf der Lx-Office-Homepage unter <ulink
15         url="http://lx-office.org/index.php?id=dokumentation">http://lx-office.org/index.php?id=dokumentation</ulink></para>
16       </listitem>
17
18       <listitem>
19         <para>im Lx-Office-Wiki unter Dokumentation (<ulink
20         url="http://wiki.lx-office.org/index.php/Lx-Office_ERP">http://wiki.lx-office.org/index.php/Lx-Office_ERP</ulink>)</para>
21       </listitem>
22
23       <listitem>
24         <para>im Lx-Office-Forum: <ulink
25         url="http://www.lx-office.org/forum/">http://www.lx-office.org/forum/</ulink></para>
26       </listitem>
27     </itemizedlist>
28
29     <!--  -->
30   </chapter>
31
32   <chapter id="config">
33     <title>Installation und Grundkonfiguration</title>
34
35     <sect1 id="Benötigte-Software-und-Pakete">
36       <title>Benötigte Software und Pakete</title>
37
38       <sect2 id="Betriebssystem">
39         <title>Betriebssystem</title>
40
41         <para>Lx-Office ist für Linux konzipiert, und sollte auf jedem
42         unixoiden Betriebssystem zum Laufen zu kriegen sein. Getestet ist
43         diese Version im speziellen auf Debian und Ubuntu, grundsätzlich wurde
44         bei der Auswahl der Pakete aber darauf Rücksicht genommen, dass es
45         ohne große Probleme auf den derzeit aktuellen verbreiteten
46         Distributionen läuft.</para>
47
48         <para>Anfang 2012 sind das folgende Systeme, von denen bekannt ist, dass Lx-Office auf ihnen läuft:</para>
49
50         <itemizedlist>
51           <listitem>
52             <para>Ubuntu 8.04 LTS Hardy Heron, 10.04 LTS Lucid Lynx bis 11.10 Oneiric Ocelot</para>
53           </listitem>
54
55           <listitem>
56             <para>Debian 5.0 Lenny und 6.0 Squeeze</para>
57           </listitem>
58
59           <listitem>
60             <para>openSUSE 11.2 und 11.3</para>
61           </listitem>
62
63           <listitem>
64             <para>SuSE Linux Enterprice Server 11</para>
65           </listitem>
66
67           <listitem>
68             <para>Fedora 13 bis 15</para>
69           </listitem>
70         </itemizedlist>
71
72         <para>Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die
73         Module im Archiv recht alt sind, und das viele der benötigten Module
74         nicht einfach zu installieren sind. Dafür sollte es kurz nach dem
75         Release ein eigenes .deb geben.</para>
76
77         <para>Alternativ dazu kann die normale Installation durchgeführt
78         werden (siehe <xref
79         linkend="Manuelle-Installation-des-Programmpaketes"/>), wenn vorher
80         ein Kompatibilitätspaket installiert wird, das die fehlenden Pakete
81         bereitstellt. Das Paket ist auf <ulink
82         url="https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/">Sourceforge</ulink>
83         unter dem Namen <filename>lx-erp-perl-libs-compat-v2.tar.gz</filename>
84         hinterlegt.</para>
85
86         <para>Zur Installation das Paket in das entpackte Lx-Office
87         Verzeichnis entpacken:</para>
88
89         <programlisting>tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/</programlisting>
90
91         <para>Zusätzlich müssen dann noch die folgenden Pakete installiert
92         weerden</para>
93
94         <programlisting>apt-get install libbit-vector-perl libsub-exporter-perl libclone-perl libclass-factory-util-perl</programlisting>
95
96         <para>Danach sollte der Installationscheck (siehe <xref
97         linkend="Pakete"/>) die enthaltenen Pakete erkennen.</para>
98       </sect2>
99
100       <sect2 id="Pakete" xreflabel="Pakete">
101         <title>Pakete</title>
102
103         <para>Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist
104         Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
105         benötigt.</para>
106
107         <para>Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die
108         nicht Bestandteil einer Standard-Perl-Installation sind:</para>
109
110         <itemizedlist>
111           <listitem>
112             <para>parent</para>
113           </listitem>
114
115           <listitem>
116             <para>Archive::Zip</para>
117           </listitem>
118
119           <listitem>
120             <para>Config::Std</para>
121           </listitem>
122
123           <listitem>
124             <para>DateTime</para>
125           </listitem>
126
127           <listitem>
128             <para>DBI</para>
129           </listitem>
130
131           <listitem>
132             <para>DBD::Pg</para>
133           </listitem>
134
135           <listitem>
136             <para>Email::Address</para>
137           </listitem>
138
139           <listitem>
140             <para>JSON</para>
141           </listitem>
142
143           <listitem>
144             <para>List::MoreUtils</para>
145           </listitem>
146
147           <listitem>
148             <para>Params::Validate</para>
149           </listitem>
150
151           <listitem>
152             <para>PDF::API2</para>
153           </listitem>
154
155           <listitem>
156             <para>Rose::Object</para>
157           </listitem>
158
159           <listitem>
160             <para>Rose::DB</para>
161           </listitem>
162
163           <listitem>
164             <para>Rose::DB::Object</para>
165           </listitem>
166
167           <listitem>
168             <para>Template</para>
169           </listitem>
170
171           <listitem>
172             <para>Text::CSV_XS</para>
173           </listitem>
174
175           <listitem>
176             <para>Text::Iconv</para>
177           </listitem>
178
179           <listitem>
180             <para>URI</para>
181           </listitem>
182
183           <listitem>
184             <para>XML::Writer</para>
185           </listitem>
186
187           <listitem>
188             <para>YAML</para>
189           </listitem>
190         </itemizedlist>
191
192         <para>Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
193         hinzugekommen, <literal>URI</literal> und
194         <literal>XML::Writer</literal> sind notwendig. Ohne startet Lx-Office
195         nicht.</para>
196
197         <para>Gegenüber Version 2.6.1 sind <literal>parent</literal>,
198         <literal>DateTime</literal>, <literal>Rose::Object</literal>,
199         <literal>Rose::DB</literal> und <literal>Rose::DB::Object</literal>
200         neu hinzugekommen. <literal>IO::Wrap</literal> wurde entfernt.</para>
201
202         <para>Gegenüber Version 2.6.3 ist <literal>JSON</literal> neu
203         hinzugekommen.</para>
204
205         <para><literal>Email::Address</literal> und
206         <literal>List::MoreUtils</literal> sind schon länger feste
207         Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert. Beide
208         sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
209         zukünftigen Version aber aus dem Paket entfernt werden. Es wird
210         empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
211         installieren.</para>
212
213         <para>Die zu installierenden Pakete können in den verschiedenen
214         Distributionen unterschiedlich heißen.</para>
215
216         <para>Für Debian oder Ubuntu benötigen Sie diese Pakete:</para>
217
218         <programlisting>apt-get install apache2 postgresql libparent-perl libarchive-zip-perl \
219   libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl \
220   libemail-address-perl liblist-moreutils-perl libpdf-api2-perl \
221   librose-object-perl librose-db-perl librose-db-object-perl \
222   libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl \
223   libxml-writer-perl libyaml-perl libconfig-std-perl \
224   libparams-validate-perl libjson-perl</programlisting>
225
226         <para>Für Fedora Core benötigen Sie diese Pakete:</para>
227
228         <programlisting>yum install httpd postgresql-server perl-parent perl-DateTime \
229   perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils \
230   perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object \
231   perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \
232   perl-XML-Writer perl-YAML</programlisting>
233
234         <para>Für OpenSuSE benötigen Sie diese Pakete:</para>
235
236         <programlisting>zypper install apache2 postgresql-server perl-Archive-Zip \
237   perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils \
238   perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
239   perl-URI perl-XML-Writer perl-YAML</programlisting>
240
241         <para>Bei openSuSE 11 ist <literal>parent</literal> bereits enthalten,
242         und braucht nicht nachinstalliert werden. Die
243         <literal>Rose::*</literal> Pakete sind derzeit nicht für SuSE gepackt,
244         und müssen anderweitig nachinstalliert werden.</para>
245
246         <para>Lx-Office enthält ein Script, mit dem überprüft werden kann, ob
247         alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
248         folgt:</para>
249
250         <programlisting>./scripts/installation_check.pl</programlisting>
251       </sect2>
252     </sect1>
253
254     <sect1 id="Manuelle-Installation-des-Programmpaketes"
255            xreflabel="Manuelle Installation des Programmpaketes">
256       <title>Manuelle Installation des Programmpaketes</title>
257
258       <para>Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.3.tgz) wird
259       im Dokumentenverzeichnis des Webservers (z.B.
260       <filename>/var/www/html/</filename>,
261       <filename>/srv/www/htdocs</filename> oder
262       <filename>/var/www/</filename>) entpackt:</para>
263
264       <programlisting>cd /var/www tar xvzf
265 lxoffice-erp-2.6.2.tgz</programlisting>
266
267       <para>Verändern Sie evtl. noch den Namen des Verzeichnisses mit</para>
268
269       <programlisting>mv lxoffice-erp/ lx-erp/</programlisting>
270
271       <para>Alternativ können Sie auch einen Alias in der
272       Webserverkonfiguration benutzen, um auf das tatsächliche
273       Installationsverzeichnis zu verweisen.</para>
274
275       <para>Die Verzeichnisse <filename>users</filename>,
276       <filename>spool</filename> und <filename>webdav</filename> müssen für
277       den Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
278       restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
279       Benutzername ist bei verschiedenen Distributionen unterschiedlich (z.B.
280       bei Debian/Ubuntu <constant>www-data</constant>, bei Fedora core
281       <constant>apache</constant> oder bei OpenSuSE
282       <constant>wwwrun</constant>).</para>
283
284       <para>Der folgende Befehl ändert den Besitzer für die oben genannten
285       Verzeichnisse auf einem Debian/Ubuntu-System:</para>
286
287       <programlisting>chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav</programlisting>
288
289       <para>Weiterhin muss der Webserver-Benutzer im Verzeichnis
290       <filename>templates</filename> Verzeichnisse für jeden neuen Benutzer,
291       der in lx-office angelegt wird, anlegen dürfen:</para>
292
293       <programlisting>chgrp www-data lx-office-erp/templates
294 chmod g+w lx-office-erp/templates</programlisting>
295     </sect1>
296
297     <sect1 id="config.config-file">
298      <title>Lx-Office-Konfigurationsdatei</title>
299
300      <sect2 id="config.config-file.introduction" xreflabel="Einführung in die Konfigurationsdatei">
301       <title>Einführung</title>
302
303       <para>
304        Seit Lx-Office 2.6.3. gibt es nur noch eine Konfigurationsdatei die benötigt wird: <filename>config/lx_office.conf</filename> (kurz:
305        "die Hauptkonfigurationsdatei"). Diese muss bei der Erstinstallation von Lx-Office bzw. der Migration von älteren Versionen angelegt
306        werden.
307       </para>
308
309       <para>
310        Als Vorlage dient die Datei <filename>config/lx_office.conf.default</filename> (kurz: "die Default-Datei"):
311       </para>
312
313       <programlisting>$ cp config/lx_office.conf.default config/lx_office.conf</programlisting>
314
315       <para>
316        Die Default-Datei wird immer zuerst eingelesen. Werte, die in der Hauptkonfigurationsdatei stehen, überschreiben die
317        Werte aus der Default-Datei. Die Hauptkonfigurationsdatei muss also nur die Abschintte und Werte
318        enthalten, die von denen der Default-Datei abweichen.
319       </para>
320
321       <para>
322        Diese Hauptkonfigurationsdatei ist dann eine installationsspezifische Datei, d.h. sie enthält bspw. lokale Passwörter und wird auch
323        nicht im Versionsmanagement (git) verwaltet.
324       </para>
325
326       <para>
327        Die Konfiguration ist ferner serverabhängig, d.h. für alle Mandaten, bzw. Datenbanken gleich.
328       </para>
329      </sect2>
330
331      <sect2 id="config.config-file.sections-parameters">
332       <title>Abschnitte und Parameter</title>
333
334       <para>
335        Die Konfigurationsdatei besteht aus mehreren Teilen, die entsprechend kommentiert sind:
336       </para>
337
338       <itemizedlist>
339        <listitem><para><literal>authentication</literal></para></listitem>
340        <listitem><para><literal>authentication/database</literal></para></listitem>
341        <listitem><para><literal>authentication/ldap</literal></para></listitem>
342        <listitem><para><literal>system</literal></para></listitem>
343        <listitem><para><literal>features</literal></para></listitem>
344        <listitem><para><literal>paths</literal></para></listitem>
345        <listitem><para><literal>applications</literal></para></listitem>
346        <listitem><para><literal>environment</literal></para></listitem>
347        <listitem><para><literal>print_templates</literal></para></listitem>
348        <listitem><para><literal>task_server</literal></para></listitem>
349        <listitem><para><literal>periodic_invoices</literal></para></listitem>
350        <listitem><para><literal>console</literal></para></listitem>
351        <listitem><para><literal>debug</literal></para></listitem>
352       </itemizedlist>
353
354       <para>
355        Die üblicherweise wichtigsten Parameter, die am Anfang einzustellen oder zu kontrollieren sind, sind:
356       </para>
357
358       <programlisting>[authentication]
359 admin_password = geheim
360
361 [authentication/database]
362 host     = localhost
363 port     = 5432
364 db       = lxerp_auth
365 user     = postgres
366 password =
367
368 [system]
369 eur = 1
370 dbcharset = UTF-8</programlisting>
371
372        <para>
373         Nutzt man wiederkehrende Rechnungen, kann man unter <varname>[periodic_invoices]</varname> den Login eines Benutzers angeben, der
374         nach Erstellung der Rechnungen eine entsprechende E-Mail mit Informationen über die erstellten Rechnungen bekommt.
375        </para>
376
377        <para>
378         Nutzt man den <link linkend="config.task-server">Taskserver</link> für <link
379         linkend="features.periodic-invoices">wiederkehrende Rechnungen</link>, muss unter <varname>[task_server]</varname> ein Login eines
380         Benutzers angegeben werden, mit dem sich der Taskserver an Lx-Office bei der Datenbank anmeldet, die dem Benutzer zugewiesen ist.
381        </para>
382
383        <para>
384         Für Entwickler finden sich unter <varname>[debug]</varname> wichtige Funktionen, um die Fehlersuche zu erleichtern.
385        </para>
386      </sect2>
387
388      <sect2 id="config.config-file.prior-versions">
389       <title>Versionen vor 2.6.3</title>
390
391       <para>
392        In älteren Lx-Office Versionen gab es im Verzeichnis <filename>config</filename> die Dateien <filename>authentication.pl</filename>
393        und <filename>lx-erp.conf</filename>, die jeweils Perl-Dateien waren. Es gab auch die Möglichkeit, eine lokale Version der
394        Konfigurationsdatei zu erstellen (<filename>lx-erp-local.conf</filename>). Dies ist ab 2.6.3 nicht mehr möglich, aber auch nicht mehr
395        nötig.
396       </para>
397
398       <para>
399        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
400        manuell übertragen und die alten Konfigurationsdateien anschließend gelöscht oder verschoben werden. Ansonsten zeigt Lx-Office eine
401        entsprechende Fehlermeldung an.
402       </para>
403      </sect2>
404     </sect1>
405
406     <sect1 id="Anpassung-der-PostgreSQL-Konfiguration">
407       <title>Anpassung der PostgreSQL-Konfiguration</title>
408
409       <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
410
411       <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
412         <title>Zeichensätze/die Verwendung von UTF-8</title>
413
414         <para>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
415         werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
416         Version 8.2 oder neuer benutzt werden, und der
417         PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
418         angelegt worden sein.</para>
419
420         <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank “template1” “UTF8”, so kann auch Lx-Office mit UTF-8
421         betrieben werden.  Andernfalls ist es notwendig, einen neuen Datenbankcluster mit UTF-8-Encoding anzulegen und diesen zu
422         verwenden. Unter Debian und Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl getan werden:</para>
423
424         <programlisting>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername</programlisting>
425
426         <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete Versionsnummer angepasst werden.</para>
427
428         <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
429
430         <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
431         ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
432         Lx-Office mit ISO-8859-15 als Encoding betrieben werden.</para>
433
434         <para>Das Encoding einer Datenbank kann in <command>psql</command> mit <literal>\l</literal> geprüft werden.</para>
435       </sect2>
436
437       <sect2 id="Änderungen-an-Konfigurationsdateien">
438         <title>Änderungen an Konfigurationsdateien</title>
439
440         <para>In der Datei <filename>postgresql.conf</filename>, die je nach
441         Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
442         <filename>/var/lib/pgsql/data/</filename> oder
443         <filename>/etc/postgresql/</filename>, muss sichergestellt werden, dass
444         TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
445         Parameter <varname>listen_address</varname> gesteuert. Laufen
446         PostgreSQL und Lx-Office auf demselben Rechner, so kann dort der Wert
447         <literal>localhost</literal> verwendet werden. Andernfalls müssen
448         Datenbankverbindungen auch von anderen Rechnern aus zugelassen werden,
449         was mit dem Wert <literal>*</literal> geschieht.</para>
450
451         <para>In der Datei <filename>pg_hba.conf</filename>, die im gleichen
452         Verzeichnis wie die <filename>postgresql.conf</filename> zu finden sein
453         sollte, müssen die Berichtigungen für den Zugriff geändert werden.
454         Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
455         Verbindungen immer zuzulassen:</para>
456
457         <programlisting>local all all trust
458 host all all 127.0.0.1 255.0.0.0 trust</programlisting>
459
460         <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
461         Passwort zuzulassen. Beispielsweise:</para>
462
463         <programlisting>local all lxoffice password
464 host all lxoffice 127.0.0.1 255.255.255.255 password</programlisting>
465
466         <!--  -->
467       </sect2>
468
469       <sect2 id="Erweiterung-für-servergespeicherte-Prozeduren">
470         <title>Erweiterung für servergespeicherte Prozeduren</title>
471
472         <para>In der Datenbank <literal>template1</literal> muss die
473         Unterstützung für servergespeicherte Prozeduren eingerichet werden.
474         Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
475         führen Sie die folgenden Kommandos aus:</para>
476
477         <programlisting>create language 'plpgsql';</programlisting>
478         <!--  -->
479       </sect2>
480
481       <sect2 id="Datenbankbenutzer-anlegen">
482         <title>Datenbankbenutzer anlegen</title>
483
484         <para>Wenn Sie nicht den Datenbanksuperuser “postgres” zum Zugriff
485         benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
486         anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
487         können:</para>
488
489         <programlisting>su - postgres createuser -d -P lxoffice</programlisting>
490
491         <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
492         Sie den evtl. voreingestellten Benutzer “postgres” auf “lxoffice” bzw.
493         den hier gewählten Benutzernamen.</para>
494
495         <!--  -->
496       </sect2>
497     </sect1>
498
499     <sect1 id="Apache-Konfiguration">
500       <title>Webserver-Konfiguration</title>
501
502       <sect2>
503         <title>Grundkonfiguration mittels CGI</title>
504
505         <note>
506           <para>Für einen deutlichen Performanceschub sorgt die Ausführung
507           mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
508           <xref linkend="Apache-Konfiguration.FCGI"/> beschrieben.</para>
509         </note>
510
511         <para>Der Zugriff auf das Programmverzeichnis muss in der Apache
512         Webserverkonfigurationsdatei <literal>httpd.conf</literal> eingestellt
513         werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
514         anderen Datei hinzu, die beim Starten des Webservers eingelesen
515         wird:</para>
516
517         <programlisting>AddHandler cgi-script .pl
518 Alias /lx-erp/ /var/www/lx-erp/
519
520 &lt;Directory /var/www/lx-erp&gt;
521  Options ExecCGI
522  Includes FollowSymlinks
523 &lt;/Directory&gt;
524
525 &lt;Directory /var/www/lx-erp/users&gt;
526  Order Deny,Allow
527  Deny from All
528 &lt;/Directory&gt;</programlisting>
529
530         <para>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher
531         das Lx-Office-Archiv entpacket haben.</para>
532
533         <note>
534          <para>Vor den einzelnen Optionen muss bei einigen Distributionen ein Plus ‘<literal>+</literal>’ gesetzt werden.</para>
535         </note>
536
537         <para>Auf einigen Webservern werden manchmal die Grafiken und
538         Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft
539         geholfen, die folgende Option in die Konfiguration aufzunehmen:</para>
540
541         <programlisting>EnableSendfile Off</programlisting>
542       </sect2>
543
544       <sect2 id="Apache-Konfiguration.FCGI"
545              xreflabel="Konfiguration für FastCGI/FCGI">
546         <title>Konfiguration für FastCGI/FCGI</title>
547
548         <sect3 id="Apache-Konfiguration.FCGI.WasIstEs">
549           <title>Was ist FastCGI?</title>
550
551           <para>Direkt aus <ulink
552           url="http://de.wikipedia.org/wiki/FastCGI">Wikipedia</ulink>
553           kopiert:</para>
554
555           <para><citation> FastCGI ist ein Standard für die Einbindung
556           externer Software zur Generierung dynamischer Webseiten in einem
557           Webserver. FastCGI ist vergleichbar zum Common Gateway Interface
558           (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu
559           umgehen. </citation></para>
560         </sect3>
561
562         <sect3 id="Apache-Konfiguration.FCGI.Warum">
563           <title>Warum FastCGI?</title>
564
565           <para>Perl Programme (wie Lx-Office eines ist) werden nicht statisch
566           kompiliert. Stattdessen werden die Quelldateien bei jedem Start
567           übersetzt, was bei kurzen Laufzeiten einen Großteil der Laufzeit
568           ausmacht. Während SQL Ledger einen Großteil der Funktionalität in
569           einzelne Module kapselt, um immer nur einen kleinen Teil laden zu
570           müssen, ist die Funktionalität von Lx-Office soweit gewachsen, dass
571           immer mehr Module auf den Rest des Programms zugreifen. Zusätzlich
572           benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
573           entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies
574           führt dazu dass ein Lx-Office Aufruf der Kernmasken mittlerweile
575           deutlich länger dauert als früher, und dass davon 90% für das Laden
576           der Module verwendet wird.</para>
577
578           <para>Mit FastCGI werden nun die Module einmal geladen, und danach
579           wird nur die eigentliche Programmlogik ausgeführt.</para>
580         </sect3>
581
582         <sect3 id="Apache-Konfiguration.FCGI.WebserverUndPlugin">
583           <title>Getestete Kombinationen aus Webservern und Plugin</title>
584
585           <para>Folgende Kombinationen sind getestet:</para>
586
587           <itemizedlist>
588             <listitem>
589               <para>Apache 2.2.11 (Ubuntu) und mod_fcgid.</para>
590             </listitem>
591
592             <listitem>
593               <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
594             </listitem>
595           </itemizedlist>
596
597           <para>Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer
598           Zeit nicht mehr weiter entwickelt wird. Im Folgenden wird auf
599           mod_fastcgi nicht mehr explizit eingegangen.</para>
600
601           <para>Als Perl Backend wird das Modul <filename>FCGI.pm</filename>
602           verwendet.</para>
603
604           <warning>
605             <para>
606              FCGI 0.69 und höher ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte Eingaben von Lx-Office. Falls es
607              Probleme mit Umlauten in Ihrere Installation gibt, muss auf die Vorgängerversion FCGI 0.68 ausgewichen werden.
608             </para>
609
610             <para>
611              Mit CPAN lässt sie sich die Vorgängerversion wie folgt installieren:
612             </para>
613
614             <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
615           </warning>
616         </sect3>
617
618         <sect3 id="Apache-Konfiguration.FCGI.Konfiguration">
619           <title>Konfiguration des Webservers</title>
620
621           <para>Bevor Sie versuchen, eine Lx-Office Installation unter FCGI
622           laufen zu lassen, empfliehlt es sich die Installation ersteinmal
623           unter CGI aufzusetzen. FCGI macht es nicht einfach Fehler zu
624           debuggen die beim ersten aufsetzen auftreten können. Sollte die
625           Installation schon funktionieren, lesen Sie weiter.</para>
626
627           <para>Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann
628           unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:</para>
629
630           <programlisting>a2enmod fcgid</programlisting>
631
632           <para>Die Konfiguration für die Verwendung von Lx-Office mit FastCGI
633           erfolgt durch Anpassung der vorhandenen <function>Alias</function>-
634           und <function>Directory</function>-Direktiven. Dabei wird zwischen
635           dem Installationspfad von Lx-Office im Dateisystem
636           ("<filename>/path/to/lx-office-erp</filename>") und der URL
637           unterschieden, unter der Lx-Office im Webbrowser erreichbar ist
638           ("<filename>/url/for/lx-office-erp</filename>").</para>
639
640           <para>Folgender Konfigurationsschnipsel funktioniert mit
641           mod_fastcgi:</para>
642
643           <programlisting>AliasMatch ^/url/for/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
644 Alias       /url/for/lx-office-erp/          /path/to/lx-office-erp/
645
646 &lt;Directory /path/to/lx-office-erp&gt;
647   AllowOverride All
648   Options ExecCGI Includes FollowSymlinks
649   Order Allow,Deny
650   Allow from All
651 &lt;/Directory&gt;
652
653 &lt;DirectoryMatch /path/to/lx-office-erp/users&gt;
654   Order Deny,Allow
655   Deny from All
656 &lt;/DirectoryMatch&gt;</programlisting>
657
658           <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
659           die maximale Größe eines Requests. Diese sollte wie folgt
660           hochgesetzt werden:</para>
661
662           <programlisting>FcgidMaxRequestLen 10485760</programlisting>
663
664           <para>Das ganze sollte dann so aussehen:</para>
665
666           <programlisting>AddHandler fcgid-script .fpl
667 AliasMatch ^/url/for/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
668 Alias       /url/for/lx-office-erp/          /path/to/lx-office-erp/
669 FcgidMaxRequestLen 10485760
670
671 &lt;Directory /path/to/lx-office-erp&gt;
672   AllowOverride All
673   Options ExecCGI Includes FollowSymlinks
674   Order Allow,Deny
675   Allow from All
676 &lt;/Directory&gt;
677
678 &lt;DirectoryMatch /path/to/lx-office-erp/users&gt;
679   Order Deny,Allow
680   Deny from All
681 &lt;/DirectoryMatch&gt;</programlisting>
682
683           <para>Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle
684           Zugriffe auf die einzelnen Scripte werden auf diesen umgeleitet.
685           Dadurch, dass zur Laufzeit öfter mal Scripte neu geladen werden,
686           gibt es hier kleine Performance-Einbußen.</para>
687
688           <para>Es ist möglich, die gleiche Lx-Office Version parallel unter
689           CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven
690           wie oben beschrieben, die URLs werden aber umgeleitet:</para>
691
692           <programlisting># Zugriff über CGI
693 Alias       /url/for/lx-office-erp                /path/to/lx-office-erp
694
695 # Zugriff mit mod_fcgid:
696 AliasMatch ^/url/for/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
697 Alias       /url/for/lx-office-erp-fcgid/          /path/to/lx-office-erp/</programlisting>
698
699           <para>Dann ist unter <filename>/url/for/lx-office-erp/</filename> die normale Version erreichbar, und unter
700           <constant>/url/for/lx-office-erp-fcgid/</constant> die FastCGI-Version.</para>
701         </sect3>
702       </sect2>
703     </sect1>
704
705     <sect1 id="config.task-server">
706       <title>Der Task-Server</title>
707
708       <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
709       regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
710       festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
711       wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
712       benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
713       bekommen.</para>
714
715       <sect2 id="Konfiguration-des-Task-Servers">
716         <title>Verfügbare und notwendige Konfigurationsoptionen</title>
717
718         <para>Die Konfiguration erfolgt über den Abschnitt
719         <literal>[task_server]</literal> in der Datei
720         <filename>config/lx_office.conf</filename>. Die dort verfügbaren
721         Optionen sind:</para>
722
723         <variablelist>
724          <varlistentry>
725           <term><varname>login</varname></term>
726           <listitem>
727            <para>
728             gültiger Lx-Office-Benutzername, der benutzt wird, um die zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss in
729             der Administration angelegt werden. Diese Option muss angegeben werden.
730            </para>
731           </listitem>
732          </varlistentry>
733
734          <varlistentry>
735           <term><varname>run_as</varname></term>
736           <listitem>
737             <para>
738              Wird der Server vom Systembenutzer <literal>root</literal> gestartet, so wechselt er auf den mit <literal>run_as</literal>
739              angegebenen Systembenutzer.  Der Systembenutzer muss dieselben Lese- und Schreibrechte haben, wie auch der Webserverbenutzer
740              (siehe see <xref linkend="Manuelle-Installation-des-Programmpaketes"/>). Daher ist es sinnvoll, hier denselben Systembenutzer
741              einzutragen, unter dem auch der Webserver läuft.
742             </para>
743           </listitem>
744          </varlistentry>
745
746          <varlistentry>
747           <term><varname>debug</varname></term>
748           <listitem>
749             <para>
750              Schaltet Debug-Informationen an und aus.
751             </para>
752           </listitem>
753          </varlistentry>
754         </variablelist>
755       </sect2>
756
757       <sect2 id="Einbinden-in-den-Boot-Prozess">
758         <title>Automatisches Starten des Task-Servers beim Booten</title>
759
760         <para>Der Task-Server verhält sich von seinen Optionen her wie ein
761         reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim
762         Starten automatisch in das Lx-Office-Installationsverzeichnis.</para>
763
764         <para>Deshalb ist es möglich, ihn durch Setzen eines symbolischen
765         Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
766         einzubinden. Da das bei neueren Linux-Distributionen aber nicht
767         zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
768         anstelle eines symbolischen Links verwendet werden können.</para>
769
770         <sect3>
771           <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
772           Core)</title>
773
774           <para>Kopieren Sie die Datei
775           <filename>scripts/boot/system-v/lx-office-task-server</filename>
776           nach <filename>/etc/init.d/lx-office-task-server</filename>. Passen
777           Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
778           <literal>DAEMON=....</literal>). Binden Sie das Script in den
779           Boot-Prozess ein. Dies ist distributionsabhängig:</para>
780
781           <itemizedlist>
782             <listitem>
783               <para>Debian-basierende Systeme:</para>
784
785               <programlisting>update-rc.d lx-office-task-server defaults
786 # Nur bei Debian Squeeze und neuer:
787 insserv lx-office-task-server</programlisting>
788             </listitem>
789
790             <listitem>
791               <para>OpenSuSE und Fedora Core:</para>
792
793               <programlisting>chkconfig --add lx-office-task-server</programlisting>
794             </listitem>
795           </itemizedlist>
796
797           <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet werden: <command>/etc/init.d/lx-office-task-server
798           start</command></para>
799         </sect3>
800
801         <sect3>
802           <title>Upstart-basierende Systeme (z.B. Ubuntu)</title>
803
804           <para>Kopieren Sie die Datei
805           <filename>scripts/boot/upstart/lx-office-task-server.conf</filename>
806           nach <filename>/etc/init/lx-office-task-server.conf</filename>.
807           Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
808           <literal>exec ....</literal>).</para>
809
810           <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet werden: <command>service lx-office-task-server
811           start</command></para>
812         </sect3>
813       </sect2>
814
815       <sect2 id="Prozesskontrolle">
816         <title>Wie der Task-Server gestartet und beendet wird</title>
817
818         <para>Der Task-Server wird wie folgt kontrolliert:</para>
819
820         <programlisting>./scripts/task_server.pl Befehl</programlisting>
821
822         <para><literal>Befehl</literal> ist dabei eine der folgenden
823         Optionen:</para>
824
825         <itemizedlist>
826           <listitem>
827             <para><literal>start</literal> startet eine neue Instanz des
828             Task-Servers. Die Prozess-ID wird innerhalb des
829             <filename>users</filename>-Verzeichnisses abgelegt.</para>
830           </listitem>
831
832           <listitem>
833             <para><literal>stop</literal> beendet einen laufenden
834             Task-Server.</para>
835           </listitem>
836
837           <listitem>
838             <para><literal>restart</literal> beendet und startet ihn
839             neu.</para>
840           </listitem>
841
842           <listitem>
843             <para><literal>status</literal> berichtet, ob der Task-Server
844             läuft.</para>
845           </listitem>
846         </itemizedlist>
847
848         <para>Der Task-Server wechselt beim Starten automatisch in das
849         Lx-Office-Installationsverzeichnis.</para>
850
851         <para>Dieselben Optionen können auch für die SystemV-basierenden
852         Runlevel-Scripte benutzt werden (siehe oben).</para>
853
854         <!--  -->
855       </sect2>
856     </sect1>
857
858     <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
859       <title>Benutzerauthentifizierung und Administratorpasswort</title>
860
861       <para>Informationen über die Einrichtung der Benutzerauthentifizierung,
862       über die Verwaltung von Gruppen und weitere Einstellungen</para>
863
864       <!--  -->
865
866       <sect2 id="Grundlagen-zur-Benutzerauthentifizierung">
867         <title>Grundlagen zur Benutzerauthentifizierung</title>
868
869         <para>Lx-Office verwaltet die Benutzerinformationen in einer
870         Datenbank, die im folgenden “Authentifizierungsdatenbank” genannt
871         wird. Für jeden Benutzer kann dort eine eigene Datenbank für die
872         eigentlichen Finanzdaten hinterlegt sein. Diese beiden Datenbanken
873         können, müssen aber nicht unterschiedlich sein.</para>
874
875         <para>Im einfachsten Fall gibt es für Lx-Office nur eine einzige
876         Datenbank, in der sowohl die Benutzerinformationen als auch die Daten
877         abgelegt werden.</para>
878
879         <para>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
880         entweder gegen die Authentifizierungsdatenbank oder gegen einen
881         LDAP-Server überprüft werden.</para>
882
883         <para>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
884         Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
885         Konfigurationsdatei <filename>config/lx_office.conf</filename>
886         festgelegt. Diese muss bei der Installation und bei einem Upgrade von
887         einer Version vor v2.6.0 angelegt werden. Eine
888         Beispielkonfigurationsdatei
889         <filename>config/lx_office.conf.default</filename> existiert, die als
890         Vorlage benutzt werden kann.</para>
891       </sect2>
892
893       <sect2 id="Administratorpasswort">
894         <title>Administratorpasswort</title>
895
896         <para>Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt wird, wird ebenfalls in dieser Datei gespeichert. Es
897         kann auch nur dort und nicht mehr im Administrationsinterface selber geändert werden. Der Parameter dazu heißt
898         <varname>admin_password</varname> im Abschnitt <varname>[authentication]</varname>.</para>
899       </sect2>
900
901       <sect2 id="Authentifizierungsdatenbank">
902         <title>Authentifizierungsdatenbank</title>
903
904         <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern in <varname>[authentication/database]</varname>
905         konfiguriert.  Hier sind die folgenden Parameter anzugeben:</para>
906
907         <variablelist>
908          <varlistentry>
909           <term><literal>host</literal></term>
910           <listitem>
911            <para>Der Rechnername oder die IP-Adresse des Datenbankservers</para>
912           </listitem>
913          </varlistentry>
914
915          <varlistentry>
916           <term><literal>port</literal></term>
917           <listitem>
918             <para>Die Portnummer des Datenbankservers, meist 5432</para>
919           </listitem>
920          </varlistentry>
921
922          <varlistentry>
923           <term><literal>db</literal></term>
924           <listitem>
925            <para>Der Name der Authentifizierungsdatenbank</para>
926           </listitem>
927          </varlistentry>
928
929          <varlistentry>
930           <term><literal>user</literal></term>
931           <listitem>
932             <para>Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. "<literal>postgres</literal>")</para>
933           </listitem>
934          </varlistentry>
935
936          <varlistentry>
937           <term><literal>password</literal></term>
938           <listitem>
939             <para>Das Passwort für den Datenbankbenutzer</para>
940           </listitem>
941          </varlistentry>
942         </variablelist>
943
944         <para>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
945         automatisch anlegen (mehr dazu siehe unten).</para>
946       </sect2>
947
948       <sect2 id="Passwortüberprüfung">
949         <title>Passwortüberprüfung</title>
950
951         <para>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die Authentifizierungsdatenbank und gegen einen externen LDAP-
952         oder Active-Directory-Server. Welche davon benutzt wird, regelt der Parameter <varname>module</varname> im Abschnitt
953         <varname>[authentication]</varname>.</para>
954
955         <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank gespeichert werden, so muss der Parameter
956         <varname>module</varname> den Wert <literal>DB</literal> enthalten. In diesem Fall können sowohl der Administrator als auch die
957         Benutzer selber ihre Psaswörter in Lx-Office ändern.</para>
958
959         <para>Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt werden, so muss der Parameter <varname>module</varname>
960         auf <literal>LDAP</literal> gesetzt werden. In diesem Fall müssen zusätzliche Informationen über den LDAP-Server im Abschnitt
961         <literal>[authentication/ldap]</literal> angegeben werden:</para>
962
963         <variablelist>
964          <varlistentry>
965           <term><literal>host</literal></term>
966           <listitem>
967             <para>Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend
968             erforderlich.</para>
969           </listitem>
970          </varlistentry>
971
972          <varlistentry>
973           <term><literal>port</literal></term>
974           <listitem>
975             <para>Die Portnummer des LDAP-Servers; meist 389.</para>
976           </listitem>
977          </varlistentry>
978
979          <varlistentry>
980           <term><literal>tls</literal></term>
981           <listitem>
982             <para>Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf ‘<literal>1</literal>’ setzen, andernfalls auf
983             ‘<literal>0</literal>’ belassen</para>
984           </listitem>
985          </varlistentry>
986
987          <varlistentry>
988           <term><literal>attribute</literal></term>
989           <listitem>
990             <para>Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server ist dies
991             meist ‘<literal>sAMAccountName</literal>’, für andere LDAP-Server hingegen ‘<literal>uid</literal>’. Diese Angabe ist zwingend
992             erforderlich.</para>
993           </listitem>
994          </varlistentry>
995
996          <varlistentry>
997           <term><literal>base_dn</literal></term>
998           <listitem>
999             <para>Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich.</para>
1000           </listitem>
1001          </varlistentry>
1002
1003          <varlistentry>
1004           <term><literal>filter</literal></term>
1005           <listitem>
1006             <para>Ein optionaler LDAP-Filter.  Enthält dieser Filter das Wort <literal>&lt;%login%&gt;</literal>, so wird dieses durch den
1007             vom Benutzer eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum nach einem Element durchsucht, bei dem das oben
1008             angegebene Attribut mit dem Benutzernamen identisch ist.</para>
1009           </listitem>
1010          </varlistentry>
1011
1012          <varlistentry>
1013           <term><literal>bind_dn</literal> und <literal>bind_password</literal></term>
1014           <listitem>
1015             <para>Wenn der LDAP-Server eine Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist dies bei Active-Directory-Servern
1016             der Fall), so kann diese hier angegeben werden. Für Active-Directory-Server kann als ‘<literal>bind_dn</literal>’ entweder eine
1017             komplette LDAP-DN wie z.B. ‘<literal>cn=Martin Mustermann,cn=Users,dc=firmendomain</literal>’ auch nur der volle Name des
1018             Benutzers eingegeben werden; in diesem Beispiel also ‘<literal>Martin Mustermann</literal>’.</para>
1019           </listitem>
1020          </varlistentry>
1021         </variablelist>
1022       </sect2>
1023
1024       <sect2 id="Name-des-Session-Cookies">
1025         <title>Name des Session-Cookies</title>
1026
1027         <para>Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt werden, so müssen die Namen der Session-Cookies für alle
1028         Installationen unterschiedlich sein. Der Name des Cookies wird mit dem Parameter <varname>cookie_name</varname> im Abschnitt
1029         <varname>[authentication]</varname>gesetzt.</para>
1030
1031         <para>Diese Angabe ist optional, wenn nur eine Installation auf dem
1032         Server existiert.</para>
1033       </sect2>
1034
1035       <sect2 id="Anlegen-der-Authentifizierungsdatenbank">
1036         <title>Anlegen der Authentifizierungsdatenbank</title>
1037
1038         <para>Nachdem alle Einstellungen in
1039         <filename>config/lx_office.conf</filename> vorgenommen wurden, muss
1040         Lx-Office die Authentifizierungsdatenbank anlegen. Dieses geschieht
1041         automatisch, wenn Sie sich im Administrationsmodul anmelden, das unter
1042         der folgenden URL erreichbar sein sollte:</para>
1043
1044         <para><ulink
1045         url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1046
1047         <!--  -->
1048       </sect2>
1049     </sect1>
1050
1051     <sect1 id="Benutzer--und-Gruppenverwaltung">
1052       <title>Benutzer- und Gruppenverwaltung</title>
1053
1054       <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
1055       angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
1056       folgender URL finden:</para>
1057
1058       <para><ulink
1059       url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1060
1061       <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
1062       <filename>config/lx_office.conf</filename> eingetragen haben.</para>
1063
1064       <sect2 id="Zusammenhänge">
1065         <title>Zusammenhänge</title>
1066
1067         <para>Lx-Office verwendet eine Datenbank zum Speichern all seiner
1068         Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
1069         mit Lx-Office arbeiten zu können, muss eine Person einen
1070         Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
1071         Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
1072         möglich und normal, dass mehreren Benutzern die selbe Datenbank
1073         zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
1074         können.</para>
1075
1076         <para>Die Basisdaten der Benutzer, die in der Administration
1077         eingegeben werden können, werden in einer zweiten Datenbank
1078         gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
1079         ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
1080         Pro Lx-Office-Installation gibt es nur eine
1081         Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
1082         Firmendaten.</para>
1083
1084         <para>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
1085         Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
1086         gestattet, so werden der entsprechenden Menüpunkte auch nicht
1087         angezeigt. Diese Rechte werden ebenfalls in der
1088         Authentifizierungsdatenbank gespeichert.</para>
1089
1090         <para>Um Rechte verteilen zu können, verwendet Lx-Office ein
1091         Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
1092         erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
1093         mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
1094         Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
1095         Benutzer Mitglied ist.</para>
1096
1097         <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
1098         Benutzer angelegt werden sollten, lautet:</para>
1099
1100         <orderedlist numeration="arabic">
1101           <listitem>
1102             <para>Datenbank anlegen</para>
1103           </listitem>
1104
1105           <listitem>
1106             <para>Gruppen anlegen</para>
1107           </listitem>
1108
1109           <listitem>
1110             <para>Benutzer anlegen</para>
1111           </listitem>
1112
1113           <listitem>
1114             <para>Benutzer den Gruppen zuordnen</para>
1115           </listitem>
1116         </orderedlist>
1117       </sect2>
1118
1119       <sect2 id="Datenbanken-anlegen">
1120         <title>Datenbanken anlegen</title>
1121
1122         <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
1123         den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
1124         Beispielen ist dies ‘<literal>lxoffice</literal>’).</para>
1125
1126         <para>Wenn Sie für die Lx-Office-Installation nicht den europäischen
1127         Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
1128         müssen Sie vor dem Anlegen der Datenbank in der Datei
1129         <filename>config/lx_office.conf</filename> die Variable
1130         <literal>dbcharset</literal> im Abschnitt <literal>system</literal>
1131         auf den Wert ‘<literal>UTF-8</literal>’ setzen. Zusätzlich muss beim
1132         Anlegen der Datenbank ‘<literal>UTF-8 Unicode</literal>’ als
1133         Schriftsatz ausgewählt werden.</para>
1134
1135         <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
1136         verwenden müssen, da diese Einstellungen momentan global in Lx-Office
1137         vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
1138         Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
1139         angelegt worden sein.</para>
1140       </sect2>
1141
1142       <sect2 id="Gruppen-anlegen">
1143         <title>Gruppen anlegen</title>
1144
1145         <para>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
1146         Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
1147         Anlegen können Sie die verschiedenen Bereiche wählen, auf die
1148         Mitglieder dieser Gruppe Zugriff haben sollen.</para>
1149
1150         <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
1151         Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
1152         Datenbanken, die in dieser Installation verwaltet werden.</para>
1153       </sect2>
1154
1155       <sect2 id="Benutzer-anlegen">
1156         <title>Benutzer anlegen</title>
1157
1158         <para>Beim Anlegen von Benutzern werden für viele Parameter
1159         Standardeinstellungen vorgenommen, die den Gepflogenheiten des
1160         deutschen Raumes entsprechen.</para>
1161
1162         <para>Zwingend anzugeben sind der Loginname sowie die komplette
1163         Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
1164         Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
1165         gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
1166         aktiv, so ist das Passwort-Feld deaktiviert.</para>
1167
1168         <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
1169         eben angelegten Datenbanken eingetragen werden.</para>
1170       </sect2>
1171
1172       <sect2 id="Gruppenmitgliedschaften-verwalten">
1173         <title>Gruppenmitgliedschaften verwalten</title>
1174
1175         <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
1176         Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
1177
1178         <orderedlist numeration="arabic">
1179           <listitem>
1180             <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
1181             folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
1182             hinzufügen.</para>
1183           </listitem>
1184
1185           <listitem>
1186             <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
1187             der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
1188             alle im System angelegten Gruppen und Benutzer enthält. Durch
1189             Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
1190             Gruppe in der ausgewählten Spalte hinzugefügt.</para>
1191           </listitem>
1192         </orderedlist>
1193       </sect2>
1194
1195       <sect2 id="Migration-alter-Installationen">
1196         <title>Migration alter Installationen</title>
1197
1198         <para>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird,
1199         in der die Benutzerdaten noch im Dateisystem im Verzeichnis
1200         <literal>users</literal> verwaltet wurden, so bietet Lx-Office die
1201         Möglichkeit, diese Benutzerdaten automatisch in die
1202         Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
1203         sich nach dem Update der Installation das erste Mal im
1204         Administrationsbereich anmeldet. Findet Lx-Office die Datei
1205         <literal>users/members</literal>, so wird der Migrationsprozess
1206         gestartet.</para>
1207
1208         <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
1209         Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
1210         Lx-Office noch die Möglichkeit an, dass automatisch eine
1211         Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
1212         Funktionen von Lx-Office gewährt. Alle migrierten Benutzern werden
1213         Mitglied in dieser Gruppe. Damit wird das Verhalten von Lx-Office bis
1214         Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
1215         sich sofort wieder anmelden und mit dem System arbeiten.</para>
1216
1217         <!--  -->
1218       </sect2>
1219     </sect1>
1220
1221     <sect1 id="Drucken-mit-Lx-Office">
1222       <title>Drucken mit Lx-Office</title>
1223
1224       <para>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen.
1225       Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
1226       einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
1227       Debianoiden Betriebssystemen sind das die Pakete:</para>
1228
1229       <para><literal>texlive-latex-base texlive-latex-extra
1230       texlive-fonts-recommended</literal></para>
1231
1232       <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
1233       von den Standardvorlagen verwendet werden.</para>
1234
1235       <para>TODO: rpm Pakete.</para>
1236
1237       <para>In den allermeisten Installationen sollte drucken jetzt schon
1238       funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
1239       Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
1240       die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
1241       Beispiel:</para>
1242
1243       <itemizedlist>
1244         <listitem>
1245           <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
1246           LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
1247           Vorlagen aus der Community auf. Installieren Sie die entsprechenden
1248           Pakete.</para>
1249         </listitem>
1250
1251         <listitem>
1252           <para>! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for
1253           use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
1254           einer Standardinstallation exotische utf8 Zeichen zu drucken.
1255           TeXLive unterstützt von Haus nur romanische Schriften und muss mit
1256           diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
1257           Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
1258         </listitem>
1259       </itemizedlist>
1260
1261       <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
1262       heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
1263       Prüfen Sie den Namen in der Konfiguration (Standard:
1264       <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
1265       (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
1266       darf.</para>
1267
1268       <!--  -->
1269     </sect1>
1270
1271     <sect1 id="OpenDocument-Vorlagen">
1272       <title>OpenDocument-Vorlagen</title>
1273
1274       <para>Lx-Office unterstützt die Verwendung von Vorlagen im
1275       OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
1276       Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
1277       diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
1278       OpenDocument-Vorlagen zu aktivieren muss in der Datei
1279       <filename>config/lx_office.conf</filename> die Variable
1280       <literal>opendocument</literal> im Abschnitt
1281       <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
1282       Dieses ist die Standardeinstellung.</para>
1283
1284       <para>Weiterhin muss in der Datei
1285       <filename>config/lx_office.conf</filename> die Variable
1286       <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
1287       die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
1288       Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
1289       "UTF-8".</para>
1290
1291       <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
1292       weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
1293       OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
1294       neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
1295       (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
1296       Andere Distributionen enthalten ihn in anderen Paketen.</para>
1297
1298       <para>Nach der Installation müssen in der Datei
1299       <filename>config/lx_config.conf</filename> zwei weitere Variablen
1300       angepasst werden: <literal>openofficeorg_writer</literal> muss den
1301       vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
1302       <literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
1303       enthalten. Beide stehen im Abschnitt
1304       <literal>applications</literal>.</para>
1305
1306       <para>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
1307       OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
1308       Variable <literal>$openofficeorg_daemon</literal> gesetzt ist, startet
1309       ein OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
1310       bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
1311       benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
1312       reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
1313       werden muss. Der Nachteil ist, dass diese Methode Python und die
1314       Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
1315       sind.</para>
1316
1317       <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
1318       wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
1319       mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
1320       Dokumentenvorlage enthalten sein und
1321       “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
1322       ‘<literal>templates/mastertemplates/German/invoice.odt</literal>’
1323       enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
1324       ebenfalls enthalten sein muss.</para>
1325
1326       <para>Als letztes muss herausgefunden werden, welchen Namen
1327       OpenOffice.org Writer dem Verzeichnis mit den Benutzereinstellungen
1328       gibt. Unter Debian ist dies momentan
1329       <literal>~/.openoffice.org2</literal>. Sollte der Name bei Ihrer
1330       OpenOffice.org-Installation anders sein, so muss das Verzeichnis
1331       <literal>users/.openoffice.org2</literal> entsprechend umbenannt werden.
1332       Ist der Name z.B. einfach nur <literal>.openoffice</literal>, so wäre
1333       folgender Befehl auszuführen:</para>
1334
1335       <para><literal>mv users/.openoffice.org2
1336       users/.openoffice</literal></para>
1337
1338       <para>Dieses Verzeichnis, wie auch das komplette
1339       <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
1340       sein. Dieses wurde bereits erledigt (siehe <xref
1341       linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber erneut
1342       überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</para>
1343
1344       <!--  -->
1345     </sect1>
1346
1347     <sect1 id="config.eur">
1348       <title>Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung: EUR</title>
1349
1350       <sect2 id="config.eur.introduction" xreflabel="Einführung in die Konfiguration zur EUR">
1351        <title>Einführung</title>
1352
1353        <para>
1354         Lx-Office besaß bis inklusive Version 2.6.3 einen Konfigurationsparameter namens <varname>eur</varname>, der sich in der
1355         Konfigurationsdatei <filename>config/lx_office.conf</filename> befindet. Somit galt er für alle Mandanten, die in dieser
1356         Installation benutzt wurden.
1357        </para>
1358
1359        <para>
1360         Mit der nachfolgenden Version wurde der Parameter zum Einen in die Mandantendatenbank verschoben und dabei auch gleich in drei
1361         Einzelparameter aufgeteilt, mit denen sich das Verhalten genauer steuern lässt.
1362        </para>
1363       </sect2>
1364
1365       <sect2 id="config.eur.parameters" xreflabel="Konfigurationsparameter für EUR">
1366        <title>Konfigurationsparameter</title>
1367
1368        <para>
1369         Es gibt drei Parameter, die die Gewinnermittlungsart, Versteuerungsart und die Warenbuchungsmethode regeln:
1370        </para>
1371
1372        <variablelist>
1373         <varlistentry>
1374          <term><varname>profit_determination</varname></term>
1375          <listitem>
1376           <para>
1377            Dieser Parameter legt die Berechnungsmethode für die Gewinnermittlung fest. Er enthält entweder <literal>balance</literal> für
1378            Betriebsvermögensvergleich/Bilanzierung oder <literal>income</literal> für die Einnahmen-Überschuss-Rechnung.
1379           </para>
1380          </listitem>
1381         </varlistentry>
1382
1383         <varlistentry>
1384          <term><varname>accounting_method</varname></term>
1385          <listitem>
1386           <para>
1387            Dieser Parameter steuert die Buchungs- und Berechnungsmethoden für die Versteuerungsart. Er enthält entweder
1388            <literal>accrual</literal> für die Soll-Versteuerung oder <literal>cash</literal> für die Ist-Versteuerung.
1389           </para>
1390          </listitem>
1391         </varlistentry>
1392
1393         <varlistentry>
1394          <term><varname>inventory_system</varname></term>
1395          <listitem>
1396           <para>
1397            Dieser Parameter legt die Warenbuchungsmethode fest. Er enthält entweder <literal>perpetual</literal> für die Bestandsmethode
1398            oder <literal>periodic</literal> für die Aufwandsmethode.
1399           </para>
1400          </listitem>
1401         </varlistentry>
1402        </variablelist>
1403
1404        <para>
1405         Zum Vergleich der Funktionalität bis und nach 2.6.3: <varname>eur</varname> = 1 bedeutete Einnahmen-Überschuss-Rechnung,
1406         Ist-Versteuerung und Aufwandsmethode. <varname>eur</varname> = 0 bedeutete hingegen Bilanzierung, Soll-Versteuerung und
1407         Bestandsmethode.
1408        </para>
1409
1410        <para>
1411         Die Konfiguration "<varname>eur</varname>" unter <varname>[system]</varname> in der <link
1412         linkend="config.config-file">Konfigurationsdatei</link> <filename>config/lx_office.conf</filename> wird nun nicht mehr benötigt und
1413         kann entfernt werden. Dies muss manuell geschehen.
1414        </para>
1415       </sect2>
1416
1417       <sect2 id="config.eur.setting-parameters">
1418        <title>Festlegen der Parameter</title>
1419
1420        <para>
1421         Beim Anlegen eines neuen Mandanten bzw. einer neuen Datenbank in der Admininstration können diese Optionen nun unabhängig
1422         voneinander eingestellt werden.
1423        </para>
1424
1425        <para>
1426         Beim Upgrade bestehender Mandanten wird eur ausgelesen und die Variablen werden so gesetzt, daß sich an der Funktionalität nichts
1427         ändert.
1428        </para>
1429
1430        <para>
1431         Die aktuelle Konfiguration wird unter Nummernkreise und Standardkonten unter dem neuen Punkt "Einstellungen" angezeigt (read-only).
1432         Eine spätere Änderung ist für einen bestehenden Mandanten nicht mehr möglich. Dies war auch vorher nicht möglich, bzw. vorhandene
1433         Daten wurden so belassen und haben damit die Ergebnisse verfälscht.
1434        </para>
1435       </sect2>
1436
1437       <sect2 id="config.eur.inventory-system-perpetual">
1438        <title>Bemerkungen zu Bestandsmethode</title>
1439
1440        <para>
1441         Die Bestandsmethode ist eigentlich eine sehr elegante Methode, funktioniert in Lx-Office aber nur unter bestimmten Bedingungen:
1442         Voraussetzung ist, daß auch immer alle Einkaufsrechnungen gepflegt werden, und man beim Jahreswechsel nicht mit einer leeren
1443         Datenbank anfängt, da bei jedem Verkauf anhand der gesamten Rechnungshistorie der Einkaufswert der Ware nach dem FIFO-Prinzip aus
1444         den Einkaufsrechnungen berechnet wird.
1445        </para>
1446
1447        <para>
1448         Die Bestandsmethode kann vom Prinzip her also nur funktioneren, wenn man mit den Buchungen bei Null anfängt, und man kann auch nicht
1449         im laufenden Betrieb von der Aufwandsmethode zur Bestandsmethode wechseln.
1450        </para>
1451       </sect2>
1452
1453       <sect2 id="config.eur.knonw-issues">
1454        <title>Bekannte Probleme</title>
1455
1456        <para>
1457         Bei bestimmten Berichten kann man derzeit noch inviduell einstellen, ob man nach Ist- oder Sollversteuerung auswertet, und es werden
1458         im Code Variablen wie $accrual oder $cash gesetzt. Diese Codestellen wurden noch nicht angepasst, sondern nur die, wo bisher
1459         die Konfigurationsvariable <varname>$::lx_office_conf{system}->{eur}</varname> ausgewertet wurde.
1460        </para>
1461
1462        <para>
1463         Es fehlen Hilfetext beim Neuanlegen eines Mandanten, was die Optionen bewirken, z.B. mit zwei Standardfällen.
1464        </para>
1465       </sect2>
1466     </sect1>
1467
1468     <sect1 id="Lx-Office-ERP-verwenden">
1469       <title>Lx-Office ERP verwenden</title>
1470
1471       <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
1472       folgender URL erreichbar:</para>
1473
1474       <para><ulink
1475       url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
1476
1477       <para>Die Administrationsseite erreichen Sie unter:</para>
1478
1479       <para><ulink
1480       url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
1481     </sect1>
1482   </chapter>
1483
1484   <chapter id="features" xreflabel="Features und Funktionen">
1485     <title>Features und Funktionen</title>
1486
1487     <sect1 id="features.periodic-invoices" xreflabel="Wiedekehrende Rechnungen">
1488      <title>Wiederkehrende Rechnungen</title>
1489
1490      <sect2 id="features.periodic-invoices.introduction" xreflabel="Einführung in wiederkehrende Rechnungen">
1491       <title>Einführung</title>
1492
1493       <para>
1494        Wiederkehrende Rechnungen werden als normale Aufträge definiert und konfiguriert, mit allen dazugehörigen Kunden- und
1495        Artikelangaben. Die konfigurierten Aufträge werden später automatisch in Rechnungen umgewandelt, so als ob man den Workflow benutzen
1496        würde, und auch die Auftragsnummer wird übernommen, sodass alle wiederkehrenden Rechnungen, die aus einem Auftrag erstellt wurden,
1497        später leicht wiederzufinden sind.
1498       </para>
1499
1500      </sect2>
1501
1502      <sect2 id="features.periodic-invoices.configuration" xreflabel="Konfiguration von wiederkehrenden Rechnungen">
1503       <title>Konfiguration</title>
1504
1505       <para>
1506        Um einen Auftrag für wiederkehrende Rechnung zu konfigurieren, findet sich beim Bearbeiten des Auftrags ein neuer Knopf
1507        "Konfigurieren", der ein neues Fenster öffnet, in dem man die nötigen Parameter einstellen kann.  Hinter dem Knopf wird außerdem noch
1508        angezeigt, ob der Auftrag als wiederkehrende Rechnung konfiguriert ist oder nicht.
1509       </para>
1510
1511       <para>
1512        Folgende Parameter kann man konfigurieren:
1513       </para>
1514
1515       <variablelist>
1516        <varlistentry>
1517         <term>Status</term>
1518         <listitem>
1519          <para>
1520           Bei aktiven Rechnungen wird automatisch eine Rechnung erstellt, wenn die Periodizität erreicht ist (z.B. Anfang eines neuen
1521           Monats).
1522          </para>
1523
1524          <para>
1525           Ist ein Auftrag nicht aktiv, so werden für ihn auch keine wiederkehrenden Rechnungen erzeugt. Stellt man nach längerer
1526           nicht-aktiver Zeit einen Auftrag wieder auf aktiv, wird beim nächsten Periodenwechsel für alle Perioden, seit der letzten aktiven
1527           Periode, jeweils eine Rechnung erstellt. Möchte man dies verhindern, muss man vorher das Startdatum neu setzen.
1528          </para>
1529
1530          <para>
1531           Für gekündigte Aufträge werden nie mehr Rechnungen erstellt. Man kann sich diese Aufträge aber gesondert in den Berichten anzeigen
1532           lassen.
1533          </para>
1534         </listitem>
1535        </varlistentry>
1536
1537        <varlistentry>
1538         <term>Periodizität</term>
1539         <listitem>
1540          <para>
1541           Ob monatlich, quartalsweise oder jährlich auf neue Rechnungen überprüft werden soll. Für jede Periode seit dem Startdatum wird
1542           überprüft, ob für die Periode (beginnend immer mit dem ersten Tag der Periode) schon eine Rechnung erstellt wurde. Unter Umständen
1543           können bei einem Startdatum in der Vergangenheit gleich mehrere Rechnungen erstellt werden.
1544          </para>
1545         </listitem>
1546        </varlistentry>
1547
1548        <varlistentry>
1549         <term>Buchen auf</term>
1550         <listitem>
1551          <para>
1552           Das Forderungskonto, in der Regel "Forderungen aus Lieferungen und Leistungen". Das Gegenkonto ergibt sich aus den Buchungsgruppen
1553           der betreffenden Waren.
1554          </para>
1555         </listitem>
1556        </varlistentry>
1557
1558        <varlistentry>
1559         <term>Startdatum</term>
1560         <listitem>
1561          <para>
1562           ab welchem Datum auf Rechnungserstellung geprüft werden soll
1563          </para>
1564         </listitem>
1565        </varlistentry>
1566
1567        <varlistentry>
1568         <term>Enddatum</term>
1569         <listitem>
1570          <para>
1571           ab wann keine Rechnungen mehr erstellt werden sollen
1572          </para>
1573         </listitem>
1574        </varlistentry>
1575
1576        <varlistentry>
1577         <term>Automatische Verlängerung um x Monate</term>
1578         <listitem>
1579          <para>
1580           Sollen die wiederkehrenden Rechnungen bei Erreichen des eingetragenen Enddatums weiterhin erstellt werden, so kann man hier die
1581           Anzahl der Monate eingeben, um die das Enddatum automatisch nach hinten geschoben wird.
1582          </para>
1583         </listitem>
1584        </varlistentry>
1585
1586        <varlistentry>
1587         <term>Drucken</term>
1588         <listitem>
1589          <para>
1590           Sind Drucker konfiguriert, so kann man sich die erstellten Rechnungen auch gleich ausdrucken lassen.
1591          </para>
1592         </listitem>
1593        </varlistentry>
1594       </variablelist>
1595
1596       <para>
1597        Nach Erstellung der Rechnungen kann eine E-Mail mit Informationen zu den erstellten Rechnungen verschickt werden. Konfiguriert wird
1598        dies in der <link linkend="config.config-file.sections-parameters">Konfigurationsdatei</link>
1599        <filename>config/lx_office.conf</filename> im Abschnitt <varname>[periodic_invoices]</varname>.
1600       </para>
1601      </sect2>
1602
1603      <sect2 id="features.periodic-invoices.reports">
1604       <title>Auflisten</title>
1605
1606       <para>
1607        Unter Verkauf-&gt;Berichte-&gt;Aufträge finden sich zwei neue Checkboxen, &quot;Wiederkehrende Rechnungen aktiv&quot; und
1608        &quot;Wiederkehrende Rechnungen inaktiv&quot;, mit denen man sich einen Überglick über die wiederkehrenden Rechnungen verschaffen
1609        kann.
1610       </para>
1611      </sect2>
1612
1613      <sect2 id="features.periodic-invoices.task-server">
1614       <title>Erzeugung der eigentlichen Rechnungen</title>
1615
1616       <para>
1617        Die zeitliche und periodische Überprüfung, ob eine wiederkehrende Rechnung automatisch erstellt werden soll, geschieht durch den
1618        <link linkend="config.task-server">Taskserver</link>, einen externen Dienst, der automatisch beim Start des Servers gestartet
1619        werden sollte.
1620       </para>
1621      </sect2>
1622
1623      <sect2 id="features.periodic-invoices.create-for-current-month">
1624       <title>Erste Rechnung für aktuellen Monat erstellen</title>
1625
1626       <para>
1627        Will man im laufenden Monat eine monatlich wiederkehrende Rechnung inkl. des laufenden Monats starten, stellt man das Startdatum auf
1628        den Monatsanfang und wartet ein paar Minuten, bis der Taskserver den neu konfigurieren Auftrag erkennt und daraus eine Rechnung
1629        generiert hat. Alternativ setzt man das Startdatum auf den Monatsersten des Folgemonats und erstellt die erste Rechnung direkt
1630        manuell über den Workflow.
1631       </para>
1632      </sect2>
1633     </sect1>
1634
1635     <sect1 id="dokumentenvorlagen-und-variablen">
1636       <title>Dokumentenvorlagen und verfügbare Variablen</title>
1637
1638       <sect2 id="dokumentenvorlagen-und-variablen.einführung">
1639         <title>Einführung</title>
1640
1641         <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
1642         aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
1643         einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
1644         <function>&lt;%variablenname%&gt;</function> verwendet wird. Für
1645         LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
1646         (siehe <xref
1647         linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
1648
1649         <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
1650         unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
1651         ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
1652         alle Vorlagenarten.</para>
1653
1654         <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
1655         verfügbar als hier aufgelistet werden. Die meisten davon können
1656         allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
1657         werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
1658         diese wie folgt erhalten werden:</para>
1659
1660         <itemizedlist>
1661           <listitem>
1662             <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
1663             Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
1664           </listitem>
1665
1666           <listitem>
1667             <para>In <filename>Form.pm</filename> die Funktion
1668             <function>parse_template</function> suchen und hier die Zeile
1669             <command>print(STDERR Dumper($self));</command> einfügen.</para>
1670           </listitem>
1671
1672           <listitem>
1673             <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
1674             ein PDF für eine Rechnung erzeugen.</para>
1675           </listitem>
1676
1677           <listitem>
1678             <para>Im <filename>error.log</filename> Apache steht die Ausgabe
1679             der Variablen <varname>$self</varname> in der Form <varname>'key'
1680             =&gt; 'value',</varname>. Alle <varname>key</varname>s sind
1681             verfügbar.</para>
1682           </listitem>
1683         </itemizedlist>
1684       </sect2>
1685
1686       <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
1687         <title>Variablen ausgeben</title>
1688
1689         <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
1690         Tags geschrieben werden, also z.B.
1691         <varname>&lt;%variablenname%&gt;</varname>.</para>
1692
1693         <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
1694         die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
1695         <varname>&lt;%variablenname FLAG1 FLAG2%&gt;</varname>. Momentan
1696         werden die folgenden Flags unterstützt:</para>
1697
1698         <itemizedlist>
1699           <listitem>
1700             <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
1701             den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
1702             mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
1703             damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
1704           </listitem>
1705
1706           <listitem>
1707             <para><option>NOESCAPE</option> unterdrückt das Escapen von
1708             Sonderzeichen für die Vorlagensprache. Wenn also in einer
1709             Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
1710             auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
1711             ist dieses Flag sinnvoll.</para>
1712           </listitem>
1713         </itemizedlist>
1714
1715         <para>Beispiel:</para>
1716
1717         <programlisting>&lt;%quototal NOFORMAT%&gt;</programlisting>
1718       </sect2>
1719
1720       <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
1721         <title>Verwendung in Druckbefehlen</title>
1722
1723         <para>In der Admininstration können Drucker definiert werden. Auch im
1724         dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
1725         und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
1726         den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
1727         <function>`...`</function> nicht zu unerwünschtem Verhalten
1728         führen.</para>
1729
1730         <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
1731         für das die Telefonnummer eines Ansprechpartners als Teil der
1732         Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
1733         z.B. wie folgt aussehen:</para>
1734
1735         <programlisting>send_fax --number &lt;%if cp_phone2%&gt;&lt;%cp_phone2%&gt;&lt;%else%&gt;&lt;%cp_phone1%&gt;&lt;%end%&gt;</programlisting>
1736       </sect2>
1737
1738       <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
1739              xreflabel="Anfang und Ende der Tags verändern">
1740         <title>Anfang und Ende der Tags verändern</title>
1741
1742         <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
1743         Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
1744         Prozentzeichen und dem Größerzeichen endet, beispielsweise
1745         <function>&lt;%customer%&gt;</function>. Da diese Form aber z.B. in
1746         LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
1747         Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
1748         Stil umgestellt werden.</para>
1749
1750         <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
1751         Format gültigen Kommentarzeichen anfangen, dann
1752         <function>config:</function> enthalten, die entsprechende Option
1753         setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
1754         enden. Beispiel für LaTeX:</para>
1755
1756         <programlisting>% config: tag-style=($ $)</programlisting>
1757
1758         <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
1759         wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
1760         äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
1761
1762         <programlisting>&lt;!-- config: tag-style=($ $) --&gt;</programlisting>
1763       </sect2>
1764
1765       <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
1766         <title>Zuordnung von den Dateinamen zu den Funktionen</title>
1767
1768         <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
1769         welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
1770         "<filename>.ext</filename>" geeignet zu ersetzen:
1771         "<filename>.tex</filename>" für LaTeX-Vorlagen und
1772         "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
1773
1774         <variablelist>
1775           <varlistentry>
1776             <term><filename>bin_list.ext</filename></term>
1777
1778             <listitem>
1779               <para>Lagerliste</para>
1780             </listitem>
1781           </varlistentry>
1782
1783           <varlistentry>
1784             <term><filename>check.ext</filename></term>
1785
1786             <listitem>
1787               <para>?</para>
1788             </listitem>
1789           </varlistentry>
1790
1791           <varlistentry>
1792             <term><filename>invoice.ext</filename></term>
1793
1794             <listitem>
1795               <para>Rechnung</para>
1796             </listitem>
1797           </varlistentry>
1798
1799           <varlistentry>
1800             <term><filename>packing_list.ext</filename></term>
1801
1802             <listitem>
1803               <para>Packliste</para>
1804             </listitem>
1805           </varlistentry>
1806
1807           <varlistentry>
1808             <term><filename>pick_list.ext</filename></term>
1809
1810             <listitem>
1811               <para>Sammelliste</para>
1812             </listitem>
1813           </varlistentry>
1814
1815           <varlistentry>
1816             <term><filename>purchase_delivery_order.ext</filename></term>
1817
1818             <listitem>
1819               <para>Lieferschein (Einkauf)</para>
1820             </listitem>
1821           </varlistentry>
1822
1823           <varlistentry>
1824             <term><filename>purcharse_order.ext</filename></term>
1825
1826             <listitem>
1827               <para>Bestellung an Lieferanten</para>
1828             </listitem>
1829           </varlistentry>
1830
1831           <varlistentry>
1832             <term><filename>request_quotation.ext</filename></term>
1833
1834             <listitem>
1835               <para>Anfrage an Lieferanten</para>
1836             </listitem>
1837           </varlistentry>
1838
1839           <varlistentry>
1840             <term><filename>sales_delivery_order.ext</filename></term>
1841
1842             <listitem>
1843               <para>Lieferschein (Verkauf)</para>
1844             </listitem>
1845           </varlistentry>
1846
1847           <varlistentry>
1848             <term><filename>sales_order.ext</filename></term>
1849
1850             <listitem>
1851               <para>Bestellung</para>
1852             </listitem>
1853           </varlistentry>
1854
1855           <varlistentry>
1856             <term><filename>sales_quotation.ext</filename></term>
1857
1858             <listitem>
1859               <para>Angebot an Kunden</para>
1860             </listitem>
1861           </varlistentry>
1862
1863           <varlistentry>
1864             <term><filename>zahlungserinnerung.ext</filename></term>
1865
1866             <listitem>
1867               <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
1868             </listitem>
1869           </varlistentry>
1870
1871           <varlistentry>
1872             <term><filename>zahlungserinnerung_invoice.ext</filename></term>
1873
1874             <listitem>
1875               <para>Rechnung über Mahngebühren (Dateiname im Programm
1876               konfigurierbar)</para>
1877             </listitem>
1878           </varlistentry>
1879         </variablelist>
1880       </sect2>
1881
1882       <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
1883         <title>Sprache, Drucker und E-Mail</title>
1884
1885         <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
1886         eingearbeitet. So wird aus der Vorlage
1887         <filename>sales_order.ext</filename> bei Sprache
1888         <function>de</function> und Druckerkürzel <function>lpr2</function>
1889         der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
1890         Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
1891         bekommen dann noch das Kürzel <filename>_email</filename>, der
1892         vollständige Vorlagenname wäre dann
1893         <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
1894         kann eine Standarddatei <filename>default.ext</filename> hinterlegt
1895         werden. Diese wird verwendet, wenn keine der anderen Varianten
1896         gefunden wird.</para>
1897
1898         <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
1899         der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
1900         verschickt wird, ist:</para>
1901
1902         <orderedlist>
1903           <listitem>
1904             <para><filename>sales_order_email_de_lpr2.tex</filename></para>
1905           </listitem>
1906
1907           <listitem>
1908             <para><filename>sales_order_de_lpr2.tex</filename></para>
1909           </listitem>
1910
1911           <listitem>
1912             <para><filename>sales_order.tex</filename></para>
1913           </listitem>
1914
1915           <listitem>
1916             <para><filename>default.tex</filename></para>
1917           </listitem>
1918         </orderedlist>
1919
1920         <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
1921         Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
1922         siehe dazu <xref
1923         linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"/>.</para>
1924       </sect2>
1925
1926       <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
1927         <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
1928         sind</title>
1929
1930         <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
1931                xreflabel="Metainformationen zur angeforderten Vorlage">
1932           <title>Metainformationen zur angeforderten Vorlage</title>
1933
1934           <para>Diese Variablen liefern Informationen darüber welche Variante
1935           einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
1936           Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
1937           Formulare einbinden möchten.</para>
1938
1939           <variablelist>
1940             <varlistentry>
1941               <term><varname>template_meta.formname</varname></term>
1942
1943               <listitem>
1944                 <para>Basisname der Vorlage. Identisch mit der <link
1945                 linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
1946                 zu den Dateinamen</link> ohne die Erweiterung. Ein
1947                 Verkaufsauftrag enthält hier
1948                 <constant>sales_order</constant>.</para>
1949               </listitem>
1950             </varlistentry>
1951
1952             <varlistentry>
1953               <term><varname>template_meta.language.description</varname></term>
1954
1955               <listitem>
1956                 <para>Beschreibung der verwendeten Sprache</para>
1957               </listitem>
1958             </varlistentry>
1959
1960             <varlistentry>
1961               <term><varname>template_meta.language.template_code</varname></term>
1962
1963               <listitem>
1964                 <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
1965                 Kürzel das im Dateinamen verwendetet wird.</para>
1966               </listitem>
1967             </varlistentry>
1968
1969             <varlistentry>
1970               <term><varname>template_meta.language.output_numberformat</varname></term>
1971
1972               <listitem>
1973                 <para>Zahlenformat der verwendeten Sprache in der Form
1974                 "<constant>1.000,00</constant>". Experimentell! Nur
1975                 interessant für Vorlagen die mit unformatierten Werten
1976                 arbeiten.</para>
1977               </listitem>
1978             </varlistentry>
1979
1980             <varlistentry>
1981               <term><varname>template_meta.language.output_dateformat</varname></term>
1982
1983               <listitem>
1984                 <para>Datumsformat der verwendeten Sprache in der Form
1985                 "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
1986                 interessant für Vorlagen die mit unformatierten Werten
1987                 arbeiten.</para>
1988               </listitem>
1989             </varlistentry>
1990
1991             <varlistentry>
1992               <term><varname>template_meta.format</varname></term>
1993
1994               <listitem>
1995                 <para>Das angeforderte Format. Kann im Moment die Werte
1996                 <constant>pdf</constant>, <constant>postscript</constant>,
1997                 <constant>html</constant>, <constant>opendocument</constant>,
1998                 <constant>opendocument_pdf</constant> und
1999                 <constant>excel</constant> enthalten.</para>
2000               </listitem>
2001             </varlistentry>
2002
2003             <varlistentry>
2004               <term><varname>template_meta.extension</varname></term>
2005
2006               <listitem>
2007                 <para>Dateierweiterung, wie im Dateinamen. Wird aus
2008                 <constant>format</constant> entschieden.</para>
2009               </listitem>
2010             </varlistentry>
2011
2012             <varlistentry>
2013               <term><varname>template_meta.media</varname></term>
2014
2015               <listitem>
2016                 <para>Ausgabemedium. Kann zur Zeit die Werte
2017                 <constant>screen</constant> für Bildschirm,
2018                 <constant>email</constant> für E-Mmail (triggert das
2019                 <constant>_email</constant> Kürzel im Dateinamen),
2020                 <constant>printer</constant> für Drucker, und
2021                 <constant>queue</constant> für Warteschlange enthalten.</para>
2022               </listitem>
2023             </varlistentry>
2024
2025             <varlistentry>
2026               <term><varname>template_meta.printer.description</varname></term>
2027
2028               <listitem>
2029                 <para>Beschreibung des ausgewählten Druckers</para>
2030               </listitem>
2031             </varlistentry>
2032
2033             <varlistentry>
2034               <term><varname>template_meta.printer.template_code</varname></term>
2035
2036               <listitem>
2037                 <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
2038                 dem Kürzel das im Dateinamen verwendetet wird.</para>
2039               </listitem>
2040             </varlistentry>
2041           </variablelist>
2042         </sect3>
2043
2044         <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
2045           <title>Stammdaten von Kunden und Lieferanten</title>
2046
2047           <variablelist>
2048             <varlistentry>
2049               <term><varname>account_number</varname></term>
2050
2051               <listitem>
2052                 <para>Kontonummer</para>
2053               </listitem>
2054             </varlistentry>
2055
2056             <varlistentry>
2057               <term><varname>bank</varname></term>
2058
2059               <listitem>
2060                 <para>Name der Bank</para>
2061               </listitem>
2062             </varlistentry>
2063
2064             <varlistentry>
2065               <term><varname>bank_code</varname></term>
2066
2067               <listitem>
2068                 <para>Bankleitzahl</para>
2069               </listitem>
2070             </varlistentry>
2071
2072             <varlistentry>
2073               <term><varname>bic</varname></term>
2074
2075               <listitem>
2076                 <para>Bank-Identifikations-Code (Bank Identifier Code,
2077                 BIC)</para>
2078               </listitem>
2079             </varlistentry>
2080
2081             <varlistentry>
2082               <term><varname>business</varname></term>
2083
2084               <listitem>
2085                 <para>Kunden-/Lieferantentyp</para>
2086               </listitem>
2087             </varlistentry>
2088
2089             <varlistentry>
2090               <term><varname>city</varname></term>
2091
2092               <listitem>
2093                 <para>Stadt</para>
2094               </listitem>
2095             </varlistentry>
2096
2097             <varlistentry>
2098               <term><varname>contact</varname></term>
2099
2100               <listitem>
2101                 <para>Kontakt</para>
2102               </listitem>
2103             </varlistentry>
2104
2105             <varlistentry>
2106               <term><varname>country</varname></term>
2107
2108               <listitem>
2109                 <para>Land</para>
2110               </listitem>
2111             </varlistentry>
2112
2113             <varlistentry>
2114               <term><varname>cp_email</varname></term>
2115
2116               <listitem>
2117                 <para>Email des Ansprechpartners</para>
2118               </listitem>
2119             </varlistentry>
2120
2121             <varlistentry>
2122               <term><varname>cp_givenname</varname></term>
2123
2124               <listitem>
2125                 <para>Vorname des Ansprechpartners</para>
2126               </listitem>
2127             </varlistentry>
2128
2129             <varlistentry>
2130               <term><varname>cp_greeting</varname></term>
2131
2132               <listitem>
2133                 <para>Anrede des Ansprechpartners</para>
2134               </listitem>
2135             </varlistentry>
2136
2137             <varlistentry>
2138               <term><varname>cp_name</varname></term>
2139
2140               <listitem>
2141                 <para>Name des Ansprechpartners</para>
2142               </listitem>
2143             </varlistentry>
2144
2145             <varlistentry>
2146               <term><varname>cp_phone1</varname></term>
2147
2148               <listitem>
2149                 <para>Telefonnummer 1 des Ansprechpartners</para>
2150               </listitem>
2151             </varlistentry>
2152
2153             <varlistentry>
2154               <term><varname>cp_phone2</varname></term>
2155
2156               <listitem>
2157                 <para>Telefonnummer 2 des Ansprechpartners</para>
2158               </listitem>
2159             </varlistentry>
2160
2161             <varlistentry>
2162               <term><varname>cp_title</varname></term>
2163
2164               <listitem>
2165                 <para>Titel des Ansprechpartners</para>
2166               </listitem>
2167             </varlistentry>
2168
2169             <varlistentry>
2170               <term><varname>creditlimit</varname></term>
2171
2172               <listitem>
2173                 <para>Kreditlimit</para>
2174               </listitem>
2175             </varlistentry>
2176
2177             <varlistentry>
2178               <term><varname>customeremail</varname></term>
2179
2180               <listitem>
2181                 <para>Email des Kunden; nur für Kunden</para>
2182               </listitem>
2183             </varlistentry>
2184
2185             <varlistentry>
2186               <term><varname>customerfax</varname></term>
2187
2188               <listitem>
2189                 <para>Faxnummer des Kunden; nur für Kunden</para>
2190               </listitem>
2191             </varlistentry>
2192
2193             <varlistentry>
2194               <term><varname>customernotes</varname></term>
2195
2196               <listitem>
2197                 <para>Bemerkungen beim Kunden; nur für Kunden</para>
2198               </listitem>
2199             </varlistentry>
2200
2201             <varlistentry>
2202               <term><varname>customernumber</varname></term>
2203
2204               <listitem>
2205                 <para>Kundennummer; nur für Kunden</para>
2206               </listitem>
2207             </varlistentry>
2208
2209             <varlistentry>
2210               <term><varname>customerphone</varname></term>
2211
2212               <listitem>
2213                 <para>Telefonnummer des Kunden; nur für Kunden</para>
2214               </listitem>
2215             </varlistentry>
2216
2217             <varlistentry>
2218               <term><varname>discount</varname></term>
2219
2220               <listitem>
2221                 <para>Rabatt</para>
2222               </listitem>
2223             </varlistentry>
2224
2225             <varlistentry>
2226               <term><varname>email</varname></term>
2227
2228               <listitem>
2229                 <para>Emailadresse</para>
2230               </listitem>
2231             </varlistentry>
2232
2233             <varlistentry>
2234               <term><varname>fax</varname></term>
2235
2236               <listitem>
2237                 <para>Faxnummer</para>
2238               </listitem>
2239             </varlistentry>
2240
2241             <varlistentry>
2242               <term><varname>homepage</varname></term>
2243
2244               <listitem>
2245                 <para>Homepage</para>
2246               </listitem>
2247             </varlistentry>
2248
2249             <varlistentry>
2250               <term><varname>iban</varname></term>
2251
2252               <listitem>
2253                 <para>Internationale Kontonummer (International Bank Account
2254                 Number, IBAN)</para>
2255               </listitem>
2256             </varlistentry>
2257
2258             <varlistentry>
2259               <term><varname>language</varname></term>
2260
2261               <listitem>
2262                 <para>Sprache</para>
2263               </listitem>
2264             </varlistentry>
2265
2266             <varlistentry>
2267               <term><varname>name</varname></term>
2268
2269               <listitem>
2270                 <para>Firmenname</para>
2271               </listitem>
2272             </varlistentry>
2273
2274             <varlistentry>
2275               <term><varname>payment_description</varname></term>
2276
2277               <listitem>
2278                 <para>Name der Zahlart</para>
2279               </listitem>
2280             </varlistentry>
2281
2282             <varlistentry>
2283               <term><varname>payment_terms</varname></term>
2284
2285               <listitem>
2286                 <para>Zahlungskonditionen</para>
2287               </listitem>
2288             </varlistentry>
2289
2290             <varlistentry>
2291               <term><varname>phone</varname></term>
2292
2293               <listitem>
2294                 <para>Telefonnummer</para>
2295               </listitem>
2296             </varlistentry>
2297
2298             <varlistentry>
2299               <term><varname>shiptocity</varname></term>
2300
2301               <listitem>
2302                 <para>Stadt (Lieferadresse) <link
2303                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2304               </listitem>
2305             </varlistentry>
2306
2307             <varlistentry>
2308               <term><varname>shiptocontact</varname></term>
2309
2310               <listitem>
2311                 <para>Kontakt (Lieferadresse) <link
2312                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2313               </listitem>
2314             </varlistentry>
2315
2316             <varlistentry>
2317               <term><varname>shiptocountry</varname></term>
2318
2319               <listitem>
2320                 <para>Land (Lieferadresse) <link
2321                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2322               </listitem>
2323             </varlistentry>
2324
2325             <varlistentry>
2326               <term><varname>shiptodepartment1</varname></term>
2327
2328               <listitem>
2329                 <para>Abteilung 1 (Lieferadresse) <link
2330                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2331               </listitem>
2332             </varlistentry>
2333
2334             <varlistentry>
2335               <term><varname>shiptodepartment2</varname></term>
2336
2337               <listitem>
2338                 <para>Abteilung 2 (Lieferadresse) <link
2339                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2340               </listitem>
2341             </varlistentry>
2342
2343             <varlistentry>
2344               <term><varname>shiptoemail</varname></term>
2345
2346               <listitem>
2347                 <para>Email (Lieferadresse) <link
2348                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2349               </listitem>
2350             </varlistentry>
2351
2352             <varlistentry>
2353               <term><varname>shiptofax</varname></term>
2354
2355               <listitem>
2356                 <para>Fax (Lieferadresse) <link
2357                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2358               </listitem>
2359             </varlistentry>
2360
2361             <varlistentry>
2362               <term><varname>shiptoname</varname></term>
2363
2364               <listitem>
2365                 <para>Firmenname (Lieferadresse) <link
2366                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2367               </listitem>
2368             </varlistentry>
2369
2370             <varlistentry>
2371               <term><varname>shiptophone</varname></term>
2372
2373               <listitem>
2374                 <para>Telefonnummer (Lieferadresse) <link
2375                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2376               </listitem>
2377             </varlistentry>
2378
2379             <varlistentry>
2380               <term><varname>shiptostreet</varname></term>
2381
2382               <listitem>
2383                 <para>Straße und Hausnummer (Lieferadresse) <link
2384                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2385               </listitem>
2386             </varlistentry>
2387
2388             <varlistentry>
2389               <term><varname>shiptozipcode</varname></term>
2390
2391               <listitem>
2392                 <para>Postleitzahl (Lieferadresse) <link
2393                 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2394               </listitem>
2395             </varlistentry>
2396
2397             <varlistentry>
2398               <term><varname>street</varname></term>
2399
2400               <listitem>
2401                 <para>Straße und Hausnummer</para>
2402               </listitem>
2403             </varlistentry>
2404
2405             <varlistentry>
2406               <term><varname>taxnumber</varname></term>
2407
2408               <listitem>
2409                 <para>Steuernummer</para>
2410               </listitem>
2411             </varlistentry>
2412
2413             <varlistentry>
2414               <term><varname>ustid</varname></term>
2415
2416               <listitem>
2417                 <para>Umsatzsteuer-Identifikationsnummer</para>
2418               </listitem>
2419             </varlistentry>
2420
2421             <varlistentry>
2422               <term><varname>vendoremail</varname></term>
2423
2424               <listitem>
2425                 <para>Email des Lieferanten; nur für Lieferanten</para>
2426               </listitem>
2427             </varlistentry>
2428
2429             <varlistentry>
2430               <term><varname>vendorfax</varname></term>
2431
2432               <listitem>
2433                 <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
2434               </listitem>
2435             </varlistentry>
2436
2437             <varlistentry>
2438               <term><varname>vendornotes</varname></term>
2439
2440               <listitem>
2441                 <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
2442               </listitem>
2443             </varlistentry>
2444
2445             <varlistentry>
2446               <term><varname>vendornumber</varname></term>
2447
2448               <listitem>
2449                 <para>Lieferantennummer; nur für Lieferanten</para>
2450               </listitem>
2451             </varlistentry>
2452
2453             <varlistentry>
2454               <term><varname>vendorphone</varname></term>
2455
2456               <listitem>
2457                 <para>Telefonnummer des Lieferanten; nur für
2458                 Lieferanten</para>
2459               </listitem>
2460             </varlistentry>
2461
2462             <varlistentry>
2463               <term><varname>zipcode</varname></term>
2464
2465               <listitem>
2466                 <para>Postleitzahl</para>
2467               </listitem>
2468             </varlistentry>
2469           </variablelist>
2470
2471           <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
2472             <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
2473             Stammdaten nicht eingetragen, so haben die Variablen
2474             <varname>shipto*</varname> den gleichen Wert wie die die
2475             entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
2476             einige <varname>shipto*</varname>-Variablen so nicht in den
2477             Stammdaten wiederfinden sondern schlicht Kopien der
2478             Lieferdatenvariablen sind (z.B.
2479             <varname>shiptocontact</varname>).</para>
2480           </note>
2481         </sect3>
2482
2483         <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
2484           <title>Informationen über den Bearbeiter</title>
2485
2486           <variablelist>
2487             <varlistentry>
2488               <term><varname>employee_address</varname></term>
2489
2490               <listitem>
2491                 <para>Adressfeld</para>
2492               </listitem>
2493             </varlistentry>
2494
2495             <varlistentry>
2496               <term><varname>employee_businessnumber</varname></term>
2497
2498               <listitem>
2499                 <para>Firmennummer</para>
2500               </listitem>
2501             </varlistentry>
2502
2503             <varlistentry>
2504               <term><varname>employee_company</varname></term>
2505
2506               <listitem>
2507                 <para>Firmenname</para>
2508               </listitem>
2509             </varlistentry>
2510
2511             <varlistentry>
2512               <term><varname>employee_co_ustid</varname></term>
2513
2514               <listitem>
2515                 <para>Usatzsteuer-Identifikationsnummer</para>
2516               </listitem>
2517             </varlistentry>
2518
2519             <varlistentry>
2520               <term><varname>employee_duns</varname></term>
2521
2522               <listitem>
2523                 <para>DUNS-Nummer</para>
2524               </listitem>
2525             </varlistentry>
2526
2527             <varlistentry>
2528               <term><varname>employee_email</varname></term>
2529
2530               <listitem>
2531                 <para>Email</para>
2532               </listitem>
2533             </varlistentry>
2534
2535             <varlistentry>
2536               <term><varname>employee_fax</varname></term>
2537
2538               <listitem>
2539                 <para>Fax</para>
2540               </listitem>
2541             </varlistentry>
2542
2543             <varlistentry>
2544               <term><varname>employee_name</varname></term>
2545
2546               <listitem>
2547                 <para>voller Name</para>
2548               </listitem>
2549             </varlistentry>
2550
2551             <varlistentry>
2552               <term><varname>employee_signature</varname></term>
2553
2554               <listitem>
2555                 <para>Signatur</para>
2556               </listitem>
2557             </varlistentry>
2558
2559             <varlistentry>
2560               <term><varname>employee_taxnumber</varname></term>
2561
2562               <listitem>
2563                 <para>Steuernummer</para>
2564               </listitem>
2565             </varlistentry>
2566
2567             <varlistentry>
2568               <term><varname>employee_tel</varname></term>
2569
2570               <listitem>
2571                 <para>Telefonnummer</para>
2572               </listitem>
2573             </varlistentry>
2574           </variablelist>
2575         </sect3>
2576
2577         <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
2578           <title>Informationen über den Bearbeiter</title>
2579
2580           <variablelist>
2581             <varlistentry>
2582               <term><varname>salesman_address</varname></term>
2583
2584               <listitem>
2585                 <para>Adressfeld</para>
2586               </listitem>
2587             </varlistentry>
2588
2589             <varlistentry>
2590               <term><varname>salesman_businessnumber</varname></term>
2591
2592               <listitem>
2593                 <para>Firmennummer</para>
2594               </listitem>
2595             </varlistentry>
2596
2597             <varlistentry>
2598               <term><varname>salesman_company</varname></term>
2599
2600               <listitem>
2601                 <para>Firmenname</para>
2602               </listitem>
2603             </varlistentry>
2604
2605             <varlistentry>
2606               <term><varname>salesman_co_ustid</varname></term>
2607
2608               <listitem>
2609                 <para>Usatzsteuer-Identifikationsnummer</para>
2610               </listitem>
2611             </varlistentry>
2612
2613             <varlistentry>
2614               <term><varname>salesman_duns</varname></term>
2615
2616               <listitem>
2617                 <para>DUNS-Nummer</para>
2618               </listitem>
2619             </varlistentry>
2620
2621             <varlistentry>
2622               <term><varname>salesman_email</varname></term>
2623
2624               <listitem>
2625                 <para>Email</para>
2626               </listitem>
2627             </varlistentry>
2628
2629             <varlistentry>
2630               <term><varname>salesman_fax</varname></term>
2631
2632               <listitem>
2633                 <para>Fax</para>
2634               </listitem>
2635             </varlistentry>
2636
2637             <varlistentry>
2638               <term><varname>salesman_name</varname></term>
2639
2640               <listitem>
2641                 <para>voller Name</para>
2642               </listitem>
2643             </varlistentry>
2644
2645             <varlistentry>
2646               <term><varname>salesman_signature</varname></term>
2647
2648               <listitem>
2649                 <para>Signatur</para>
2650               </listitem>
2651             </varlistentry>
2652
2653             <varlistentry>
2654               <term><varname>salesman_taxnumber</varname></term>
2655
2656               <listitem>
2657                 <para>Steuernummer</para>
2658               </listitem>
2659             </varlistentry>
2660
2661             <varlistentry>
2662               <term><varname>salesman_tel</varname></term>
2663
2664               <listitem>
2665                 <para>Telefonnummer</para>
2666               </listitem>
2667             </varlistentry>
2668           </variablelist>
2669         </sect3>
2670
2671         <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
2672           <title>Variablen für die einzelnen Steuern</title>
2673
2674           <variablelist>
2675             <varlistentry>
2676               <term><varname>tax</varname></term>
2677
2678               <listitem>
2679                 <para>Steuer</para>
2680               </listitem>
2681             </varlistentry>
2682
2683             <varlistentry>
2684               <term><varname>taxbase</varname></term>
2685
2686               <listitem>
2687                 <para>zu versteuernder Betrag</para>
2688               </listitem>
2689             </varlistentry>
2690
2691             <varlistentry>
2692               <term><varname>taxdescription</varname></term>
2693
2694               <listitem>
2695                 <para>Name der Steuer</para>
2696               </listitem>
2697             </varlistentry>
2698
2699             <varlistentry>
2700               <term><varname>taxrate</varname></term>
2701
2702               <listitem>
2703                 <para>Steuersatz</para>
2704               </listitem>
2705             </varlistentry>
2706           </variablelist>
2707         </sect3>
2708       </sect2>
2709
2710       <sect2 id="dokumentenvorlagen-und-variablen.invoice">
2711         <title>Variablen in Rechnungen</title>
2712
2713         <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
2714           <title>Allgemeine Variablen</title>
2715
2716           <variablelist>
2717             <varlistentry>
2718               <term><varname>creditremaining</varname></term>
2719
2720               <listitem>
2721                 <para>Verbleibender Kredit</para>
2722               </listitem>
2723             </varlistentry>
2724
2725             <varlistentry>
2726               <term><varname>currency</varname></term>
2727
2728               <listitem>
2729                 <para>Währung</para>
2730               </listitem>
2731             </varlistentry>
2732
2733             <varlistentry>
2734               <term><varname>cusordnumber</varname></term>
2735
2736               <listitem>
2737                 <para>Bestellnummer beim Kunden</para>
2738               </listitem>
2739             </varlistentry>
2740
2741             <varlistentry>
2742               <term><varname>deliverydate</varname></term>
2743
2744               <listitem>
2745                 <para>Lieferdatum</para>
2746               </listitem>
2747             </varlistentry>
2748
2749             <varlistentry>
2750               <term><varname>duedate</varname></term>
2751
2752               <listitem>
2753                 <para>Fälligkeitsdatum</para>
2754               </listitem>
2755             </varlistentry>
2756
2757             <varlistentry>
2758               <term><varname>globalprojectnumber</varname></term>
2759
2760               <listitem>
2761                 <para>Projektnummer des ganzen Beleges</para>
2762               </listitem>
2763             </varlistentry>
2764
2765             <varlistentry>
2766               <term><varname>globalprojectdescription</varname></term>
2767
2768               <listitem>
2769                 <para>Projekbeschreibung des ganzen Beleges</para>
2770               </listitem>
2771             </varlistentry>
2772
2773             <varlistentry>
2774               <term><varname>intnotes</varname></term>
2775
2776               <listitem>
2777                 <para>Interne Bemerkungen</para>
2778               </listitem>
2779             </varlistentry>
2780
2781             <varlistentry>
2782               <term><varname>invdate</varname></term>
2783
2784               <listitem>
2785                 <para>Rechnungsdatum</para>
2786               </listitem>
2787             </varlistentry>
2788
2789             <varlistentry>
2790               <term><varname>invnumber</varname></term>
2791
2792               <listitem>
2793                 <para>Rechnungsnummer</para>
2794               </listitem>
2795             </varlistentry>
2796
2797             <varlistentry>
2798               <term><varname>invtotal</varname></term>
2799
2800               <listitem>
2801                 <para>gesamter Rechnungsbetrag</para>
2802               </listitem>
2803             </varlistentry>
2804
2805             <varlistentry>
2806               <term><varname>notes</varname></term>
2807
2808               <listitem>
2809                 <para>Bemerkungen der Rechnung</para>
2810               </listitem>
2811             </varlistentry>
2812
2813             <varlistentry>
2814               <term><varname>orddate</varname></term>
2815
2816               <listitem>
2817                 <para>Auftragsdatum</para>
2818               </listitem>
2819             </varlistentry>
2820
2821             <varlistentry>
2822               <term><varname>ordnumber</varname></term>
2823
2824               <listitem>
2825                 <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
2826                 erstellt wurde</para>
2827               </listitem>
2828             </varlistentry>
2829
2830             <varlistentry>
2831               <term><varname>payment_description</varname></term>
2832
2833               <listitem>
2834                 <para>Name der Zahlart</para>
2835               </listitem>
2836             </varlistentry>
2837
2838             <varlistentry>
2839               <term><varname>payment_terms</varname></term>
2840
2841               <listitem>
2842                 <para>Zahlungskonditionen</para>
2843               </listitem>
2844             </varlistentry>
2845
2846             <varlistentry>
2847               <term><varname>quodate</varname></term>
2848
2849               <listitem>
2850                 <para>Angebotsdatum</para>
2851               </listitem>
2852             </varlistentry>
2853
2854             <varlistentry>
2855               <term><varname>quonumber</varname></term>
2856
2857               <listitem>
2858                 <para>Angebotsnummer</para>
2859               </listitem>
2860             </varlistentry>
2861
2862             <varlistentry>
2863               <term><varname>shippingpoint</varname></term>
2864
2865               <listitem>
2866                 <para>Versandort</para>
2867               </listitem>
2868             </varlistentry>
2869
2870             <varlistentry>
2871               <term><varname>shipvia</varname></term>
2872
2873               <listitem>
2874                 <para>Transportmittel</para>
2875               </listitem>
2876             </varlistentry>
2877
2878             <varlistentry>
2879               <term><varname>subtotal</varname></term>
2880
2881               <listitem>
2882                 <para>Zwischensumme aller Posten ohne Steuern</para>
2883               </listitem>
2884             </varlistentry>
2885
2886             <varlistentry>
2887               <term><varname>total</varname></term>
2888
2889               <listitem>
2890                 <para>Restsumme der Rechnung (Summe abzüglich bereits
2891                 bezahlter Posten)</para>
2892               </listitem>
2893             </varlistentry>
2894
2895             <varlistentry>
2896               <term><varname>transaction_description</varname></term>
2897
2898               <listitem>
2899                 <para>Vorgangsbezeichnung</para>
2900               </listitem>
2901             </varlistentry>
2902
2903             <varlistentry>
2904               <term><varname>transdate</varname></term>
2905
2906               <listitem>
2907                 <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
2908                 erstellt wurde</para>
2909               </listitem>
2910             </varlistentry>
2911           </variablelist>
2912         </sect3>
2913
2914         <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
2915           <title>Variablen für jeden Posten auf der Rechnung</title>
2916
2917           <variablelist>
2918             <varlistentry>
2919               <term><varname>bin</varname></term>
2920
2921               <listitem>
2922                 <para>Stellage</para>
2923               </listitem>
2924             </varlistentry>
2925
2926             <varlistentry>
2927               <term><varname>description</varname></term>
2928
2929               <listitem>
2930                 <para>Artikelbeschreibung</para>
2931               </listitem>
2932             </varlistentry>
2933
2934             <varlistentry>
2935               <term><varname>discount</varname></term>
2936
2937               <listitem>
2938                 <para>Rabatt als Betrag</para>
2939               </listitem>
2940             </varlistentry>
2941
2942             <varlistentry>
2943               <term><varname>discount_sub</varname></term>
2944
2945               <listitem>
2946                 <para>Zwischensumme mit Rabatt</para>
2947               </listitem>
2948             </varlistentry>
2949
2950             <varlistentry>
2951               <term><varname>drawing</varname></term>
2952
2953               <listitem>
2954                 <para>Zeichnung</para>
2955               </listitem>
2956             </varlistentry>
2957
2958             <varlistentry>
2959               <term><varname>ean</varname></term>
2960
2961               <listitem>
2962                 <para>EAN-Code</para>
2963               </listitem>
2964             </varlistentry>
2965
2966             <varlistentry>
2967               <term><varname>image</varname></term>
2968
2969               <listitem>
2970                 <para>Grafik</para>
2971               </listitem>
2972             </varlistentry>
2973
2974             <varlistentry>
2975               <term><varname>linetotal</varname></term>
2976
2977               <listitem>
2978                 <para>Zeilensumme (Anzahl * Einzelpreis)</para>
2979               </listitem>
2980             </varlistentry>
2981
2982             <varlistentry>
2983               <term><varname>longdescription</varname></term>
2984
2985               <listitem>
2986                 <para>Langtext</para>
2987               </listitem>
2988             </varlistentry>
2989
2990             <varlistentry>
2991               <term><varname>microfiche</varname></term>
2992
2993               <listitem>
2994                 <para>Mikrofilm</para>
2995               </listitem>
2996             </varlistentry>
2997
2998             <varlistentry>
2999               <term><varname>netprice</varname></term>
3000
3001               <listitem>
3002                 <para>Nettopreis</para>
3003               </listitem>
3004             </varlistentry>
3005
3006             <varlistentry>
3007               <term><varname>nodiscount_linetotal</varname></term>
3008
3009               <listitem>
3010                 <para>Zeilensumme ohne Rabatt</para>
3011               </listitem>
3012             </varlistentry>
3013
3014             <varlistentry>
3015               <term><varname>nodiscount_sub</varname></term>
3016
3017               <listitem>
3018                 <para>Zwischensumme ohne Rabatt</para>
3019               </listitem>
3020             </varlistentry>
3021
3022             <varlistentry>
3023               <term><varname>number</varname></term>
3024
3025               <listitem>
3026                 <para>Artikelnummer</para>
3027               </listitem>
3028             </varlistentry>
3029
3030             <varlistentry>
3031               <term><varname>ordnumber_oe</varname></term>
3032
3033               <listitem>
3034                 <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3035                 aus einem Sammelauftrag erstellt wurde</para>
3036               </listitem>
3037             </varlistentry>
3038
3039             <varlistentry>
3040               <term><varname>p_discount</varname></term>
3041
3042               <listitem>
3043                 <para>Rabatt in Prozent</para>
3044               </listitem>
3045             </varlistentry>
3046
3047             <varlistentry>
3048               <term><varname>partnotes</varname></term>
3049
3050               <listitem>
3051                 <para>Die beim Artikel gespeicherten Bemerkungen</para>
3052               </listitem>
3053             </varlistentry>
3054
3055             <varlistentry>
3056               <term><varname>partsgroup</varname></term>
3057
3058               <listitem>
3059                 <para>Warengruppe</para>
3060               </listitem>
3061             </varlistentry>
3062
3063             <varlistentry>
3064               <term><varname>price_factor</varname></term>
3065
3066               <listitem>
3067                 <para>Der Preisfaktor als Zahl, sofern einer eingestellt
3068                 ist</para>
3069               </listitem>
3070             </varlistentry>
3071
3072             <varlistentry>
3073               <term><varname>price_factor_name</varname></term>
3074
3075               <listitem>
3076                 <para>Der Name des Preisfaktors, sofern einer eingestellt
3077                 ist</para>
3078               </listitem>
3079             </varlistentry>
3080
3081             <varlistentry>
3082               <term><varname>projectnumber</varname></term>
3083
3084               <listitem>
3085                 <para>Projektnummer</para>
3086               </listitem>
3087             </varlistentry>
3088
3089             <varlistentry>
3090               <term><varname>projectdescription</varname></term>
3091
3092               <listitem>
3093                 <para>Projektbeschreibung</para>
3094               </listitem>
3095             </varlistentry>
3096
3097             <varlistentry>
3098               <term><varname>qty</varname></term>
3099
3100               <listitem>
3101                 <para>Anzahl</para>
3102               </listitem>
3103             </varlistentry>
3104
3105             <varlistentry>
3106               <term><varname>reqdate</varname></term>
3107
3108               <listitem>
3109                 <para>Lieferdatum</para>
3110               </listitem>
3111             </varlistentry>
3112
3113             <varlistentry>
3114               <term><varname>runningnumber</varname></term>
3115
3116               <listitem>
3117                 <para>Position auf der Rechnung (1, 2, 3...)</para>
3118               </listitem>
3119             </varlistentry>
3120
3121             <varlistentry>
3122               <term><varname>sellprice</varname></term>
3123
3124               <listitem>
3125                 <para>Verkaufspreis</para>
3126               </listitem>
3127             </varlistentry>
3128
3129             <varlistentry>
3130               <term><varname>serialnumber</varname></term>
3131
3132               <listitem>
3133                 <para>Seriennummer</para>
3134               </listitem>
3135             </varlistentry>
3136
3137             <varlistentry>
3138               <term><varname>tax_rate</varname></term>
3139
3140               <listitem>
3141                 <para>Steuersatz</para>
3142               </listitem>
3143             </varlistentry>
3144
3145             <varlistentry>
3146               <term><varname>transdate_oe</varname></term>
3147
3148               <listitem>
3149                 <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
3150                 aus einem Sammelauftrag erstellt wurde</para>
3151               </listitem>
3152             </varlistentry>
3153
3154             <varlistentry>
3155               <term><varname>unit</varname></term>
3156
3157               <listitem>
3158                 <para>Einheit</para>
3159               </listitem>
3160             </varlistentry>
3161
3162             <varlistentry>
3163               <term><varname>weight</varname></term>
3164
3165               <listitem>
3166                 <para>Gewicht</para>
3167               </listitem>
3168             </varlistentry>
3169           </variablelist>
3170
3171           <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
3172           über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
3173           einer <function>foreach</function>-Schleife ausgegeben werden, da
3174           für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
3175           können. Die Variablen dafür lauten:</para>
3176
3177           <variablelist>
3178             <varlistentry>
3179               <term><varname>make</varname></term>
3180
3181               <listitem>
3182                 <para>Lieferant</para>
3183               </listitem>
3184             </varlistentry>
3185
3186             <varlistentry>
3187               <term><varname>model</varname></term>
3188
3189               <listitem>
3190                 <para>Lieferantenartikelnummer</para>
3191               </listitem>
3192             </varlistentry>
3193           </variablelist>
3194         </sect3>
3195
3196         <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
3197           <title>Variablen für die einzelnen Zahlungseingänge</title>
3198
3199           <variablelist>
3200             <varlistentry>
3201               <term><varname>payment</varname></term>
3202
3203               <listitem>
3204                 <para>Betrag</para>
3205               </listitem>
3206             </varlistentry>
3207
3208             <varlistentry>
3209               <term><varname>paymentaccount</varname></term>
3210
3211               <listitem>
3212                 <para>Konto</para>
3213               </listitem>
3214             </varlistentry>
3215
3216             <varlistentry>
3217               <term><varname>paymentdate</varname></term>
3218
3219               <listitem>
3220                 <para>Datum</para>
3221               </listitem>
3222             </varlistentry>
3223
3224             <varlistentry>
3225               <term><varname>paymentmemo</varname></term>
3226
3227               <listitem>
3228                 <para>Memo</para>
3229               </listitem>
3230             </varlistentry>
3231
3232             <varlistentry>
3233               <term><varname>paymentsource</varname></term>
3234
3235               <listitem>
3236                 <para>Beleg</para>
3237               </listitem>
3238             </varlistentry>
3239           </variablelist>
3240         </sect3>
3241
3242         <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
3243           <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
3244
3245           <para>Die vom Benutzer definierten Variablen für Kunden und
3246           Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
3247           ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
3248           <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
3249           Variablennamen zusammen.</para>
3250
3251           <para>Beispiel: Der Benutzer hat eine Variable namens
3252           <varname>number_of_employees</varname> definiert, die die Anzahl der
3253           Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
3254           unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
3255           Verfügung.</para>
3256         </sect3>
3257       </sect2>
3258
3259       <sect2 id="dokumentenvorlagen-und-variablen.dunning">
3260         <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
3261
3262         <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
3263           <title>Namen der Vorlagen</title>
3264
3265           <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
3266           eingegeben. Wird für ein Mahnlevel die Option zur automatischen
3267           Erstellung einer Rechnung über die Mahngebühren und Zinsen
3268           aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
3269           Vorlagenname für diese Mahnstufe mit dem Zusatz
3270           <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
3271           für die ausgewählte Sprache und den ausgewählten Drucker
3272           angehängt.</para>
3273         </sect3>
3274
3275         <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
3276           <title>Allgemeine Variablen in Mahnungen</title>
3277
3278           <para>Die Variablen des Verkäufers stehen wie gewohnt als
3279           <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3280           Kunden stehen als Variablen <varname>name</varname>,
3281           <varname>street</varname>, <varname>zipcode</varname>,
3282           <varname>city</varname>, <varname>country</varname>,
3283           <varname>department_1</varname>, <varname>department_2</varname>,
3284           und <varname>email</varname> zur Verfügung.</para>
3285
3286           <para>Weitere Variablen beinhalten:</para>
3287
3288           <variablelist>
3289             <varlistentry>
3290               <term><varname>dunning_date</varname></term>
3291
3292               <listitem>
3293                 <para>Datum der Mahnung</para>
3294               </listitem>
3295             </varlistentry>
3296
3297             <varlistentry>
3298               <term><varname>dunning_duedate</varname></term>
3299
3300               <listitem>
3301                 <para>Fälligkeitsdatum für diese Mahhnung</para>
3302               </listitem>
3303             </varlistentry>
3304
3305             <varlistentry>
3306               <term><varname>dunning_id</varname></term>
3307
3308               <listitem>
3309                 <para>Mahnungsnummer</para>
3310               </listitem>
3311             </varlistentry>
3312
3313             <varlistentry>
3314               <term><varname>fee</varname></term>
3315
3316               <listitem>
3317                 <para>Kummulative Mahngebühren</para>
3318               </listitem>
3319             </varlistentry>
3320
3321             <varlistentry>
3322               <term><varname>interest_rate</varname></term>
3323
3324               <listitem>
3325                 <para>Zinssatz per anno in Prozent</para>
3326               </listitem>
3327             </varlistentry>
3328
3329             <varlistentry>
3330               <term><varname>total_amount</varname></term>
3331
3332               <listitem>
3333                 <para>Gesamter noch zu zahlender Betrag als
3334                 <function>fee</function> + <function>total_interest</function>
3335                 + <function>total_open_amount</function></para>
3336               </listitem>
3337             </varlistentry>
3338
3339             <varlistentry>
3340               <term><varname>total_interest</varname></term>
3341
3342               <listitem>
3343                 <para>Zinsen per anno über alle Rechnungen</para>
3344               </listitem>
3345             </varlistentry>
3346
3347             <varlistentry>
3348               <term><varname>total_open_amount</varname></term>
3349
3350               <listitem>
3351                 <para>Summe über alle offene Beträge der Rechnungen</para>
3352               </listitem>
3353             </varlistentry>
3354           </variablelist>
3355         </sect3>
3356
3357         <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
3358           <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
3359
3360           <variablelist>
3361             <varlistentry>
3362               <term><varname>dn_amount</varname></term>
3363
3364               <listitem>
3365                 <para>Rechnungssumme (brutto)</para>
3366               </listitem>
3367             </varlistentry>
3368
3369             <varlistentry>
3370               <term><varname>dn_duedate</varname></term>
3371
3372               <listitem>
3373                 <para>Originales Fälligkeitsdatum der Rechnung</para>
3374               </listitem>
3375             </varlistentry>
3376
3377             <varlistentry>
3378               <term><varname>dn_dunning_date</varname></term>
3379
3380               <listitem>
3381                 <para>Datum der Mahnung</para>
3382               </listitem>
3383             </varlistentry>
3384
3385             <varlistentry>
3386               <term><varname>dn_dunning_duedate</varname></term>
3387
3388               <listitem>
3389                 <para>Fälligkeitsdatum der Mahnung</para>
3390               </listitem>
3391             </varlistentry>
3392
3393             <varlistentry>
3394               <term><varname>dn_fee</varname></term>
3395
3396               <listitem>
3397                 <para>Kummulative Mahngebühr</para>
3398               </listitem>
3399             </varlistentry>
3400
3401             <varlistentry>
3402               <term><varname>dn_interest</varname></term>
3403
3404               <listitem>
3405                 <para>Zinsen per anno für diese Rechnung</para>
3406               </listitem>
3407             </varlistentry>
3408
3409             <varlistentry>
3410               <term><varname>dn_invnumber</varname></term>
3411
3412               <listitem>
3413                 <para>Rechnungsnummer</para>
3414               </listitem>
3415             </varlistentry>
3416
3417             <varlistentry>
3418               <term><varname>dn_linetotal</varname></term>
3419
3420               <listitem>
3421                 <para>Noch zu zahlender Betrag (ergibt sich aus
3422                 <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
3423                 + <varname>dn_interest</varname>)</para>
3424               </listitem>
3425             </varlistentry>
3426
3427             <varlistentry>
3428               <term><varname>dn_netamount</varname></term>
3429
3430               <listitem>
3431                 <para>Rechnungssumme (netto)</para>
3432               </listitem>
3433             </varlistentry>
3434
3435             <varlistentry>
3436               <term><varname>dn_open_amount</varname></term>
3437
3438               <listitem>
3439                 <para>Offener Rechnungsbetrag</para>
3440               </listitem>
3441             </varlistentry>
3442
3443             <varlistentry>
3444               <term><varname>dn_ordnumber</varname></term>
3445
3446               <listitem>
3447                 <para>Bestellnummer</para>
3448               </listitem>
3449             </varlistentry>
3450
3451             <varlistentry>
3452               <term><varname>dn_transdate</varname></term>
3453
3454               <listitem>
3455                 <para>Rechnungsdatum</para>
3456               </listitem>
3457             </varlistentry>
3458
3459             <varlistentry>
3460               <term><varname>dn_curr</varname></term>
3461
3462               <listitem>
3463                 <para>Währung, in der die Rechnung erstellt wurde. (Die
3464                 Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
3465               </listitem>
3466             </varlistentry>
3467           </variablelist>
3468         </sect3>
3469
3470         <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
3471           <title>Variablen in automatisch erzeugten Rechnungen über
3472           Mahngebühren</title>
3473
3474           <para>Die Variablen des Verkäufers stehen wie gewohnt als
3475           <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3476           Kunden stehen als Variablen <varname>name</varname>,
3477           <varname>street</varname>, <varname>zipcode</varname>,
3478           <varname>city</varname>, <varname>country</varname>,
3479           <varname>department_1</varname>, <varname>department_2</varname>,
3480           und <varname>email</varname> zur Verfügung.</para>
3481
3482           <para>Weitere Variablen beinhalten:</para>
3483
3484           <variablelist>
3485             <varlistentry>
3486               <term><varname>duedate</varname></term>
3487
3488               <listitem>
3489                 <para>Fälligkeitsdatum der Rechnung</para>
3490               </listitem>
3491             </varlistentry>
3492
3493             <varlistentry>
3494               <term><varname>dunning_id</varname></term>
3495
3496               <listitem>
3497                 <para>Mahnungsnummer</para>
3498               </listitem>
3499             </varlistentry>
3500
3501             <varlistentry>
3502               <term><varname>fee</varname></term>
3503
3504               <listitem>
3505                 <para>Mahngebühren</para>
3506               </listitem>
3507             </varlistentry>
3508
3509             <varlistentry>
3510               <term><varname>interest</varname></term>
3511
3512               <listitem>
3513                 <para>Zinsen</para>
3514               </listitem>
3515             </varlistentry>
3516
3517             <varlistentry>
3518               <term><varname>invamount</varname></term>
3519
3520               <listitem>
3521                 <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
3522                 <varname>interest</varname>)</para>
3523               </listitem>
3524             </varlistentry>
3525
3526             <varlistentry>
3527               <term><varname>invdate</varname></term>
3528
3529               <listitem>
3530                 <para>Rechnungsdatum</para>
3531               </listitem>
3532             </varlistentry>
3533
3534             <varlistentry>
3535               <term><varname>invnumber</varname></term>
3536
3537               <listitem>
3538                 <para>Rechnungsnummer</para>
3539               </listitem>
3540             </varlistentry>
3541           </variablelist>
3542         </sect3>
3543       </sect2>
3544
3545       <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
3546         <title>Variablen in anderen Vorlagen</title>
3547
3548         <sect3>
3549           <title>Einführung</title>
3550
3551           <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
3552           Rechnung. Allerdings heißen die Variablen, die mit
3553           <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
3554           fangen sie mit <varname>quo</varname> für "quotation" an:
3555           <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
3556           wiederum fangen sie mit <varname>ord</varname> für "order" an:
3557           <varname>ordnumber</varname> für Bestellnummer etc.</para>
3558
3559           <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
3560           vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
3561           sind Variablen, die vom Geschäftsablauf her in der entsprechenden
3562           Vorlage keine Bedeutung haben oder noch nicht belegt sein
3563           können.</para>
3564
3565           <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
3566           in Rechnungen aufgeführt.</para>
3567         </sect3>
3568
3569         <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
3570           <title>Angebote und Preisanfragen</title>
3571
3572           <variablelist>
3573             <varlistentry>
3574               <term><varname>quonumber</varname></term>
3575
3576               <listitem>
3577                 <para>Angebots- bzw. Anfragenummer</para>
3578               </listitem>
3579             </varlistentry>
3580
3581             <varlistentry>
3582               <term><varname>reqdate</varname></term>
3583
3584               <listitem>
3585                 <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
3586                 Preisanfragen)</para>
3587               </listitem>
3588             </varlistentry>
3589
3590             <varlistentry>
3591               <term><varname>transdate</varname></term>
3592
3593               <listitem>
3594                 <para>Angebots- bzw. Anfragedatum</para>
3595               </listitem>
3596             </varlistentry>
3597           </variablelist>
3598         </sect3>
3599
3600         <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
3601           <title>Auftragsbestätigungen und Lieferantenaufträge</title>
3602
3603           <variablelist>
3604             <varlistentry>
3605               <term><varname>ordnumber</varname></term>
3606
3607               <listitem>
3608                 <para>Auftragsnummer</para>
3609               </listitem>
3610             </varlistentry>
3611
3612             <varlistentry>
3613               <term><varname>reqdate</varname></term>
3614
3615               <listitem>
3616                 <para>Lieferdatum</para>
3617               </listitem>
3618             </varlistentry>
3619
3620             <varlistentry>
3621               <term><varname>transdate</varname></term>
3622
3623               <listitem>
3624                 <para>Auftragsdatum</para>
3625               </listitem>
3626             </varlistentry>
3627           </variablelist>
3628         </sect3>
3629
3630         <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
3631           <title>Lieferscheine (Verkauf und Einkauf)</title>
3632
3633           <variablelist>
3634             <varlistentry>
3635               <term><varname>cusordnumber</varname></term>
3636
3637               <listitem>
3638                 <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
3639                 des Lieferanten (im Einkauf)</para>
3640               </listitem>
3641             </varlistentry>
3642
3643             <varlistentry>
3644               <term><varname>donumber</varname></term>
3645
3646               <listitem>
3647                 <para>Lieferscheinnummer</para>
3648               </listitem>
3649             </varlistentry>
3650
3651             <varlistentry>
3652               <term><varname>transdate</varname></term>
3653
3654               <listitem>
3655                 <para>Lieferscheindatum</para>
3656               </listitem>
3657             </varlistentry>
3658           </variablelist>
3659
3660           <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
3661           mit den Informationen darüber, von welchem Lager und Lagerplatz aus
3662           die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
3663           Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
3664           <function>foreach</function>-Schleife ausgegeben werden. Diese
3665           Variablen sind:</para>
3666
3667           <variablelist>
3668             <varlistentry>
3669               <term><varname>si_bin</varname></term>
3670
3671               <listitem>
3672                 <para>Lagerplatz</para>
3673               </listitem>
3674             </varlistentry>
3675
3676             <varlistentry>
3677               <term><varname>si_chargenumber</varname></term>
3678
3679               <listitem>
3680                 <para>Chargennummer</para>
3681               </listitem>
3682             </varlistentry>
3683
3684             <varlistentry>
3685               <term><varname>si_bestbefore</varname></term>
3686
3687               <listitem>
3688                 <para>Mindesthaltbarkeit</para>
3689               </listitem>
3690             </varlistentry>
3691
3692             <varlistentry>
3693               <term><varname>si_number</varname></term>
3694
3695               <listitem>
3696                 <para>Artikelnummer</para>
3697               </listitem>
3698             </varlistentry>
3699
3700             <varlistentry>
3701               <term><varname>si_qty</varname></term>
3702
3703               <listitem>
3704                 <para>Anzahl bzw. Menge</para>
3705               </listitem>
3706             </varlistentry>
3707
3708             <varlistentry>
3709               <term><varname>si_runningnumber</varname></term>
3710
3711               <listitem>
3712                 <para>Positionsnummer (1, 2, 3 etc)</para>
3713               </listitem>
3714             </varlistentry>
3715
3716             <varlistentry>
3717               <term><varname>si_unit</varname></term>
3718
3719               <listitem>
3720                 <para>Einheit</para>
3721               </listitem>
3722             </varlistentry>
3723
3724             <varlistentry>
3725               <term><varname>si_warehouse</varname></term>
3726
3727               <listitem>
3728                 <para>Lager</para>
3729               </listitem>
3730             </varlistentry>
3731           </variablelist>
3732         </sect3>
3733
3734         <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
3735           <title>Variablen für Sammelrechnung</title>
3736
3737           <variablelist>
3738             <varlistentry>
3739               <term><varname>c0total</varname></term>
3740
3741               <listitem>
3742                 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &lt; 30
3743                 Tage</para>
3744               </listitem>
3745             </varlistentry>
3746
3747             <varlistentry>
3748               <term><varname>c30total</varname></term>
3749
3750               <listitem>
3751                 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 30
3752                 und &lt; 60 Tage</para>
3753               </listitem>
3754             </varlistentry>
3755
3756             <varlistentry>
3757               <term><varname>c60total</varname></term>
3758
3759               <listitem>
3760                 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 60
3761                 und &lt; 90 Tage</para>
3762               </listitem>
3763             </varlistentry>
3764
3765             <varlistentry>
3766               <term><varname>c90total</varname></term>
3767
3768               <listitem>
3769                 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit &gt;= 90
3770                 Tage</para>
3771               </listitem>
3772             </varlistentry>
3773
3774             <varlistentry>
3775               <term><varname>total</varname></term>
3776
3777               <listitem>
3778                 <para>Gesamtbetrag aller Rechnungen</para>
3779               </listitem>
3780             </varlistentry>
3781           </variablelist>
3782
3783           <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
3784
3785           <variablelist>
3786             <varlistentry>
3787               <term><varname>invnumber</varname></term>
3788
3789               <listitem>
3790                 <para>Rechnungsnummer</para>
3791               </listitem>
3792             </varlistentry>
3793
3794             <varlistentry>
3795               <term><varname>invdate</varname></term>
3796
3797               <listitem>
3798                 <para>Rechnungsdatum</para>
3799               </listitem>
3800             </varlistentry>
3801
3802             <varlistentry>
3803               <term><varname>duedate</varname></term>
3804
3805               <listitem>
3806                 <para>Fälligkeitsdatum</para>
3807               </listitem>
3808             </varlistentry>
3809
3810             <varlistentry>
3811               <term><varname>amount</varname></term>
3812
3813               <listitem>
3814                 <para>Summe der Rechnung</para>
3815               </listitem>
3816             </varlistentry>
3817
3818             <varlistentry>
3819               <term><varname>open</varname></term>
3820
3821               <listitem>
3822                 <para>Noch offener Betrag der Rechnung</para>
3823               </listitem>
3824             </varlistentry>
3825
3826             <varlistentry>
3827               <term><varname>c0</varname></term>
3828
3829               <listitem>
3830                 <para>Noch offener Rechnungsbetrag mit Fälligkeit &lt; 30
3831                 Tage</para>
3832               </listitem>
3833             </varlistentry>
3834
3835             <varlistentry>
3836               <term><varname>c30</varname></term>
3837
3838               <listitem>
3839                 <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 30 und
3840                 &lt; 60 Tage</para>
3841               </listitem>
3842             </varlistentry>
3843
3844             <varlistentry>
3845               <term><varname>c60</varname></term>
3846
3847               <listitem>
3848                 <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 60 und
3849                 &lt; 90 Tage</para>
3850               </listitem>
3851             </varlistentry>
3852
3853             <varlistentry>
3854               <term><varname>c90</varname></term>
3855
3856               <listitem>
3857                 <para>Noch offener Rechnungsbetrag mit Fälligkeit &gt;= 90
3858                 Tage</para>
3859               </listitem>
3860             </varlistentry>
3861           </variablelist>
3862         </sect3>
3863       </sect2>
3864
3865       <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
3866         <title>Blöcke, bedingte Anweisungen und Schleifen</title>
3867
3868         <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
3869           <title>Einfürhung</title>
3870
3871           <para>Der Parser kennt neben den Variablen einige weitere
3872           Konstrukte, die gesondert behandelt werden. Diese sind wie
3873           Variablennamen in spezieller Weise markiert:
3874           <command>&lt;%anweisung%&gt; ... &lt;%end%&gt;</command></para>
3875
3876           <para>Anmerkung zum <command>&lt;%end%&gt;</command>: Der besseren
3877           Verständlichkeit halber kann man nach dem <command>end</command>
3878           noch beliebig weitere Wörter schreiben, um so zu markieren, welche
3879           Anweisung (z.B. <command>if</command> oder
3880           <command>foreach</command>) damit abgeschlossen wird.</para>
3881
3882           <para>Beispiel: Lautet der Beginn eines Blockes z.B.
3883           <command>&lt;%if type == "sales_quotation"%&gt;</command>, so könnte
3884           er mit <command>&lt;%end%&gt;</command> genauso abgeschlossen werden
3885           wie mit <command>&lt;%end if%&gt;</command> oder auch
3886           <command>&lt;%end type == "sales_quotation"%&gt;</command>.</para>
3887         </sect3>
3888
3889         <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
3890           <title>Der if-Block</title>
3891
3892           <programlisting>&lt;%if variablenname%&gt;
3893 ...
3894 &lt;%end%&gt;</programlisting>
3895
3896           <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
3897           und dem "end" werden nur ausgegeben, wenn die Variable
3898           <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
3899
3900           <para>Die Bedingung kann auch negiert werden, indem das Wort
3901           <function>not</function> nach dem <filename>if</filename> verwendet
3902           wird. Beispiel:</para>
3903
3904           <programlisting>&lt;%if not cp_greeting%&gt;
3905 ...
3906 &lt;%end%&gt;</programlisting>
3907
3908           <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
3909           oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
3910           einer Variablen mit einer festen Zeichenkette oder einer anderen
3911           Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
3912           oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
3913           die rechte Seite des Vergleichsoperators in Anführungszeichen
3914           gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
3915           anderer Variablen). Zwei Beispiele, die beide Vergleiche
3916           zeigen:</para>
3917
3918           <programlisting>&lt;%if var1 == "Wert"%&gt;</programlisting>
3919
3920           <para>Testet die Variable <varname>var1</varname> auf
3921           übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
3922           Mittels <function>!=</function> anstelle von <function>==</function>
3923           würde auf Ungleichheit getestet.</para>
3924
3925           <programlisting>%if var1 == var2%&gt;</programlisting>
3926
3927           <para>Testet die Variable <varname>var1</varname> auf
3928           übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
3929           <function>!=</function> anstelle von <function>==</function> würde
3930           auf Ungleichheit getestet.</para>
3931
3932           <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
3933           auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
3934           Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
3935           dieselbe Syntax wie oben nur mit <function>=~</function> und
3936           <function>!~</function> als Vergleichsoperatoren.</para>
3937
3938           <para>Beispiel für einen Test, ob die Variable
3939           <varname>intnotes</varname> (interne Bemerkungen) das Wort
3940           <constant>schwierig</constant> enthält:</para>
3941
3942           <programlisting>&lt;%if intnotes =~ "schwierig"%&gt;</programlisting>
3943         </sect3>
3944
3945         <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
3946           <title>Der foreach-Block</title>
3947
3948           <programlisting>&lt;%foreach variablenname%&gt;
3949 ...
3950 &lt;%end%&gt;</programlisting>
3951
3952           <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
3953           wie das Perl-Array der Variablen <varname>variablenname</varname>
3954           Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
3955           Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
3956           benutzt. In jedem Durchlauf werden die <link
3957           linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
3958           Variablen</link> jeweils auf den Wert für die aktuelle Position
3959           gesetzt.</para>
3960
3961           <para>Die Syntax sieht normalerweise wie folgt aus:</para>
3962
3963           <programlisting>&lt;%foreach number%&gt;
3964 Position: &lt;%runningnumber%&gt;
3965 Anzahl: &lt;%qty%&gt;
3966 Artikelnummer: &lt;%number%&gt;
3967 Beschreibung: &lt;%description%&gt;
3968 ...
3969 &lt;%end%&gt;</programlisting>
3970
3971           <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
3972           <function>&lt;%foreach%&gt;</function>-Block innerhalb einer
3973           Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
3974           wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
3975           Inhalt zwischen <function>&lt;%foreach%&gt;</function> und
3976           <function>&lt;%end%&gt;</function> wiederholt, nicht aber die
3977           komplette Zeile, in der er steht.</para>
3978         </sect3>
3979       </sect2>
3980
3981       <sect2 id="dokumentenvorlagen-und-variablen.markup">
3982         <title>Markup-Code zur Textformatierung innerhalb von
3983         Formularen</title>
3984
3985         <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
3986         anders formatiert haben möchte, so ist dies begrenzt möglich.
3987         Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
3988         Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
3989         Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
3990         dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
3991         (HTML oder PDF über LaTeX) umgesetzt.</para>
3992
3993         <para>Die unterstützen Formatierungen sind:</para>
3994
3995         <variablelist>
3996           <varlistentry>
3997             <term>&lt;b&gt;Text&lt;/b&gt;</term>
3998
3999             <listitem>
4000               <para>Text wird in Fettdruck gesetzt.</para>
4001             </listitem>
4002           </varlistentry>
4003
4004           <varlistentry>
4005             <term>&lt;i&gt;Text&lt;/i&gt;</term>
4006
4007             <listitem>
4008               <para>Text wird kursiv gesetzt.</para>
4009             </listitem>
4010           </varlistentry>
4011
4012           <varlistentry>
4013             <term>&lt;u&gt;Text&lt;/u&gt;</term>
4014
4015             <listitem>
4016               <para>Text wird unterstrichen.</para>
4017             </listitem>
4018           </varlistentry>
4019
4020           <varlistentry>
4021             <term>&lt;s&gt;Text&lt;/s&gt;</term>
4022
4023             <listitem>
4024               <para>Text wird durchgestrichen. Diese Formatierung ist nicht
4025               bei der Ausgabe als PDF über LaTeX verfügbar.</para>
4026             </listitem>
4027           </varlistentry>
4028
4029           <varlistentry>
4030             <term>&lt;bullet&gt;</term>
4031
4032             <listitem>
4033               <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
4034               unten).</para>
4035             </listitem>
4036           </varlistentry>
4037         </variablelist>
4038
4039         <para>Der Befehl <command>&lt;bullet&gt;</command> funktioniert
4040         momentan auch nur in Latex-Vorlagen.</para>
4041       </sect2>
4042     </sect1>
4043
4044     <sect1 id="excel-templates">
4045       <title>Excel-Vorlagen</title>
4046
4047       <sect2 id="excel-templates.summary">
4048         <title>Zusammenfassung</title>
4049
4050         <para>Dieses Dokument beschreibt den Mechanismus, mit dem
4051         Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
4052         einhergehen.</para>
4053       </sect2>
4054
4055       <sect2 id="excel-templates.usage">
4056         <title>Bedienung</title>
4057
4058         <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
4059         werden. Die Konfigurationsoption heißt <varname>excel_templates =
4060         1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
4061
4062         <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
4063         anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
4064         werden. In den normalen Verkaufsmasken taucht nun
4065         <constant>Excel</constant> als auswählbares Format auf und kann von da
4066         an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
4067
4068         <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
4069         eine Angebotsvorlage und wird unter dem internen Namen der Angebote
4070         <filename>sales_quotation.xls</filename> gespeichert.</para>
4071       </sect2>
4072
4073       <sect2 id="excel-templates.syntax">
4074         <title>Variablensyntax</title>
4075
4076         <para>Einfache Syntax:
4077         <command>&lt;&lt;varname&gt;&gt;</command></para>
4078
4079         <para>Dabei sind <constant>&lt;&lt;</constant> und
4080         <constant>&gt;&gt;</constant> die Delimiter. Da Excel auf festen
4081         Breiten besteht, kann der Tag künstlich verlängert werden, indem
4082         weitere <constant>&lt;</constant> oder <constant>&gt;</constant>
4083         eingefügt werden. Der Tag muss nicht symmetrisch sein.
4084         Beispiel:</para>
4085
4086         <programlisting>&lt;&lt;&lt;&lt;&lt;varname&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
4087
4088         <para>Um die Limitierung der festen Breite zu reduzieren, können
4089         weitere Variablen in einem Block interpoliert werden. Whitespace wird
4090         dazwishen dann erhalten. Beispiel:</para>
4091
4092         <programlisting>&lt;&lt;&lt;&lt;&lt;varname1 varname2   varname3&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
4093
4094         <para>Die Variablen werden interpoliert, und linksbündig mit
4095         Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
4096         lang, werden überzählige Zeichen abgeschnitten.</para>
4097
4098         <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
4099         der Block mit einem Leerzeichen anfängt. Beispiel:</para>
4100
4101         <programlisting>&lt;&lt;&lt;&lt;&lt;&lt;            varname&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</programlisting>
4102
4103         <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
4104         Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
4105         entfernt.</para>
4106       </sect2>
4107
4108       <sect2 id="excel-templates.limitations">
4109         <title>Einschränkungen</title>
4110
4111         <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
4112         mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
4113         beschränkt sich daher darauf, Textstellen exakt durch einen anderen
4114         Text zu ersetzen.</para>
4115
4116         <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
4117         <command>&lt;%if%&gt;</command> und
4118         <command>&lt;%foreach%&gt;</command> nicht vorhanden. Der Delimiter
4119         <constant>&lt;% %&gt;</constant> kommt in den Headerinformationen
4120         evtl. vor. Deshalb wurde auf den sichereren Delimiter
4121         <constant>&lt;&lt;</constant> und <constant>&gt;&gt;</constant>
4122         gewechselt.</para>
4123       </sect2>
4124     </sect1>
4125   </chapter>
4126
4127   <chapter>
4128     <title>Entwicklerdokumentation</title>
4129
4130     <sect1 id="devel.globals" xreflabel="Globale Variablen">
4131       <title>Globale Variablen</title>
4132
4133       <sect2>
4134         <title>Wie sehen globale Variablen in Perl aus?</title>
4135
4136         <para>Globale Variablen liegen in einem speziellen namespace namens
4137         "main", der von überall erreichbar ist. Darüber hinaus sind bareword
4138         globs global und die meisten speziellen Variablen sind...
4139         speziell.</para>
4140
4141         <para>Daraus ergeben sich folgende Formen:</para>
4142
4143         <variablelist>
4144           <varlistentry>
4145             <term><literal>$main::form</literal></term>
4146
4147             <listitem>
4148               <para>expliziter Namespace "main"</para>
4149             </listitem>
4150           </varlistentry>
4151
4152           <varlistentry>
4153             <term><literal>$::form</literal></term>
4154
4155             <listitem>
4156               <para>impliziter Namespace "main"</para>
4157             </listitem>
4158           </varlistentry>
4159
4160           <varlistentry>
4161             <term><literal>open FILE, "file.txt"</literal></term>
4162
4163             <listitem>
4164               <para><varname>FILE</varname> ist global</para>
4165             </listitem>
4166           </varlistentry>
4167
4168           <varlistentry>
4169             <term><literal>$_</literal></term>
4170
4171             <listitem>
4172               <para>speziell</para>
4173             </listitem>
4174           </varlistentry>
4175         </variablelist>
4176
4177         <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
4178         Schlüsselwort wie "<function>global</function>", mit dem man
4179         importieren kann. <function>my</function>, <function>our</function>
4180         und <function>local</function> machen was anderes.</para>
4181
4182         <variablelist>
4183           <varlistentry>
4184             <term><literal>my $form</literal></term>
4185
4186             <listitem>
4187               <para>lexikalische Variable, gültig bis zum Ende des
4188               Scopes</para>
4189             </listitem>
4190           </varlistentry>
4191
4192           <varlistentry>
4193             <term><literal>our $form</literal></term>
4194
4195             <listitem>
4196               <para><varname>$form</varname> referenziert ab hier
4197               <varname>$PACKAGE::form</varname>.</para>
4198             </listitem>
4199           </varlistentry>
4200
4201           <varlistentry>
4202             <term><literal>local $form</literal></term>
4203
4204             <listitem>
4205               <para>Alle Änderungen an <varname>$form</varname> werden am Ende
4206               des scopes zurückgesetzt</para>
4207             </listitem>
4208           </varlistentry>
4209         </variablelist>
4210       </sect2>
4211
4212       <sect2>
4213         <title>Warum sind globale Variablen ein Problem?</title>
4214
4215         <para>Das erste Problem ist <productname>FCGI</productname>.</para>
4216
4217         <para><productname>SQL-Ledger</productname> hat fast alles im globalen
4218         namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
4219         Unter <productname>FCGI</productname> müssen diese Sachen aber wieder
4220         aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
4221         Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
4222         Datenbankverbindungen, weil die sehr lange zum Initialisieren
4223         brauchen.</para>
4224
4225         <para>Das zweite Problem ist <function>strict</function>. Unter
4226         <function>strict</function> werden alle Variablen die nicht explizit
4227         mit <function>Package</function>, <function>my</function> oder
4228         <function>our</function> angegeben werden als Tippfehler angemarkert,
4229         dies hat, seit der Einführung, u.a. schon so manche langwierige Bug-Suche verkürzt.
4230         Da globale Variablen aber implizit mit Package angegeben werden, werden
4231         die nicht geprüft, und somit kann sich schnell ein Tippfehler einschleichen.</para>
4232       </sect2>
4233
4234       <sect2>
4235         <title>Kanonische globale Variablen</title>
4236
4237         <para>Um dieses Problem im Griff zu halten gibt es einige wenige
4238         globale Variablen, die kanonisch sind, d.h. sie haben bestimmte vorgegebenen Eigenschaften,
4239         und alles andere sollte anderweitig umhergereicht werden.</para>
4240
4241         <para>Diese Variablen sind im Moment die folgenden neun:</para>
4242
4243         <itemizedlist>
4244           <listitem>
4245             <para><varname>$::form</varname></para>
4246           </listitem>
4247
4248           <listitem>
4249             <para><varname>%::myconfig</varname></para>
4250           </listitem>
4251
4252           <listitem>
4253             <para><varname>$::locale</varname></para>
4254           </listitem>
4255
4256           <listitem>
4257             <para><varname>$::lxdebug</varname></para>
4258           </listitem>
4259
4260           <listitem>
4261             <para><varname>$::auth</varname></para>
4262           </listitem>
4263
4264           <listitem>
4265             <para><varname>$::lx_office_conf</varname></para>
4266           </listitem>
4267
4268           <listitem>
4269             <para><varname>$::instance_conf</varname></para>
4270           </listitem>
4271
4272           <listitem>
4273             <para><varname>$::dispatcher</varname></para>
4274           </listitem>
4275
4276           <listitem>
4277             <para><varname>$::request</varname></para>
4278           </listitem>
4279         </itemizedlist>
4280
4281         <para>Damit diese nicht erneut als Müllhalde missbraucht werden, im Folgenden
4282         eine kurze Erläuterung der bestimmten vorgegebenen Eigenschaften (Konventionen):</para>
4283
4284         <sect3>
4285           <title>$::form</title>
4286
4287           <itemizedlist>
4288             <listitem>
4289               <para>Ist ein Objekt der Klasse
4290               "<classname>Form</classname>"</para>
4291             </listitem>
4292
4293             <listitem>
4294               <para>Wird nach jedem Request gelöscht</para>
4295             </listitem>
4296
4297             <listitem>
4298               <para>Muss auch in Tests und Konsolenscripts vorhanden
4299               sein.</para>
4300             </listitem>
4301
4302             <listitem>
4303               <para>Enthält am Anfang eines Requests die Requestparameter vom
4304               User</para>
4305             </listitem>
4306
4307             <listitem>
4308               <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
4309               cachen, das wird aber momentan absichtlich zerstört</para>
4310             </listitem>
4311           </itemizedlist>
4312
4313           <para><varname>$::form</varname> wurde unter <productname>SQL
4314           Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
4315           alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
4316           heißt, alles was einem lieb ist (alle Variablen die einem ans Herz
4317           gewachsen sind), sollte man vor einem Aufruf (!) von zum
4318           Beispiel <function>IS-&gt;retrieve_customer()</function> in
4319           Sicherheit bringen. </para>
4320           Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man Berechnung in einem
4321           bestimmten Format durchführt (SL/Form.pm Zeile 3552, Stand version 2.7beta), um
4322           dies hinterher wieder auf den richtigen Wert zu setzen:
4323           <programlisting>
4324             my $saved_numberformat    = $::myconfig{numberformat};
4325             $::myconfig{numberformat} = $numberformat;
4326             # (...) div Berechnungen
4327             $::myconfig{numberformat} = $saved_numberformat;
4328           </programlisting>
4329           <para>Das Objekt der Klasse Form hat leider im Moment noch viele
4330           zentrale Funktionen die vom internen Zustand abhängen, deshalb
4331           bitte nie einfach zerstören oder überschreiben (zumindestens nicht kurz
4332           vor einem Release oder in Absprache über bspw. die devel-Liste ;-).
4333           Es geht ziemlich sicher etwas kaputt.</para>
4334
4335           <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
4336           in den <productname>Template::Toolkit</productname> Templates
4337           außerhalb der Controller: der Ausdruck <function>[% var
4338           %]</function> greift auf <varname>$::form-&gt;{var}</varname> zu.
4339           Unter Controllern ist der Standard Scope anders, da lautet der
4340           Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
4341           normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
4342           <function>&lt;%var%&gt;</function> zeigt auf
4343           <varname>$::form-&gt;{var}</varname>.
4344           Nochmal von der anderen Seite erläutert, innerhalb von (Web-)Templates sieht
4345           man häufiger solche Konstrukte:
4346           <programlisting>
4347             [%- IF business %]
4348             # (... Zeig die Auswahlliste Kunden-/Lieferantentyp an
4349             [%- END %]
4350          </programlisting>
4351         Entweder wird hier dann $::form->{business} ausgewertet oder aber der Funktion
4352         <function>$form->parse_html_template</function> wird explizit noch ein zusätzlicher Hash
4353         übergeben, der dann auch in den (Web-)Templates zu Verfügung steht, bspw. so:
4354           <function>$form->parse_html_template("is/form_header", \%TMPL_VAR);</function>
4355
4356           Innerhalb von Schleifen wird
4357           <varname>$::form-&gt;{TEMPLATE_ARRAYS}{var}[$index]</varname>
4358           bevorzugt, wenn vorhanden.</para>
4359           Zum Beispiel in SL/DO.pm welche über alle Positionen eines Lieferscheins
4360           in Schleife läuft:
4361           <programlisting>
4362             for $i (1 .. $form->{rowcount}) {
4363               (...)
4364               push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} },   $position;
4365               push @{ $form->{TEMPLATE_ARRAYS}{number} },          $form->{"partnumber_$i"};
4366               push @{ $form->{TEMPLATE_ARRAYS}{description} },     $form->{"description_$i"};
4367          </programlisting>
4368                  </sect3>
4369
4370         <sect3>
4371           <title>%::myconfig</title>
4372
4373           <itemizedlist>
4374             <listitem>
4375               <para>Das einzige Hash unter den globalen Variablen</para>
4376             </listitem>
4377
4378             <listitem>
4379               <para>Wird spätestens benötigt wenn auf die Datenbank
4380               zugegriffen wird</para>
4381             </listitem>
4382
4383             <listitem>
4384               <para>Wird bei jedem Request neu erstellt.</para>
4385             </listitem>
4386
4387             <listitem>
4388               <para>Enthält die Userdaten des aktuellen Logins</para>
4389             </listitem>
4390
4391             <listitem>
4392               <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
4393               extern serialisiert werden, weil da auch der Datenbankzugriff
4394               für diesen user drinsteht.</para>
4395             </listitem>
4396
4397             <listitem>
4398               <para>Enthält unter anderem Listenbegrenzung vclimit,
4399               Datumsformat dateformat und Nummernformat numberformat</para>
4400             </listitem>
4401
4402             <listitem>
4403               <para>Enthält Datenbankzugriffinformationen</para>
4404             </listitem>
4405           </itemizedlist>
4406
4407           <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
4408           ein Userobjekt. Die meisten Funktionen, die etwas anhand des
4409           aktuellen Users entscheiden müssen, befragen
4410           <varname>%::myconfig</varname>.
4411           Innerhalb der Anwendungen sind dies überwiegend die Daten, die sich
4412           unter Programm->Einstellungen befinden, bzw. die Informationen über den
4413           Benutzer die über die Administrator-Schnittstelle (admin.pl) eingegeben wurden.
4414         </para>
4415         </sect3>
4416
4417         <sect3>
4418           <title>$::locale</title>
4419
4420           <itemizedlist>
4421             <listitem>
4422               <para>Objekt der Klasse "Locale"</para>
4423             </listitem>
4424
4425             <listitem>
4426               <para>Wird pro Request erstellt</para>
4427             </listitem>
4428
4429             <listitem>
4430               <para>Muss auch für Tests und Scripte immer verfügbar
4431               sein.</para>
4432             </listitem>
4433
4434             <listitem>
4435               <para>Cached intern über Requestgrenzen hinweg benutzte
4436               Locales</para>
4437             </listitem>
4438           </itemizedlist>
4439
4440           <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
4441           Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
4442         </sect3>
4443
4444         <sect3>
4445           <title>$::lxdebug</title>
4446
4447           <itemizedlist>
4448             <listitem>
4449               <para>Objekt der Klasse "LXDebug"</para>
4450             </listitem>
4451
4452             <listitem>
4453               <para>Wird global gecached</para>
4454             </listitem>
4455
4456             <listitem>
4457               <para>Muss immer verfügbar sein, in nahezu allen
4458               Funktionen</para>
4459             </listitem>
4460           </itemizedlist>
4461
4462           <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
4463           bereit, wie "<function>enter_sub</function>" und
4464           "<function>leave_sub</function>", mit denen in den alten Modulen ein
4465           brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
4466           der man die Wallclockzeit seit Requeststart loggen kann, sowie
4467           "<function>message</function>" und "<function>dump</function>" mit
4468           denen man flott Informationen ins Log (tmp/lx-office-debug.log) packen kann.</para>
4469           Beispielsweise so:
4470           <programlisting>
4471             $main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
4472             $main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});
4473
4474           </programlisting>
4475         </sect3>
4476
4477         <sect3>
4478           <title>$::auth</title>
4479
4480           <itemizedlist>
4481             <listitem>
4482               <para>Objekt der Klasse "SL::Auth"</para>
4483             </listitem>
4484
4485             <listitem>
4486               <para>Wird global gecached</para>
4487             </listitem>
4488
4489             <listitem>
4490               <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
4491             </listitem>
4492
4493             <listitem>
4494               <para>Wird nach jedem Request resettet.</para>
4495             </listitem>
4496           </itemizedlist>
4497
4498           <para><varname>$::auth</varname> stellt Funktionen bereit um die
4499           Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
4500           vom aktuellen User abhängen wird das Objekt aus
4501           Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
4502           Request kurz resettet.</para>
4503         </sect3>
4504
4505         <sect3>
4506           <title>$::lx_office_conf</title>
4507
4508           <itemizedlist>
4509             <listitem>
4510               <para>Objekt der Klasse
4511               "<classname>SL::LxOfficeConf</classname>"</para>
4512             </listitem>
4513
4514             <listitem>
4515               <para>Global gecached</para>
4516             </listitem>
4517
4518             <listitem>
4519               <para>Repräsentation der
4520               <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
4521             </listitem>
4522           </itemizedlist>
4523
4524           <para>Globale Konfiguration. Configdateien werden zum Start gelesen
4525           und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
4526           Programm die Konfiguration ändern kann oder sollte.</para>
4527
4528           <para>Beispielsweise ist über den Konfigurationseintrag [debug]
4529                 die Debug- und Trace-Log-Datei wie folgt konfiguriert und verfügbar:</para>
4530
4531           <programlisting>[debug]
4532 file = /tmp/lx-office-debug.log</programlisting>
4533
4534           <para>ist der Key <varname>file</varname> im Programm als
4535           <varname>$::lx_office_conf-&gt;{debug}{file}</varname>
4536           erreichbar.</para>
4537
4538           <warning>
4539             <para>Zugriff auf die Konfiguration erfolgt im Moment über
4540             Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
4541           </warning>
4542         </sect3>
4543
4544         <sect3>
4545           <title>$::instance_conf</title>
4546
4547           <itemizedlist>
4548             <listitem>
4549               <para>Objekt der Klasse
4550               "<classname>SL::InstanceConfiguration</classname>"</para>
4551             </listitem>
4552
4553             <listitem>
4554               <para>wird pro Request neu erstellt</para>
4555             </listitem>
4556           </itemizedlist>
4557
4558           <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
4559           speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
4560           ist hier eine Mandantendatenbank.
4561           Beispielsweise überprüft
4562           <programlisting>$::instance_conf->get_inventory_system eq 'perpetual'</programlisting>
4563           ob die berüchtigte Bestandsmethode zur Anwendung kommt.</para>
4564         </sect3>
4565
4566         <sect3>
4567           <title>$::dispatcher</title>
4568
4569           <itemizedlist>
4570             <listitem>
4571               <para>Objekt der Klasse
4572               "<varname>SL::Dispatcher</varname>"</para>
4573             </listitem>
4574
4575             <listitem>
4576               <para>wird pro Serverprozess erstellt.</para>
4577             </listitem>
4578
4579             <listitem>
4580               <para>enthält Informationen über die technische Verbindung zum
4581               Server</para>
4582             </listitem>
4583           </itemizedlist>
4584
4585           <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
4586           global gespeichert wird. Wird vermutlich irgendwann in einem anderen
4587           Objekt untergebracht.</para>
4588         </sect3>
4589
4590         <sect3>
4591           <title>$::request</title>
4592
4593           <itemizedlist>
4594             <listitem>
4595               <para>Hashref (evtl später Objekt)</para>
4596             </listitem>
4597
4598             <listitem>
4599               <para>Wird pro Request neu initialisiert.</para>
4600             </listitem>
4601
4602             <listitem>
4603               <para>Keine Unterstruktur garantiert.</para>
4604             </listitem>
4605           </itemizedlist>
4606
4607           <para><varname>$::request</varname> ist ein generischer Platz um
4608           Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
4609           at a distance benutzt werden, sondern um lokales memoizing zu
4610           ermöglichen, das garantiert am Ende des Requests zerstört
4611           wird.</para>
4612
4613           <para>Vieles von dem, was im moment in <varname>$::form</varname>
4614           liegt, sollte eigentlich hier liegen. Die groben
4615           Differentialkriterien sind:</para>
4616
4617           <itemizedlist>
4618             <listitem>
4619               <para>Kommt es vom User, und soll unverändert wieder an den User? Dann <varname>$::form</varname>, steht da eh schon</para>
4620             </listitem>
4621
4622             <listitem>
4623               <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des Requests gebraucht werden? Dann
4624               <varname>$::request</varname></para>
4625             </listitem>
4626
4627             <listitem>
4628               <para>Muss ich von anderen Teilen des Programms lesend drauf zugreifen? Dann <varname>$::request</varname>, aber Zugriff über
4629               Wrappermethode</para>
4630             </listitem>
4631           </itemizedlist>
4632         </sect3>
4633       </sect2>
4634
4635       <sect2>
4636         <title>Ehemalige globale Variablen</title>
4637
4638         <para>Die folgenden Variablen waren einmal im Programm, und wurden
4639         entfernt.</para>
4640
4641         <sect3>
4642           <title>$::cgi</title>
4643
4644           <itemizedlist>
4645             <listitem>
4646               <para>war nötig, weil cookie Methoden nicht als
4647               Klassenfunktionen funktionieren</para>
4648             </listitem>
4649
4650             <listitem>
4651               <para>Aufruf als Klasse erzeugt Dummyobjekt was im
4652               Klassennamespace gehalten wird und über Requestgrenzen
4653               leaked</para>
4654             </listitem>
4655
4656             <listitem>
4657               <para>liegt jetzt unter
4658               <varname>$::request-&gt;{cgi}</varname></para>
4659             </listitem>
4660           </itemizedlist>
4661         </sect3>
4662
4663         <sect3>
4664           <title>$::all_units</title>
4665
4666           <itemizedlist>
4667             <listitem>
4668               <para>war nötig, weil einige Funktionen in Schleifen zum Teil
4669               ein paar hundert mal pro Request eine Liste der Einheiten
4670               brauchen, und de als Parameter durch einen Riesenstack von
4671               Funktionen geschleift werden müssten.</para>
4672             </listitem>
4673
4674             <listitem>
4675               <para>Liegt jetzt unter
4676               <varname>$::request-&gt;{cache}{all_units}</varname></para>
4677             </listitem>
4678
4679             <listitem>
4680               <para>Wird nur in
4681               <function>AM-&gt;retrieve_all_units()</function> gesetzt oder
4682               gelesen.</para>
4683             </listitem>
4684           </itemizedlist>
4685         </sect3>
4686
4687         <sect3>
4688           <title>%::called_subs</title>
4689
4690           <itemizedlist>
4691             <listitem>
4692               <para>wurde benutzt um callsub deep recursions
4693               abzufangen.</para>
4694             </listitem>
4695
4696             <listitem>
4697               <para>Wurde entfernt, weil callsub nur einen Bruchteil der
4698               möglichen Rekursioenen darstellt, und da nie welche
4699               auftreten.</para>
4700             </listitem>
4701
4702             <listitem>
4703               <para>komplette recursion protection wurde entfernt.</para>
4704             </listitem>
4705           </itemizedlist>
4706         </sect3>
4707       </sect2>
4708     </sect1>
4709
4710     <sect1 id="devel.fcgi">
4711       <title>Entwicklung unter FastCGI</title>
4712
4713       <sect2 id="devel.fcgi.general">
4714         <title>Allgemeines</title>
4715
4716         <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
4717         werden, muss der Webserver neu gestartet werden.</para>
4718
4719         <para>Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu
4720         achten. Dadurch, dass das Programm in einer Endlosschleife läuft,
4721         müssen folgende Aspekte beachtet werden.</para>
4722       </sect2>
4723
4724       <sect2 id="devel.fcgi.exiting">
4725         <title>Programmende und Ausnahmen</title>
4726
4727         <para>Betrifft die Funktionen <function>warn</function>,
4728         <function>die</function>, <function>exit</function>,
4729         <function>carp</function> und <function>confess</function>.</para>
4730
4731         <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
4732         Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
4733         am Laufen zu halten. Man kann mit <function>die</function>,
4734         <function>confess</function> oder <function>carp</function> Fehler
4735         ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
4736         eigene <function>$::form-</function>error()&gt; tut im Prinzip das
4737         Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
4738         <function>exit</function> hingegen werden nicht abgefangen.
4739         <function>warn</function> wird direkt nach STDERR, also in Server Log
4740         eine Nachricht schreiben (sofern in der Konfiguration nicht die
4741         Warnungen in das Lx-Office Log umgeleitet wurden), und
4742         <function>exit</function> wird die Ausführung beenden.</para>
4743
4744         <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
4745         beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
4746         Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
4747         benutzen, alle anderen Exceptionmechanismen sind ok.</para>
4748       </sect2>
4749
4750       <sect2 id="devel.fcgi.globals">
4751         <title>Globale Variablen</title>
4752
4753         <para>Um zu vermeiden, dass Informationen von einem Request in einen
4754         anderen gelangen, müssen alle globalen Variablen vor einem Request
4755         sauber initialisiert werden. Das ist besonders wichtig im
4756         <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
4757         diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
4758         werden.</para>
4759
4760         <para>In <classname>SL::Dispatcher</classname> gibt es einen sauber
4761         abgetrennten Block, der alle kanonischen globalen Variablen listet und
4762         erklärt. Bitte keine anderen einführen ohne das sauber zu
4763         dokumentieren.</para>
4764
4765         <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
4766         man sicher geht, dass man die richtige erwischt.</para>
4767       </sect2>
4768
4769       <sect2 id="devel.fcgi.performance">
4770         <title>Performance und Statistiken</title>
4771
4772         <para>Die kritischen Pfade des Programms sind die Belegmasken, und
4773         unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
4774         Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
4775         4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
4776         sind es je nach Menge der definierten Variablen 1-2s. Ab der
4777         Moose/Rose::DB Version sind es 5-6s.</para>
4778
4779         <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
4780         den kritischen Pfaden, unter 0,15 sonst.</para>
4781       </sect2>
4782
4783       <sect2 id="devel.fcgi.known-issues">
4784         <title>Bekannte Probleme</title>
4785
4786         <sect3 id="devel.fcgi.known-issues.encoding">
4787           <title>Encoding Awareness</title>
4788
4789           <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
4790           fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
4791           falsch kodierte Zeichen eher unwissend, und geben sie einfach
4792           weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
4793           das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
4794           beseitigen.</para>
4795         </sect3>
4796       </sect2>
4797     </sect1>
4798
4799     <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
4800      <title>SQL-Upgradedateien</title>
4801
4802      <sect2 id="db-upgrade-files.introduction" xreflabel="Einführung in die Datenbank-Upgradedateien">
4803       <title>Einführung</title>
4804
4805       <para>
4806        Der alte Mechanismus für SQL-Upgradescripte, der auf einer Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
4807        diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele Entwicklung im stable- und unstable-Baum betrifft.
4808       </para>
4809
4810       <para>
4811        Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es werden weiterhin alle Scripte aus sql/Pg-upgrade
4812        ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
4813        Datei existieren, die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige Kontrollinformationen enthält.
4814       </para>
4815
4816       <para>
4817        Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten definieren können werden, sodass Datenbankscripte zwar in
4818        einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
4819        angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern mehr braucht.
4820       </para>
4821
4822       <para>
4823        Lx-Office merkt sich dabei, welches der Upgradescripte in sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht erneut
4824        aus. Dazu dient die Tabelle "schema_info", die bei der Anmeldung automatisch angelegt wird.
4825       </para>
4826      </sect2>
4827
4828      <sect2 id="db-upgrade-files.format" xreflabel="Format der Upgradedateien">
4829       <title>Format der Kontrollinformationen</title>
4830
4831       <para>
4832        Die Kontrollinformationen sollten sich am Anfang der jeweiligen Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
4833        hat dabei das folgende Format:
4834       </para>
4835
4836       <para>
4837        Für SQL-Upgradedateien:
4838       </para>
4839
4840       <programlisting>-- @key: value</programlisting>
4841
4842       <para>
4843        Für Perl-Upgradedateien:
4844       </para>
4845
4846       <programlisting># @key: value</programlisting>
4847
4848       <para>
4849        Leerzeichen vor "<varname>value</varname>" werden entfernt.
4850       </para>
4851
4852       <para>
4853        Die folgenden Schlüsselworte werden verarbeitet:
4854       </para>
4855
4856       <variablelist>
4857        <varlistentry>
4858         <term><varname>tag</varname></term>
4859         <listitem>
4860          <para>
4861           Wird zwingend benötigt. Dies ist der "Name" des Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren Abhängigkeiten
4862           verwendet werden (Schlüsselwort "<varname>depends</varname>"). Der "tag" ist auch der Name, der in der Datenbank eingetragen wird.
4863          </para>
4864
4865          <para>
4866           Normalerweise sollte die Kontrolldatei genau so heißen wie der "tag", nur mit der Endung ".sql" bzw. "pl".
4867          </para>
4868
4869          <para>
4870           Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
4871           sollten stattdessen mit Unterstrichen ersetzt werden.
4872          </para>
4873         </listitem>
4874        </varlistentry>
4875
4876        <varlistentry>
4877         <term><varname>charset</varname></term>
4878         <listitem>
4879          <para>
4880           Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
4881           Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags der Zeichensatz "<literal>ISO-8859-15</literal>"
4882           angenommen.
4883          </para>
4884         </listitem>
4885        </varlistentry>
4886
4887        <varlistentry>
4888         <term><varname>description</varname></term>
4889         <listitem>
4890          <para>
4891           Benötigt. Eine Beschreibung, was in diesem Update passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
4892           angezeigt. Während der Tag in englisch gehalten sein sollte, sollte die Beschreibung auf Deutsch erfolgen.
4893          </para>
4894         </listitem>
4895        </varlistentry>
4896
4897        <varlistentry>
4898         <term><varname>depends</varname></term>
4899         <listitem>
4900          <para>
4901           Optional. Eine mit Leerzeichen getrennte Liste von "tags", von denen dieses Upgradescript abhängt. Lx-Office stellt sicher, dass
4902           die in dieser Liste aufgeführten Scripte bereits durchgeführt wurden, bevor dieses Script ausgeführt wird.
4903          </para>
4904
4905          <para>
4906           Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b" existiert, das von Änderungen in "a" abhängt, und eine neue
4907           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
4908           Abhängigkeit zu definieren.
4909          </para>
4910
4911          <para>
4912           Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu definieren (z.B. &quot;a&quot; -&gt; &quot;b&quot;,
4913           &quot;b&quot; -&gt; &quot;c&quot; und &quot;c&quot; -&gt; &quot;a&quot;).
4914          </para>
4915         </listitem>
4916        </varlistentry>
4917
4918        <varlistentry>
4919         <term><varname>priority</varname></term>
4920         <listitem>
4921          <para>
4922           Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
4923           besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
4924          </para>
4925
4926          <para>
4927           Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends" benutzt werden. Lx-Office sortiert die auszuführenden Scripte
4928           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
4929           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
4930           alphabetisch nach dem "tag".
4931          </para>
4932         </listitem>
4933        </varlistentry>
4934        <varlistentry>
4935         <term><varname>ignore</varname></term>
4936         <listitem>
4937          <para>
4938           Optional. Falls der Wert auf 1 (true) steht, wird das Skript bei der Anmeldung ignoriert und entsprechend nicht ausgeführt.
4939          </para>
4940         </listitem>
4941        </varlistentry>
4942       </variablelist>
4943      </sect2>
4944
4945      <sect2 id="db-upgrade-files.dbupgrade-tool" xreflabel="Hilfsscript dbupgrade2_tool.pl">
4946       <title>Hilfsscript dbupgrade2_tool.pl</title>
4947
4948       <para>
4949        Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert ein Hilfsscript namens
4950        "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses
4951        Tool liest alle Datenbankupgradescripte aus dem Verzeichnis <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die gleichen
4952        Methoden wie Lx-Office selber, sodass alle Fehlersituationen von der Kommandozeile überprüft werden können.
4953       </para>
4954
4955       <para>
4956        Wird dem Script kein weiterer Parameter übergeben, so wird nur eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
4957        sich aber auch Informationen auf verschiedene Art ausgeben lassen:
4958       </para>
4959
4960       <itemizedlist>
4961        <listitem>
4962         <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl --list</command>"</para>
4963
4964         <para>
4965          Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge sortiert, in der Lx-Office die Scripte ausführen würde. Es
4966          werden neben der Listenposition der Tag, die Abhängigkeitstiefe und die Priorität ausgegeben.
4967         </para>
4968        </listitem>
4969
4970        <listitem>
4971         <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl --tree</command>"</para>
4972
4973         <para>
4974          Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
4975          anderen abhängen. Die Unterknoten sind Scripte, die beim übergeordneten Script als Abhängigkeit eingetragen sind.
4976         </para>
4977        </listitem>
4978
4979        <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
4980         <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl --rtree</command>"</para>
4981
4982         <para>
4983          Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf.  Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
4984          Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das übergeordnete Script als Abhängigkeit eingetragen haben.
4985         </para>
4986        </listitem>
4987
4988        <listitem>
4989         <para>Baumform mit Postscriptausgabe: "<command>./scripts/dbupgrade2_tool.pl --graphviz</command>"</para>
4990
4991         <para>
4992          Benötigt das Tool "<command>graphviz</command>", um mit seiner Hilfe die <link
4993          linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte Baumform</link> in eine Postscriptdatei namens
4994          "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist vermutlich die übersichtlichste Form, weil hierbei jeder Knoten nur
4995          einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben werden.
4996         </para>
4997        </listitem>
4998
4999        <listitem>
5000         <para>
5001          Scripte, von denen kein anderes Script abhängt: "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"
5002         </para>
5003
5004         <para>
5005          Listet die Tags aller Scripte auf, von denen keine anderen Scripte abhängen.
5006         </para>
5007        </listitem>
5008       </itemizedlist>
5009      </sect2>
5010     </sect1>
5011
5012     <sect1 id="translations-languages" xreflabel="Translations and languages">
5013       <title>Translations and languages</title>
5014
5015       <sect2 id="translations-languages.introduction"
5016              xreflabel="Introduction to translations and languages">
5017         <title>Introduction</title>
5018
5019         <note>
5020           <para>Dieser Abschnitt ist in Englisch geschrieben, um
5021           internationalen Übersetzern die Arbeit zu erleichtern.</para>
5022         </note>
5023
5024         <para>This section describes how localization packages in Lx-Office
5025         are built. Currently the only language fully supported is German, and
5026         since most of the internal messages are held in English the English
5027         version is usable too.</para>
5028
5029         <para>A stub version of French is included but not functunal at this
5030         point.</para>
5031       </sect2>
5032
5033       <sect2 id="translations-languages.file-structure"
5034              xreflabel="File structure">
5035         <title>File structure</title>
5036
5037         <para>The structure of locales in Lx-Office is:</para>
5038
5039         <programlisting>lx-office/locale/&lt;langcode&gt;/</programlisting>
5040
5041         <para>where &lt;langcode&gt; stands for an abbreviation of the
5042         language package. The builtin packages use two letter <ulink
5043         url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
5044         but the actual name is not relevant for the program and can easily be
5045         extended to <ulink
5046         url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
5047         tags</ulink> (i.e. "en_GB"). In fact the original language packages
5048         from SQL Ledger are named in this way.</para>
5049
5050         <para>In such a language directory the following files are
5051         recognized:</para>
5052
5053         <variablelist>
5054           <varlistentry>
5055             <term>LANGUAGE</term>
5056
5057             <listitem>
5058               <para>This file is mandatory.</para>
5059
5060               <para>The <filename>LANGUAGE</filename> file contains the self
5061               descripted name of the language. It should contain a native
5062               representation first, and in parenthesis an english translation
5063               after that. Example:</para>
5064
5065               <programlisting>Deutsch (German)</programlisting>
5066             </listitem>
5067           </varlistentry>
5068
5069           <varlistentry>
5070             <term>charset</term>
5071
5072             <listitem>
5073               <para>This file should be present.</para>
5074
5075               <para>The <filename>charset</filename> file describes which
5076               charset a language package is written in and applies to all
5077               other language files in the package. It is possible to write
5078               some language packages without an explicit charset, but it is
5079               still strongly recommended. You'll never know in what
5080               environment your language package will be used, and neither
5081               UTF-8 nor Latin1 are guaranteed.</para>
5082
5083               <para>The whole content of this file is a string that can be
5084               recognized as a valid charset encoding. Example:</para>
5085
5086               <programlisting>UTF-8</programlisting>
5087             </listitem>
5088           </varlistentry>
5089
5090           <varlistentry>
5091             <term>all</term>
5092
5093             <listitem>
5094               <para>This file is mandatory.</para>
5095
5096               <para>The central translation file. It is essentially an inline
5097               Perl script autogenerated by <command>locales.pl</command>. To
5098               generate it, generate the directory and the two files mentioned
5099               above, and execute the following command:</para>
5100
5101               <programlisting>scripts/locales.pl &lt;langcode&gt;</programlisting>
5102
5103               <para>Otherwise you can simply copy one of the other languages.
5104               You will be told how many are missing like this:</para>
5105
5106               <programlisting>$ scripts/locales.pl en
5107 English - 0.6% - 2015/2028 missing</programlisting>
5108
5109               <para>A file named "<filename>missing</filename>" will be
5110               generated and can be edited. You can also edit the
5111               "<filename>all</filename>" file directly. Edit everything you
5112               like to fit the target language and execute
5113               <command>locales.pl</command> again. See how the missing words
5114               get fewer.</para>
5115             </listitem>
5116           </varlistentry>
5117
5118           <varlistentry>
5119             <term>Num2text</term>
5120
5121             <listitem>
5122               <para>Legacy code from SQL Ledger. It provides a means for
5123               numbers to be converted into natural language, like
5124               <literal>1523 =&gt; one thousand five hundred twenty
5125               three</literal>. If you want to provide it, it must be inlinable
5126               Perl code which provides a <function>num2text</function> sub. If
5127               an <function>init</function> sub exists it will be executed
5128               first.</para>
5129
5130               <para>Only used in the check and receipt printing module.</para>
5131             </listitem>
5132           </varlistentry>
5133
5134           <varlistentry>
5135             <term>special_chars</term>
5136
5137             <listitem>
5138               <para>Lx-Office comes with a lot of interfaces to different
5139               formats, some of which are rather picky with their accepted
5140               charset. The <filename>special_chars</filename> file contains a
5141               listing of chars not suited for different file format and
5142               provides substitutions. It is written in "Simple Ini" style,
5143               containing a block for every file format.</para>
5144
5145               <para>First entry should be the order of substitution for
5146               entries as a whitespace separated list. All entries are
5147               interpolated, so <literal>\n</literal>, <literal>\x20</literal>
5148               and <literal>\\</literal> all work.</para>
5149
5150               <para>After that every entry is a special char that should be
5151               translated when writing text into such a file.</para>
5152
5153               <para>Example:</para>
5154
5155               <programlisting>[Template/XML]
5156 order=&amp; &lt; &gt; \n
5157 &amp;=&amp;amp;
5158 &lt;=&amp;lt;
5159 &gt;=&amp;gt;
5160 \n=&lt;br&gt;</programlisting>
5161
5162               <para>Note the importance of the order in this example.
5163               Substituting &lt; and &gt; befor &amp; would lead to $gt; become
5164               &amp;amp;gt;</para>
5165
5166               <para>For a list of valid formats, see the German
5167               <filename>special_chars</filename> entry. As of this writing the
5168               following are recognized:</para>
5169
5170               <programlisting>HTML
5171 URL@HTML
5172 Template/HTML
5173 Template/XML
5174 Template/LaTeX
5175 Template/OpenDocument
5176 filenames</programlisting>
5177
5178               <para>The last of which is very machine dependant. Remember that
5179               a lot of characters are forbidden by some filesystems, for
5180               exmaple MS Windows doesn't like ':' in its files where Linux
5181               doesn't mind that. If you want the files created with your
5182               language pack to be portable, find all chars that could cause
5183               trouble.</para>
5184             </listitem>
5185           </varlistentry>
5186
5187           <varlistentry>
5188             <term>missing</term>
5189
5190             <listitem>
5191               <para>This file is not a part of the language package
5192               itself.</para>
5193
5194               <para>This is a file generated by
5195               <command>scripts/locales.pl</command> while processing your
5196               locales. It's only to have the missing entries singled out and
5197               does not belong to a language package.</para>
5198             </listitem>
5199           </varlistentry>
5200
5201           <varlistentry>
5202             <term>lost</term>
5203
5204             <listitem>
5205               <para>This file is not a part of the language package
5206               itself.</para>
5207
5208               <para>Another file generated by
5209               <command>scripts/locales.pl</command>. If for any reason a
5210               translation does not appear anymore and can be deleted, it gets
5211               moved here. The last 50 or so entries deleted are saved here in
5212               case you made a typo, so that you don't have to translate
5213               everything again. If a tranlsation is missing, the lost file is
5214               checked first. If you maintain a language package, you might
5215               want to keep this safe somewhere.</para>
5216             </listitem>
5217           </varlistentry>
5218         </variablelist>
5219       </sect2>
5220     </sect1>
5221
5222      <sect1 id="devel.style-guide">
5223       <title>Stil-Richtlinien</title>
5224
5225       <para>
5226        Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar zu machen. Dazu gehört zum Einen, dass der Code
5227        einheitlich eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte "Klammern" oder "Hash-Keys").
5228       </para>
5229
5230       <para>
5231        Diese Regeln sind keine Schikane sondern erleichtern allen das Leben!
5232       </para>
5233
5234       <para>
5235        Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
5236        nicht.
5237       </para>
5238
5239       <orderedlist>
5240        <listitem>
5241         <para>
5242          Es werden keine echten Tabs sondern Leerzeichen verwendet.
5243         </para>
5244        </listitem>
5245
5246        <listitem>
5247         <para>
5248          Die Einrückung beträgt zwei Leerzeichen. Beispiel:
5249         </para>
5250
5251         <programlisting>foreach my $row (@data) {
5252   if ($flag) {
5253     # do something with $row
5254   }
5255
5256   if ($use_modules) {
5257     $row-&gt;{modules} = MODULE-&gt;retrieve(
5258       id   =&gt; $row-&gt;{id},
5259       date =&gt; $use_now ? localtime() : $row-&gt;{time},
5260     );
5261   }
5262
5263   $report-&gt;add($row);
5264 }</programlisting>
5265        </listitem>
5266
5267        <listitem>
5268         <para>Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie der letzte Befehl. Beispiele:</para>
5269
5270         <programlisting>sub debug {
5271   ...
5272 }</programlisting>
5273
5274         <para>oder</para>
5275
5276         <programlisting>if ($form-&gt;{item_rows} &gt; 0) {
5277   ...
5278 }</programlisting>
5279        </listitem>
5280
5281        <listitem>
5282         <para>
5283          Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl / die öffnende schließende Klammer, die den Block gestartet
5284          hat, und nicht auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
5285         </para>
5286        </listitem>
5287
5288        <listitem>
5289         <para>
5290          Die Wörter "<function>else</function>", "<function>elsif</function>", "<function>while</function>" befinden sich auf der gleichen
5291          Zeile wie schließende geschweifte Klammern. Beispiele:
5292         </para>
5293
5294         <programlisting>if ($form-&gt;{sum} &gt; 1000) {
5295   ...
5296 } elsif ($form-&gt;{sum} &gt; 0) {
5297   ...
5298 } else {
5299   ...
5300 }
5301
5302 do {
5303   ...
5304 } until ($a &gt; 0);</programlisting>
5305        </listitem>
5306
5307        <listitem>
5308         <para>
5309          Parameter von Funktionsaufrufen müssen mit runden Klammern versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
5310          und grep-ähnliche Operatoren. Beispiel:
5311         </para>
5312
5313         <programlisting>$main::lxdebug-&gt;message(&quot;Could not find file.&quot;);
5314 %options = map { $_ =&gt; 1 } grep { !/^#/ } @config_file;</programlisting>
5315        </listitem>
5316
5317        <listitem>
5318         <para>
5319          Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
5320         </para>
5321
5322         <para>
5323          Generell gilt: Hashkeys und Arrayindices sollten nicht durch Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
5324          Blöcke schon. Beispiel:
5325         </para>
5326
5327         <programlisting>if (($form-&gt;{debug} == 1) &amp;&amp; ($form-&gt;{sum} - 100 &lt; 0)) {
5328   ...
5329 }
5330
5331 $array[$i + 1]             = 4;
5332 $form-&gt;{sum}              += $form-&gt;{&quot;row_$i&quot;};
5333 $form-&gt;{ $form-&gt;{index} } += 1;
5334
5335 map { $form-&gt;{sum} += $form-&gt;{&quot;row_$_&quot;} } 1..$rowcount;</programlisting>
5336        </listitem>
5337
5338        <listitem>
5339         <para>
5340          Mehrzeilige Befehle
5341         </para>
5342
5343         <orderedlist>
5344          <listitem>
5345           <para>
5346            Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
5347            werden, in der die ersten Funktionsparameter in der ersten Zeile stehen. Beispiel:
5348           </para>
5349
5350           <programlisting>$sth = $dbh-&gt;prepare(&quot;SELECT * FROM some_table WHERE col = ?&quot;,
5351                     $form-&gt;{some_col_value});</programlisting>
5352          </listitem>
5353
5354          <listitem>
5355           <para>
5356            Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer übersichtlichen Tabellenstruktur organisiert
5357            wird. Beispiel:
5358           </para>
5359
5360           <programlisting>my $rowcount = $form-&gt;{&quot;row_$i&quot;} ? $i
5361              : $form-&gt;{oldcount} ? $form-&gt;{oldcount} + 1
5362              :                     $form-&gt;{rowcount} - $form-&gt;{rowbase};</programlisting>
5363          </listitem>
5364         </orderedlist>
5365        </listitem>
5366
5367        <listitem>
5368         <para>
5369          Kommentare
5370         </para>
5371
5372         <orderedlist>
5373          <listitem>
5374           <para>Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der Code eingerückt sein.</para>
5375          </listitem>
5376
5377          <listitem>
5378           <para>Seitliche hängende Kommentare sollten einheitlich formatiert werden.</para>
5379          </listitem>
5380
5381          <listitem>
5382           <para>
5383            Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch zu verfassen. So wie ich keine Lust habe, französischen
5384            Quelltext zu lesen, sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein. Beispiel:
5385           </para>
5386
5387           <programlisting>my $found = 0;
5388 while (1) {
5389   last if $found;
5390
5391   # complicated check
5392   $found = 1 if //
5393 }
5394
5395 $i  = 0        # initialize $i
5396 $n  = $i;      # save $i
5397 $i *= $const;  # do something crazy
5398 $i  = $n;      # recover $i</programlisting>
5399          </listitem>
5400         </orderedlist>
5401        </listitem>
5402
5403        <listitem>
5404         <para>
5405          Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation gewünscht ist. Beispiel:
5406         </para>
5407
5408         <programlisting>$form-&gt;{sum}      = 0;
5409 $form-&gt;{&quot;row_$i&quot;} = $form-&gt;{&quot;row_$i&quot;} - 5;
5410 $some_hash{42}    = 54;</programlisting>
5411        </listitem>
5412
5413        <listitem>
5414         <para>
5415          Die maximale Zeilenlänge ist nicht beschränkt. Zeilenlängen unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
5416          wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann ist Lesbarkeit vorzuziehen.
5417         </para>
5418
5419         <para>
5420          Als Beispiel sei die Funktion <function>print_options</function> aus <filename>bin/mozilla/io.pl</filename> angeführt.
5421         </para>
5422        </listitem>
5423
5424        <listitem>
5425         <para>
5426          Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die
5427          diffs verfälschen.
5428         </para>
5429
5430         <para>
5431          Emacs und vim haben beide recht einfache Methoden zur Entfernung von trailing whitespace. Emacs kennt das Kommande
5432          <command>nuke-trailing-whitespace</command>, vim macht das gleiche manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
5433          BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern gebunden.
5434         </para>
5435        </listitem>
5436
5437        <listitem>
5438         <para>
5439          Es wird kein <command>perltidy</command> verwendet.
5440         </para>
5441
5442         <para>
5443          In der Vergangenheit wurde versucht, <command>perltidy</command> zu verwenden, um einen einheitlichen Stil zu erlangen. Es hat
5444          sich aber gezeigt, dass <command>perltidy</command>s sehr eigenwilliges Verhalten, was Zeilenumbrüche angeht, oftmals gut
5445          formatierten Code zerstört. Für den Interessierten sind hier die <command>perltidy</command>-Optionen, die grob den
5446          beschriebenen Richtlinien entsprechen:
5447         </para>
5448
5449         <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
5450 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
5451 -lp -vt=1 -vtc=1</programlisting>
5452        </listitem>
5453
5454        <listitem>
5455         <para>
5456          <varname>STDERR</varname> ist tabu. Unkonditionale Debugmeldungen auch.
5457         </para>
5458
5459         <para>
5460          Lx-Office bietet mit dem Modul <classname>LXDebug</classname> einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
5461          Grund, nach <varname>STDERR</varname> zu schreiben.
5462         </para>
5463
5464         <para>
5465          Die <classname>LXDebug</classname>-Methode "<function>message</function>" nimmt als ersten Paramter außerdem eine Flagmaske, für
5466          die die Meldung angezeigt wird, wobei "0" immer angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden und werden in
5467          den meisten Fällen auch vom Repository zurückgewiesen.
5468         </para>
5469        </listitem>
5470
5471        <listitem>
5472         <para>
5473          Alle neuen Module müssen use strict verwenden.
5474         </para>
5475
5476         <para>
5477          <varname>$form</varname>, <varname>$auth</varname>, <varname>$locale</varname>, <varname>$lxdebug</varname> und
5478          <varname>%myconfig</varname> werden derzeit aus dem main package importiert (siehe <xref linkend="devel.globals"/>. Alle anderen
5479          Konstrukte sollten lexikalisch lokal gehalten werden.
5480         </para>
5481        </listitem>
5482       </orderedlist>
5483     </sect1>
5484
5485     <sect1 id="devel.build-doc" xreflabel="Dokumentation erstellen">
5486      <title>Dokumentation erstellen</title>
5487
5488      <sect2 id="devel.build-doc.introduction">
5489       <title>Einführung</title>
5490
5491       <para>
5492        Diese Dokumentation ist in <productname>DocBook</productname> XML geschrieben. Zum Bearbeiten reicht grundsätzlich ein
5493        Text-Editor. Mehr Komfort bekommt man, wenn man einen dedizierten XML-fähigen Editor nutzt, der spezielle Unterstützung für
5494        <productname>DocBook</productname> mitbringt. Wir empfehlen dafür den <ulink url="http://www.xmlmind.com/xmleditor/">XMLmind XML
5495        Editor</ulink>, der bei nicht kommerzieller Nutzung kostenlos ist.
5496       </para>
5497      </sect2>
5498
5499      <sect2 id="devel.build-doc.required-software">
5500       <title>Benötigte Software</title>
5501
5502       <para>
5503        Bei <productname>DocBook</productname> ist Prinzip, dass ausschließlich die XML-Quelldatei bearbeitet wird. Aus dieser werden dann
5504        mit entsprechenden Stylesheets andere Formate wie PDF oder HTML erzeugt. Bei Lx-Office übernimmt diese Aufgabe das Shell-Script
5505        <command>scripts/build_doc.sh</command>.
5506       </para>
5507
5508       <para>
5509        Das Script benötigt zur Konvertierung verschiedene Softwarekomponenten, die im normalen Lx-Office-Betrieb nicht benötigt werden:
5510       </para>
5511
5512       <itemizedlist>
5513        <listitem>
5514         <para>
5515          <ulink url="http://www.oracle.com/technetwork/java/index.html">Java</ulink> in einer halbwegs aktuellen Version
5516         </para>
5517        </listitem>
5518
5519        <listitem>
5520         <para>
5521          Das Java-Build-System <ulink url="http://ant.apache.org/">Apache Ant</ulink>
5522         </para>
5523        </listitem>
5524
5525        <listitem>
5526         <para>
5527          Das Dokumentations-System Dobudish für <productname>DocBook</productname> 4.5, eine Zusammenstellung diverser Stylesheets und
5528          Grafiken zur Konvertierung von <productname>DocBook</productname> XML in andere Formate. Das Paket, das benötigt wird, ist zum
5529          Zeitpunkt der Dokumentationserstellung <filename>dobudish-nojre-1.1.4.zip</filename>, aus auf <ulink
5530          url="http://code.google.com/p/dobudish/downloads/list">code.google.com</ulink> bereitsteht.
5531         </para>
5532        </listitem>
5533       </itemizedlist>
5534
5535       <para>
5536        Apache Ant sowie ein dazu passendes Java Runtime Environment sind auf allen gängigen Plattformen verfügbar. Beispiel für
5537        Debian/Ubuntu:
5538       </para>
5539
5540       <programlisting>apt-get install ant openjdk-7-jre</programlisting>
5541
5542       <para>
5543        Nach dem Download von Dobudish muss Dobudish im Unterverzeichnis <filename>doc/build</filename> entpackt werden. Beispiel unter der
5544        Annahme, das <productname>Dobudish</productname> in <filename>$HOME/Downloads</filename> heruntergeladen wurde:
5545       </para>
5546
5547       <programlisting>cd doc/build
5548 unzip $HOME/Downloads/dobudish-nojre-1.1.4.zip</programlisting>
5549      </sect2>
5550
5551      <sect2 id="devel.build-doc.build">
5552       <title>PDFs und HTML-Seiten erstellen</title>
5553
5554       <para>
5555        Die eigentliche Konvertierung erfolgt nach Installation der benötigten Software mit einem einfachen Aufruf direkt aus dem
5556        Lx-Office-Installationsverzeichnis heraus:
5557       </para>
5558
5559       <programlisting>./scripts/build_doc.sh</programlisting>
5560      </sect2>
5561
5562      <sect2 id="devel.build-doc.repository">
5563       <title>Einchecken in das Git-Repository</title>
5564
5565       <para>
5566        Sowohl die XML-Datei als auch die erzeugten PDF- und HTML-Dateien sind Bestandteil des Git-Repositories. Daraus folgt, dass nach
5567        Änderungen am XML die PDF- und HTML-Dokumente ebenfalls gebaut und alles zusammen in einem Commit eingecheckt werden sollten.
5568       </para>
5569
5570       <para>
5571        Die "<filename>dobudish</filename>"-Verzeichnisse bzw. symbolischen Links gehören hingegen nicht in das Repository.
5572       </para>
5573      </sect2>
5574     </sect1>
5575   </chapter>
5576 </book>