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