1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4 <book id="lx-office-documentation" lang="de">
5 <title>Lx-Office: Installation, Konfiguration, Entwicklung</title>
7 <chapter id="Aktuelle-Hinweise">
8 <title>Aktuelle Hinweise</title>
10 <para>Aktuelle Installations- und Konfigurationshinweise gibt es:</para>
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>
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>
24 <para>im Lx-Office-Forum: <ulink
25 url="http://www.lx-office.org/forum/">http://www.lx-office.org/forum/</ulink></para>
31 <title>Installation und Grundkonfiguration</title>
33 <sect1 id="Benötigte-Software-und-Pakete">
34 <title>Benötigte Software und Pakete</title>
36 <sect2 id="Betriebssystem">
37 <title>Betriebssystem</title>
39 <para>Lx-Office ist für Linux konzipiert, und sollte auf jedem
40 unixoiden Betriebssystem zum Laufen zu kriegen sein. Getestet ist
41 diese Version im speziellen auf Debian und Ubuntu, grundsätzlich wurde
42 bei der Auswahl der Pakete aber darauf Rücksicht genommen, dass es
43 ohne große Probleme auf den derzeit aktuellen verbreiteten
44 Distributionen läuft.</para>
46 <para>Anfang 2012 sind das folgende Systeme, von denen bekannt ist,
47 dass Lx-Office auf ihnen läuft:</para>
51 <para>Ubuntu 8.04 LTS Hardy Heron, 10.04 LTS Lucid Lynx bis 11.10
56 <para>Debian 5.0 Lenny und 6.0 Squeeze</para>
60 <para>openSUSE 11.2 und 11.3</para>
64 <para>SuSE Linux Enterprice Server 11</para>
68 <para>Fedora 13 bis 15</para>
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>
77 <para>Alternativ dazu kann die normale Installation durchgeführt
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>
86 <para>Zur Installation das Paket in das entpackte Lx-Office
87 Verzeichnis entpacken:</para>
89 <programlisting>tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/</programlisting>
91 <para>Zusätzlich müssen dann noch die folgenden Pakete installiert
94 <programlisting>apt-get install libbit-vector-perl libsub-exporter-perl libclone-perl libclass-factory-util-perl</programlisting>
96 <para>Danach sollte der Installationscheck (siehe <xref
97 linkend="Pakete" />) die enthaltenen Pakete erkennen.</para>
100 <sect2 id="Pakete" xreflabel="Pakete">
101 <title>Pakete</title>
103 <para>Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist
104 Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
107 <para>Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die
108 nicht Bestandteil einer Standard-Perl-Installation sind:</para>
116 <para>Archive::Zip</para>
120 <para>Config::Std</para>
124 <para>DateTime</para>
136 <para>Email::Address</para>
144 <para>List::MoreUtils</para>
148 <para>Params::Validate</para>
152 <para>PDF::API2</para>
156 <para>Rose::Object</para>
160 <para>Rose::DB</para>
164 <para>Rose::DB::Object</para>
168 <para>Template</para>
172 <para>Text::CSV_XS</para>
176 <para>Text::Iconv</para>
184 <para>XML::Writer</para>
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
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>
202 <para>Gegenüber Version 2.6.3 ist <literal>JSON</literal> neu
203 hinzugekommen.</para>
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
213 <para>Die zu installierenden Pakete können in den verschiedenen
214 Distributionen unterschiedlich heißen.</para>
216 <para>Für Debian oder Ubuntu benötigen Sie diese Pakete:</para>
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>
226 <para>Für Fedora Core benötigen Sie diese Pakete:</para>
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>
234 <para>Für OpenSuSE benötigen Sie diese Pakete:</para>
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>
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>
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
250 <programlisting>./scripts/installation_check.pl</programlisting>
254 <sect1 id="Manuelle-Installation-des-Programmpaketes"
255 xreflabel="Manuelle Installation des Programmpaketes">
256 <title>Manuelle Installation des Programmpaketes</title>
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>
264 <programlisting>cd /var/www tar xvzf
265 lxoffice-erp-2.6.2.tgz</programlisting>
267 <para>Verändern Sie evtl. noch den Namen des Verzeichnisses mit</para>
269 <programlisting>mv lxoffice-erp/ lx-erp/</programlisting>
271 <para>Alternativ können Sie auch einen Alias in der
272 Webserverkonfiguration benutzen, um auf das tatsächliche
273 Installationsverzeichnis zu verweisen.</para>
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>
284 <para>Der folgende Befehl ändert den Besitzer für die oben genannten
285 Verzeichnisse auf einem Debian/Ubuntu-System:</para>
287 <programlisting>chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav</programlisting>
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>
293 <programlisting>chgrp www-data lx-office-erp/templates
294 chmod g+w lx-office-erp/templates</programlisting>
297 <sect1 id="config.config-file">
298 <title>Lx-Office-Konfigurationsdatei</title>
300 <sect2 id="config.config-file.introduction"
301 xreflabel="Einführung in die Konfigurationsdatei">
302 <title>Einführung</title>
304 <para>Seit Lx-Office 2.6.3. gibt es nur noch eine Konfigurationsdatei
305 die benötigt wird: <filename>config/lx_office.conf</filename> (kurz:
306 "die Hauptkonfigurationsdatei"). Diese muss bei der Erstinstallation
307 von Lx-Office bzw. der Migration von älteren Versionen angelegt
310 <para>Als Vorlage dient die Datei
311 <filename>config/lx_office.conf.default</filename> (kurz: "die
312 Default-Datei"):</para>
314 <programlisting>$ cp config/lx_office.conf.default config/lx_office.conf</programlisting>
316 <para>Die Default-Datei wird immer zuerst eingelesen. Werte, die in
317 der Hauptkonfigurationsdatei stehen, überschreiben die Werte aus der
318 Default-Datei. Die Hauptkonfigurationsdatei muss also nur die
319 Abschintte und Werte enthalten, die von denen der Default-Datei
322 <para>Diese Hauptkonfigurationsdatei ist dann eine
323 installationsspezifische Datei, d.h. sie enthält bspw. lokale
324 Passwörter und wird auch nicht im Versionsmanagement (git)
327 <para>Die Konfiguration ist ferner serverabhängig, d.h. für alle
328 Mandaten, bzw. Datenbanken gleich.</para>
331 <sect2 id="config.config-file.sections-parameters">
332 <title>Abschnitte und Parameter</title>
334 <para>Die Konfigurationsdatei besteht aus mehreren Teilen, die
335 entsprechend kommentiert sind:</para>
339 <para><literal>authentication</literal></para>
343 <para><literal>authentication/database</literal></para>
347 <para><literal>authentication/ldap</literal></para>
351 <para><literal>system</literal></para>
355 <para><literal>features</literal></para>
359 <para><literal>paths</literal></para>
363 <para><literal>applications</literal></para>
367 <para><literal>environment</literal></para>
371 <para><literal>print_templates</literal></para>
375 <para><literal>task_server</literal></para>
379 <para><literal>periodic_invoices</literal></para>
383 <para><literal>console</literal></para>
387 <para><literal>debug</literal></para>
391 <para>Die üblicherweise wichtigsten Parameter, die am Anfang
392 einzustellen oder zu kontrollieren sind, sind:</para>
394 <programlisting>[authentication]
395 admin_password = geheim
397 [authentication/database]
406 dbcharset = UTF-8</programlisting>
408 <para>Nutzt man wiederkehrende Rechnungen, kann man unter
409 <varname>[periodic_invoices]</varname> den Login eines Benutzers
410 angeben, der nach Erstellung der Rechnungen eine entsprechende E-Mail
411 mit Informationen über die erstellten Rechnungen bekommt.</para>
413 <para>Nutzt man den <link
414 linkend="config.task-server">Taskserver</link> für <link
415 linkend="features.periodic-invoices">wiederkehrende Rechnungen</link>,
416 muss unter <varname>[task_server]</varname> ein Login eines Benutzers
417 angegeben werden, mit dem sich der Taskserver an Lx-Office bei der
418 Datenbank anmeldet, die dem Benutzer zugewiesen ist.</para>
420 <para>Für Entwickler finden sich unter <varname>[debug]</varname>
421 wichtige Funktionen, um die Fehlersuche zu erleichtern.</para>
424 <sect2 id="config.config-file.prior-versions">
425 <title>Versionen vor 2.6.3</title>
427 <para>In älteren Lx-Office Versionen gab es im Verzeichnis
428 <filename>config</filename> die Dateien
429 <filename>authentication.pl</filename> und
430 <filename>lx-erp.conf</filename>, die jeweils Perl-Dateien waren. Es
431 gab auch die Möglichkeit, eine lokale Version der Konfigurationsdatei
432 zu erstellen (<filename>lx-erp-local.conf</filename>). Dies ist ab
433 2.6.3 nicht mehr möglich, aber auch nicht mehr nötig.</para>
435 <para>Beim Update von einer Lx-Office-Version vor 2.6.3 auf 2.6.3 oder
436 jünger müssen die Einstellungen aus den alten Konfigurationsdateien
437 manuell übertragen und die alten Konfigurationsdateien anschließend
438 gelöscht oder verschoben werden. Ansonsten zeigt Lx-Office eine
439 entsprechende Fehlermeldung an.</para>
443 <sect1 id="Anpassung-der-PostgreSQL-Konfiguration">
444 <title>Anpassung der PostgreSQL-Konfiguration</title>
446 <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
448 <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
449 <title>Zeichensätze/die Verwendung von UTF-8</title>
451 <para>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
452 werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
453 Version 8.2 oder neuer benutzt werden, und der
454 PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
455 angelegt worden sein.</para>
457 <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
458 “template1” “UTF8”, so kann auch Lx-Office mit UTF-8 betrieben werden.
459 Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
460 UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
461 Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl
464 <programlisting>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername</programlisting>
466 <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete
467 Versionsnummer angepasst werden.</para>
469 <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
471 <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
472 ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
473 Lx-Office mit ISO-8859-15 als Encoding betrieben werden.</para>
475 <para>Das Encoding einer Datenbank kann in <command>psql</command> mit
476 <literal>\l</literal> geprüft werden.</para>
479 <sect2 id="Änderungen-an-Konfigurationsdateien">
480 <title>Änderungen an Konfigurationsdateien</title>
482 <para>In der Datei <filename>postgresql.conf</filename>, die je nach
483 Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
484 <filename>/var/lib/pgsql/data/</filename> oder
485 <filename>/etc/postgresql/</filename>, muss sichergestellt werden,
486 dass TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
487 Parameter <varname>listen_address</varname> gesteuert. Laufen
488 PostgreSQL und Lx-Office auf demselben Rechner, so kann dort der Wert
489 <literal>localhost</literal> verwendet werden. Andernfalls müssen
490 Datenbankverbindungen auch von anderen Rechnern aus zugelassen werden,
491 was mit dem Wert <literal>*</literal> geschieht.</para>
493 <para>In der Datei <filename>pg_hba.conf</filename>, die im gleichen
494 Verzeichnis wie die <filename>postgresql.conf</filename> zu finden
495 sein sollte, müssen die Berichtigungen für den Zugriff geändert
496 werden. Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
497 Verbindungen immer zuzulassen:</para>
499 <programlisting>local all all trust
500 host all all 127.0.0.1 255.0.0.0 trust</programlisting>
502 <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
503 Passwort zuzulassen. Beispielsweise:</para>
505 <programlisting>local all lxoffice password
506 host all lxoffice 127.0.0.1 255.255.255.255 password</programlisting>
509 <sect2 id="Erweiterung-für-servergespeicherte-Prozeduren">
510 <title>Erweiterung für servergespeicherte Prozeduren</title>
512 <para>In der Datenbank <literal>template1</literal> muss die
513 Unterstützung für servergespeicherte Prozeduren eingerichet werden.
514 Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
515 führen Sie die folgenden Kommandos aus:</para>
517 <programlisting>create language 'plpgsql';</programlisting>
520 <sect2 id="Datenbankbenutzer-anlegen">
521 <title>Datenbankbenutzer anlegen</title>
523 <para>Wenn Sie nicht den Datenbanksuperuser “postgres” zum Zugriff
524 benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
525 anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
528 <programlisting>su - postgres createuser -d -P lxoffice</programlisting>
530 <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
531 Sie den evtl. voreingestellten Benutzer “postgres” auf “lxoffice” bzw.
532 den hier gewählten Benutzernamen.</para>
536 <sect1 id="Apache-Konfiguration">
537 <title>Webserver-Konfiguration</title>
540 <title>Grundkonfiguration mittels CGI</title>
543 <para>Für einen deutlichen Performanceschub sorgt die Ausführung
544 mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
545 <xref linkend="Apache-Konfiguration.FCGI" /> beschrieben.</para>
548 <para>Der Zugriff auf das Programmverzeichnis muss in der Apache
549 Webserverkonfigurationsdatei <literal>httpd.conf</literal> eingestellt
550 werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
551 anderen Datei hinzu, die beim Starten des Webservers eingelesen
554 <programlisting>AddHandler cgi-script .pl
555 Alias /lx-erp/ /var/www/lx-erp/
557 <Directory /var/www/lx-erp>
559 Includes FollowSymlinks
562 <Directory /var/www/lx-erp/users>
565 </Directory></programlisting>
567 <para>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher
568 das Lx-Office-Archiv entpacket haben.</para>
571 <para>Vor den einzelnen Optionen muss bei einigen Distributionen ein
572 Plus ‘<literal>+</literal>’ gesetzt werden.</para>
575 <para>Auf einigen Webservern werden manchmal die Grafiken und
576 Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft
577 geholfen, die folgende Option in die Konfiguration aufzunehmen:</para>
579 <programlisting>EnableSendfile Off</programlisting>
582 <sect2 id="Apache-Konfiguration.FCGI"
583 xreflabel="Konfiguration für FastCGI/FCGI">
584 <title>Konfiguration für FastCGI/FCGI</title>
586 <sect3 id="Apache-Konfiguration.FCGI.WasIstEs">
587 <title>Was ist FastCGI?</title>
589 <para>Direkt aus <ulink
590 url="http://de.wikipedia.org/wiki/FastCGI">Wikipedia</ulink>
593 <para><citation> FastCGI ist ein Standard für die Einbindung
594 externer Software zur Generierung dynamischer Webseiten in einem
595 Webserver. FastCGI ist vergleichbar zum Common Gateway Interface
596 (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu
597 umgehen. </citation></para>
600 <sect3 id="Apache-Konfiguration.FCGI.Warum">
601 <title>Warum FastCGI?</title>
603 <para>Perl Programme (wie Lx-Office eines ist) werden nicht statisch
604 kompiliert. Stattdessen werden die Quelldateien bei jedem Start
605 übersetzt, was bei kurzen Laufzeiten einen Großteil der Laufzeit
606 ausmacht. Während SQL Ledger einen Großteil der Funktionalität in
607 einzelne Module kapselt, um immer nur einen kleinen Teil laden zu
608 müssen, ist die Funktionalität von Lx-Office soweit gewachsen, dass
609 immer mehr Module auf den Rest des Programms zugreifen. Zusätzlich
610 benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
611 entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies
612 führt dazu dass ein Lx-Office Aufruf der Kernmasken mittlerweile
613 deutlich länger dauert als früher, und dass davon 90% für das Laden
614 der Module verwendet wird.</para>
616 <para>Mit FastCGI werden nun die Module einmal geladen, und danach
617 wird nur die eigentliche Programmlogik ausgeführt.</para>
620 <sect3 id="Apache-Konfiguration.FCGI.WebserverUndPlugin">
621 <title>Getestete Kombinationen aus Webservern und Plugin</title>
623 <para>Folgende Kombinationen sind getestet:</para>
627 <para>Apache 2.2.11 (Ubuntu) und mod_fcgid.</para>
631 <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
635 <para>Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer
636 Zeit nicht mehr weiter entwickelt wird. Im Folgenden wird auf
637 mod_fastcgi nicht mehr explizit eingegangen.</para>
639 <para>Als Perl Backend wird das Modul <filename>FCGI.pm</filename>
643 <para>FCGI 0.69 und höher ist extrem strict in der Behandlung von
644 Unicode, und verweigert bestimmte Eingaben von Lx-Office. Falls es
645 Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
646 Vorgängerversion FCGI 0.68 ausgewichen werden.</para>
648 <para>Mit CPAN lässt sie sich die Vorgängerversion wie folgt
651 <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
655 <sect3 id="Apache-Konfiguration.FCGI.Konfiguration">
656 <title>Konfiguration des Webservers</title>
658 <para>Bevor Sie versuchen, eine Lx-Office Installation unter FCGI
659 laufen zu lassen, empfliehlt es sich die Installation ersteinmal
660 unter CGI aufzusetzen. FCGI macht es nicht einfach Fehler zu
661 debuggen die beim ersten aufsetzen auftreten können. Sollte die
662 Installation schon funktionieren, lesen Sie weiter.</para>
664 <para>Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann
665 unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:</para>
667 <programlisting>a2enmod fcgid</programlisting>
669 <para>Die Konfiguration für die Verwendung von Lx-Office mit FastCGI
670 erfolgt durch Anpassung der vorhandenen <function>Alias</function>-
671 und <function>Directory</function>-Direktiven. Dabei wird zwischen
672 dem Installationspfad von Lx-Office im Dateisystem
673 ("<filename>/path/to/lx-office-erp</filename>") und der URL
674 unterschieden, unter der Lx-Office im Webbrowser erreichbar ist
675 ("<filename>/url/for/lx-office-erp</filename>").</para>
677 <para>Folgender Konfigurationsschnipsel funktioniert mit
680 <programlisting>AliasMatch ^/url/for/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
681 Alias /url/for/lx-office-erp/ /path/to/lx-office-erp/
683 <Directory /path/to/lx-office-erp>
685 Options ExecCGI Includes FollowSymlinks
690 <DirectoryMatch /path/to/lx-office-erp/users>
693 </DirectoryMatch></programlisting>
695 <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
696 die maximale Größe eines Requests. Diese sollte wie folgt
697 hochgesetzt werden:</para>
699 <programlisting>FcgidMaxRequestLen 10485760</programlisting>
701 <para>Das ganze sollte dann so aussehen:</para>
703 <programlisting>AddHandler fcgid-script .fpl
704 AliasMatch ^/url/for/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
705 Alias /url/for/lx-office-erp/ /path/to/lx-office-erp/
706 FcgidMaxRequestLen 10485760
708 <Directory /path/to/lx-office-erp>
710 Options ExecCGI Includes FollowSymlinks
715 <DirectoryMatch /path/to/lx-office-erp/users>
718 </DirectoryMatch></programlisting>
720 <para>Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle
721 Zugriffe auf die einzelnen Scripte werden auf diesen umgeleitet.
722 Dadurch, dass zur Laufzeit öfter mal Scripte neu geladen werden,
723 gibt es hier kleine Performance-Einbußen.</para>
725 <para>Es ist möglich, die gleiche Lx-Office Version parallel unter
726 CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven
727 wie oben beschrieben, die URLs werden aber umgeleitet:</para>
729 <programlisting># Zugriff über CGI
730 Alias /url/for/lx-office-erp /path/to/lx-office-erp
732 # Zugriff mit mod_fcgid:
733 AliasMatch ^/url/for/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
734 Alias /url/for/lx-office-erp-fcgid/ /path/to/lx-office-erp/</programlisting>
736 <para>Dann ist unter <filename>/url/for/lx-office-erp/</filename>
737 die normale Version erreichbar, und unter
738 <constant>/url/for/lx-office-erp-fcgid/</constant> die
739 FastCGI-Version.</para>
744 <sect1 id="config.task-server">
745 <title>Der Task-Server</title>
747 <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
748 regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
749 festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
750 wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
751 benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
754 <sect2 id="Konfiguration-des-Task-Servers">
755 <title>Verfügbare und notwendige Konfigurationsoptionen</title>
757 <para>Die Konfiguration erfolgt über den Abschnitt
758 <literal>[task_server]</literal> in der Datei
759 <filename>config/lx_office.conf</filename>. Die dort verfügbaren
760 Optionen sind:</para>
764 <term><varname>login</varname></term>
767 <para>gültiger Lx-Office-Benutzername, der benutzt wird, um die
768 zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss
769 in der Administration angelegt werden. Diese Option muss
770 angegeben werden.</para>
775 <term><varname>run_as</varname></term>
778 <para>Wird der Server vom Systembenutzer <literal>root</literal>
779 gestartet, so wechselt er auf den mit <literal>run_as</literal>
780 angegebenen Systembenutzer. Der Systembenutzer muss dieselben
781 Lese- und Schreibrechte haben, wie auch der Webserverbenutzer
783 linkend="Manuelle-Installation-des-Programmpaketes" />). Daher
784 ist es sinnvoll, hier denselben Systembenutzer einzutragen,
785 unter dem auch der Webserver läuft.</para>
790 <term><varname>debug</varname></term>
793 <para>Schaltet Debug-Informationen an und aus.</para>
799 <sect2 id="Einbinden-in-den-Boot-Prozess">
800 <title>Automatisches Starten des Task-Servers beim Booten</title>
802 <para>Der Task-Server verhält sich von seinen Optionen her wie ein
803 reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim
804 Starten automatisch in das Lx-Office-Installationsverzeichnis.</para>
806 <para>Deshalb ist es möglich, ihn durch Setzen eines symbolischen
807 Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
808 einzubinden. Da das bei neueren Linux-Distributionen aber nicht
809 zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
810 anstelle eines symbolischen Links verwendet werden können.</para>
813 <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
816 <para>Kopieren Sie die Datei
817 <filename>scripts/boot/system-v/lx-office-task-server</filename>
818 nach <filename>/etc/init.d/lx-office-task-server</filename>. Passen
819 Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
820 <literal>DAEMON=....</literal>). Binden Sie das Script in den
821 Boot-Prozess ein. Dies ist distributionsabhängig:</para>
825 <para>Debian-basierende Systeme:</para>
827 <programlisting>update-rc.d lx-office-task-server defaults
828 # Nur bei Debian Squeeze und neuer:
829 insserv lx-office-task-server</programlisting>
833 <para>OpenSuSE und Fedora Core:</para>
835 <programlisting>chkconfig --add lx-office-task-server</programlisting>
839 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
840 werden: <command>/etc/init.d/lx-office-task-server
841 start</command></para>
845 <title>Upstart-basierende Systeme (z.B. Ubuntu)</title>
847 <para>Kopieren Sie die Datei
848 <filename>scripts/boot/upstart/lx-office-task-server.conf</filename>
849 nach <filename>/etc/init/lx-office-task-server.conf</filename>.
850 Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
851 <literal>exec ....</literal>).</para>
853 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
854 werden: <command>service lx-office-task-server
855 start</command></para>
859 <sect2 id="Prozesskontrolle">
860 <title>Wie der Task-Server gestartet und beendet wird</title>
862 <para>Der Task-Server wird wie folgt kontrolliert:</para>
864 <programlisting>./scripts/task_server.pl Befehl</programlisting>
866 <para><literal>Befehl</literal> ist dabei eine der folgenden
871 <para><literal>start</literal> startet eine neue Instanz des
872 Task-Servers. Die Prozess-ID wird innerhalb des
873 <filename>users</filename>-Verzeichnisses abgelegt.</para>
877 <para><literal>stop</literal> beendet einen laufenden
882 <para><literal>restart</literal> beendet und startet ihn
887 <para><literal>status</literal> berichtet, ob der Task-Server
892 <para>Der Task-Server wechselt beim Starten automatisch in das
893 Lx-Office-Installationsverzeichnis.</para>
895 <para>Dieselben Optionen können auch für die SystemV-basierenden
896 Runlevel-Scripte benutzt werden (siehe oben).</para>
900 <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
901 <title>Benutzerauthentifizierung und Administratorpasswort</title>
903 <para>Informationen über die Einrichtung der Benutzerauthentifizierung,
904 über die Verwaltung von Gruppen und weitere Einstellungen</para>
906 <sect2 id="Grundlagen-zur-Benutzerauthentifizierung">
907 <title>Grundlagen zur Benutzerauthentifizierung</title>
909 <para>Lx-Office verwaltet die Benutzerinformationen in einer
910 Datenbank, die im folgenden “Authentifizierungsdatenbank” genannt
911 wird. Für jeden Benutzer kann dort eine eigene Datenbank für die
912 eigentlichen Finanzdaten hinterlegt sein. Diese beiden Datenbanken
913 können, müssen aber nicht unterschiedlich sein.</para>
915 <para>Im einfachsten Fall gibt es für Lx-Office nur eine einzige
916 Datenbank, in der sowohl die Benutzerinformationen als auch die Daten
917 abgelegt werden.</para>
919 <para>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
920 entweder gegen die Authentifizierungsdatenbank oder gegen einen
921 LDAP-Server überprüft werden.</para>
923 <para>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
924 Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
925 Konfigurationsdatei <filename>config/lx_office.conf</filename>
926 festgelegt. Diese muss bei der Installation und bei einem Upgrade von
927 einer Version vor v2.6.0 angelegt werden. Eine
928 Beispielkonfigurationsdatei
929 <filename>config/lx_office.conf.default</filename> existiert, die als
930 Vorlage benutzt werden kann.</para>
933 <sect2 id="Administratorpasswort">
934 <title>Administratorpasswort</title>
936 <para>Das Passwort, das zum Zugriff auf das Aministrationsinterface
937 benutzt wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch
938 nur dort und nicht mehr im Administrationsinterface selber geändert
939 werden. Der Parameter dazu heißt <varname>admin_password</varname> im
940 Abschnitt <varname>[authentication]</varname>.</para>
943 <sect2 id="Authentifizierungsdatenbank">
944 <title>Authentifizierungsdatenbank</title>
946 <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den
947 Parametern in <varname>[authentication/database]</varname>
948 konfiguriert. Hier sind die folgenden Parameter anzugeben:</para>
952 <term><literal>host</literal></term>
955 <para>Der Rechnername oder die IP-Adresse des
956 Datenbankservers</para>
961 <term><literal>port</literal></term>
964 <para>Die Portnummer des Datenbankservers, meist 5432</para>
969 <term><literal>db</literal></term>
972 <para>Der Name der Authentifizierungsdatenbank</para>
977 <term><literal>user</literal></term>
980 <para>Der Benutzername, mit dem sich Lx-Office beim
981 Datenbankserver anmeldet (z.B.
982 "<literal>postgres</literal>")</para>
987 <term><literal>password</literal></term>
990 <para>Das Passwort für den Datenbankbenutzer</para>
995 <para>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
996 automatisch anlegen (mehr dazu siehe unten).</para>
999 <sect2 id="Passwortüberprüfung">
1000 <title>Passwortüberprüfung</title>
1002 <para>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen
1003 die Authentifizierungsdatenbank und gegen einen externen LDAP- oder
1004 Active-Directory-Server. Welche davon benutzt wird, regelt der
1005 Parameter <varname>module</varname> im Abschnitt
1006 <varname>[authentication]</varname>.</para>
1008 <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
1009 gespeichert werden, so muss der Parameter <varname>module</varname>
1010 den Wert <literal>DB</literal> enthalten. In diesem Fall können sowohl
1011 der Administrator als auch die Benutzer selber ihre Psaswörter in
1012 Lx-Office ändern.</para>
1014 <para>Soll hingegen ein externer LDAP- oder Active-Directory-Server
1015 benutzt werden, so muss der Parameter <varname>module</varname> auf
1016 <literal>LDAP</literal> gesetzt werden. In diesem Fall müssen
1017 zusätzliche Informationen über den LDAP-Server im Abschnitt
1018 <literal>[authentication/ldap]</literal> angegeben werden:</para>
1022 <term><literal>host</literal></term>
1025 <para>Der Rechnername oder die IP-Adresse des LDAP- oder
1026 Active-Directory-Servers. Diese Angabe ist zwingend
1027 erforderlich.</para>
1032 <term><literal>port</literal></term>
1035 <para>Die Portnummer des LDAP-Servers; meist 389.</para>
1040 <term><literal>tls</literal></term>
1043 <para>Wenn Verbindungsverschlüsselung gewünscht ist, so diesen
1044 Wert auf ‘<literal>1</literal>’ setzen, andernfalls auf
1045 ‘<literal>0</literal>’ belassen</para>
1050 <term><literal>attribute</literal></term>
1053 <para>Das LDAP-Attribut, in dem der Benutzername steht, den der
1054 Benutzer eingegeben hat. Für Active-Directory-Server ist dies
1055 meist ‘<literal>sAMAccountName</literal>’, für andere
1056 LDAP-Server hingegen ‘<literal>uid</literal>’. Diese Angabe ist
1057 zwingend erforderlich.</para>
1062 <term><literal>base_dn</literal></term>
1065 <para>Der Abschnitt des LDAP-Baumes, der durchsucht werden soll.
1066 Diese Angabe ist zwingend erforderlich.</para>
1071 <term><literal>filter</literal></term>
1074 <para>Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort
1075 <literal><%login%></literal>, so wird dieses durch den vom
1076 Benutzer eingegebenen Benutzernamen ersetzt. Andernfalls wird
1077 der LDAP-Baum nach einem Element durchsucht, bei dem das oben
1078 angegebene Attribut mit dem Benutzernamen identisch ist.</para>
1083 <term><literal>bind_dn</literal> und
1084 <literal>bind_password</literal></term>
1087 <para>Wenn der LDAP-Server eine Anmeldung erfordert, bevor er
1088 durchsucht werden kann (z.B. ist dies bei
1089 Active-Directory-Servern der Fall), so kann diese hier angegeben
1090 werden. Für Active-Directory-Server kann als
1091 ‘<literal>bind_dn</literal>’ entweder eine komplette LDAP-DN wie
1092 z.B. ‘<literal>cn=Martin
1093 Mustermann,cn=Users,dc=firmendomain</literal>’ auch nur der
1094 volle Name des Benutzers eingegeben werden; in diesem Beispiel
1095 also ‘<literal>Martin Mustermann</literal>’.</para>
1101 <sect2 id="Name-des-Session-Cookies">
1102 <title>Name des Session-Cookies</title>
1104 <para>Sollen auf einem Server mehrere Lx-Office-Installationen
1105 aufgesetzt werden, so müssen die Namen der Session-Cookies für alle
1106 Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
1107 Parameter <varname>cookie_name</varname> im Abschnitt
1108 <varname>[authentication]</varname>gesetzt.</para>
1110 <para>Diese Angabe ist optional, wenn nur eine Installation auf dem
1111 Server existiert.</para>
1114 <sect2 id="Anlegen-der-Authentifizierungsdatenbank">
1115 <title>Anlegen der Authentifizierungsdatenbank</title>
1117 <para>Nachdem alle Einstellungen in
1118 <filename>config/lx_office.conf</filename> vorgenommen wurden, muss
1119 Lx-Office die Authentifizierungsdatenbank anlegen. Dieses geschieht
1120 automatisch, wenn Sie sich im Administrationsmodul anmelden, das unter
1121 der folgenden URL erreichbar sein sollte:</para>
1124 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1128 <sect1 id="Benutzer--und-Gruppenverwaltung">
1129 <title>Benutzer- und Gruppenverwaltung</title>
1131 <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
1132 angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
1133 folgender URL finden:</para>
1136 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1138 <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
1139 <filename>config/lx_office.conf</filename> eingetragen haben.</para>
1141 <sect2 id="Zusammenhänge">
1142 <title>Zusammenhänge</title>
1144 <para>Lx-Office verwendet eine Datenbank zum Speichern all seiner
1145 Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
1146 mit Lx-Office arbeiten zu können, muss eine Person einen
1147 Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
1148 Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
1149 möglich und normal, dass mehreren Benutzern die selbe Datenbank
1150 zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
1153 <para>Die Basisdaten der Benutzer, die in der Administration
1154 eingegeben werden können, werden in einer zweiten Datenbank
1155 gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
1156 ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
1157 Pro Lx-Office-Installation gibt es nur eine
1158 Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
1161 <para>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
1162 Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
1163 gestattet, so werden der entsprechenden Menüpunkte auch nicht
1164 angezeigt. Diese Rechte werden ebenfalls in der
1165 Authentifizierungsdatenbank gespeichert.</para>
1167 <para>Um Rechte verteilen zu können, verwendet Lx-Office ein
1168 Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
1169 erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
1170 mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
1171 Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
1172 Benutzer Mitglied ist.</para>
1174 <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
1175 Benutzer angelegt werden sollten, lautet:</para>
1177 <orderedlist numeration="arabic">
1179 <para>Datenbank anlegen</para>
1183 <para>Gruppen anlegen</para>
1187 <para>Benutzer anlegen</para>
1191 <para>Benutzer den Gruppen zuordnen</para>
1196 <sect2 id="Datenbanken-anlegen">
1197 <title>Datenbanken anlegen</title>
1199 <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
1200 den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
1201 Beispielen ist dies ‘<literal>lxoffice</literal>’).</para>
1203 <para>Wenn Sie für die Lx-Office-Installation nicht den europäischen
1204 Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
1205 müssen Sie vor dem Anlegen der Datenbank in der Datei
1206 <filename>config/lx_office.conf</filename> die Variable
1207 <literal>dbcharset</literal> im Abschnitt <literal>system</literal>
1208 auf den Wert ‘<literal>UTF-8</literal>’ setzen. Zusätzlich muss beim
1209 Anlegen der Datenbank ‘<literal>UTF-8 Unicode</literal>’ als
1210 Schriftsatz ausgewählt werden.</para>
1212 <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
1213 verwenden müssen, da diese Einstellungen momentan global in Lx-Office
1214 vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
1215 Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
1216 angelegt worden sein.</para>
1219 <sect2 id="Gruppen-anlegen">
1220 <title>Gruppen anlegen</title>
1222 <para>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
1223 Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
1224 Anlegen können Sie die verschiedenen Bereiche wählen, auf die
1225 Mitglieder dieser Gruppe Zugriff haben sollen.</para>
1227 <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
1228 Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
1229 Datenbanken, die in dieser Installation verwaltet werden.</para>
1232 <sect2 id="Benutzer-anlegen">
1233 <title>Benutzer anlegen</title>
1235 <para>Beim Anlegen von Benutzern werden für viele Parameter
1236 Standardeinstellungen vorgenommen, die den Gepflogenheiten des
1237 deutschen Raumes entsprechen.</para>
1239 <para>Zwingend anzugeben sind der Loginname sowie die komplette
1240 Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
1241 Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
1242 gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
1243 aktiv, so ist das Passwort-Feld deaktiviert.</para>
1245 <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
1246 eben angelegten Datenbanken eingetragen werden.</para>
1249 <sect2 id="Gruppenmitgliedschaften-verwalten">
1250 <title>Gruppenmitgliedschaften verwalten</title>
1252 <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
1253 Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
1255 <orderedlist numeration="arabic">
1257 <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
1258 folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
1263 <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
1264 der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
1265 alle im System angelegten Gruppen und Benutzer enthält. Durch
1266 Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
1267 Gruppe in der ausgewählten Spalte hinzugefügt.</para>
1272 <sect2 id="Migration-alter-Installationen">
1273 <title>Migration alter Installationen</title>
1275 <para>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird,
1276 in der die Benutzerdaten noch im Dateisystem im Verzeichnis
1277 <literal>users</literal> verwaltet wurden, so bietet Lx-Office die
1278 Möglichkeit, diese Benutzerdaten automatisch in die
1279 Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
1280 sich nach dem Update der Installation das erste Mal im
1281 Administrationsbereich anmeldet. Findet Lx-Office die Datei
1282 <literal>users/members</literal>, so wird der Migrationsprozess
1285 <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
1286 Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
1287 Lx-Office noch die Möglichkeit an, dass automatisch eine
1288 Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
1289 Funktionen von Lx-Office gewährt. Alle migrierten Benutzern werden
1290 Mitglied in dieser Gruppe. Damit wird das Verhalten von Lx-Office bis
1291 Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
1292 sich sofort wieder anmelden und mit dem System arbeiten.</para>
1296 <sect1 id="Drucken-mit-Lx-Office">
1297 <title>Drucken mit Lx-Office</title>
1299 <para>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen.
1300 Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
1301 einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
1302 Debianoiden Betriebssystemen sind das die Pakete:</para>
1304 <para><literal>texlive-latex-base texlive-latex-extra
1305 texlive-fonts-recommended</literal></para>
1307 <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
1308 von den Standardvorlagen verwendet werden.</para>
1310 <para>TODO: rpm Pakete.</para>
1312 <para>In den allermeisten Installationen sollte drucken jetzt schon
1313 funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
1314 Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
1315 die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
1320 <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
1321 LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
1322 Vorlagen aus der Community auf. Installieren Sie die entsprechenden
1327 <para>! Package inputenc Error: Unicode char \u8:æ¡
\9c not set up for
1328 use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
1329 einer Standardinstallation exotische utf8 Zeichen zu drucken.
1330 TeXLive unterstützt von Haus nur romanische Schriften und muss mit
1331 diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
1332 Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
1336 <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
1337 heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
1338 Prüfen Sie den Namen in der Konfiguration (Standard:
1339 <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
1340 (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
1344 <sect1 id="OpenDocument-Vorlagen">
1345 <title>OpenDocument-Vorlagen</title>
1347 <para>Lx-Office unterstützt die Verwendung von Vorlagen im
1348 OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
1349 Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
1350 diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
1351 OpenDocument-Vorlagen zu aktivieren muss in der Datei
1352 <filename>config/lx_office.conf</filename> die Variable
1353 <literal>opendocument</literal> im Abschnitt
1354 <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
1355 Dieses ist die Standardeinstellung.</para>
1357 <para>Weiterhin muss in der Datei
1358 <filename>config/lx_office.conf</filename> die Variable
1359 <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
1360 die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
1361 Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
1364 <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
1365 weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
1366 OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
1367 neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
1368 (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
1369 Andere Distributionen enthalten ihn in anderen Paketen.</para>
1371 <para>Nach der Installation müssen in der Datei
1372 <filename>config/lx_config.conf</filename> zwei weitere Variablen
1373 angepasst werden: <literal>openofficeorg_writer</literal> muss den
1374 vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
1375 <literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
1376 enthalten. Beide stehen im Abschnitt
1377 <literal>applications</literal>.</para>
1379 <para>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
1380 OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
1381 Variable <literal>$openofficeorg_daemon</literal> gesetzt ist, startet
1382 ein OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
1383 bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
1384 benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
1385 reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
1386 werden muss. Der Nachteil ist, dass diese Methode Python und die
1387 Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
1390 <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
1391 wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
1392 mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
1393 Dokumentenvorlage enthalten sein und
1394 “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
1395 ‘<literal>templates/mastertemplates/German/invoice.odt</literal>’
1396 enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
1397 ebenfalls enthalten sein muss.</para>
1399 <para>Als letztes muss herausgefunden werden, welchen Namen
1400 OpenOffice.org Writer dem Verzeichnis mit den Benutzereinstellungen
1401 gibt. Unter Debian ist dies momentan
1402 <literal>~/.openoffice.org2</literal>. Sollte der Name bei Ihrer
1403 OpenOffice.org-Installation anders sein, so muss das Verzeichnis
1404 <literal>users/.openoffice.org2</literal> entsprechend umbenannt werden.
1405 Ist der Name z.B. einfach nur <literal>.openoffice</literal>, so wäre
1406 folgender Befehl auszuführen:</para>
1408 <para><literal>mv users/.openoffice.org2
1409 users/.openoffice</literal></para>
1411 <para>Dieses Verzeichnis, wie auch das komplette
1412 <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
1413 sein. Dieses wurde bereits erledigt (siehe <xref
1414 linkend="Manuelle-Installation-des-Programmpaketes" />), kann aber
1415 erneut überprüft werden, wenn die Konvertierung nach PDF
1419 <sect1 id="config.eur">
1420 <title>Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
1423 <sect2 id="config.eur.introduction"
1424 xreflabel="Einführung in die Konfiguration zur EUR">
1425 <title>Einführung</title>
1427 <para>Lx-Office besaß bis inklusive Version 2.6.3 einen
1428 Konfigurationsparameter namens <varname>eur</varname>, der sich in der
1429 Konfigurationsdatei <filename>config/lx_office.conf</filename>
1430 befindet. Somit galt er für alle Mandanten, die in dieser Installation
1431 benutzt wurden.</para>
1433 <para>Mit der nachfolgenden Version wurde der Parameter zum Einen in
1434 die Mandantendatenbank verschoben und dabei auch gleich in drei
1435 Einzelparameter aufgeteilt, mit denen sich das Verhalten genauer
1436 steuern lässt.</para>
1439 <sect2 id="config.eur.parameters"
1440 xreflabel="Konfigurationsparameter für EUR">
1441 <title>Konfigurationsparameter</title>
1443 <para>Es gibt drei Parameter, die die Gewinnermittlungsart,
1444 Versteuerungsart und die Warenbuchungsmethode regeln:</para>
1448 <term><varname>profit_determination</varname></term>
1451 <para>Dieser Parameter legt die Berechnungsmethode für die
1452 Gewinnermittlung fest. Er enthält entweder
1453 <literal>balance</literal> für
1454 Betriebsvermögensvergleich/Bilanzierung oder
1455 <literal>income</literal> für die
1456 Einnahmen-Überschuss-Rechnung.</para>
1461 <term><varname>accounting_method</varname></term>
1464 <para>Dieser Parameter steuert die Buchungs- und
1465 Berechnungsmethoden für die Versteuerungsart. Er enthält
1466 entweder <literal>accrual</literal> für die Soll-Versteuerung
1467 oder <literal>cash</literal> für die Ist-Versteuerung.</para>
1472 <term><varname>inventory_system</varname></term>
1475 <para>Dieser Parameter legt die Warenbuchungsmethode fest. Er
1476 enthält entweder <literal>perpetual</literal> für die
1477 Bestandsmethode oder <literal>periodic</literal> für die
1478 Aufwandsmethode.</para>
1483 <para>Zum Vergleich der Funktionalität bis und nach 2.6.3:
1484 <varname>eur</varname> = 1 bedeutete Einnahmen-Überschuss-Rechnung,
1485 Ist-Versteuerung und Aufwandsmethode. <varname>eur</varname> = 0
1486 bedeutete hingegen Bilanzierung, Soll-Versteuerung und
1487 Bestandsmethode.</para>
1489 <para>Die Konfiguration "<varname>eur</varname>" unter
1490 <varname>[system]</varname> in der <link
1491 linkend="config.config-file">Konfigurationsdatei</link>
1492 <filename>config/lx_office.conf</filename> wird nun nicht mehr
1493 benötigt und kann entfernt werden. Dies muss manuell geschehen.</para>
1496 <sect2 id="config.eur.setting-parameters">
1497 <title>Festlegen der Parameter</title>
1499 <para>Beim Anlegen eines neuen Mandanten bzw. einer neuen Datenbank in
1500 der Admininstration können diese Optionen nun unabhängig voneinander
1501 eingestellt werden.</para>
1503 <para>Beim Upgrade bestehender Mandanten wird eur ausgelesen und die
1504 Variablen werden so gesetzt, daß sich an der Funktionalität nichts
1507 <para>Die aktuelle Konfiguration wird unter Nummernkreise und
1508 Standardkonten unter dem neuen Punkt "Einstellungen" angezeigt
1509 (read-only). Eine spätere Änderung ist für einen bestehenden Mandanten
1510 nicht mehr möglich. Dies war auch vorher nicht möglich, bzw.
1511 vorhandene Daten wurden so belassen und haben damit die Ergebnisse
1515 <sect2 id="config.eur.inventory-system-perpetual">
1516 <title>Bemerkungen zu Bestandsmethode</title>
1518 <para>Die Bestandsmethode ist eigentlich eine sehr elegante Methode,
1519 funktioniert in Lx-Office aber nur unter bestimmten Bedingungen:
1520 Voraussetzung ist, daß auch immer alle Einkaufsrechnungen gepflegt
1521 werden, und man beim Jahreswechsel nicht mit einer leeren Datenbank
1522 anfängt, da bei jedem Verkauf anhand der gesamten Rechnungshistorie
1523 der Einkaufswert der Ware nach dem FIFO-Prinzip aus den
1524 Einkaufsrechnungen berechnet wird.</para>
1526 <para>Die Bestandsmethode kann vom Prinzip her also nur funktioneren,
1527 wenn man mit den Buchungen bei Null anfängt, und man kann auch nicht
1528 im laufenden Betrieb von der Aufwandsmethode zur Bestandsmethode
1532 <sect2 id="config.eur.knonw-issues">
1533 <title>Bekannte Probleme</title>
1535 <para>Bei bestimmten Berichten kann man derzeit noch inviduell
1536 einstellen, ob man nach Ist- oder Sollversteuerung auswertet, und es
1537 werden im Code Variablen wie $accrual oder $cash gesetzt. Diese
1538 Codestellen wurden noch nicht angepasst, sondern nur die, wo bisher
1539 die Konfigurationsvariable
1540 <varname>$::lx_office_conf{system}->{eur}</varname> ausgewertet
1543 <para>Es fehlen Hilfetext beim Neuanlegen eines Mandanten, was die
1544 Optionen bewirken, z.B. mit zwei Standardfällen.</para>
1548 <sect1 id="config.skr04-update-3804">
1549 <title>SKR04 19% Umstellung für innergemeinschaftlichen Erwerb</title>
1551 <sect2 id="config.skr04-update-3804.introduction">
1552 <title>Einführung</title>
1554 <para>Die Umsatzsteuerumstellung auf 19% für SKR04 für die
1555 Steuerschlüssel "EU ohne USt-ID Nummer" ist erst 2010 erfolgt.
1556 Lx-Office beinhaltet ein Upgradeskript, das das Konto 3804 automatisch
1557 erstellt und die Steuereinstellungen korrekt einstellt. Hat der
1558 Benutzer aber schon selber das Konto 3804 angelegt, oder gab es schon
1559 Buchungen im Zeitraum nach dem 01.01.2007 auf das Konto 3803, wird das
1560 Upgradeskript vorsichtshalber nicht ausgeführt, da der Benutzer sich
1561 vielleicht schon selbst geholfen hat und mit seinen Änderungen
1562 zufrieden ist. Die korrekten Einstellungen kann man aber auch per Hand
1563 ausführen. Nachfolgend werden die entsprechenden Schritte anhand von
1564 Screenshots dargestellt.</para>
1566 <para>Für den Fall, daß Buchungen mit der Steuerschlüssel "EU ohne
1567 USt.-IdNr." nach dem 01.01.2007 erfolgt sind, ist davon auszugehen,
1568 dass diese mit dem alten Umsatzsteuersatz von 16% gebucht worden sind,
1569 und diese Buchungen sollten entsprechend kontrolliert werden.</para>
1572 <sect2 id="config.skr04-update-3804.create-chart">
1573 <title>Konto 3804 manuell anlegen</title>
1575 <para>Die folgenden Schritte sind notwendig, um das Konto manuell
1576 anzulegen und zu konfigurieren. Zuerst wird in
1577 <guimenu>System</guimenu> ->
1578 <guisubmenu>Kontenübersicht</guisubmenu> -> <guimenuitem>Konto
1579 erfassen</guimenuitem> das Konto angelegt.</para>
1582 <screeninfo>Konto 3804 erfassen</screeninfo>
1586 <imagedata fileref="images/skr04-update-3804/konto3804.png" />
1592 Als Zweites muss Steuergruppe 13 für Konto 3803 angepasst werden. Dazu unter <guimenu>System</guimenu> ->
1593 <guisubmenu>Steuern</guisubmenu> -> <guimenuitem>Bearbeiten</guimenuitem> den Eintrag mit Steuerschlüssel 13 auswählen und ihn
1594 wie im folgenden Screenshot angezeigt anpassen.
1598 <screeninfo>Steuerschlüssel 13 für 3803 (16%) anpassen</screeninfo>
1602 <imagedata fileref="images/skr04-update-3804/steuer3803.png" />
1608 Als Drittes wird ein neuer Eintrag mit Steuerschlüssel 13 für Konto 3804 (19%) angelegt. Dazu unter <guimenu>System</guimenu> ->
1609 <guisubmenu>Steuern</guisubmenu> -> <guimenuitem>Erfassen</guimenuitem> auswählen und die Werte aus dem Screenshot übernehmen.
1613 <screeninfo>Steuerschlüssel 13 für 3804 (19%) anlegen</screeninfo>
1617 <imagedata fileref="images/skr04-update-3804/steuer3804.png" />
1623 Als Nächstes sind alle Konten anzupassen, die als Steuerautomatikkonto die 3803 haben, sodass sie ab dem 1.1.2007 auch
1624 Steuerautomatik auf 3804 bekommen. Dies betrifft in der Standardkonfiguration die Konten 4315 und 4726. Als Beispiel für 4315
1625 müssen Sie dazu unter <guimenu>System</guimenu> -> <guisubmenu>Kontenübersicht</guisubmenu> -> <guimenuitem>Konten
1626 anzeigen</guimenuitem> das Konto 4315 anklicken und die Einstellungen wie im Screenshot gezeigt vornehmen.
1630 <screeninfo>Konto 4315 anpassen</screeninfo>
1634 <imagedata fileref="images/skr04-update-3804/konto4315.png" />
1640 Als Letztes sollte die Steuerliste unter <guimenu>System</guimenu> -> <guisubmenu>Steuern</guisubmenu> ->
1641 <guimenuitem>Bearbeiten</guimenuitem> kontrolliert werden. Zum Vergleich der Screenshot.
1645 <screeninfo>Steuerliste vergleichen</screeninfo>
1649 <imagedata fileref="images/skr04-update-3804/steuerliste.png" />
1656 <sect1 id="Lx-Office-ERP-verwenden">
1657 <title>Lx-Office ERP verwenden</title>
1659 <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
1660 folgender URL erreichbar:</para>
1663 url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
1665 <para>Die Administrationsseite erreichen Sie unter:</para>
1668 url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
1672 <chapter id="features" xreflabel="Features und Funktionen">
1673 <title>Features und Funktionen</title>
1675 <sect1 id="features.periodic-invoices"
1676 xreflabel="Wiedekehrende Rechnungen">
1677 <title>Wiederkehrende Rechnungen</title>
1679 <sect2 id="features.periodic-invoices.introduction"
1680 xreflabel="Einführung in wiederkehrende Rechnungen">
1681 <title>Einführung</title>
1683 <para>Wiederkehrende Rechnungen werden als normale Aufträge definiert
1684 und konfiguriert, mit allen dazugehörigen Kunden- und Artikelangaben.
1685 Die konfigurierten Aufträge werden später automatisch in Rechnungen
1686 umgewandelt, so als ob man den Workflow benutzen würde, und auch die
1687 Auftragsnummer wird übernommen, sodass alle wiederkehrenden
1688 Rechnungen, die aus einem Auftrag erstellt wurden, später leicht
1689 wiederzufinden sind.</para>
1692 <sect2 id="features.periodic-invoices.configuration"
1693 xreflabel="Konfiguration von wiederkehrenden Rechnungen">
1694 <title>Konfiguration</title>
1696 <para>Um einen Auftrag für wiederkehrende Rechnung zu konfigurieren,
1697 findet sich beim Bearbeiten des Auftrags ein neuer Knopf
1698 "Konfigurieren", der ein neues Fenster öffnet, in dem man die nötigen
1699 Parameter einstellen kann. Hinter dem Knopf wird außerdem noch
1700 angezeigt, ob der Auftrag als wiederkehrende Rechnung konfiguriert ist
1703 <para>Folgende Parameter kann man konfigurieren:</para>
1710 <para>Bei aktiven Rechnungen wird automatisch eine Rechnung
1711 erstellt, wenn die Periodizität erreicht ist (z.B. Anfang eines
1712 neuen Monats).</para>
1714 <para>Ist ein Auftrag nicht aktiv, so werden für ihn auch keine
1715 wiederkehrenden Rechnungen erzeugt. Stellt man nach längerer
1716 nicht-aktiver Zeit einen Auftrag wieder auf aktiv, wird beim
1717 nächsten Periodenwechsel für alle Perioden, seit der letzten
1718 aktiven Periode, jeweils eine Rechnung erstellt. Möchte man dies
1719 verhindern, muss man vorher das Startdatum neu setzen.</para>
1721 <para>Für gekündigte Aufträge werden nie mehr Rechnungen
1722 erstellt. Man kann sich diese Aufträge aber gesondert in den
1723 Berichten anzeigen lassen.</para>
1728 <term>Periodizität</term>
1731 <para>Ob monatlich, quartalsweise oder jährlich auf neue
1732 Rechnungen überprüft werden soll. Für jede Periode seit dem
1733 Startdatum wird überprüft, ob für die Periode (beginnend immer
1734 mit dem ersten Tag der Periode) schon eine Rechnung erstellt
1735 wurde. Unter Umständen können bei einem Startdatum in der
1736 Vergangenheit gleich mehrere Rechnungen erstellt werden.</para>
1741 <term>Buchen auf</term>
1744 <para>Das Forderungskonto, in der Regel "Forderungen aus
1745 Lieferungen und Leistungen". Das Gegenkonto ergibt sich aus den
1746 Buchungsgruppen der betreffenden Waren.</para>
1751 <term>Startdatum</term>
1754 <para>ab welchem Datum auf Rechnungserstellung geprüft werden
1760 <term>Enddatum</term>
1763 <para>ab wann keine Rechnungen mehr erstellt werden
1769 <term>Automatische Verlängerung um x Monate</term>
1772 <para>Sollen die wiederkehrenden Rechnungen bei Erreichen des
1773 eingetragenen Enddatums weiterhin erstellt werden, so kann man
1774 hier die Anzahl der Monate eingeben, um die das Enddatum
1775 automatisch nach hinten geschoben wird.</para>
1780 <term>Drucken</term>
1783 <para>Sind Drucker konfiguriert, so kann man sich die erstellten
1784 Rechnungen auch gleich ausdrucken lassen.</para>
1789 <para>Nach Erstellung der Rechnungen kann eine E-Mail mit
1790 Informationen zu den erstellten Rechnungen verschickt werden.
1791 Konfiguriert wird dies in der <link
1792 linkend="config.config-file.sections-parameters">Konfigurationsdatei</link>
1793 <filename>config/lx_office.conf</filename> im Abschnitt
1794 <varname>[periodic_invoices]</varname>.</para>
1797 <sect2 id="features.periodic-invoices.reports">
1798 <title>Auflisten</title>
1800 <para>Unter Verkauf->Berichte->Aufträge finden sich zwei neue
1801 Checkboxen, "Wiederkehrende Rechnungen aktiv" und "Wiederkehrende
1802 Rechnungen inaktiv", mit denen man sich einen Überglick über die
1803 wiederkehrenden Rechnungen verschaffen kann.</para>
1806 <sect2 id="features.periodic-invoices.task-server">
1807 <title>Erzeugung der eigentlichen Rechnungen</title>
1809 <para>Die zeitliche und periodische Überprüfung, ob eine
1810 wiederkehrende Rechnung automatisch erstellt werden soll, geschieht
1811 durch den <link linkend="config.task-server">Taskserver</link>, einen
1812 externen Dienst, der automatisch beim Start des Servers gestartet
1813 werden sollte.</para>
1816 <sect2 id="features.periodic-invoices.create-for-current-month">
1817 <title>Erste Rechnung für aktuellen Monat erstellen</title>
1819 <para>Will man im laufenden Monat eine monatlich wiederkehrende
1820 Rechnung inkl. des laufenden Monats starten, stellt man das Startdatum
1821 auf den Monatsanfang und wartet ein paar Minuten, bis der Taskserver
1822 den neu konfigurieren Auftrag erkennt und daraus eine Rechnung
1823 generiert hat. Alternativ setzt man das Startdatum auf den
1824 Monatsersten des Folgemonats und erstellt die erste Rechnung direkt
1825 manuell über den Workflow.</para>
1829 <sect1 id="dokumentenvorlagen-und-variablen">
1830 <title>Dokumentenvorlagen und verfügbare Variablen</title>
1832 <sect2 id="dokumentenvorlagen-und-variablen.einführung">
1833 <title>Einführung</title>
1835 <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
1836 aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
1837 einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
1838 <function><%variablenname%></function> verwendet wird. Für
1839 LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
1841 linkend="dokumentenvorlagen-und-variablen.tag-style" />).</para>
1843 <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
1844 unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
1845 ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
1846 alle Vorlagenarten.</para>
1848 <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
1849 verfügbar als hier aufgelistet werden. Die meisten davon können
1850 allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
1851 werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
1852 diese wie folgt erhalten werden:</para>
1856 <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
1857 Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
1861 <para>In <filename>Form.pm</filename> die Funktion
1862 <function>parse_template</function> suchen und hier die Zeile
1863 <command>print(STDERR Dumper($self));</command> einfügen.</para>
1867 <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
1868 ein PDF für eine Rechnung erzeugen.</para>
1872 <para>Im <filename>error.log</filename> Apache steht die Ausgabe
1873 der Variablen <varname>$self</varname> in der Form <varname>'key'
1874 => 'value',</varname>. Alle <varname>key</varname>s sind
1880 <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
1881 <title>Variablen ausgeben</title>
1883 <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
1884 Tags geschrieben werden, also z.B.
1885 <varname><%variablenname%></varname>.</para>
1887 <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
1888 die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
1889 <varname><%variablenname FLAG1 FLAG2%></varname>. Momentan
1890 werden die folgenden Flags unterstützt:</para>
1894 <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
1895 den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
1896 mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
1897 damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
1901 <para><option>NOESCAPE</option> unterdrückt das Escapen von
1902 Sonderzeichen für die Vorlagensprache. Wenn also in einer
1903 Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
1904 auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
1905 ist dieses Flag sinnvoll.</para>
1909 <para>Beispiel:</para>
1911 <programlisting><%quototal NOFORMAT%></programlisting>
1914 <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
1915 <title>Verwendung in Druckbefehlen</title>
1917 <para>In der Admininstration können Drucker definiert werden. Auch im
1918 dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
1919 und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
1920 den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
1921 <function>`...`</function> nicht zu unerwünschtem Verhalten
1924 <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
1925 für das die Telefonnummer eines Ansprechpartners als Teil der
1926 Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
1927 z.B. wie folgt aussehen:</para>
1929 <programlisting>send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></programlisting>
1932 <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
1933 xreflabel="Anfang und Ende der Tags verändern">
1934 <title>Anfang und Ende der Tags verändern</title>
1936 <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
1937 Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
1938 Prozentzeichen und dem Größerzeichen endet, beispielsweise
1939 <function><%customer%></function>. Da diese Form aber z.B. in
1940 LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
1941 Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
1942 Stil umgestellt werden.</para>
1944 <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
1945 Format gültigen Kommentarzeichen anfangen, dann
1946 <function>config:</function> enthalten, die entsprechende Option
1947 setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
1948 enden. Beispiel für LaTeX:</para>
1950 <programlisting>% config: tag-style=($ $)</programlisting>
1952 <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
1953 wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
1954 äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
1956 <programlisting><!-- config: tag-style=($ $) --></programlisting>
1959 <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
1960 <title>Zuordnung von den Dateinamen zu den Funktionen</title>
1962 <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
1963 welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
1964 "<filename>.ext</filename>" geeignet zu ersetzen:
1965 "<filename>.tex</filename>" für LaTeX-Vorlagen und
1966 "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
1970 <term><filename>bin_list.ext</filename></term>
1973 <para>Lagerliste</para>
1978 <term><filename>check.ext</filename></term>
1986 <term><filename>invoice.ext</filename></term>
1989 <para>Rechnung</para>
1994 <term><filename>packing_list.ext</filename></term>
1997 <para>Packliste</para>
2002 <term><filename>pick_list.ext</filename></term>
2005 <para>Sammelliste</para>
2010 <term><filename>purchase_delivery_order.ext</filename></term>
2013 <para>Lieferschein (Einkauf)</para>
2018 <term><filename>purcharse_order.ext</filename></term>
2021 <para>Bestellung an Lieferanten</para>
2026 <term><filename>request_quotation.ext</filename></term>
2029 <para>Anfrage an Lieferanten</para>
2034 <term><filename>sales_delivery_order.ext</filename></term>
2037 <para>Lieferschein (Verkauf)</para>
2042 <term><filename>sales_order.ext</filename></term>
2045 <para>Bestellung</para>
2050 <term><filename>sales_quotation.ext</filename></term>
2053 <para>Angebot an Kunden</para>
2058 <term><filename>zahlungserinnerung.ext</filename></term>
2061 <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
2066 <term><filename>zahlungserinnerung_invoice.ext</filename></term>
2069 <para>Rechnung über Mahngebühren (Dateiname im Programm
2070 konfigurierbar)</para>
2076 <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
2077 <title>Sprache, Drucker und E-Mail</title>
2079 <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
2080 eingearbeitet. So wird aus der Vorlage
2081 <filename>sales_order.ext</filename> bei Sprache
2082 <function>de</function> und Druckerkürzel <function>lpr2</function>
2083 der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
2084 Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
2085 bekommen dann noch das Kürzel <filename>_email</filename>, der
2086 vollständige Vorlagenname wäre dann
2087 <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
2088 kann eine Standarddatei <filename>default.ext</filename> hinterlegt
2089 werden. Diese wird verwendet, wenn keine der anderen Varianten
2090 gefunden wird.</para>
2092 <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
2093 der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
2094 verschickt wird, ist:</para>
2098 <para><filename>sales_order_email_de_lpr2.tex</filename></para>
2102 <para><filename>sales_order_de_lpr2.tex</filename></para>
2106 <para><filename>sales_order.tex</filename></para>
2110 <para><filename>default.tex</filename></para>
2114 <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
2115 Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
2117 linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta" />.</para>
2120 <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
2121 <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
2124 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
2125 xreflabel="Metainformationen zur angeforderten Vorlage">
2126 <title>Metainformationen zur angeforderten Vorlage</title>
2128 <para>Diese Variablen liefern Informationen darüber welche Variante
2129 einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
2130 Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
2131 Formulare einbinden möchten.</para>
2135 <term><varname>template_meta.formname</varname></term>
2138 <para>Basisname der Vorlage. Identisch mit der <link
2139 linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
2140 zu den Dateinamen</link> ohne die Erweiterung. Ein
2141 Verkaufsauftrag enthält hier
2142 <constant>sales_order</constant>.</para>
2147 <term><varname>template_meta.language.description</varname></term>
2150 <para>Beschreibung der verwendeten Sprache</para>
2155 <term><varname>template_meta.language.template_code</varname></term>
2158 <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
2159 Kürzel das im Dateinamen verwendetet wird.</para>
2164 <term><varname>template_meta.language.output_numberformat</varname></term>
2167 <para>Zahlenformat der verwendeten Sprache in der Form
2168 "<constant>1.000,00</constant>". Experimentell! Nur
2169 interessant für Vorlagen die mit unformatierten Werten
2175 <term><varname>template_meta.language.output_dateformat</varname></term>
2178 <para>Datumsformat der verwendeten Sprache in der Form
2179 "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
2180 interessant für Vorlagen die mit unformatierten Werten
2186 <term><varname>template_meta.format</varname></term>
2189 <para>Das angeforderte Format. Kann im Moment die Werte
2190 <constant>pdf</constant>, <constant>postscript</constant>,
2191 <constant>html</constant>, <constant>opendocument</constant>,
2192 <constant>opendocument_pdf</constant> und
2193 <constant>excel</constant> enthalten.</para>
2198 <term><varname>template_meta.extension</varname></term>
2201 <para>Dateierweiterung, wie im Dateinamen. Wird aus
2202 <constant>format</constant> entschieden.</para>
2207 <term><varname>template_meta.media</varname></term>
2210 <para>Ausgabemedium. Kann zur Zeit die Werte
2211 <constant>screen</constant> für Bildschirm,
2212 <constant>email</constant> für E-Mmail (triggert das
2213 <constant>_email</constant> Kürzel im Dateinamen),
2214 <constant>printer</constant> für Drucker, und
2215 <constant>queue</constant> für Warteschlange enthalten.</para>
2220 <term><varname>template_meta.printer.description</varname></term>
2223 <para>Beschreibung des ausgewählten Druckers</para>
2228 <term><varname>template_meta.printer.template_code</varname></term>
2231 <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
2232 dem Kürzel das im Dateinamen verwendetet wird.</para>
2238 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
2239 <title>Stammdaten von Kunden und Lieferanten</title>
2243 <term><varname>account_number</varname></term>
2246 <para>Kontonummer</para>
2251 <term><varname>bank</varname></term>
2254 <para>Name der Bank</para>
2259 <term><varname>bank_code</varname></term>
2262 <para>Bankleitzahl</para>
2267 <term><varname>bic</varname></term>
2270 <para>Bank-Identifikations-Code (Bank Identifier Code,
2276 <term><varname>business</varname></term>
2279 <para>Kunden-/Lieferantentyp</para>
2284 <term><varname>city</varname></term>
2292 <term><varname>contact</varname></term>
2295 <para>Kontakt</para>
2300 <term><varname>country</varname></term>
2308 <term><varname>cp_email</varname></term>
2311 <para>Email des Ansprechpartners</para>
2316 <term><varname>cp_givenname</varname></term>
2319 <para>Vorname des Ansprechpartners</para>
2324 <term><varname>cp_greeting</varname></term>
2327 <para>Anrede des Ansprechpartners</para>
2332 <term><varname>cp_name</varname></term>
2335 <para>Name des Ansprechpartners</para>
2340 <term><varname>cp_phone1</varname></term>
2343 <para>Telefonnummer 1 des Ansprechpartners</para>
2348 <term><varname>cp_phone2</varname></term>
2351 <para>Telefonnummer 2 des Ansprechpartners</para>
2356 <term><varname>cp_title</varname></term>
2359 <para>Titel des Ansprechpartners</para>
2364 <term><varname>creditlimit</varname></term>
2367 <para>Kreditlimit</para>
2372 <term><varname>customeremail</varname></term>
2375 <para>Email des Kunden; nur für Kunden</para>
2380 <term><varname>customerfax</varname></term>
2383 <para>Faxnummer des Kunden; nur für Kunden</para>
2388 <term><varname>customernotes</varname></term>
2391 <para>Bemerkungen beim Kunden; nur für Kunden</para>
2396 <term><varname>customernumber</varname></term>
2399 <para>Kundennummer; nur für Kunden</para>
2404 <term><varname>customerphone</varname></term>
2407 <para>Telefonnummer des Kunden; nur für Kunden</para>
2412 <term><varname>discount</varname></term>
2420 <term><varname>email</varname></term>
2423 <para>Emailadresse</para>
2428 <term><varname>fax</varname></term>
2431 <para>Faxnummer</para>
2436 <term><varname>homepage</varname></term>
2439 <para>Homepage</para>
2444 <term><varname>iban</varname></term>
2447 <para>Internationale Kontonummer (International Bank Account
2448 Number, IBAN)</para>
2453 <term><varname>language</varname></term>
2456 <para>Sprache</para>
2461 <term><varname>name</varname></term>
2464 <para>Firmenname</para>
2469 <term><varname>payment_description</varname></term>
2472 <para>Name der Zahlart</para>
2477 <term><varname>payment_terms</varname></term>
2480 <para>Zahlungskonditionen</para>
2485 <term><varname>phone</varname></term>
2488 <para>Telefonnummer</para>
2493 <term><varname>shiptocity</varname></term>
2496 <para>Stadt (Lieferadresse) <link
2497 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2502 <term><varname>shiptocontact</varname></term>
2505 <para>Kontakt (Lieferadresse) <link
2506 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2511 <term><varname>shiptocountry</varname></term>
2514 <para>Land (Lieferadresse) <link
2515 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2520 <term><varname>shiptodepartment1</varname></term>
2523 <para>Abteilung 1 (Lieferadresse) <link
2524 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2529 <term><varname>shiptodepartment2</varname></term>
2532 <para>Abteilung 2 (Lieferadresse) <link
2533 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2538 <term><varname>shiptoemail</varname></term>
2541 <para>Email (Lieferadresse) <link
2542 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2547 <term><varname>shiptofax</varname></term>
2550 <para>Fax (Lieferadresse) <link
2551 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2556 <term><varname>shiptoname</varname></term>
2559 <para>Firmenname (Lieferadresse) <link
2560 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2565 <term><varname>shiptophone</varname></term>
2568 <para>Telefonnummer (Lieferadresse) <link
2569 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2574 <term><varname>shiptostreet</varname></term>
2577 <para>Straße und Hausnummer (Lieferadresse) <link
2578 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2583 <term><varname>shiptozipcode</varname></term>
2586 <para>Postleitzahl (Lieferadresse) <link
2587 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2592 <term><varname>street</varname></term>
2595 <para>Straße und Hausnummer</para>
2600 <term><varname>taxnumber</varname></term>
2603 <para>Steuernummer</para>
2608 <term><varname>ustid</varname></term>
2611 <para>Umsatzsteuer-Identifikationsnummer</para>
2616 <term><varname>vendoremail</varname></term>
2619 <para>Email des Lieferanten; nur für Lieferanten</para>
2624 <term><varname>vendorfax</varname></term>
2627 <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
2632 <term><varname>vendornotes</varname></term>
2635 <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
2640 <term><varname>vendornumber</varname></term>
2643 <para>Lieferantennummer; nur für Lieferanten</para>
2648 <term><varname>vendorphone</varname></term>
2651 <para>Telefonnummer des Lieferanten; nur für
2657 <term><varname>zipcode</varname></term>
2660 <para>Postleitzahl</para>
2665 <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
2666 <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
2667 Stammdaten nicht eingetragen, so haben die Variablen
2668 <varname>shipto*</varname> den gleichen Wert wie die die
2669 entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
2670 einige <varname>shipto*</varname>-Variablen so nicht in den
2671 Stammdaten wiederfinden sondern schlicht Kopien der
2672 Lieferdatenvariablen sind (z.B.
2673 <varname>shiptocontact</varname>).</para>
2677 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
2678 <title>Informationen über den Bearbeiter</title>
2682 <term><varname>employee_address</varname></term>
2685 <para>Adressfeld</para>
2690 <term><varname>employee_businessnumber</varname></term>
2693 <para>Firmennummer</para>
2698 <term><varname>employee_company</varname></term>
2701 <para>Firmenname</para>
2706 <term><varname>employee_co_ustid</varname></term>
2709 <para>Usatzsteuer-Identifikationsnummer</para>
2714 <term><varname>employee_duns</varname></term>
2717 <para>DUNS-Nummer</para>
2722 <term><varname>employee_email</varname></term>
2730 <term><varname>employee_fax</varname></term>
2738 <term><varname>employee_name</varname></term>
2741 <para>voller Name</para>
2746 <term><varname>employee_signature</varname></term>
2749 <para>Signatur</para>
2754 <term><varname>employee_taxnumber</varname></term>
2757 <para>Steuernummer</para>
2762 <term><varname>employee_tel</varname></term>
2765 <para>Telefonnummer</para>
2771 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
2772 <title>Informationen über den Bearbeiter</title>
2776 <term><varname>salesman_address</varname></term>
2779 <para>Adressfeld</para>
2784 <term><varname>salesman_businessnumber</varname></term>
2787 <para>Firmennummer</para>
2792 <term><varname>salesman_company</varname></term>
2795 <para>Firmenname</para>
2800 <term><varname>salesman_co_ustid</varname></term>
2803 <para>Usatzsteuer-Identifikationsnummer</para>
2808 <term><varname>salesman_duns</varname></term>
2811 <para>DUNS-Nummer</para>
2816 <term><varname>salesman_email</varname></term>
2824 <term><varname>salesman_fax</varname></term>
2832 <term><varname>salesman_name</varname></term>
2835 <para>voller Name</para>
2840 <term><varname>salesman_signature</varname></term>
2843 <para>Signatur</para>
2848 <term><varname>salesman_taxnumber</varname></term>
2851 <para>Steuernummer</para>
2856 <term><varname>salesman_tel</varname></term>
2859 <para>Telefonnummer</para>
2865 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
2866 <title>Variablen für die einzelnen Steuern</title>
2870 <term><varname>tax</varname></term>
2878 <term><varname>taxbase</varname></term>
2881 <para>zu versteuernder Betrag</para>
2886 <term><varname>taxdescription</varname></term>
2889 <para>Name der Steuer</para>
2894 <term><varname>taxrate</varname></term>
2897 <para>Steuersatz</para>
2904 <sect2 id="dokumentenvorlagen-und-variablen.invoice">
2905 <title>Variablen in Rechnungen</title>
2907 <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
2908 <title>Allgemeine Variablen</title>
2912 <term><varname>creditremaining</varname></term>
2915 <para>Verbleibender Kredit</para>
2920 <term><varname>currency</varname></term>
2923 <para>Währung</para>
2928 <term><varname>cusordnumber</varname></term>
2931 <para>Bestellnummer beim Kunden</para>
2936 <term><varname>deliverydate</varname></term>
2939 <para>Lieferdatum</para>
2944 <term><varname>duedate</varname></term>
2947 <para>Fälligkeitsdatum</para>
2952 <term><varname>globalprojectnumber</varname></term>
2955 <para>Projektnummer des ganzen Beleges</para>
2960 <term><varname>globalprojectdescription</varname></term>
2963 <para>Projekbeschreibung des ganzen Beleges</para>
2968 <term><varname>intnotes</varname></term>
2971 <para>Interne Bemerkungen</para>
2976 <term><varname>invdate</varname></term>
2979 <para>Rechnungsdatum</para>
2984 <term><varname>invnumber</varname></term>
2987 <para>Rechnungsnummer</para>
2992 <term><varname>invtotal</varname></term>
2995 <para>gesamter Rechnungsbetrag</para>
3000 <term><varname>notes</varname></term>
3003 <para>Bemerkungen der Rechnung</para>
3008 <term><varname>orddate</varname></term>
3011 <para>Auftragsdatum</para>
3016 <term><varname>ordnumber</varname></term>
3019 <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
3020 erstellt wurde</para>
3025 <term><varname>payment_description</varname></term>
3028 <para>Name der Zahlart</para>
3033 <term><varname>payment_terms</varname></term>
3036 <para>Zahlungskonditionen</para>
3041 <term><varname>quodate</varname></term>
3044 <para>Angebotsdatum</para>
3049 <term><varname>quonumber</varname></term>
3052 <para>Angebotsnummer</para>
3057 <term><varname>shippingpoint</varname></term>
3060 <para>Versandort</para>
3065 <term><varname>shipvia</varname></term>
3068 <para>Transportmittel</para>
3073 <term><varname>subtotal</varname></term>
3076 <para>Zwischensumme aller Posten ohne Steuern</para>
3081 <term><varname>total</varname></term>
3084 <para>Restsumme der Rechnung (Summe abzüglich bereits
3085 bezahlter Posten)</para>
3090 <term><varname>transaction_description</varname></term>
3093 <para>Vorgangsbezeichnung</para>
3098 <term><varname>transdate</varname></term>
3101 <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
3102 erstellt wurde</para>
3108 <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
3109 <title>Variablen für jeden Posten auf der Rechnung</title>
3113 <term><varname>bin</varname></term>
3116 <para>Stellage</para>
3121 <term><varname>description</varname></term>
3124 <para>Artikelbeschreibung</para>
3129 <term><varname>discount</varname></term>
3132 <para>Rabatt als Betrag</para>
3137 <term><varname>discount_sub</varname></term>
3140 <para>Zwischensumme mit Rabatt</para>
3145 <term><varname>drawing</varname></term>
3148 <para>Zeichnung</para>
3153 <term><varname>ean</varname></term>
3156 <para>EAN-Code</para>
3161 <term><varname>image</varname></term>
3169 <term><varname>linetotal</varname></term>
3172 <para>Zeilensumme (Anzahl * Einzelpreis)</para>
3177 <term><varname>longdescription</varname></term>
3180 <para>Langtext</para>
3185 <term><varname>microfiche</varname></term>
3188 <para>Mikrofilm</para>
3193 <term><varname>netprice</varname></term>
3196 <para>Nettopreis</para>
3201 <term><varname>nodiscount_linetotal</varname></term>
3204 <para>Zeilensumme ohne Rabatt</para>
3209 <term><varname>nodiscount_sub</varname></term>
3212 <para>Zwischensumme ohne Rabatt</para>
3217 <term><varname>number</varname></term>
3220 <para>Artikelnummer</para>
3225 <term><varname>ordnumber_oe</varname></term>
3228 <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3229 aus einem Sammelauftrag erstellt wurde</para>
3234 <term><varname>p_discount</varname></term>
3237 <para>Rabatt in Prozent</para>
3242 <term><varname>partnotes</varname></term>
3245 <para>Die beim Artikel gespeicherten Bemerkungen</para>
3250 <term><varname>partsgroup</varname></term>
3253 <para>Warengruppe</para>
3258 <term><varname>price_factor</varname></term>
3261 <para>Der Preisfaktor als Zahl, sofern einer eingestellt
3267 <term><varname>price_factor_name</varname></term>
3270 <para>Der Name des Preisfaktors, sofern einer eingestellt
3276 <term><varname>projectnumber</varname></term>
3279 <para>Projektnummer</para>
3284 <term><varname>projectdescription</varname></term>
3287 <para>Projektbeschreibung</para>
3292 <term><varname>qty</varname></term>
3300 <term><varname>reqdate</varname></term>
3303 <para>Lieferdatum</para>
3308 <term><varname>runningnumber</varname></term>
3311 <para>Position auf der Rechnung (1, 2, 3...)</para>
3316 <term><varname>sellprice</varname></term>
3319 <para>Verkaufspreis</para>
3324 <term><varname>serialnumber</varname></term>
3327 <para>Seriennummer</para>
3332 <term><varname>tax_rate</varname></term>
3335 <para>Steuersatz</para>
3340 <term><varname>transdate_oe</varname></term>
3343 <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
3344 aus einem Sammelauftrag erstellt wurde</para>
3349 <term><varname>unit</varname></term>
3352 <para>Einheit</para>
3357 <term><varname>weight</varname></term>
3360 <para>Gewicht</para>
3365 <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
3366 über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
3367 einer <function>foreach</function>-Schleife ausgegeben werden, da
3368 für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
3369 können. Die Variablen dafür lauten:</para>
3373 <term><varname>make</varname></term>
3376 <para>Lieferant</para>
3381 <term><varname>model</varname></term>
3384 <para>Lieferantenartikelnummer</para>
3390 <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
3391 <title>Variablen für die einzelnen Zahlungseingänge</title>
3395 <term><varname>payment</varname></term>
3403 <term><varname>paymentaccount</varname></term>
3411 <term><varname>paymentdate</varname></term>
3419 <term><varname>paymentmemo</varname></term>
3427 <term><varname>paymentsource</varname></term>
3436 <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
3437 <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
3439 <para>Die vom Benutzer definierten Variablen für Kunden und
3440 Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
3441 ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
3442 <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
3443 Variablennamen zusammen.</para>
3445 <para>Beispiel: Der Benutzer hat eine Variable namens
3446 <varname>number_of_employees</varname> definiert, die die Anzahl der
3447 Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
3448 unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
3453 <sect2 id="dokumentenvorlagen-und-variablen.dunning">
3454 <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
3456 <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
3457 <title>Namen der Vorlagen</title>
3459 <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
3460 eingegeben. Wird für ein Mahnlevel die Option zur automatischen
3461 Erstellung einer Rechnung über die Mahngebühren und Zinsen
3462 aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
3463 Vorlagenname für diese Mahnstufe mit dem Zusatz
3464 <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
3465 für die ausgewählte Sprache und den ausgewählten Drucker
3469 <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
3470 <title>Allgemeine Variablen in Mahnungen</title>
3472 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3473 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3474 Kunden stehen als Variablen <varname>name</varname>,
3475 <varname>street</varname>, <varname>zipcode</varname>,
3476 <varname>city</varname>, <varname>country</varname>,
3477 <varname>department_1</varname>, <varname>department_2</varname>,
3478 und <varname>email</varname> zur Verfügung.</para>
3480 <para>Weitere Variablen beinhalten:</para>
3484 <term><varname>dunning_date</varname></term>
3487 <para>Datum der Mahnung</para>
3492 <term><varname>dunning_duedate</varname></term>
3495 <para>Fälligkeitsdatum für diese Mahhnung</para>
3500 <term><varname>dunning_id</varname></term>
3503 <para>Mahnungsnummer</para>
3508 <term><varname>fee</varname></term>
3511 <para>Kummulative Mahngebühren</para>
3516 <term><varname>interest_rate</varname></term>
3519 <para>Zinssatz per anno in Prozent</para>
3524 <term><varname>total_amount</varname></term>
3527 <para>Gesamter noch zu zahlender Betrag als
3528 <function>fee</function> + <function>total_interest</function>
3529 + <function>total_open_amount</function></para>
3534 <term><varname>total_interest</varname></term>
3537 <para>Zinsen per anno über alle Rechnungen</para>
3542 <term><varname>total_open_amount</varname></term>
3545 <para>Summe über alle offene Beträge der Rechnungen</para>
3551 <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
3552 <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
3556 <term><varname>dn_amount</varname></term>
3559 <para>Rechnungssumme (brutto)</para>
3564 <term><varname>dn_duedate</varname></term>
3567 <para>Originales Fälligkeitsdatum der Rechnung</para>
3572 <term><varname>dn_dunning_date</varname></term>
3575 <para>Datum der Mahnung</para>
3580 <term><varname>dn_dunning_duedate</varname></term>
3583 <para>Fälligkeitsdatum der Mahnung</para>
3588 <term><varname>dn_fee</varname></term>
3591 <para>Kummulative Mahngebühr</para>
3596 <term><varname>dn_interest</varname></term>
3599 <para>Zinsen per anno für diese Rechnung</para>
3604 <term><varname>dn_invnumber</varname></term>
3607 <para>Rechnungsnummer</para>
3612 <term><varname>dn_linetotal</varname></term>
3615 <para>Noch zu zahlender Betrag (ergibt sich aus
3616 <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
3617 + <varname>dn_interest</varname>)</para>
3622 <term><varname>dn_netamount</varname></term>
3625 <para>Rechnungssumme (netto)</para>
3630 <term><varname>dn_open_amount</varname></term>
3633 <para>Offener Rechnungsbetrag</para>
3638 <term><varname>dn_ordnumber</varname></term>
3641 <para>Bestellnummer</para>
3646 <term><varname>dn_transdate</varname></term>
3649 <para>Rechnungsdatum</para>
3654 <term><varname>dn_curr</varname></term>
3657 <para>Währung, in der die Rechnung erstellt wurde. (Die
3658 Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
3664 <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
3665 <title>Variablen in automatisch erzeugten Rechnungen über
3666 Mahngebühren</title>
3668 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3669 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3670 Kunden stehen als Variablen <varname>name</varname>,
3671 <varname>street</varname>, <varname>zipcode</varname>,
3672 <varname>city</varname>, <varname>country</varname>,
3673 <varname>department_1</varname>, <varname>department_2</varname>,
3674 und <varname>email</varname> zur Verfügung.</para>
3676 <para>Weitere Variablen beinhalten:</para>
3680 <term><varname>duedate</varname></term>
3683 <para>Fälligkeitsdatum der Rechnung</para>
3688 <term><varname>dunning_id</varname></term>
3691 <para>Mahnungsnummer</para>
3696 <term><varname>fee</varname></term>
3699 <para>Mahngebühren</para>
3704 <term><varname>interest</varname></term>
3712 <term><varname>invamount</varname></term>
3715 <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
3716 <varname>interest</varname>)</para>
3721 <term><varname>invdate</varname></term>
3724 <para>Rechnungsdatum</para>
3729 <term><varname>invnumber</varname></term>
3732 <para>Rechnungsnummer</para>
3739 <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
3740 <title>Variablen in anderen Vorlagen</title>
3743 <title>Einführung</title>
3745 <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
3746 Rechnung. Allerdings heißen die Variablen, die mit
3747 <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
3748 fangen sie mit <varname>quo</varname> für "quotation" an:
3749 <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
3750 wiederum fangen sie mit <varname>ord</varname> für "order" an:
3751 <varname>ordnumber</varname> für Bestellnummer etc.</para>
3753 <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
3754 vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
3755 sind Variablen, die vom Geschäftsablauf her in der entsprechenden
3756 Vorlage keine Bedeutung haben oder noch nicht belegt sein
3759 <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
3760 in Rechnungen aufgeführt.</para>
3763 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
3764 <title>Angebote und Preisanfragen</title>
3768 <term><varname>quonumber</varname></term>
3771 <para>Angebots- bzw. Anfragenummer</para>
3776 <term><varname>reqdate</varname></term>
3779 <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
3780 Preisanfragen)</para>
3785 <term><varname>transdate</varname></term>
3788 <para>Angebots- bzw. Anfragedatum</para>
3794 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
3795 <title>Auftragsbestätigungen und Lieferantenaufträge</title>
3799 <term><varname>ordnumber</varname></term>
3802 <para>Auftragsnummer</para>
3807 <term><varname>reqdate</varname></term>
3810 <para>Lieferdatum</para>
3815 <term><varname>transdate</varname></term>
3818 <para>Auftragsdatum</para>
3824 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
3825 <title>Lieferscheine (Verkauf und Einkauf)</title>
3829 <term><varname>cusordnumber</varname></term>
3832 <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
3833 des Lieferanten (im Einkauf)</para>
3838 <term><varname>donumber</varname></term>
3841 <para>Lieferscheinnummer</para>
3846 <term><varname>transdate</varname></term>
3849 <para>Lieferscheindatum</para>
3854 <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
3855 mit den Informationen darüber, von welchem Lager und Lagerplatz aus
3856 die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
3857 Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
3858 <function>foreach</function>-Schleife ausgegeben werden. Diese
3859 Variablen sind:</para>
3863 <term><varname>si_bin</varname></term>
3866 <para>Lagerplatz</para>
3871 <term><varname>si_chargenumber</varname></term>
3874 <para>Chargennummer</para>
3879 <term><varname>si_bestbefore</varname></term>
3882 <para>Mindesthaltbarkeit</para>
3887 <term><varname>si_number</varname></term>
3890 <para>Artikelnummer</para>
3895 <term><varname>si_qty</varname></term>
3898 <para>Anzahl bzw. Menge</para>
3903 <term><varname>si_runningnumber</varname></term>
3906 <para>Positionsnummer (1, 2, 3 etc)</para>
3911 <term><varname>si_unit</varname></term>
3914 <para>Einheit</para>
3919 <term><varname>si_warehouse</varname></term>
3928 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
3929 <title>Variablen für Sammelrechnung</title>
3933 <term><varname>c0total</varname></term>
3936 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit < 30
3942 <term><varname>c30total</varname></term>
3945 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
3946 und < 60 Tage</para>
3951 <term><varname>c60total</varname></term>
3954 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
3955 und < 90 Tage</para>
3960 <term><varname>c90total</varname></term>
3963 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90
3969 <term><varname>total</varname></term>
3972 <para>Gesamtbetrag aller Rechnungen</para>
3977 <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
3981 <term><varname>invnumber</varname></term>
3984 <para>Rechnungsnummer</para>
3989 <term><varname>invdate</varname></term>
3992 <para>Rechnungsdatum</para>
3997 <term><varname>duedate</varname></term>
4000 <para>Fälligkeitsdatum</para>
4005 <term><varname>amount</varname></term>
4008 <para>Summe der Rechnung</para>
4013 <term><varname>open</varname></term>
4016 <para>Noch offener Betrag der Rechnung</para>
4021 <term><varname>c0</varname></term>
4024 <para>Noch offener Rechnungsbetrag mit Fälligkeit < 30
4030 <term><varname>c30</varname></term>
4033 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
4039 <term><varname>c60</varname></term>
4042 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
4048 <term><varname>c90</varname></term>
4051 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 90
4059 <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
4060 <title>Blöcke, bedingte Anweisungen und Schleifen</title>
4062 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
4063 <title>Einfürhung</title>
4065 <para>Der Parser kennt neben den Variablen einige weitere
4066 Konstrukte, die gesondert behandelt werden. Diese sind wie
4067 Variablennamen in spezieller Weise markiert:
4068 <command><%anweisung%> ... <%end%></command></para>
4070 <para>Anmerkung zum <command><%end%></command>: Der besseren
4071 Verständlichkeit halber kann man nach dem <command>end</command>
4072 noch beliebig weitere Wörter schreiben, um so zu markieren, welche
4073 Anweisung (z.B. <command>if</command> oder
4074 <command>foreach</command>) damit abgeschlossen wird.</para>
4076 <para>Beispiel: Lautet der Beginn eines Blockes z.B.
4077 <command><%if type == "sales_quotation"%></command>, so könnte
4078 er mit <command><%end%></command> genauso abgeschlossen werden
4079 wie mit <command><%end if%></command> oder auch
4080 <command><%end type == "sales_quotation"%></command>.</para>
4083 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
4084 <title>Der if-Block</title>
4086 <programlisting><%if variablenname%>
4088 <%end%></programlisting>
4090 <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
4091 und dem "end" werden nur ausgegeben, wenn die Variable
4092 <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
4094 <para>Die Bedingung kann auch negiert werden, indem das Wort
4095 <function>not</function> nach dem <filename>if</filename> verwendet
4096 wird. Beispiel:</para>
4098 <programlisting><%if not cp_greeting%>
4100 <%end%></programlisting>
4102 <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
4103 oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
4104 einer Variablen mit einer festen Zeichenkette oder einer anderen
4105 Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
4106 oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
4107 die rechte Seite des Vergleichsoperators in Anführungszeichen
4108 gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
4109 anderer Variablen). Zwei Beispiele, die beide Vergleiche
4112 <programlisting><%if var1 == "Wert"%></programlisting>
4114 <para>Testet die Variable <varname>var1</varname> auf
4115 übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
4116 Mittels <function>!=</function> anstelle von <function>==</function>
4117 würde auf Ungleichheit getestet.</para>
4119 <programlisting>%if var1 == var2%></programlisting>
4121 <para>Testet die Variable <varname>var1</varname> auf
4122 übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
4123 <function>!=</function> anstelle von <function>==</function> würde
4124 auf Ungleichheit getestet.</para>
4126 <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
4127 auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
4128 Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
4129 dieselbe Syntax wie oben nur mit <function>=~</function> und
4130 <function>!~</function> als Vergleichsoperatoren.</para>
4132 <para>Beispiel für einen Test, ob die Variable
4133 <varname>intnotes</varname> (interne Bemerkungen) das Wort
4134 <constant>schwierig</constant> enthält:</para>
4136 <programlisting><%if intnotes =~ "schwierig"%></programlisting>
4139 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
4140 <title>Der foreach-Block</title>
4142 <programlisting><%foreach variablenname%>
4144 <%end%></programlisting>
4146 <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
4147 wie das Perl-Array der Variablen <varname>variablenname</varname>
4148 Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
4149 Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
4150 benutzt. In jedem Durchlauf werden die <link
4151 linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
4152 Variablen</link> jeweils auf den Wert für die aktuelle Position
4155 <para>Die Syntax sieht normalerweise wie folgt aus:</para>
4157 <programlisting><%foreach number%>
4158 Position: <%runningnumber%>
4159 Anzahl: <%qty%>
4160 Artikelnummer: <%number%>
4161 Beschreibung: <%description%>
4163 <%end%></programlisting>
4165 <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
4166 <function><%foreach%></function>-Block innerhalb einer
4167 Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
4168 wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
4169 Inhalt zwischen <function><%foreach%></function> und
4170 <function><%end%></function> wiederholt, nicht aber die
4171 komplette Zeile, in der er steht.</para>
4175 <sect2 id="dokumentenvorlagen-und-variablen.markup">
4176 <title>Markup-Code zur Textformatierung innerhalb von
4179 <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
4180 anders formatiert haben möchte, so ist dies begrenzt möglich.
4181 Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
4182 Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
4183 Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
4184 dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
4185 (HTML oder PDF über LaTeX) umgesetzt.</para>
4187 <para>Die unterstützen Formatierungen sind:</para>
4191 <term><b>Text</b></term>
4194 <para>Text wird in Fettdruck gesetzt.</para>
4199 <term><i>Text</i></term>
4202 <para>Text wird kursiv gesetzt.</para>
4207 <term><u>Text</u></term>
4210 <para>Text wird unterstrichen.</para>
4215 <term><s>Text</s></term>
4218 <para>Text wird durchgestrichen. Diese Formatierung ist nicht
4219 bei der Ausgabe als PDF über LaTeX verfügbar.</para>
4224 <term><bullet></term>
4227 <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
4233 <para>Der Befehl <command><bullet></command> funktioniert
4234 momentan auch nur in Latex-Vorlagen.</para>
4238 <sect1 id="excel-templates">
4239 <title>Excel-Vorlagen</title>
4241 <sect2 id="excel-templates.summary">
4242 <title>Zusammenfassung</title>
4244 <para>Dieses Dokument beschreibt den Mechanismus, mit dem
4245 Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
4249 <sect2 id="excel-templates.usage">
4250 <title>Bedienung</title>
4252 <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
4253 werden. Die Konfigurationsoption heißt <varname>excel_templates =
4254 1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
4256 <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
4257 anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
4258 werden. In den normalen Verkaufsmasken taucht nun
4259 <constant>Excel</constant> als auswählbares Format auf und kann von da
4260 an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
4262 <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
4263 eine Angebotsvorlage und wird unter dem internen Namen der Angebote
4264 <filename>sales_quotation.xls</filename> gespeichert.</para>
4267 <sect2 id="excel-templates.syntax">
4268 <title>Variablensyntax</title>
4270 <para>Einfache Syntax:
4271 <command><<varname>></command></para>
4273 <para>Dabei sind <constant><<</constant> und
4274 <constant>>></constant> die Delimiter. Da Excel auf festen
4275 Breiten besteht, kann der Tag künstlich verlängert werden, indem
4276 weitere <constant><</constant> oder <constant>></constant>
4277 eingefügt werden. Der Tag muss nicht symmetrisch sein.
4280 <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4282 <para>Um die Limitierung der festen Breite zu reduzieren, können
4283 weitere Variablen in einem Block interpoliert werden. Whitespace wird
4284 dazwishen dann erhalten. Beispiel:</para>
4286 <programlisting><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4288 <para>Die Variablen werden interpoliert, und linksbündig mit
4289 Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
4290 lang, werden überzählige Zeichen abgeschnitten.</para>
4292 <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
4293 der Block mit einem Leerzeichen anfängt. Beispiel:</para>
4295 <programlisting><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4297 <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
4298 Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
4302 <sect2 id="excel-templates.limitations">
4303 <title>Einschränkungen</title>
4305 <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
4306 mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
4307 beschränkt sich daher darauf, Textstellen exakt durch einen anderen
4308 Text zu ersetzen.</para>
4310 <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
4311 <command><%if%></command> und
4312 <command><%foreach%></command> nicht vorhanden. Der Delimiter
4313 <constant><% %></constant> kommt in den Headerinformationen
4314 evtl. vor. Deshalb wurde auf den sichereren Delimiter
4315 <constant><<</constant> und <constant>>></constant>
4322 <title>Entwicklerdokumentation</title>
4324 <sect1 id="devel.globals" xreflabel="Globale Variablen">
4325 <title>Globale Variablen</title>
4328 <title>Wie sehen globale Variablen in Perl aus?</title>
4330 <para>Globale Variablen liegen in einem speziellen namespace namens
4331 "main", der von überall erreichbar ist. Darüber hinaus sind bareword
4332 globs global und die meisten speziellen Variablen sind...
4335 <para>Daraus ergeben sich folgende Formen:</para>
4339 <term><literal>$main::form</literal></term>
4342 <para>expliziter Namespace "main"</para>
4347 <term><literal>$::form</literal></term>
4350 <para>impliziter Namespace "main"</para>
4355 <term><literal>open FILE, "file.txt"</literal></term>
4358 <para><varname>FILE</varname> ist global</para>
4363 <term><literal>$_</literal></term>
4366 <para>speziell</para>
4371 <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
4372 Schlüsselwort wie "<function>global</function>", mit dem man
4373 importieren kann. <function>my</function>, <function>our</function>
4374 und <function>local</function> machen was anderes.</para>
4378 <term><literal>my $form</literal></term>
4381 <para>lexikalische Variable, gültig bis zum Ende des
4387 <term><literal>our $form</literal></term>
4390 <para><varname>$form</varname> referenziert ab hier
4391 <varname>$PACKAGE::form</varname>.</para>
4396 <term><literal>local $form</literal></term>
4399 <para>Alle Änderungen an <varname>$form</varname> werden am Ende
4400 des scopes zurückgesetzt</para>
4407 <title>Warum sind globale Variablen ein Problem?</title>
4409 <para>Das erste Problem ist <productname>FCGI</productname>.</para>
4411 <para><productname>SQL-Ledger</productname> hat fast alles im globalen
4412 namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
4413 Unter <productname>FCGI</productname> müssen diese Sachen aber wieder
4414 aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
4415 Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
4416 Datenbankverbindungen, weil die sehr lange zum Initialisieren
4419 <para>Das zweite Problem ist <function>strict</function>. Unter
4420 <function>strict</function> werden alle Variablen die nicht explizit
4421 mit <function>Package</function>, <function>my</function> oder
4422 <function>our</function> angegeben werden als Tippfehler angemarkert,
4423 dies hat, seit der Einführung, u.a. schon so manche langwierige
4424 Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package
4425 angegeben werden, werden die nicht geprüft, und somit kann sich
4426 schnell ein Tippfehler einschleichen.</para>
4430 <title>Kanonische globale Variablen</title>
4432 <para>Um dieses Problem im Griff zu halten gibt es einige wenige
4433 globale Variablen, die kanonisch sind, d.h. sie haben bestimmte
4434 vorgegebenen Eigenschaften, und alles andere sollte anderweitig
4435 umhergereicht werden.</para>
4437 <para>Diese Variablen sind im Moment die folgenden neun:</para>
4441 <para><varname>$::form</varname></para>
4445 <para><varname>%::myconfig</varname></para>
4449 <para><varname>$::locale</varname></para>
4453 <para><varname>$::lxdebug</varname></para>
4457 <para><varname>$::auth</varname></para>
4461 <para><varname>$::lx_office_conf</varname></para>
4465 <para><varname>$::instance_conf</varname></para>
4469 <para><varname>$::dispatcher</varname></para>
4473 <para><varname>$::request</varname></para>
4477 <para>Damit diese nicht erneut als Müllhalde missbraucht werden, im
4478 Folgenden eine kurze Erläuterung der bestimmten vorgegebenen
4479 Eigenschaften (Konventionen):</para>
4482 <title>$::form</title>
4486 <para>Ist ein Objekt der Klasse
4487 "<classname>Form</classname>"</para>
4491 <para>Wird nach jedem Request gelöscht</para>
4495 <para>Muss auch in Tests und Konsolenscripts vorhanden
4500 <para>Enthält am Anfang eines Requests die Requestparameter vom
4505 <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
4506 cachen, das wird aber momentan absichtlich zerstört</para>
4510 <para><varname>$::form</varname> wurde unter <productname>SQL
4511 Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
4512 alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
4513 heißt, alles was einem lieb ist (alle Variablen die einem ans Herz
4514 gewachsen sind), sollte man vor einem Aufruf (!) von zum Beispiel
4515 <function>IS->retrieve_customer()</function> in Sicherheit
4518 <para>Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man
4519 Berechnung in einem bestimmten Format durchführt (SL/Form.pm Zeile
4520 3552, Stand version 2.7beta), um dies hinterher wieder auf den
4521 richtigen Wert zu setzen:</para>
4523 <programlisting> my $saved_numberformat = $::myconfig{numberformat};
4524 $::myconfig{numberformat} = $numberformat;
4525 # (...) div Berechnungen
4526 $::myconfig{numberformat} = $saved_numberformat;</programlisting>
4528 <para>Das Objekt der Klasse Form hat leider im Moment noch viele
4529 zentrale Funktionen die vom internen Zustand abhängen, deshalb bitte
4530 nie einfach zerstören oder überschreiben (zumindestens nicht kurz
4531 vor einem Release oder in Absprache über bspw. die devel-Liste ;-).
4532 Es geht ziemlich sicher etwas kaputt.</para>
4534 <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
4535 in den <productname>Template::Toolkit</productname> Templates
4536 außerhalb der Controller: der Ausdruck <function>[% var
4537 %]</function> greift auf <varname>$::form->{var}</varname> zu.
4538 Unter Controllern ist der Standard Scope anders, da lautet der
4539 Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
4540 normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
4541 <function><%var%></function> zeigt auf
4542 <varname>$::form->{var}</varname>. Nochmal von der anderen Seite
4543 erläutert, innerhalb von (Web-)Templates sieht man häufiger solche
4546 <programlisting>[%- IF business %]
4547 # (... Zeig die Auswahlliste Kunden-/Lieferantentyp an)
4548 [%- END %]</programlisting>
4550 <para>Entweder wird hier dann $::form->{business} ausgewertet
4551 oder aber der Funktion
4552 <function>$form->parse_html_template</function> wird explizit
4553 noch ein zusätzlicher Hash übergeben, der dann auch in den
4554 (Web-)Templates zu Verfügung steht, bspw. so:</para>
4556 <programlisting>$form->parse_html_template("is/form_header", \%TMPL_VAR);</programlisting>
4558 <para>Innerhalb von Schleifen wird
4559 <varname>$::form->{TEMPLATE_ARRAYS}{var}[$index]</varname>
4560 bevorzugt, wenn vorhanden. Ein Beispiel findet sich in SL/DO.pm,
4561 welches über alle Positionen eines Lieferscheins in Schleife
4564 <programlisting>for $i (1 .. $form->{rowcount}) {
4566 push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position;
4567 push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"};
4568 push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"};
4574 <title>%::myconfig</title>
4578 <para>Das einzige Hash unter den globalen Variablen</para>
4582 <para>Wird spätestens benötigt wenn auf die Datenbank
4583 zugegriffen wird</para>
4587 <para>Wird bei jedem Request neu erstellt.</para>
4591 <para>Enthält die Userdaten des aktuellen Logins</para>
4595 <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
4596 extern serialisiert werden, weil da auch der Datenbankzugriff
4597 für diesen user drinsteht.</para>
4601 <para>Enthält unter anderem Listenbegrenzung vclimit,
4602 Datumsformat dateformat und Nummernformat numberformat</para>
4606 <para>Enthält Datenbankzugriffinformationen</para>
4610 <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
4611 ein Userobjekt. Die meisten Funktionen, die etwas anhand des
4612 aktuellen Users entscheiden müssen, befragen
4613 <varname>%::myconfig</varname>. Innerhalb der Anwendungen sind dies
4614 überwiegend die Daten, die sich unter <guimenu>Programm</guimenu>
4615 -> <guimenuitem>Einstellungen</guimenuitem> befinden, bzw. die
4616 Informationen über den Benutzer die über die
4617 Administrator-Schnittstelle (admin.pl) eingegeben wurden.</para>
4621 <title>$::locale</title>
4625 <para>Objekt der Klasse "Locale"</para>
4629 <para>Wird pro Request erstellt</para>
4633 <para>Muss auch für Tests und Scripte immer verfügbar
4638 <para>Cached intern über Requestgrenzen hinweg benutzte
4643 <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
4644 Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
4648 <title>$::lxdebug</title>
4652 <para>Objekt der Klasse "LXDebug"</para>
4656 <para>Wird global gecached</para>
4660 <para>Muss immer verfügbar sein, in nahezu allen
4665 <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
4666 bereit, wie "<function>enter_sub</function>" und
4667 "<function>leave_sub</function>", mit denen in den alten Modulen ein
4668 brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
4669 der man die Wallclockzeit seit Requeststart loggen kann, sowie
4670 "<function>message</function>" und "<function>dump</function>" mit
4671 denen man flott Informationen ins Log (tmp/lx-office-debug.log)
4674 <para>Beispielsweise so:</para>
4676 <programlisting>$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
4677 $main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</programlisting>
4681 <title>$::auth</title>
4685 <para>Objekt der Klasse "SL::Auth"</para>
4689 <para>Wird global gecached</para>
4693 <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
4697 <para>Wird nach jedem Request resettet.</para>
4701 <para><varname>$::auth</varname> stellt Funktionen bereit um die
4702 Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
4703 vom aktuellen User abhängen wird das Objekt aus
4704 Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
4705 Request kurz resettet.</para>
4709 <title>$::lx_office_conf</title>
4713 <para>Objekt der Klasse
4714 "<classname>SL::LxOfficeConf</classname>"</para>
4718 <para>Global gecached</para>
4722 <para>Repräsentation der
4723 <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
4727 <para>Globale Konfiguration. Configdateien werden zum Start gelesen
4728 und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass
4729 das Programm die Konfiguration ändern kann oder sollte.</para>
4731 <para>Beispielsweise ist über den Konfigurationseintrag [debug] die
4732 Debug- und Trace-Log-Datei wie folgt konfiguriert und
4735 <programlisting>[debug]
4736 file = /tmp/lx-office-debug.log</programlisting>
4738 <para>ist der Key <varname>file</varname> im Programm als
4739 <varname>$::lx_office_conf->{debug}{file}</varname>
4743 <para>Zugriff auf die Konfiguration erfolgt im Moment über
4744 Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
4749 <title>$::instance_conf</title>
4753 <para>Objekt der Klasse
4754 "<classname>SL::InstanceConfiguration</classname>"</para>
4758 <para>wird pro Request neu erstellt</para>
4762 <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
4763 speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
4764 ist hier eine Mandantendatenbank. Beispielsweise überprüft
4765 <programlisting>$::instance_conf->get_inventory_system eq 'perpetual'</programlisting>
4766 ob die berüchtigte Bestandsmethode zur Anwendung kommt.</para>
4770 <title>$::dispatcher</title>
4774 <para>Objekt der Klasse
4775 "<varname>SL::Dispatcher</varname>"</para>
4779 <para>wird pro Serverprozess erstellt.</para>
4783 <para>enthält Informationen über die technische Verbindung zum
4788 <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
4789 global gespeichert wird. Wird vermutlich irgendwann in einem anderen
4790 Objekt untergebracht.</para>
4794 <title>$::request</title>
4798 <para>Hashref (evtl später Objekt)</para>
4802 <para>Wird pro Request neu initialisiert.</para>
4806 <para>Keine Unterstruktur garantiert.</para>
4810 <para><varname>$::request</varname> ist ein generischer Platz um
4811 Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
4812 at a distance benutzt werden, sondern um lokales memoizing zu
4813 ermöglichen, das garantiert am Ende des Requests zerstört
4816 <para>Vieles von dem, was im moment in <varname>$::form</varname>
4817 liegt, sollte eigentlich hier liegen. Die groben
4818 Differentialkriterien sind:</para>
4822 <para>Kommt es vom User, und soll unverändert wieder an den
4823 User? Dann <varname>$::form</varname>, steht da eh schon</para>
4827 <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des
4828 Requests gebraucht werden? Dann
4829 <varname>$::request</varname></para>
4833 <para>Muss ich von anderen Teilen des Programms lesend drauf
4834 zugreifen? Dann <varname>$::request</varname>, aber Zugriff über
4835 Wrappermethode</para>
4842 <title>Ehemalige globale Variablen</title>
4844 <para>Die folgenden Variablen waren einmal im Programm, und wurden
4848 <title>$::cgi</title>
4852 <para>war nötig, weil cookie Methoden nicht als
4853 Klassenfunktionen funktionieren</para>
4857 <para>Aufruf als Klasse erzeugt Dummyobjekt was im
4858 Klassennamespace gehalten wird und über Requestgrenzen
4863 <para>liegt jetzt unter
4864 <varname>$::request->{cgi}</varname></para>
4870 <title>$::all_units</title>
4874 <para>war nötig, weil einige Funktionen in Schleifen zum Teil
4875 ein paar hundert mal pro Request eine Liste der Einheiten
4876 brauchen, und de als Parameter durch einen Riesenstack von
4877 Funktionen geschleift werden müssten.</para>
4881 <para>Liegt jetzt unter
4882 <varname>$::request->{cache}{all_units}</varname></para>
4887 <function>AM->retrieve_all_units()</function> gesetzt oder
4894 <title>%::called_subs</title>
4898 <para>wurde benutzt um callsub deep recursions
4903 <para>Wurde entfernt, weil callsub nur einen Bruchteil der
4904 möglichen Rekursioenen darstellt, und da nie welche
4909 <para>komplette recursion protection wurde entfernt.</para>
4916 <sect1 id="devel.fcgi">
4917 <title>Entwicklung unter FastCGI</title>
4919 <sect2 id="devel.fcgi.general">
4920 <title>Allgemeines</title>
4922 <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
4923 werden, muss der Webserver neu gestartet werden.</para>
4925 <para>Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu
4926 achten. Dadurch, dass das Programm in einer Endlosschleife läuft,
4927 müssen folgende Aspekte beachtet werden.</para>
4930 <sect2 id="devel.fcgi.exiting">
4931 <title>Programmende und Ausnahmen</title>
4933 <para>Betrifft die Funktionen <function>warn</function>,
4934 <function>die</function>, <function>exit</function>,
4935 <function>carp</function> und <function>confess</function>.</para>
4937 <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
4938 Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
4939 am Laufen zu halten. Man kann mit <function>die</function>,
4940 <function>confess</function> oder <function>carp</function> Fehler
4941 ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
4942 eigene <function>$::form-</function>error()> tut im Prinzip das
4943 Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
4944 <function>exit</function> hingegen werden nicht abgefangen.
4945 <function>warn</function> wird direkt nach STDERR, also in Server Log
4946 eine Nachricht schreiben (sofern in der Konfiguration nicht die
4947 Warnungen in das Lx-Office Log umgeleitet wurden), und
4948 <function>exit</function> wird die Ausführung beenden.</para>
4950 <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
4951 beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
4952 Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
4953 benutzen, alle anderen Exceptionmechanismen sind ok.</para>
4956 <sect2 id="devel.fcgi.globals">
4957 <title>Globale Variablen</title>
4959 <para>Um zu vermeiden, dass Informationen von einem Request in einen
4960 anderen gelangen, müssen alle globalen Variablen vor einem Request
4961 sauber initialisiert werden. Das ist besonders wichtig im
4962 <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
4963 diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
4966 <para>In <classname>SL::Dispatcher</classname> gibt es einen sauber
4967 abgetrennten Block, der alle kanonischen globalen Variablen listet und
4968 erklärt. Bitte keine anderen einführen ohne das sauber zu
4969 dokumentieren.</para>
4971 <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
4972 man sicher geht, dass man die richtige erwischt.</para>
4975 <sect2 id="devel.fcgi.performance">
4976 <title>Performance und Statistiken</title>
4978 <para>Die kritischen Pfade des Programms sind die Belegmasken, und
4979 unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
4980 Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
4981 4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
4982 sind es je nach Menge der definierten Variablen 1-2s. Ab der
4983 Moose/Rose::DB Version sind es 5-6s.</para>
4985 <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
4986 den kritischen Pfaden, unter 0,15 sonst.</para>
4989 <sect2 id="devel.fcgi.known-issues">
4990 <title>Bekannte Probleme</title>
4992 <sect3 id="devel.fcgi.known-issues.encoding">
4993 <title>Encoding Awareness</title>
4995 <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
4996 fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
4997 falsch kodierte Zeichen eher unwissend, und geben sie einfach
4998 weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
4999 das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
5005 <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
5006 <title>SQL-Upgradedateien</title>
5008 <sect2 id="db-upgrade-files.introduction"
5009 xreflabel="Einführung in die Datenbank-Upgradedateien">
5010 <title>Einführung</title>
5012 <para>Der alte Mechanismus für SQL-Upgradescripte, der auf einer
5013 Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
5014 diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele
5015 Entwicklung im stable- und unstable-Baum betrifft.</para>
5017 <para>Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert.
5018 Es werden weiterhin alle Scripte aus sql/Pg-upgrade ausgeführt.
5019 Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In
5020 diesem Verzeichnis muss pro Datenbankupgrade eine Datei existieren,
5021 die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige
5022 Kontrollinformationen enthält.</para>
5024 <para>Neu sind die Kontrollinformationen, die Abhängigkeiten und
5025 Prioritäten definieren können werden, sodass Datenbankscripte zwar in
5026 einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER
5027 TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
5028 angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man
5029 keine Versionsnummern mehr braucht.</para>
5031 <para>Lx-Office merkt sich dabei, welches der Upgradescripte in
5032 sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht
5033 erneut aus. Dazu dient die Tabelle "schema_info", die bei der
5034 Anmeldung automatisch angelegt wird.</para>
5037 <sect2 id="db-upgrade-files.format"
5038 xreflabel="Format der Upgradedateien">
5039 <title>Format der Kontrollinformationen</title>
5041 <para>Die Kontrollinformationen sollten sich am Anfang der jeweiligen
5042 Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
5043 hat dabei das folgende Format:</para>
5045 <para>Für SQL-Upgradedateien:</para>
5047 <programlisting>-- @key: value</programlisting>
5049 <para>Für Perl-Upgradedateien:</para>
5051 <programlisting># @key: value</programlisting>
5053 <para>Leerzeichen vor "<varname>value</varname>" werden
5056 <para>Die folgenden Schlüsselworte werden verarbeitet:</para>
5060 <term><varname>tag</varname></term>
5063 <para>Wird zwingend benötigt. Dies ist der "Name" des Upgrades.
5064 Dieser "tag" kann von anderen Kontrolldateien in ihren
5065 Abhängigkeiten verwendet werden (Schlüsselwort
5066 "<varname>depends</varname>"). Der "tag" ist auch der Name, der
5067 in der Datenbank eingetragen wird.</para>
5069 <para>Normalerweise sollte die Kontrolldatei genau so heißen wie
5070 der "tag", nur mit der Endung ".sql" bzw. "pl".</para>
5072 <para>Ein Tag darf nur aus alphanumerischen Zeichen sowie den
5073 Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht
5074 erlaubt und sollten stattdessen mit Unterstrichen ersetzt
5080 <term><varname>charset</varname></term>
5083 <para>Empfohlen. Gibt den Zeichensatz an, in dem das Script
5084 geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
5085 Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei
5086 Abwesenheit des Tags der Zeichensatz
5087 "<literal>ISO-8859-15</literal>" angenommen.</para>
5092 <term><varname>description</varname></term>
5095 <para>Benötigt. Eine Beschreibung, was in diesem Update
5096 passiert. Diese wird dem Benutzer beim eigentlichen
5097 Datenbankupdate angezeigt. Während der Tag in englisch gehalten
5098 sein sollte, sollte die Beschreibung auf Deutsch
5104 <term><varname>depends</varname></term>
5107 <para>Optional. Eine mit Leerzeichen getrennte Liste von "tags",
5108 von denen dieses Upgradescript abhängt. Lx-Office stellt sicher,
5109 dass die in dieser Liste aufgeführten Scripte bereits
5110 durchgeführt wurden, bevor dieses Script ausgeführt wird.</para>
5112 <para>Abhängigkeiten werden rekursiv betrachtet. Wenn also ein
5113 Script "b" existiert, das von Änderungen in "a" abhängt, und
5114 eine neue Kontrolldatei für "c" erstellt wird, die von
5115 Änderungen in "a" und "b" abhängt, so genügt es, in "c" nur den
5116 Tag "b" als Abhängigkeit zu definieren.</para>
5118 <para>Es ist nicht erlaubt, sich selbst referenzierende
5119 Abhängigkeiten zu definieren (z.B. "a" -> "b", "b" -> "c"
5120 und "c" -> "a").</para>
5125 <term><varname>priority</varname></term>
5128 <para>Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in
5129 der Scripte ausgeführt werden, die die gleichen
5130 Abhängigkeitstiefen besitzen. Fehlt dieser Parameter, so wird
5131 der Wert 1000 benutzt.</para>
5133 <para>Dies ist reine Kosmetik. Für echte Reihenfolgen muss
5134 "depends" benutzt werden. Lx-Office sortiert die auszuführenden
5135 Scripte zuerst nach der Abhängigkeitstiefe (wenn "z" von "y"
5136 abhängt und "y" von "x", so hat "z" eine Abhängigkeitstiefe von
5137 2, "y" von 1 und "x" von 0. "x" würde hier zuerst ausgeführt,
5138 dann "y", dann "z"), dann nach der Priorität und bei gleicher
5139 Priorität alphabetisch nach dem "tag".</para>
5144 <term><varname>ignore</varname></term>
5147 <para>Optional. Falls der Wert auf 1 (true) steht, wird das
5148 Skript bei der Anmeldung ignoriert und entsprechend nicht
5155 <sect2 id="db-upgrade-files.dbupgrade-tool"
5156 xreflabel="Hilfsscript dbupgrade2_tool.pl">
5157 <title>Hilfsscript dbupgrade2_tool.pl</title>
5159 <para>Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern,
5160 existiert ein Hilfsscript namens
5161 "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem
5162 Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses Tool
5163 liest alle Datenbankupgradescripte aus dem Verzeichnis
5164 <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die
5165 gleichen Methoden wie Lx-Office selber, sodass alle Fehlersituationen
5166 von der Kommandozeile überprüft werden können.</para>
5168 <para>Wird dem Script kein weiterer Parameter übergeben, so wird nur
5169 eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
5170 sich aber auch Informationen auf verschiedene Art ausgeben
5175 <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl
5176 --list</command>"</para>
5178 <para>Gibt eine Liste aller Scripte aus. Die Liste ist in der
5179 Reihenfolge sortiert, in der Lx-Office die Scripte ausführen
5180 würde. Es werden neben der Listenposition der Tag, die
5181 Abhängigkeitstiefe und die Priorität ausgegeben.</para>
5185 <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl
5186 --tree</command>"</para>
5188 <para>Listet alle Tags in Baumform basierend auf den
5189 Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von
5190 denen keine anderen abhängen. Die Unterknoten sind Scripte, die
5191 beim übergeordneten Script als Abhängigkeit eingetragen
5195 <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
5196 <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl
5197 --rtree</command>"</para>
5199 <para>Listet alle Tags in Baumform basierend auf den
5200 Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte mit
5201 der geringsten Abhängigkeitstiefe. Die Unterknoten sind Scripte,
5202 die das übergeordnete Script als Abhängigkeit eingetragen
5207 <para>Baumform mit Postscriptausgabe:
5208 "<command>./scripts/dbupgrade2_tool.pl
5209 --graphviz</command>"</para>
5211 <para>Benötigt das Tool "<command>graphviz</command>", um mit
5212 seiner Hilfe die <link
5213 linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte
5214 Baumform</link> in eine Postscriptdatei namens
5215 "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist
5216 vermutlich die übersichtlichste Form, weil hierbei jeder Knoten
5217 nur einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen
5218 können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben
5223 <para>Scripte, von denen kein anderes Script abhängt:
5224 "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"</para>
5226 <para>Listet die Tags aller Scripte auf, von denen keine anderen
5227 Scripte abhängen.</para>
5233 <sect1 id="translations-languages" xreflabel="Translations and languages">
5234 <title>Translations and languages</title>
5236 <sect2 id="translations-languages.introduction"
5237 xreflabel="Introduction to translations and languages">
5238 <title>Introduction</title>
5241 <para>Dieser Abschnitt ist in Englisch geschrieben, um
5242 internationalen Übersetzern die Arbeit zu erleichtern.</para>
5245 <para>This section describes how localization packages in Lx-Office
5246 are built. Currently the only language fully supported is German, and
5247 since most of the internal messages are held in English the English
5248 version is usable too.</para>
5250 <para>A stub version of French is included but not functunal at this
5254 <sect2 id="translations-languages.file-structure"
5255 xreflabel="File structure">
5256 <title>File structure</title>
5258 <para>The structure of locales in Lx-Office is:</para>
5260 <programlisting>lx-office/locale/<langcode>/</programlisting>
5262 <para>where <langcode> stands for an abbreviation of the
5263 language package. The builtin packages use two letter <ulink
5264 url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
5265 but the actual name is not relevant for the program and can easily be
5267 url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
5268 tags</ulink> (i.e. "en_GB"). In fact the original language packages
5269 from SQL Ledger are named in this way.</para>
5271 <para>In such a language directory the following files are
5276 <term>LANGUAGE</term>
5279 <para>This file is mandatory.</para>
5281 <para>The <filename>LANGUAGE</filename> file contains the self
5282 descripted name of the language. It should contain a native
5283 representation first, and in parenthesis an english translation
5284 after that. Example:</para>
5286 <programlisting>Deutsch (German)</programlisting>
5291 <term>charset</term>
5294 <para>This file should be present.</para>
5296 <para>The <filename>charset</filename> file describes which
5297 charset a language package is written in and applies to all
5298 other language files in the package. It is possible to write
5299 some language packages without an explicit charset, but it is
5300 still strongly recommended. You'll never know in what
5301 environment your language package will be used, and neither
5302 UTF-8 nor Latin1 are guaranteed.</para>
5304 <para>The whole content of this file is a string that can be
5305 recognized as a valid charset encoding. Example:</para>
5307 <programlisting>UTF-8</programlisting>
5315 <para>This file is mandatory.</para>
5317 <para>The central translation file. It is essentially an inline
5318 Perl script autogenerated by <command>locales.pl</command>. To
5319 generate it, generate the directory and the two files mentioned
5320 above, and execute the following command:</para>
5322 <programlisting>scripts/locales.pl <langcode></programlisting>
5324 <para>Otherwise you can simply copy one of the other languages.
5325 You will be told how many are missing like this:</para>
5327 <programlisting>$ scripts/locales.pl en
5328 English - 0.6% - 2015/2028 missing</programlisting>
5330 <para>A file named "<filename>missing</filename>" will be
5331 generated and can be edited. You can also edit the
5332 "<filename>all</filename>" file directly. Edit everything you
5333 like to fit the target language and execute
5334 <command>locales.pl</command> again. See how the missing words
5340 <term>Num2text</term>
5343 <para>Legacy code from SQL Ledger. It provides a means for
5344 numbers to be converted into natural language, like
5345 <literal>1523 => one thousand five hundred twenty
5346 three</literal>. If you want to provide it, it must be inlinable
5347 Perl code which provides a <function>num2text</function> sub. If
5348 an <function>init</function> sub exists it will be executed
5351 <para>Only used in the check and receipt printing module.</para>
5356 <term>special_chars</term>
5359 <para>Lx-Office comes with a lot of interfaces to different
5360 formats, some of which are rather picky with their accepted
5361 charset. The <filename>special_chars</filename> file contains a
5362 listing of chars not suited for different file format and
5363 provides substitutions. It is written in "Simple Ini" style,
5364 containing a block for every file format.</para>
5366 <para>First entry should be the order of substitution for
5367 entries as a whitespace separated list. All entries are
5368 interpolated, so <literal>\n</literal>, <literal>\x20</literal>
5369 and <literal>\\</literal> all work.</para>
5371 <para>After that every entry is a special char that should be
5372 translated when writing text into such a file.</para>
5374 <para>Example:</para>
5376 <programlisting>[Template/XML]
5377 order=& < > \n
5381 \n=<br></programlisting>
5383 <para>Note the importance of the order in this example.
5384 Substituting < and > befor & would lead to $gt; become
5387 <para>For a list of valid formats, see the German
5388 <filename>special_chars</filename> entry. As of this writing the
5389 following are recognized:</para>
5391 <programlisting>HTML
5396 Template/OpenDocument
5397 filenames</programlisting>
5399 <para>The last of which is very machine dependant. Remember that
5400 a lot of characters are forbidden by some filesystems, for
5401 exmaple MS Windows doesn't like ':' in its files where Linux
5402 doesn't mind that. If you want the files created with your
5403 language pack to be portable, find all chars that could cause
5409 <term>missing</term>
5412 <para>This file is not a part of the language package
5415 <para>This is a file generated by
5416 <command>scripts/locales.pl</command> while processing your
5417 locales. It's only to have the missing entries singled out and
5418 does not belong to a language package.</para>
5426 <para>This file is not a part of the language package
5429 <para>Another file generated by
5430 <command>scripts/locales.pl</command>. If for any reason a
5431 translation does not appear anymore and can be deleted, it gets
5432 moved here. The last 50 or so entries deleted are saved here in
5433 case you made a typo, so that you don't have to translate
5434 everything again. If a tranlsation is missing, the lost file is
5435 checked first. If you maintain a language package, you might
5436 want to keep this safe somewhere.</para>
5443 <sect1 id="devel.style-guide">
5444 <title>Stil-Richtlinien</title>
5446 <para>Die folgenden Regeln haben das Ziel, den Code möglichst gut les-
5447 und wartbar zu machen. Dazu gehört zum Einen, dass der Code einheitlich
5448 eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden
5449 wird (Stichworte "Klammern" oder "Hash-Keys").</para>
5451 <para>Diese Regeln sind keine Schikane sondern erleichtern allen das
5454 <para>Jeder, der einen Patch schickt, sollte seinen Code vorher
5455 überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
5460 <para>Es werden keine echten Tabs sondern Leerzeichen
5465 <para>Die Einrückung beträgt zwei Leerzeichen. Beispiel:</para>
5467 <programlisting>foreach my $row (@data) {
5469 # do something with $row
5473 $row->{modules} = MODULE->retrieve(
5474 id => $row->{id},
5475 date => $use_now ? localtime() : $row->{time},
5479 $report->add($row);
5484 <para>Öffnende geschweifte Klammern befinden sich auf der gleichen
5485 Zeile wie der letzte Befehl. Beispiele:</para>
5487 <programlisting>sub debug {
5493 <programlisting>if ($form->{item_rows} > 0) {
5499 <para>Schließende geschweifte Klammern sind so weit eingerückt wie
5500 der Befehl / die öffnende schließende Klammer, die den Block
5501 gestartet hat, und nicht auf der Ebene des Inhalts. Die gleichen
5502 Beispiele wie bei 3. gelten.</para>
5506 <para>Die Wörter "<function>else</function>",
5507 "<function>elsif</function>", "<function>while</function>" befinden
5508 sich auf der gleichen Zeile wie schließende geschweifte Klammern.
5511 <programlisting>if ($form->{sum} > 1000) {
5513 } elsif ($form->{sum} > 0) {
5521 } until ($a > 0);</programlisting>
5525 <para>Parameter von Funktionsaufrufen müssen mit runden Klammern
5526 versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
5527 und grep-ähnliche Operatoren. Beispiel:</para>
5529 <programlisting>$main::lxdebug->message("Could not find file.");
5530 %options = map { $_ => 1 } grep { !/^#/ } @config_file;</programlisting>
5534 <para>Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:</para>
5536 <para>Generell gilt: Hashkeys und Arrayindices sollten nicht durch
5537 Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
5538 Blöcke schon. Beispiel:</para>
5540 <programlisting>if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
5545 $form->{sum} += $form->{"row_$i"};
5546 $form->{ $form->{index} } += 1;
5548 map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;</programlisting>
5552 <para>Mehrzeilige Befehle</para>
5556 <para>Werden die Parameter eines Funktionsaufrufes auf mehrere
5557 Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
5558 werden, in der die ersten Funktionsparameter in der ersten Zeile
5559 stehen. Beispiel:</para>
5561 <programlisting>$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
5562 $form->{some_col_value});</programlisting>
5566 <para>Ein Spezialfall ist der ternäre Oprator "?:", der am
5567 besten in einer übersichtlichen Tabellenstruktur organisiert
5568 wird. Beispiel:</para>
5570 <programlisting>my $rowcount = $form->{"row_$i"} ? $i
5571 : $form->{oldcount} ? $form->{oldcount} + 1
5572 : $form->{rowcount} - $form->{rowbase};</programlisting>
5578 <para>Kommentare</para>
5582 <para>Kommentare, die alleine in einer Zeile stehen, sollten
5583 soweit wie der Code eingerückt sein.</para>
5587 <para>Seitliche hängende Kommentare sollten einheitlich
5588 formatiert werden.</para>
5592 <para>Sämtliche Kommentare und Sonstiges im Quellcode ist bitte
5593 auf Englisch zu verfassen. So wie ich keine Lust habe,
5594 französischen Quelltext zu lesen, sollte auch der Lx-Office
5595 Quelltext für nicht-Deutschsprachige lesbar sein.
5598 <programlisting>my $found = 0;
5606 $i = 0 # initialize $i
5608 $i *= $const; # do something crazy
5609 $i = $n; # recover $i</programlisting>
5615 <para>Hashkeys sollten nur in Anführungszeichen stehen, wenn die
5616 Interpolation gewünscht ist. Beispiel:</para>
5618 <programlisting>$form->{sum} = 0;
5619 $form->{"row_$i"} = $form->{"row_$i"} - 5;
5620 $some_hash{42} = 54;</programlisting>
5624 <para>Die maximale Zeilenlänge ist nicht beschränkt. Zeilenlängen
5625 unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
5626 wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in
5627 grossen Tabellen), dann ist Lesbarkeit vorzuziehen.</para>
5629 <para>Als Beispiel sei die Funktion
5630 <function>print_options</function> aus
5631 <filename>bin/mozilla/io.pl</filename> angeführt.</para>
5635 <para>Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind
5636 unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die diffs
5639 <para>Emacs und vim haben beide recht einfache Methoden zur
5640 Entfernung von trailing whitespace. Emacs kennt das Kommande
5641 <command>nuke-trailing-whitespace</command>, vim macht das gleiche
5642 manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
5643 BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern
5648 <para>Es wird kein <command>perltidy</command> verwendet.</para>
5650 <para>In der Vergangenheit wurde versucht,
5651 <command>perltidy</command> zu verwenden, um einen einheitlichen
5652 Stil zu erlangen. Es hat sich aber gezeigt, dass
5653 <command>perltidy</command>s sehr eigenwilliges Verhalten, was
5654 Zeilenumbrüche angeht, oftmals gut formatierten Code zerstört. Für
5655 den Interessierten sind hier die
5656 <command>perltidy</command>-Optionen, die grob den beschriebenen
5657 Richtlinien entsprechen:</para>
5659 <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
5660 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
5661 -lp -vt=1 -vtc=1</programlisting>
5665 <para><varname>STDERR</varname> ist tabu. Unkonditionale
5666 Debugmeldungen auch.</para>
5668 <para>Lx-Office bietet mit dem Modul <classname>LXDebug</classname>
5669 einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
5670 Grund, nach <varname>STDERR</varname> zu schreiben.</para>
5672 <para>Die <classname>LXDebug</classname>-Methode
5673 "<function>message</function>" nimmt als ersten Paramter außerdem
5674 eine Flagmaske, für die die Meldung angezeigt wird, wobei "0" immer
5675 angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden
5676 und werden in den meisten Fällen auch vom Repository
5677 zurückgewiesen.</para>
5681 <para>Alle neuen Module müssen use strict verwenden.</para>
5683 <para><varname>$form</varname>, <varname>$auth</varname>,
5684 <varname>$locale</varname>, <varname>$lxdebug</varname> und
5685 <varname>%myconfig</varname> werden derzeit aus dem main package
5686 importiert (siehe <xref linkend="devel.globals" />. Alle anderen
5687 Konstrukte sollten lexikalisch lokal gehalten werden.</para>
5692 <sect1 id="devel.build-doc" xreflabel="Dokumentation erstellen">
5693 <title>Dokumentation erstellen</title>
5695 <sect2 id="devel.build-doc.introduction">
5696 <title>Einführung</title>
5698 <para>Diese Dokumentation ist in <productname>DocBook</productname>
5699 XML geschrieben. Zum Bearbeiten reicht grundsätzlich ein Text-Editor.
5700 Mehr Komfort bekommt man, wenn man einen dedizierten XML-fähigen
5701 Editor nutzt, der spezielle Unterstützung für
5702 <productname>DocBook</productname> mitbringt. Wir empfehlen dafür den
5703 <ulink url="http://www.xmlmind.com/xmleditor/">XMLmind XML
5704 Editor</ulink>, der bei nicht kommerzieller Nutzung kostenlos
5708 <sect2 id="devel.build-doc.required-software">
5709 <title>Benötigte Software</title>
5711 <para>Bei <productname>DocBook</productname> ist Prinzip, dass
5712 ausschließlich die XML-Quelldatei bearbeitet wird. Aus dieser werden
5713 dann mit entsprechenden Stylesheets andere Formate wie PDF oder HTML
5714 erzeugt. Bei Lx-Office übernimmt diese Aufgabe das Shell-Script
5715 <command>scripts/build_doc.sh</command>.</para>
5717 <para>Das Script benötigt zur Konvertierung verschiedene
5718 Softwarekomponenten, die im normalen Lx-Office-Betrieb nicht benötigt
5724 url="http://www.oracle.com/technetwork/java/index.html">Java</ulink>
5725 in einer halbwegs aktuellen Version</para>
5729 <para>Das Java-Build-System <ulink
5730 url="http://ant.apache.org/">Apache Ant</ulink></para>
5734 <para>Das Dokumentations-System Dobudish für
5735 <productname>DocBook</productname> 4.5, eine Zusammenstellung
5736 diverser Stylesheets und Grafiken zur Konvertierung von
5737 <productname>DocBook</productname> XML in andere Formate. Das
5738 Paket, das benötigt wird, ist zum Zeitpunkt der
5739 Dokumentationserstellung
5740 <filename>dobudish-nojre-1.1.4.zip</filename>, aus auf <ulink
5741 url="http://code.google.com/p/dobudish/downloads/list">code.google.com</ulink>
5746 <para>Apache Ant sowie ein dazu passendes Java Runtime Environment
5747 sind auf allen gängigen Plattformen verfügbar. Beispiel für
5748 Debian/Ubuntu:</para>
5750 <programlisting>apt-get install ant openjdk-7-jre</programlisting>
5752 <para>Nach dem Download von Dobudish muss Dobudish im Unterverzeichnis
5753 <filename>doc/build</filename> entpackt werden. Beispiel unter der
5754 Annahme, das <productname>Dobudish</productname> in
5755 <filename>$HOME/Downloads</filename> heruntergeladen wurde:</para>
5757 <programlisting>cd doc/build
5758 unzip $HOME/Downloads/dobudish-nojre-1.1.4.zip</programlisting>
5761 <sect2 id="devel.build-doc.build">
5762 <title>PDFs und HTML-Seiten erstellen</title>
5764 <para>Die eigentliche Konvertierung erfolgt nach Installation der
5765 benötigten Software mit einem einfachen Aufruf direkt aus dem
5766 Lx-Office-Installationsverzeichnis heraus:</para>
5768 <programlisting>./scripts/build_doc.sh</programlisting>
5771 <sect2 id="devel.build-doc.repository">
5772 <title>Einchecken in das Git-Repository</title>
5774 <para>Sowohl die XML-Datei als auch die erzeugten PDF- und
5775 HTML-Dateien sind Bestandteil des Git-Repositories. Daraus folgt, dass
5776 nach Änderungen am XML die PDF- und HTML-Dokumente ebenfalls gebaut
5777 und alles zusammen in einem Commit eingecheckt werden sollten.</para>
5779 <para>Die "<filename>dobudish</filename>"-Verzeichnisse bzw.
5780 symbolischen Links gehören hingegen nicht in das Repository.</para>