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