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