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