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