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