1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4 <book id="ding.xml" lang="de">
5 <title>Lx-Office: Installation, Konfiguration, Entwicklung</title>
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>
33 <title>Installation und Grundkonfiguration</title>
35 <sect1 id="Benötigte-Software-und-Pakete">
36 <title>Benötigte Software und Pakete</title>
38 <sect2 id="Betriebssystem">
39 <title>Betriebssystem</title>
41 <para>Lx-Office ist für Linux konzipiert, und sollte auf jedem
42 unixoiden Betriebssystem zum Laufen zu kriegen sein. Getestet ist
43 diese Version im speziellen auf Debian und Ubuntu, grundsätzlich wurde
44 bei der Auswahl der Pakete aber darauf Rücksicht genommen, dass es
45 ohne große Probleme auf den derzeit aktuellen verbreiteten
46 Distributionen läuft.</para>
48 <para>Anfang 2011 sind das folgende Systeme:</para>
52 <para>Ubuntu 8.04 LTS Hardy Heron</para>
56 <para>Ubuntu 9.10 Karmic Koala</para>
60 <para>Ubuntu 10.04 Lucid Lynx</para>
64 <para>Ubuntu 10.10 Maverick Meerkat</para>
68 <para>Debian 5.0 Lenny</para>
72 <para>Debian 6.0 Squeeze</para>
76 <para>openSUSE 11.2</para>
80 <para>openSUSE 11.3</para>
84 <para>SuSE Linux Enterprice Server 11</para>
88 <para>Fedora 13</para>
92 <para>Fedora 14</para>
96 <para>Für die debianoiden Betriebssysteme existiert ein .deb, das
97 deutlich einfacher zu installieren ist.</para>
99 <para>Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die
100 Module im Archiv recht alt sind, und das viele der benötigten Module
101 nicht einfach zu installieren sind. Dafür sollte es kurz nach dem
102 Release ein eigenes .deb geben.</para>
104 <para>Alternativ dazu kann die normale Installation durchgeführt
106 linkend="Manuelle-Installation-des-Programmpaketes"/>), wenn vorher
107 ein Kompatibilitätspaket installiert wird, das die fehlenden Pakete
108 bereitstellt. Das Paket ist auf <ulink
109 url="https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/">Sourceforge</ulink>
110 unter dem Namen <filename>lx-erp-perl-libs-compat-v2.tar.gz</filename>
113 <para>Zur Installation das Paket in das entpackte Lx-Office
114 Verzeichnis entpacken:</para>
116 <para><literal>tar xzf lx-erp-perl-libs-compat-v2.tar.gz
117 /path/to/lx-office/</literal></para>
119 <para>Zusätzlich müssen dann noch die folgenden Pakete installiert
122 <para><literal>libbit-vector-perl libsub-exporter-perl libclone-perl
123 libclass-factory-util-perl</literal></para>
125 <para>Danach sollte der Installationscheck (siehe <xref
126 linkend="Pakete"/>) die enthaltenen Pakete erkennen.</para>
129 <sect2 id="Pakete" xreflabel="Pakete">
130 <title>Pakete</title>
132 <para>Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist
133 Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
136 <para>Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die
137 nicht Bestandteil einer Standard-Perl-Installation sind:</para>
145 <para>Archive::Zip</para>
149 <para>Config::Std</para>
153 <para>DateTime</para>
165 <para>Email::Address</para>
173 <para>List::MoreUtils</para>
177 <para>Params::Validate</para>
181 <para>PDF::API2</para>
185 <para>Rose::Object</para>
189 <para>Rose::DB</para>
193 <para>Rose::DB::Object</para>
197 <para>Template</para>
201 <para>Text::CSV_XS</para>
205 <para>Text::Iconv</para>
213 <para>XML::Writer</para>
221 <para>Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
222 hinzugekommen, <literal>URI</literal> und
223 <literal>XML::Writer</literal> sind notwendig. Ohne startet Lx-Office
226 <para>Gegenüber Version 2.6.1 sind <literal>parent</literal>,
227 <literal>DateTime</literal>, <literal>Rose::Object</literal>,
228 <literal>Rose::DB</literal> und <literal>Rose::DB::Object</literal>
229 neu hinzugekommen. <literal>IO::Wrap</literal> wurde entfernt.</para>
231 <para>Gegenüber Version 2.6.3 ist <literal>JSON</literal> neu
232 hinzugekommen.</para>
234 <para><literal>Email::Address</literal> und
235 <literal>List::MoreUtils</literal> sind schon länger feste
236 Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert. Beide
237 sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
238 zukünftigen Version aber aus dem Paket entfernt werden. Es wird
239 empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
242 <para>Die zu installierenden Pakete können in den verschiedenen
243 Distributionen unterschiedlich heißen.</para>
245 <para>Für Debian oder Ubuntu benötigen Sie diese Pakete:</para>
247 <para><literal>apache2 postgresql libparent-perl libarchive-zip-perl
248 libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl
249 libemail-address-perl liblist-moreutils-perl libpdf-api2-perl
250 librose-object-perl librose-db-perl librose-db-object-perl
251 libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl
252 libxml-writer-perl libyaml-perl libconfig-std-perl
253 libparams-validate-perl libjson-perl</literal></para>
255 <para>Für Fedora Core benötigen Sie diese Pakete:</para>
257 <para><literal>httpd postgresql-server perl-parent perl-DateTime
258 perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils
259 perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object
260 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI
261 perl-XML-Writer perl-YAML</literal></para>
263 <para>Für OpenSuSE benötigen Sie diese Pakete:</para>
265 <para><literal>apache2 postgresql-server perl-Archive-Zip
266 perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils
267 perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
268 perl-URI perl-XML-Writer perl-YAML</literal></para>
270 <para>Bei openSuSE 11 ist <literal>parent</literal> bereits enthalten,
271 und braucht nicht nachinstalliert werden. Die
272 <literal>Rose::*</literal> Pakete sind derzeit nicht für SuSE gepackt,
273 und müssen anderweitig nachinstalliert werden.</para>
275 <para>Lx-Office enthält ein Script, mit dem überprüft werden kann, ob
276 alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
279 <programlisting>./scripts/installation_check.pl</programlisting>
283 <sect1 id="Manuelle-Installation-des-Programmpaketes"
284 xreflabel="Manuelle Installation des Programmpaketes">
285 <title>Manuelle Installation des Programmpaketes</title>
287 <para>Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird
288 im Dokumentenverzeichnis des Webservers (z.B.
289 <filename>/var/www/html/</filename>,
290 <filename>/srv/www/htdocs</filename> oder
291 <filename>/var/www/</filename>) entpackt:</para>
293 <programlisting>cd /var/www tar xvzf
294 lxoffice-erp-2.6.2.tgz</programlisting>
296 <para>Verändern Sie evtl. noch den Namen des Verzeichnisses mit</para>
298 <programlisting>mv lxoffice-erp/ lx-erp/</programlisting>
300 <para>Alternativ können Sie auch einen Alias in der
301 Webserverkonfiguration benutzen, um auf das tatsächliche
302 Installationsverzeichnis zu verweisen.</para>
304 <para>Die Verzeichnisse <filename>users</filename>,
305 <filename>spool</filename> und <filename>webdav</filename> müssen für
306 den Benutzer beschreibbar sein, unter dem der Webserver läuft. Die
307 restlichen Dateien müssen für diesen Benutzer lesbar sein. Der
308 Benutzername ist bei verschiedenen Distributionen unterschiedlich (z.B.
309 bei Debian/Ubuntu <constant>www-data</constant>, bei Fedora core
310 <constant>apache</constant> oder bei OpenSuSE
311 <constant>wwwrun</constant>).</para>
313 <para>Der folgende Befehl ändert den Besitzer für die oben genannten
314 Verzeichnisse auf einem Debian/Ubuntu-System:</para>
316 <programlisting>chown -R www-data lx-office-erp/users lx-office-erp/spool lx-office-erp/webdav</programlisting>
318 <para>Weiterhin muss der Webserver-Benutzer im Verzeichnis
319 <filename>templates</filename> Verzeichnisse für jeden neuen Benutzer,
320 der in lx-office angelegt wird, anlegen dürfen:</para>
322 <programlisting>chgrp www-data lx-office-erp/templates
323 chmod g+w lx-office-erp/templates</programlisting>
326 <sect1 id="config.config-file">
327 <title>Lx-Office-Konfigurationsdatei</title>
329 <sect2 id="config.config-file.introduction" xreflabel="Einführung in die Konfigurationsdatei">
330 <title>Einführung</title>
333 Seit Lx-Office 2.6.3. gibt es nur noch eine Konfigurationsdatei die benötigt wird: <filename>config/lx_office.conf</filename> (kurz:
334 "die Hauptkonfigurationsdatei"). Diese muss bei der Erstinstallation von Lx-Office bzw. der Migration von älteren Versionen angelegt
339 Als Vorlage dient die Datei <filename>config/lx_office.conf.default</filename> (kurz: "die Default-Datei"):
342 <programlisting>$ cp config/lx_office.conf.default config/lx_office.conf</programlisting>
345 Die Default-Datei wird immer zuerst eingelesen. Werte, die in der Hauptkonfigurationsdatei stehen, überschreiben die
346 Werte aus der Default-Datei. Die Hauptkonfigurationsdatei muss also nur die Abschintte und Werte
347 enthalten, die von denen der Default-Datei abweichen.
351 Diese Hauptkonfigurationsdatei ist dann eine installationsspezifische Datei, d.h. sie enthält bspw. lokale Passwörter und wird auch
352 nicht im Versionsmanagement (git) verwaltet.
356 Die Konfiguration ist ferner serverabhängig, d.h. für alle Mandaten, bzw. Datenbanken gleich.
360 <sect2 id="config.config-file.sections-parameters">
361 <title>Abschnitte und Parameter</title>
364 Die Konfigurationsdatei besteht aus mehreren Teilen, die entsprechend kommentiert sind:
368 <listitem><para><literal>authentication</literal></para></listitem>
369 <listitem><para><literal>authentication/database</literal></para></listitem>
370 <listitem><para><literal>authentication/ldap</literal></para></listitem>
371 <listitem><para><literal>system</literal></para></listitem>
372 <listitem><para><literal>features</literal></para></listitem>
373 <listitem><para><literal>paths</literal></para></listitem>
374 <listitem><para><literal>applications</literal></para></listitem>
375 <listitem><para><literal>environment</literal></para></listitem>
376 <listitem><para><literal>print_templates</literal></para></listitem>
377 <listitem><para><literal>task_server</literal></para></listitem>
378 <listitem><para><literal>periodic_invoices</literal></para></listitem>
379 <listitem><para><literal>console</literal></para></listitem>
380 <listitem><para><literal>debug</literal></para></listitem>
384 Die üblicherweise wichtigsten Parameter, die am Anfang einzustellen oder zu kontrollieren sind, sind:
387 <programlisting>[authentication]
388 admin_password = geheim
390 [authentication/database]
399 dbcharset = UTF-8</programlisting>
402 Nutzt man wiederkehrende Rechnungen, kann man unter <literal>[periodic_invoices]</literal> den Login eines Benutzers angeben, der
403 nach Erstellung der Rechnungen eine entsprechende E-Mail mit Informationen über die erstellten Rechnungen bekommt.
407 Nutzt man den Taskserver für wiederkehrende Rechnungen, muss unter <literal>[task_server]</literal> ein Login eines Benutzers
408 angegeben werden, mit dem sich der Taskserver an Lx-Office bei der Datenbank anmeldet, die dem Benutzer zugewiesen ist.
412 Für Entwickler finden sich unter <literal>[debug]</literal> wichtige Funktionen, um die Fehlersuche zu erleichtern.
416 <sect2 id="config.config-file.prior-versions">
417 <title>Versionen vor 2.6.3</title>
420 In älteren Lx-Office Versionen gab es im Verzeichnis <filename>config</filename> die Dateien <filename>authentication.pl</filename>
421 und <filename>lx-erp.conf</filename>, die jeweils Perl-Dateien waren. Es gab auch die Möglichkeit, eine lokale Version der
422 Konfigurationsdatei zu erstellen (<literal>lx-erp-local.conf</literal>). Dies ist ab 2.6.3 nicht mehr möglich, aber auch nicht mehr
427 Beim Update von einer Lx-Office-Version vor 2.6.3 auf 2.6.3 oder jünger müssen die Einstellungen aus den alten Konfigurationsdateien
428 manuell übertragen und die alten Konfigurationsdateien anschließend gelöscht oder verschoben werden. Ansonsten zeigt Lx-Office eine
429 entsprechende Fehlermeldung an.
434 <sect1 id="Anpassung-der-PostgreSQL-Konfiguration">
435 <title>Anpassung der PostgreSQL-Konfiguration</title>
437 <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
439 <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
440 <title>Zeichensätze/die Verwendung von UTF-8</title>
442 <para>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
443 werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
444 Version 8.0 oder neuer benutzt werden, und der
445 PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
446 angelegt worden sein.</para>
448 <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
449 “template1” “UTF8”, so kann auch Lx-Office mit UTF-8 betrieben werden.
450 Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
451 UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
452 Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:</para>
454 <para><literal>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8
455 8.2 clustername</literal></para>
457 <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete
458 Versionsnummer angepasst werden.</para>
460 <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
462 <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
463 ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
464 Lx-Office mit ISO-8859-15 als Encoding betrieben werden.</para>
466 <para>Das Encoding einer Datenbank kann in <literal>psql</literal> mit
467 <literal>\l</literal> geprüft werden.</para>
470 <sect2 id="Änderungen-an-Konfigurationsdateien">
471 <title>Änderungen an Konfigurationsdateien</title>
473 <para>In der Datei <literal>postgresql.conf</literal>, die je nach
474 Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
475 <literal>/var/lib/pgsql/data/</literal> oder
476 <literal>/etc/postgresql/</literal>, muss sichergestellt werden, dass
477 TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
478 Parameter <literal>listen_address</literal> gesteuert. Laufen
479 PostgreSQL und Lx-Office auf demselben Rechner, so kann dort der Wert
480 <literal>localhost</literal> verwendet werden. Andernfalls müssen
481 Datenbankverbindungen auch von anderen Rechnern aus zugelassen werden,
482 was mit dem Wert \<literal>*</literal> geschieht.</para>
484 <para>In der Datei <literal>pg_hba.conf</literal>, die im gleichen
485 Verzeichnis wie die <literal>postgresql.conf</literal> zu finden sein
486 sollte, müssen die Berichtigungen für den Zugriff geändert werden.
487 Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
488 Verbindungen immer zuzulassen</para>
490 <para><literal>local all all trust host all all 127.0.0.1 255.0.0.0
491 trust</literal></para>
493 <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
494 Passwort zuzulassen. Beispielsweise:</para>
496 <para><literal>local all lxoffice password host all lxoffice 127.0.0.1
497 255.255.255.255 password</literal></para>
502 <sect2 id="Erweiterung-für-servergespeicherte-Prozeduren">
503 <title>Erweiterung für servergespeicherte Prozeduren</title>
505 <para>In der Datenbank <literal>template1</literal> muss die
506 Unterstützung für servergespeicherte Prozeduren eingerichet werden.
507 Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
508 führen Sie die folgenden Kommandos aus:</para>
510 <para><literal>create language 'plpgsql';</literal></para>
512 <para>Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler
513 für die Sprache manuell anlelegt werden, diese Versionen werden aber
514 nicht mehr offiziell von Lx-Office unterstützt. Dafür dann die
515 folgenden Kommandos:</para>
517 <para><literal>create function plpgsql_call_handler () returns opaque
518 as '/usr/lib/pgsql/plpgsql.so' language 'c'; create language 'plpgsql'
519 handler plpgsql_call_handler lancompiler 'pl/pgsql';</literal></para>
521 <para>Bitte beachten Sie, dass der Pfad zur Datei
522 <literal>plpgsql.so</literal> von Distribution zu Distribution
523 verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich unter
524 <literal>/usr/lib/postgresql/lib/plpgsql.so</literal>.</para>
529 <sect2 id="Datenbankbenutzer-anlegen">
530 <title>Datenbankbenutzer anlegen</title>
532 <para>Wenn Sie nicht den Datenbanksuperuser “postgres” zum Zugriff
533 benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
534 anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
537 <para><literal>su - postgres createuser -d -P
538 lxoffice</literal></para>
540 <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
541 Sie den evtl. voreingestellten Benutzer “postgres” auf “lxoffice” bzw.
542 den hier gewählten Benutzernamen.</para>
548 <sect1 id="Apache-Konfiguration">
549 <title>Webserver-Konfiguration</title>
552 <title>Grundkonfiguration mittels CGI</title>
555 <para>Für einen deutlichen Performanceschub sorgt die Ausführung
556 mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
557 <xref linkend="Apache-Konfiguration.FCGI"/> beschrieben.</para>
560 <para>Der Zugriff auf das Programmverzeichnis muss in der Apache
561 Webserverkonfigurationsdatei <literal>httpd.conf</literal> eingestellt
562 werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
563 anderen Datei hinzu, die beim Starten des Webservers eingelesen
566 <para><literal> AddHandler cgi-script .pl Alias /lx-erp/
567 /var/www/lx-erp/ <Directory /var/www/lx-erp> Options ExecCGI
568 Includes FollowSymlinks </Directory> <Directory
569 /var/www/lx-erp/users> Order Deny,Allow Deny from All
570 </Directory> </literal></para>
572 <para>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher
573 das Lx-Office-Archiv entpacket haben.</para>
575 <para>Achtung: Vor den einzelnen Optionen muss bei einigen
576 Distributionen ein Plus ‘<literal>+</literal>’ gesetzt werden.</para>
578 <para>Auf einigen Webservern werden manchmal die Grafiken und
579 Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft
580 geholfen, die folgende Option in die Konfiguration aufzunehmen:</para>
582 <para><literal>EnableSendfile Off</literal></para>
585 <sect2 id="Apache-Konfiguration.FCGI"
586 xreflabel="Konfiguration für FastCGI/FCGI">
587 <title>Konfiguration für FastCGI/FCGI</title>
589 <sect3 id="Apache-Konfiguration.FCGI.WasIstEs">
590 <title>Was ist FastCGI?</title>
592 <para>Direkt aus <ulink
593 url="http://de.wikipedia.org/wiki/FastCGI">Wikipedia</ulink>
596 <para><citation> FastCGI ist ein Standard für die Einbindung
597 externer Software zur Generierung dynamischer Webseiten in einem
598 Webserver. FastCGI ist vergleichbar zum Common Gateway Interface
599 (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu
600 umgehen. </citation></para>
603 <sect3 id="Apache-Konfiguration.FCGI.Warum">
604 <title>Warum FastCGI?</title>
606 <para>Perl Programme (wie Lx-Office eines ist) werden nicht statisch
607 kompiliert. Stattdessen werden die Quelldateien bei jedem Start
608 übersetzt, was bei kurzen Laufzeiten einen Großteil der Laufzeit
609 ausmacht. Während SQL Ledger einen Großteil der Funktionalität in
610 einzelne Module kapselt, um immer nur einen kleinen Teil laden zu
611 müssen, ist die Funktionalität von Lx-Office soweit gewachsen, dass
612 immer mehr Module auf den Rest des Programms zugreifen. Zusätzlich
613 benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
614 entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies
615 führt dazu dass ein Lx-Office Aufruf der Kernmasken mittlerweile
616 deutlich länger dauert als früher, und dass davon 90% für das Laden
617 der Module verwendet wird.</para>
619 <para>Mit FastCGI werden nun die Module einmal geladen, und danach
620 wird nur die eigentliche Programmlogik ausgeführt.</para>
623 <sect3 id="Apache-Konfiguration.FCGI.WebserverUndPlugin">
624 <title>Getestete Kombinationen aus Webservern und Plugin</title>
626 <para>Folgende Kombinationen sind getestet:</para>
630 <para>Apache 2.2.11 (Ubuntu) und mod_fcgid.</para>
634 <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
638 <para>Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer
639 Zeit nicht mehr weiter entwickelt wird. Im Folgenden wird auf
640 mod_fastcgi nicht mehr explizit eingegangen.</para>
642 <para>Als Perl Backend wird das Modul <filename>FCGI.pm</filename>
646 <para>FCGI 0.69 und höher ist extrem strict in der Behandlung von
647 Unicode, und verweigert bestimmte Eingaben von Lx-Office. Falls es
648 Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
649 Vorgängerversion FCGI 0.68 ausgewichen werden.</para>
652 <para>Mit CPAN lässt sie sich die Vorgängerversion wie folgt
655 <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
658 <sect3 id="Apache-Konfiguration.FCGI.Konfiguration">
659 <title>Konfiguration des Webservers</title>
661 <para>Bevor Sie versuchen, eine Lx-Office Installation unter FCGI
662 laufen zu lassen, empfliehlt es sich die Installation ersteinmal
663 unter CGI aufzusetzen. FCGI macht es nicht einfach Fehler zu
664 debuggen die beim ersten aufsetzen auftreten können. Sollte die
665 Installation schon funktionieren, lesen Sie weiter.</para>
667 <para>Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann
668 unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:</para>
670 <programlisting>a2enmod fcgid</programlisting>
672 <para>Die Konfiguration für die Verwendung von Lx-Office mit FastCGI
673 erfolgt durch Anpassung der vorhandenen <function>Alias</function>-
674 und <function>Directory</function>-Direktiven. Dabei wird zwischen
675 dem Installationspfad von Lx-Office im Dateisystem
676 ("<filename>/path/to/lx-office-erp</filename>") und der URL
677 unterschieden, unter der Lx-Office im Webbrowser erreichbar ist
678 ("<filename>/web/path/to/lx-office-erp</filename>").</para>
680 <para>Folgender Konfigurationsschnipsel funktioniert mit
683 <programlisting>AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
684 Alias /web/path/to/lx-office-erp/ /path/to/lx-office-erp/
686 <Directory /path/to/lx-office-erp>
688 Options ExecCGI Includes FollowSymlinks
693 <DirectoryMatch /path/to/lx-office-erp/users>
696 </DirectoryMatch></programlisting>
698 <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
699 die maximale Größe eines Requests. Diese sollte wie folgt
700 hochgesetzt werden:</para>
702 <programlisting>FcgidMaxRequestLen 10485760</programlisting>
704 <para>Das ganze sollte dann so aussehen:</para>
706 <programlisting>AddHandler fcgid-script .fpl
707 AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
708 Alias /web/path/to/lx-office-erp/ /path/to/lx-office-erp/
709 FcgidMaxRequestLen 10485760
711 <Directory /path/to/lx-office-erp>
713 Options ExecCGI Includes FollowSymlinks
718 <DirectoryMatch /path/to/lx-office-erp/users>
721 </DirectoryMatch></programlisting>
723 <para>Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle
724 Zugriffe auf die einzelnen Scripte werden auf diesen umgeleitet.
725 Dadurch, dass zur Laufzeit öfter mal Scripte neu geladen werden,
726 gibt es hier kleine Performance-Einbußen.</para>
728 <para>Es ist möglich, die gleiche Lx-Office Version parallel unter
729 CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven
730 wie oben beschrieben, die URLs werden aber umgeleitet:</para>
732 <programlisting># Zugriff über CGI
733 Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
735 # Zugriff mit mod_fcgid:
736 AliasMatch ^/web/path/to/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
737 Alias /web/path/to/lx-office-erp-fcgid/ /path/to/lx-office-erp/</programlisting>
740 <filename>/web/path/to/lx-office-erp/</filename> die normale Version
741 erreichbar, und unter
742 <constant>/web/path/to/lx-office-erp-fcgid/</constant> die
743 FastCGI-Version.</para>
748 <sect1 id="Der-Task-Server">
749 <title>Der Task-Server</title>
751 <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
752 regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
753 festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
754 wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
755 benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
758 <sect2 id="Konfiguration-des-Task-Servers">
759 <title>Verfügbare und notwendige Konfigurationsoptionen</title>
761 <para>Die Konfiguration erfolgt über den Abschnitt
762 <literal>[task_server]</literal> in der Datei
763 <filename>config/lx_office.conf</filename>. Die dort verfügbaren
764 Optionen sind:</para>
768 <para><literal>login</literal>: gültiger Lx-Office-Benutzername,
769 der benutzt wird, um die zu verwendende Datenbankverbindung
770 auszulesen. Der Benutzer muss in der Administration angelegt
771 werden. Diese Option muss angegeben werden.</para>
775 <para><literal>run_as</literal>: Wird der Server vom
776 Systembenutzer <literal>root</literal> gestartet, so wechselt er
777 auf den mit <literal>run_as</literal> angegebenen Systembenutzer.
778 Der Systembenutzer muss dieselben Lese- und Schreibrechte haben,
779 wie auch der Webserverbenutzer (siehe see <xref
780 linkend="Manuelle-Installation-des-Programmpaketes"/>). Daher ist
781 es sinnvoll, hier denselben Systembenutzer einzutragen, unter dem
782 auch der Webserver läuft.</para>
786 <para><literal>debug</literal>: Schaltet Debug-Informationen an
792 <sect2 id="Einbinden-in-den-Boot-Prozess">
793 <title>Automatisches Starten des Task-Servers beim Booten</title>
795 <para>Der Task-Server verhält sich von seinen Optionen her wie ein
796 reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim
797 Starten automatisch in das Lx-Office-Installationsverzeichnis.</para>
799 <para>Deshalb ist es möglich, ihn durch Setzen eines symbolischen
800 Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
801 einzubinden. Da das bei neueren Linux-Distributionen aber nicht
802 zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
803 anstelle eines symbolischen Links verwendet werden können.</para>
806 <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
809 <para>Kopieren Sie die Datei
810 <filename>scripts/boot/system-v/lx-office-task-server</filename>
811 nach <filename>/etc/init.d/lx-office-task-server</filename>. Passen
812 Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
813 <literal>DAEMON=....</literal>). Binden Sie das Script in den
814 Boot-Prozess ein. Dies ist distributionsabhängig:</para>
818 <para>Debian-basierende Systeme:</para>
820 <para><literal>update-rc.d lx-office-task-server defaults # Nur
821 bei Debian Squeeze und neuer: insserv
822 lx-office-task-server</literal></para>
826 <para>OpenSuSE und Fedora Core:</para>
828 <para><literal>chkconfig --add
829 lx-office-task-server</literal></para>
833 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
834 werden: <literal>/etc/init.d/lx-office-task-server
835 start</literal></para>
839 <title>Upstart-basierende Systeme (z.B. Ubuntu)</title>
841 <para>Kopieren Sie die Datei
842 <filename>scripts/boot/upstart/lx-office-task-server.conf</filename>
843 nach <filename>/etc/init/lx-office-task-server.conf</filename>.
844 Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
845 <literal>exec ....</literal>).</para>
847 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
848 werden: <literal>service lx-office-task-server
849 start</literal></para>
853 <sect2 id="Prozesskontrolle">
854 <title>Wie der Task-Server gestartet und beendet wird</title>
856 <para>Der Task-Server wird wie folgt kontrolliert:</para>
858 <para><literal>./scripts/task_server.pl Befehl</literal></para>
860 <para><literal>Befehl</literal> ist dabei eine der folgenden
865 <para><literal>start</literal> startet eine neue Instanz des
866 Task-Servers. Die Prozess-ID wird innerhalb des
867 <filename>users</filename>-Verzeichnisses abgelegt.</para>
871 <para><literal>stop</literal> beendet einen laufenden
876 <para><literal>restart</literal> beendet und startet ihn
881 <para><literal>status</literal> berichtet, ob der Task-Server
886 <para>Der Task-Server wechselt beim Starten automatisch in das
887 Lx-Office-Installationsverzeichnis.</para>
889 <para>Dieselben Optionen können auch für die SystemV-basierenden
890 Runlevel-Scripte benutzt werden (siehe oben).</para>
896 <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
897 <title>Benutzerauthentifizierung und Administratorpasswort</title>
899 <para>Informationen über die Einrichtung der Benutzerauthentifizierung,
900 über die Verwaltung von Gruppen und weitere Einstellungen</para>
904 <sect2 id="Grundlagen-zur-Benutzerauthentifizierung">
905 <title>Grundlagen zur Benutzerauthentifizierung</title>
907 <para>Lx-Office verwaltet die Benutzerinformationen in einer
908 Datenbank, die im folgenden “Authentifizierungsdatenbank” genannt
909 wird. Für jeden Benutzer kann dort eine eigene Datenbank für die
910 eigentlichen Finanzdaten hinterlegt sein. Diese beiden Datenbanken
911 können, müssen aber nicht unterschiedlich sein.</para>
913 <para>Im einfachsten Fall gibt es für Lx-Office nur eine einzige
914 Datenbank, in der sowohl die Benutzerinformationen als auch die Daten
915 abgelegt werden.</para>
917 <para>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
918 entweder gegen die Authentifizierungsdatenbank oder gegen einen
919 LDAP-Server überprüft werden.</para>
921 <para>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
922 Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
923 Konfigurationsdatei <filename>config/lx_office.conf</filename>
924 festgelegt. Diese muss bei der Installation und bei einem Upgrade von
925 einer Version vor v2.6.0 angelegt werden. Eine
926 Beispielkonfigurationsdatei
927 <filename>config/lx_office.conf.default</filename> existiert, die als
928 Vorlage benutzt werden kann.</para>
931 <sect2 id="Administratorpasswort">
932 <title>Administratorpasswort</title>
934 <para>Das Passwort, das zum Zugriff auf das Aministrationsinterface
935 benutzt wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch
936 nur dort und nicht mehr im Administrationsinterface selber geändert
937 werden. Der Parameter dazu heißt
938 <literal>$self->{admin_password}</literal>.</para>
941 <sect2 id="Authentifizierungsdatenbank">
942 <title>Authentifizierungsdatenbank</title>
944 <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den
945 Parametern in <literal>$self->{DB_config}</literal> konfiguriert.
946 Hier sind die folgenden Parameter anzugeben:</para>
950 <para>‘<literal>host</literal>’ – Der Rechnername oder die
951 IP-Adresse des Datenbankservers</para>
955 <para>‘<literal>port</literal>’ – Die Portnummer des
956 Datenbankservers, meist 5432</para>
960 <para>‘<literal>db</literal>’ – Der Name der
961 Authentifizierungsdatenbank</para>
965 <para>‘<literal>user</literal>’ – Der Benutzername, mit dem sich
966 Lx-Office beim Datenbankserver anmeldet (z.B. “postgres”)</para>
970 <para>‘<literal>password</literal>’ – Das Passwort für den
971 Datenbankbenutzer</para>
975 <para>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
976 automatisch anlegen (mehr dazu siehe unten).</para>
979 <sect2 id="Passwortüberprüfung">
980 <title>Passwortüberprüfung</title>
982 <para>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen
983 die Authentifizierungsdatenbank und gegen einen externen LDAP- oder
984 Active-Directory-Server. Welche davon benutzt wird, regelt der
985 Parameter <literal>$self->{module}</literal>.</para>
987 <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
988 gespeichert werden, so muss der Parameter
989 <literal>$self->{module}</literal> den Wert ‘<literal>DB</literal>’
990 enthalten. In diesem Fall können sowohl der Administrator als auch die
991 Benutzer selber ihre Psaswörter in Lx-Office ändern.</para>
993 <para>Soll hingegen ein externer LDAP- oder Active-Directory-Server
994 benutzt werden, so muss der Parameter
995 <literal>$self->{module}</literal> auf ‘<literal>LDAP</literal>’
996 gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
997 den LDAP-Server in <literal>$self->{LDAP_config}</literal>
998 angegeben werden:</para>
1002 <para>‘<literal>host</literal>’ – Der Rechnername oder die
1003 IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe
1004 ist zwingend erforderlich.</para>
1008 <para>‘<literal>port</literal>’ – Die Portnummer des LDAP-Servers;
1013 <para>‘<literal>tls</literal>’ – Wenn Verbindungsverschlüsselung
1014 gewünscht ist, so diesen Wert auf ‘<literal>1</literal>’ setzen,
1015 andernfalls auf ‘<literal>0</literal>’ belassen</para>
1019 <para>‘<literal>attribute</literal>’ – Das LDAP-Attribut, in dem
1020 der Benutzername steht, den der Benutzer eingegeben hat. Für
1021 Active-Directory-Server ist dies meist
1022 ‘<literal>sAMAccountName</literal>’, für andere LDAP-Server
1023 hingegen ‘<literal>uid</literal>’. Diese Angabe ist zwingend
1024 erforderlich.</para>
1028 <para>‘<literal>base_dn</literal>’ – Der Abschnitt des
1029 LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend
1030 erforderlich.</para>
1034 <para>‘<literal>filter</literal>’ – Ein optionaler LDAP-Filter.
1035 Enthält dieser Filter das Wort <literal><%login%></literal>,
1036 so wird dieses durch den vom Benutzer eingegebenen Benutzernamen
1037 ersetzt. Andernfalls wird der LDAP-Baum nach einem Element
1038 durchsucht, bei dem das oben angegebene Attribut mit dem
1039 Benutzernamen identisch ist.</para>
1043 <para>‘<literal>bind_dn</literal>’ und
1044 ‘<literal>bind_password</literal>’ – Wenn der LDAP-Server eine
1045 Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist
1046 dies bei Active-Directory-Servern der Fall), so kann diese hier
1047 angegeben werden. Für Active-Directory-Server kann als
1048 ‘<literal>bind_dn</literal>’ entweder eine komplette LDAP-DN wie
1049 z.B. ‘<literal>cn=Martin
1050 Mustermann,cn=Users,dc=firmendomain</literal>’ auch nur der volle
1051 Name des Benutzers eingegeben werden; in diesem Beispiel also
1052 ‘<literal>Martin Mustermann</literal>’.</para>
1057 <sect2 id="Name-des-Session-Cookies">
1058 <title>Name des Session-Cookies</title>
1060 <para>Sollen auf einem Server mehrere Lx-Office-Installationen
1061 aufgesetzt werden, so müssen die Namen der Session-Cookies für alle
1062 Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
1063 Parameter <literal>$self->{cookie_name}</literal> gesetzt.</para>
1065 <para>Diese Angabe ist optional, wenn nur eine Installation auf dem
1066 Server existiert.</para>
1069 <sect2 id="Anlegen-der-Authentifizierungsdatenbank">
1070 <title>Anlegen der Authentifizierungsdatenbank</title>
1072 <para>Nachdem alle Einstellungen in
1073 <filename>config/lx_office.conf</filename> vorgenommen wurden, muss
1074 Lx-Office die Authentifizierungsdatenbank anlegen. Dieses geschieht
1075 automatisch, wenn Sie sich im Administrationsmodul anmelden, das unter
1076 der folgenden URL erreichbar sein sollte:</para>
1079 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1085 <sect1 id="Benutzer--und-Gruppenverwaltung">
1086 <title>Benutzer- und Gruppenverwaltung</title>
1088 <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
1089 angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
1090 folgender URL finden:</para>
1093 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1095 <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
1096 <filename>config/lx_office.conf</filename> eingetragen haben.</para>
1098 <sect2 id="Zusammenhänge">
1099 <title>Zusammenhänge</title>
1101 <para>Lx-Office verwendet eine Datenbank zum Speichern all seiner
1102 Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
1103 mit Lx-Office arbeiten zu können, muss eine Person einen
1104 Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
1105 Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
1106 möglich und normal, dass mehreren Benutzern die selbe Datenbank
1107 zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
1110 <para>Die Basisdaten der Benutzer, die in der Administration
1111 eingegeben werden können, werden in einer zweiten Datenbank
1112 gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
1113 ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
1114 Pro Lx-Office-Installation gibt es nur eine
1115 Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
1118 <para>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
1119 Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
1120 gestattet, so werden der entsprechenden Menüpunkte auch nicht
1121 angezeigt. Diese Rechte werden ebenfalls in der
1122 Authentifizierungsdatenbank gespeichert.</para>
1124 <para>Um Rechte verteilen zu können, verwendet Lx-Office ein
1125 Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
1126 erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
1127 mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
1128 Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
1129 Benutzer Mitglied ist.</para>
1131 <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
1132 Benutzer angelegt werden sollten, lautet:</para>
1134 <orderedlist numeration="arabic">
1136 <para>Datenbank anlegen</para>
1140 <para>Gruppen anlegen</para>
1144 <para>Benutzer anlegen</para>
1148 <para>Benutzer den Gruppen zuordnen</para>
1153 <sect2 id="Datenbanken-anlegen">
1154 <title>Datenbanken anlegen</title>
1156 <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
1157 den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
1158 Beispielen ist dies ‘<literal>lxoffice</literal>’).</para>
1160 <para>Wenn Sie für die Lx-Office-Installation nicht den europäischen
1161 Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
1162 müssen Sie vor dem Anlegen der Datenbank in der Datei
1163 <filename>config/lx_office.conf</filename> die Variable
1164 <literal>dbcharset</literal> im Abschnitt <literal>system</literal>
1165 auf den Wert ‘<literal>UTF-8</literal>’ setzen. Zusätzlich muss beim
1166 Anlegen der Datenbank ‘<literal>UTF-8 Unicode</literal>’ als
1167 Schriftsatz ausgewählt werden.</para>
1169 <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
1170 verwenden müssen, da diese Einstellungen momentan global in Lx-Office
1171 vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
1172 Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
1173 angelegt worden sein.</para>
1176 <sect2 id="Gruppen-anlegen">
1177 <title>Gruppen anlegen</title>
1179 <para>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
1180 Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
1181 Anlegen können Sie die verschiedenen Bereiche wählen, auf die
1182 Mitglieder dieser Gruppe Zugriff haben sollen.</para>
1184 <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
1185 Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
1186 Datenbanken, die in dieser Installation verwaltet werden.</para>
1189 <sect2 id="Benutzer-anlegen">
1190 <title>Benutzer anlegen</title>
1192 <para>Beim Anlegen von Benutzern werden für viele Parameter
1193 Standardeinstellungen vorgenommen, die den Gepflogenheiten des
1194 deutschen Raumes entsprechen.</para>
1196 <para>Zwingend anzugeben sind der Loginname sowie die komplette
1197 Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
1198 Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
1199 gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
1200 aktiv, so ist das Passwort-Feld deaktiviert.</para>
1202 <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
1203 eben angelegten Datenbanken eingetragen werden.</para>
1206 <sect2 id="Gruppenmitgliedschaften-verwalten">
1207 <title>Gruppenmitgliedschaften verwalten</title>
1209 <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
1210 Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
1212 <orderedlist numeration="arabic">
1214 <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
1215 folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
1220 <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
1221 der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
1222 alle im System angelegten Gruppen und Benutzer enthält. Durch
1223 Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
1224 Gruppe in der ausgewählten Spalte hinzugefügt.</para>
1229 <sect2 id="Migration-alter-Installationen">
1230 <title>Migration alter Installationen</title>
1232 <para>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird,
1233 in der die Benutzerdaten noch im Dateisystem im Verzeichnis
1234 <literal>users</literal> verwaltet wurden, so bietet Lx-Office die
1235 Möglichkeit, diese Benutzerdaten automatisch in die
1236 Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
1237 sich nach dem Update der Installation das erste Mal im
1238 Administrationsbereich anmeldet. Findet Lx-Office die Datei
1239 <literal>users/members</literal>, so wird der Migrationsprozess
1242 <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
1243 Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
1244 Lx-Office noch die Möglichkeit an, dass automatisch eine
1245 Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
1246 Funktionen von Lx-Office gewährt. Alle migrierten Benutzern werden
1247 Mitglied in dieser Gruppe. Damit wird das Verhalten von Lx-Office bis
1248 Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
1249 sich sofort wieder anmelden und mit dem System arbeiten.</para>
1255 <sect1 id="Drucken-mit-Lx-Office">
1256 <title>Drucken mit Lx-Office</title>
1258 <para>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen.
1259 Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
1260 einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
1261 Debianoiden Betriebssystemen sind das die Pakete:</para>
1263 <para><literal>texlive-latex-base texlive-latex-extra
1264 texlive-fonts-recommended</literal></para>
1266 <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
1267 von den Standardvorlagen verwendet werden.</para>
1269 <para>TODO: rpm Pakete.</para>
1271 <para>In den allermeisten Installationen sollte drucken jetzt schon
1272 funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
1273 Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
1274 die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
1279 <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
1280 LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
1281 Vorlagen aus der Community auf. Installieren Sie die entsprechenden
1286 <para>! Package inputenc Error: Unicode char \u8:æ¡
\9c not set up for
1287 use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
1288 einer Standardinstallation exotische utf8 Zeichen zu drucken.
1289 TeXLive unterstützt von Haus nur romanische Schriften und muss mit
1290 diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
1291 Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
1295 <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
1296 heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
1297 Prüfen Sie den Namen in der Konfiguration (Standard:
1298 <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
1299 (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
1305 <sect1 id="OpenDocument-Vorlagen">
1306 <title>OpenDocument-Vorlagen</title>
1308 <para>Lx-Office unterstützt die Verwendung von Vorlagen im
1309 OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
1310 Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
1311 diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
1312 OpenDocument-Vorlagen zu aktivieren muss in der Datei
1313 <filename>config/lx_office.conf</filename> die Variable
1314 <literal>opendocument</literal> im Abschnitt
1315 <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
1316 Dieses ist die Standardeinstellung.</para>
1318 <para>Weiterhin muss in der Datei
1319 <filename>config/lx_office.conf</filename> die Variable
1320 <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
1321 die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
1322 Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
1325 <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
1326 weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
1327 OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
1328 neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
1329 (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
1330 Andere Distributionen enthalten ihn in anderen Paketen.</para>
1332 <para>Nach der Installation müssen in der Datei
1333 <filename>config/lx_config.conf</filename> zwei weitere Variablen
1334 angepasst werden: <literal>openofficeorg_writer</literal> muss den
1335 vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
1336 <literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
1337 enthalten. Beide stehen im Abschnitt
1338 <literal>applications</literal>.</para>
1340 <para>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
1341 OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
1342 Variable <literal>$openofficeorg_daemon</literal> gesetzt ist, startet
1343 ein OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
1344 bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
1345 benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
1346 reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
1347 werden muss. Der Nachteil ist, dass diese Methode Python und die
1348 Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
1351 <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
1352 wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
1353 mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
1354 Dokumentenvorlage enthalten sein und
1355 “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
1356 ‘<literal>templates/mastertemplates/German/invoice.odt</literal>’
1357 enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
1358 ebenfalls enthalten sein muss.</para>
1360 <para>Als letztes muss herausgefunden werden, welchen Namen
1361 OpenOffice.org Writer dem Verzeichnis mit den Benutzereinstellungen
1362 gibt. Unter Debian ist dies momentan
1363 <literal>~/.openoffice.org2</literal>. Sollte der Name bei Ihrer
1364 OpenOffice.org-Installation anders sein, so muss das Verzeichnis
1365 <literal>users/.openoffice.org2</literal> entsprechend umbenannt werden.
1366 Ist der Name z.B. einfach nur <literal>.openoffice</literal>, so wäre
1367 folgender Befehl auszuführen:</para>
1369 <para><literal>mv users/.openoffice.org2
1370 users/.openoffice</literal></para>
1372 <para>Dieses Verzeichnis, wie auch das komplette
1373 <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
1374 sein. Dieses wurde bereits erledigt (siehe <xref
1375 linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber erneut
1376 überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</para>
1381 <sect1 id="Lx-Office-ERP-verwenden">
1382 <title>Lx-Office ERP verwenden</title>
1384 <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
1385 folgender URL erreichbar:</para>
1388 url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
1390 <para>Die Administrationsseite erreichen Sie unter:</para>
1393 url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
1398 <title>Entwicklerdokumentation</title>
1400 <sect1 id="devel.globals" xreflabel="Globale Variablen">
1401 <title>Globale Variablen</title>
1404 <title>Wie sehen globale Variablen in Perl aus?</title>
1406 <para>Globale Variablen liegen in einem speziellen namespace namens
1407 "main", der von überall erreichbar ist. Darüber hinaus sind bareword
1408 globs global und die meisten speziellen Variablen sind...
1411 <para>Daraus ergeben sich folgende Formen:</para>
1415 <term>$main::form</term>
1418 <para>expliziter Namespace "main"</para>
1423 <term>$::form</term>
1426 <para>impliziter Namespace "main"</para>
1431 <term>open FILE, "file.txt"</term>
1434 <para><varname>FILE</varname> ist global</para>
1442 <para>speziell</para>
1447 <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
1448 Schlüsselwort wie "<function>global</function>", mit dem man
1449 importieren kann. <function>my</function>, <function>our</function>
1450 und <function>local</function> machen was anderes.</para>
1454 <term>my $form</term>
1457 <para>lexikalische Variable, gültig bis zum Ende des
1463 <term>our $form</term>
1466 <para><varname>$form</varname> referenziert ab hier
1467 <varname>$PACKAGE::form</varname>.</para>
1472 <term>local $form</term>
1475 <para>Alle Änderungen an <varname>$form</varname> werden am Ende
1476 des scopes zurückgesetzt</para>
1483 <title>Warum sind globale Variablen ein Problem?</title>
1485 <para>Das erste Problem ist <productname>FCGI</productname>.</para>
1487 <para><productname>SQL-Ledger</productname> hat fast alles im globalen
1488 namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
1489 Unter <productname>FCGI</productname> müssen diese Sachen auch wieder
1490 aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
1491 Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
1492 Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren
1495 <para>Das zweite Problem ist <function>strict</function>. Unter
1496 <function>strict</function> werden alle Variablen die nicht explizit
1497 mit <function>Package</function>, <function>my</function> oder
1498 <function>our</function> angegeben werden als Tippfehler angemarkert,
1499 was einen vor so mancher Stunde suchen nach einem Bug erspart. Da
1500 globale Variablen aber implizit mit Package angegeben werden, werden
1501 die nicht geprüft, und ein Tippfehler da fällt niemandem auf.</para>
1505 <title>Kanonische globale Variablen</title>
1507 <para>Um dieses Problem im Griff zu halten gibt es einige wenige
1508 globale Variablen, die kanonisch sind, und alles andere sollte
1509 anderweitig umhergereicht werden.</para>
1511 <para>Diese Variablen sind im Moment die folgenden neun:</para>
1515 <para><varname>$::form</varname></para>
1519 <para><varname>%::myconfig</varname></para>
1523 <para><varname>$::locale</varname></para>
1527 <para><varname>$::lxdebug</varname></para>
1531 <para><varname>$::auth</varname></para>
1535 <para><varname>$::lx_office_conf</varname></para>
1539 <para><varname>$::instance_conf</varname></para>
1543 <para><varname>$::dispatcher</varname></para>
1547 <para><varname>$::request</varname></para>
1551 <para>Damit diese nicht als Müllhalde misbrauch werden, im Folgenden
1552 eine kurze Erläuterung was man von denn erwarten kann.</para>
1555 <title>$::form</title>
1559 <para>Ist ein Objekt der Klasse
1560 "<classname>Form</classname>"</para>
1564 <para>Wird nach jedem Request gelöscht</para>
1568 <para>Muss auch in Tests und Konsolenscripts vorhanden
1573 <para>Enthält am Anfang eines Requests die Requestparameter vom
1578 <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
1579 cachen, das wird aber momentan absichtlich zerstört</para>
1583 <para><varname>$::form</varname> wurde unter <productname>SQL
1584 Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
1585 alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
1586 heißt, alles was einem lieb ist, sollte man vor einem Aufruf von zum
1587 Beispiel <function>IS->retrieve_customer()</function> in
1588 Sicherheit bringen.</para>
1590 <para>Das Objekt der Klasse Form hat leider im Moment noch viele
1591 zentrale Funktionen Gdie vom internen Zustand abhängen, deshalb
1592 bitte nie einfach zerstören oder überschreiben. Es geht ziemlich
1593 sicher etwas kaputt.</para>
1595 <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
1596 in den <productname>Template::Toolkit</productname> Templates
1597 außerhalb der Controller: der Ausdruck <function>[% var
1598 %]</function> greift auf <varname>$::form->{var}</varname> zu.
1599 Unter Controllern ist der Standard Scope anders, da lautet der
1600 Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
1601 normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
1602 <function><%var%></function> zeigt auf
1603 <varname>$::form->{var}</varname>. Innerhalb von Schleifen wird
1604 <varname>$::form->{TEMPLATE_ARRAYS}{var}[$index]</varname>
1605 bevorzugt, wenn vorhanden.</para>
1609 <title>%::myconfig</title>
1613 <para>Das einzige Hash unter den globalen Variablen</para>
1617 <para>Wird spätestens benötigt wenn auf die Datenbank
1618 zugegriffen wird</para>
1622 <para>Wird bei jedem Request neu erstellt.</para>
1626 <para>Enthält die Userdaten des aktuellen Logins</para>
1630 <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
1631 extern serialisiert werden, weil da auch der Datenbankzugriff
1632 für diesenuser drinsteht.</para>
1636 <para>Enthält unter anderem Listenbegrenzung vclimit,
1637 Datumsformat dateformat und Nummernformat numberformat</para>
1641 <para>Enthält Datenbankzugriffinformationen</para>
1645 <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
1646 ein Userobjekt. Die meisten Funktionen, die etwas anhand des
1647 aktuellen Users entscheiden müssen, befragen
1648 <varname>%::myconfig</varname>.</para>
1652 <title>$::locale</title>
1656 <para>Objekt der Klasse "Locale"</para>
1660 <para>Wird pro Request erstellt</para>
1664 <para>Muss auch für Tests und Scripte immer verfügbar
1669 <para>Cached intern über Requestgrenzen hinweg benutzte
1674 <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
1675 Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
1679 <title>$::lxdebug</title>
1683 <para>Objekt der Klasse "LXDebug"</para>
1687 <para>Wird global gecached</para>
1691 <para>Muss immer verfügbar sein, in nahezu allen
1696 <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
1697 bereit, wie "<function>enter_sub</function>" und
1698 "<function>leave_sub</function>", mit denen in den alten Modulen ein
1699 brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
1700 der man die Wallclockzeit seit Requeststart loggen kann, sowie
1701 "<function>message</function>" und "<function>dump</function>" mit
1702 denen man flott Informationen ins Log packen kann.</para>
1706 <title>$::auth</title>
1710 <para>Objekt der Klasse "SL::Auth"</para>
1714 <para>Wird global gecached</para>
1718 <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
1722 <para>Wird nach jedem Request resettet.</para>
1726 <para><varname>$::auth</varname> stellt Funktionen bereit um die
1727 Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
1728 vom aktuellen User abhängen wird das Objekt aus
1729 Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
1730 Request kurz resettet.</para>
1734 <title>$::lx_office_conf</title>
1738 <para>Objekt der Klasse
1739 "<classname>SL::LxOfficeConf</classname>"</para>
1743 <para>Global gecached</para>
1747 <para>Repräsentation der
1748 <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
1752 <para>Globale Konfiguration. Configdateien werden zum Start gelesen,
1753 und nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
1754 Programm die Konfiguration ändern kann oder sollte.</para>
1756 <para>Für die folgende Konfigurationsdatei:</para>
1758 <programlisting>[debug]
1759 file = /tmp/lxoffice_debug_log.txt</programlisting>
1761 <para>ist der Key <varname>file</varname> im Programm als
1762 <varname>$::lx_office_conf->{debug}{file}</varname>
1766 <para>Zugriff auf die Konfiguration erfolgt im Moment über
1767 Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
1772 <title>$::instance_conf</title>
1776 <para>Objekt der Klasse
1777 "<classname>SL::InstanceConfiguration</classname>"</para>
1781 <para>wird pro Request neu erstellt</para>
1785 <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
1786 speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
1787 ist hier eine Mandantendatenbank. Prominentestes Datum ist "eur",
1788 die Information ob Bilanz oder Einnahmenüberschussrechnung gemacht
1793 <title>$::dispatcher</title>
1797 <para>Objekt der Klasse
1798 "<varname>SL::Dispatcher</varname>"</para>
1802 <para>wird pro Serverprozess erstellt.</para>
1806 <para>enthält Informationen über die technische Verbindung zum
1811 <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
1812 global gespeichert wird. Wird vermutlich irgendwann in einem anderen
1813 Objekt untergebracht.</para>
1817 <title>$::request</title>
1821 <para>Hashref (evtl später Objekt)</para>
1825 <para>Wird pro Request neu initialisiert.</para>
1829 <para>Keine Unterstruktur garantiert.</para>
1833 <para><varname>$::request</varname> ist ein generischer Platz um
1834 Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
1835 at a distance benutzt werden, sondern um lokales memoizing zu
1836 ermöglichen, das garantiert am Ende des Requests zerstört
1839 <para>Vieles von dem, was im moment in <varname>$::form</varname>
1840 liegt, sollte eigentlich hier liegen. Die groben
1841 Differentialkriterien sind:</para>
1845 <para>Kommt es vom User, und soll unverändert wieder an den
1846 User? Dann $::form, steht da eh schon</para>
1850 <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des
1851 Requests gebraucht werden? Dann $::request</para>
1855 <para>Muss ich von anderen Teilen des Programms lesend drauf
1856 zugreifen? Dann $::request, aber Zugriff über
1857 Wrappermethode</para>
1864 <title>Ehemalige globale Variablen</title>
1866 <para>Die folgenden Variablen waren einmal im Programm, und wurden
1870 <title>$::cgi</title>
1874 <para>war nötig, weil cookie Methoden nicht als
1875 Klassenfunktionen funktionieren</para>
1879 <para>Aufruf als Klasse erzeugt Dummyobjekt was im
1880 Klassennamespace gehalten wird und über Requestgrenzen
1885 <para>liegt jetzt unter
1886 <varname>$::request->{cgi}</varname></para>
1892 <title>$::all_units</title>
1896 <para>war nötig, weil einige Funktionen in Schleifen zum Teil
1897 ein paar hundert mal pro Request eine Liste der Einheiten
1898 brauchen, und de als Parameter durch einen Riesenstack von
1899 Funktionen geschleift werden müssten.</para>
1903 <para>Liegt jetzt unter
1904 <varname>$::request->{cache}{all_units}</varname></para>
1909 <function>AM->retrieve_all_units()</function> gesetzt oder
1916 <title>%::called_subs</title>
1920 <para>wurde benutzt um callsub deep recursions
1925 <para>Wurde entfernt, weil callsub nur einen Bruchteil der
1926 möglichen Rekursioenen darstellt, und da nie welche
1931 <para>komplette recursion protection wurde entfernt.</para>
1938 <sect1 id="dokumentenvorlagen-und-variablen">
1939 <title>Dokumentenvorlagen und verfügbare Variablen</title>
1941 <sect2 id="dokumentenvorlagen-und-variablen.einführung">
1942 <title>Einführung</title>
1944 <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
1945 aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
1946 einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
1947 <function><%variablenname%></function> verwendet wird. Für
1948 LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
1950 linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
1952 <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
1953 unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
1954 ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
1955 alle Vorlagenarten.</para>
1957 <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
1958 verfügbar als hier aufgelistet werden. Die meisten davon können
1959 allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
1960 werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
1961 diese wie folgt erhalten werden:</para>
1965 <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
1966 Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
1970 <para>In <filename>Form.pm</filename> die Funktion
1971 <function>parse_template</function> suchen und hier die Zeile
1972 <command>print(STDERR Dumper($self));</command> einfügen.</para>
1976 <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
1977 ein PDF für eine Rechnung erzeugen.</para>
1981 <para>Im <filename>error.log</filename> Apache steht die Ausgabe
1982 der Variablen <varname>$self</varname> in der Form <varname>'key'
1983 => 'value',</varname>. Alle <varname>key</varname>s sind
1989 <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
1990 <title>Variablen ausgeben</title>
1992 <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
1993 Tags geschrieben werden, also z.B.
1994 <varname><%variablenname%></varname>.</para>
1996 <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
1997 die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
1998 <varname><%variablenname FLAG1 FLAG2%></varname>. Momentan
1999 werden die folgenden Flags unterstützt:</para>
2003 <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
2004 den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
2005 mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
2006 damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
2010 <para><parameter>NOESCAPE</parameter> unterdrückt das Escapen von
2011 Sonderzeichen für die Vorlagensprache. Wenn also in einer
2012 Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
2013 auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
2014 ist dieses Flag sinnvoll.</para>
2018 <para>Beispiel:</para>
2020 <programlisting><%quototal NOFORMAT%></programlisting>
2023 <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
2024 <title>Verwendung in Druckbefehlen</title>
2026 <para>In der Admininstration können Drucker definiert werden. Auch im
2027 dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
2028 und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
2029 den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
2030 <function>`...`</function> nicht zu unerwünschtem Verhalten
2033 <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
2034 für das die Telefonnummer eines Ansprechpartners als Teil der
2035 Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
2036 z.B. wie folgt aussehen:</para>
2038 <programlisting>send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></programlisting>
2041 <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
2042 xreflabel="Anfang und Ende der Tags verändern">
2043 <title>Anfang und Ende der Tags verändern</title>
2045 <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
2046 Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
2047 Prozentzeichen und dem Größerzeichen endet, beispielsweise
2048 <function><%customer%></function>. Da diese Form aber z.B. in
2049 LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
2050 Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
2051 Stil umgestellt werden.</para>
2053 <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
2054 Format gültigen Kommentarzeichen anfangen, dann
2055 <function>config:</function> enthalten, die entsprechende Option
2056 setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
2057 enden. Beispiel für LaTeX:</para>
2059 <programlisting>% config: tag-style=($ $)</programlisting>
2061 <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
2062 wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
2063 äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
2065 <programlisting><!-- config: tag-style=($ $) --></programlisting>
2068 <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
2069 <title>Zuordnung von den Dateinamen zu den Funktionen</title>
2071 <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
2072 welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
2073 "<filename>.ext</filename>" geeignet zu ersetzen:
2074 "<filename>.tex</filename>" für LaTeX-Vorlagen und
2075 "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
2079 <term><filename>bin_list.ext</filename></term>
2082 <para>Lagerliste</para>
2087 <term><filename>check.ext</filename></term>
2095 <term><filename>invoice.ext</filename></term>
2098 <para>Rechnung</para>
2103 <term><filename>packing_list.ext</filename></term>
2106 <para>Packliste</para>
2111 <term><filename>pick_list.ext</filename></term>
2114 <para>Sammelliste</para>
2119 <term><filename>purchase_delivery_order.ext</filename></term>
2122 <para>Lieferschein (Einkauf)</para>
2127 <term><filename>purcharse_order.ext</filename></term>
2130 <para>Bestellung an Lieferanten</para>
2135 <term><filename>request_quotation.ext</filename></term>
2138 <para>Anfrage an Lieferanten</para>
2143 <term><filename>sales_delivery_order.ext</filename></term>
2146 <para>Lieferschein (Verkauf)</para>
2151 <term><filename>sales_order.ext</filename></term>
2154 <para>Bestellung</para>
2159 <term><filename>sales_quotation.ext</filename></term>
2162 <para>Angebot an Kunden</para>
2167 <term><filename>zahlungserinnerung.ext</filename></term>
2170 <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
2175 <term><filename>zahlungserinnerung_invoice.ext</filename></term>
2178 <para>Rechnung über Mahngebühren (Dateiname im Programm
2179 konfigurierbar)</para>
2185 <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
2186 <title>Sprache, Drucker und E-Mail</title>
2188 <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
2189 eingearbeitet. So wird aus der Vorlage
2190 <filename>sales_order.ext</filename> bei Sprache
2191 <function>de</function> und Druckerkürzel <function>lpr2</function>
2192 der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
2193 Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
2194 bekommen dann noch das Kürzel <filename>_email</filename>, der
2195 vollständige Vorlagenname wäre dann
2196 <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
2197 kann eine Standarddatei <filename>default.ext</filename> hinterlegt
2198 werden. Diese wird verwendet, wenn keine der anderen Varianten
2199 gefunden wird.</para>
2201 <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
2202 der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
2203 verschickt wird, ist:</para>
2207 <para><filename>sales_order_email_de_lpr2.tex</filename></para>
2211 <para><filename>sales_order_de_lpr2.tex</filename></para>
2215 <para><filename>sales_order.tex</filename></para>
2219 <para><filename>default.tex</filename></para>
2223 <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
2224 Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
2226 linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"/>.</para>
2229 <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
2230 <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
2233 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
2234 xreflabel="Metainformationen zur angeforderten Vorlage">
2235 <title>Metainformationen zur angeforderten Vorlage</title>
2237 <para>Diese Variablen liefern Informationen darüber welche Variante
2238 einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
2239 Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
2240 Formulare einbinden möchten.</para>
2244 <term>template_meta.formname</term>
2247 <para>Basisname der Vorlage. Identisch mit der <link
2248 linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
2249 zu den Dateinamen</link> ohne die Erweiterung. Ein
2250 Verkaufsauftrag enthält hier
2251 <constant>sales_order</constant>.</para>
2256 <term>template_meta.language.description</term>
2259 <para>Beschreibung der verwendeten Sprache</para>
2264 <term>template_meta.language.template_code</term>
2267 <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
2268 Kürzel das im Dateinamen verwendetet wird.</para>
2273 <term>template_meta.language.output_numberformat</term>
2276 <para>Zahlenformat der verwendeten Sprache in der Form
2277 "<constant>1.000,00</constant>". Experimentell! Nur
2278 interessant für Vorlagen die mit unformatierten Werten
2284 <term>template_meta.language.output_dateformat</term>
2287 <para>Datumsformat der verwendeten Sprache in der Form
2288 "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
2289 interessant für Vorlagen die mit unformatierten Werten
2295 <term>template_meta.format</term>
2298 <para>Das angeforderte Format. Kann im Moment die Werte
2299 <constant>pdf</constant>, <constant>postscript</constant>,
2300 <constant>html</constant>, <constant>opendocument</constant>,
2301 <constant>opendocument_pdf</constant> und
2302 <constant>excel</constant> enthalten.</para>
2307 <term>template_meta.extension</term>
2310 <para>Dateierweiterung, wie im Dateinamen. Wird aus
2311 <constant>format</constant> entschieden.</para>
2316 <term>template_meta.media</term>
2319 <para>Ausgabemedium. Kann zur Zeit die Werte
2320 <constant>screen</constant> für Bildschirm,
2321 <constant>email</constant> für E-Mmail (triggert das
2322 <constant>_email</constant> Kürzel im Dateinamen),
2323 <constant>printer</constant> für Drucker, und
2324 <constant>queue</constant> für Warteschlange enthalten.</para>
2329 <term>template_meta.printer.description</term>
2332 <para>Beschreibung des ausgewählten Druckers</para>
2337 <term>template_meta.printer.template_code</term>
2340 <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
2341 dem Kürzel das im Dateinamen verwendetet wird.</para>
2347 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
2348 <title>Stammdaten von Kunden und Lieferanten</title>
2352 <term>account_number</term>
2355 <para>Kontonummer</para>
2363 <para>Name der Bank</para>
2368 <term>bank_code</term>
2371 <para>Bankleitzahl</para>
2379 <para>Bank-Identifikations-Code (Bank Identifier Code,
2385 <term>business</term>
2388 <para>Kunden-/Lieferantentyp</para>
2401 <term>contact</term>
2404 <para>Kontakt</para>
2409 <term>country</term>
2417 <term>cp_email</term>
2420 <para>Email des Ansprechpartners</para>
2425 <term>cp_givenname</term>
2428 <para>Vorname des Ansprechpartners</para>
2433 <term>cp_greeting</term>
2436 <para>Anrede des Ansprechpartners</para>
2441 <term>cp_name</term>
2444 <para>Name des Ansprechpartners</para>
2449 <term>cp_phone1</term>
2452 <para>Telefonnummer 1 des Ansprechpartners</para>
2457 <term>cp_phone2</term>
2460 <para>Telefonnummer 2 des Ansprechpartners</para>
2465 <term>cp_title</term>
2468 <para>Titel des Ansprechpartners</para>
2473 <term>creditlimit</term>
2476 <para>Kreditlimit</para>
2481 <term>customeremail</term>
2484 <para>Email des Kunden; nur für Kunden</para>
2489 <term>customerfax</term>
2492 <para>Faxnummer des Kunden; nur für Kunden</para>
2497 <term>customernotes</term>
2500 <para>Bemerkungen beim Kunden; nur für Kunden</para>
2505 <term>customernumber</term>
2508 <para>Kundennummer; nur für Kunden</para>
2513 <term>customerphone</term>
2516 <para>Telefonnummer des Kunden; nur für Kunden</para>
2521 <term>discount</term>
2532 <para>Emailadresse</para>
2540 <para>Faxnummer</para>
2545 <term>homepage</term>
2548 <para>Homepage</para>
2556 <para>Internationale Kontonummer (International Bank Account
2557 Number, IBAN)</para>
2562 <term>language</term>
2565 <para>Sprache</para>
2573 <para>Firmenname</para>
2578 <term>payment_description</term>
2581 <para>Name der Zahlart</para>
2586 <term>payment_terms</term>
2589 <para>Zahlungskonditionen</para>
2597 <para>Telefonnummer</para>
2602 <term>shiptocity</term>
2605 <para>Stadt (Lieferadresse) <link
2606 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2611 <term>shiptocontact</term>
2614 <para>Kontakt (Lieferadresse) <link
2615 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2620 <term>shiptocountry</term>
2623 <para>Land (Lieferadresse) <link
2624 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2629 <term>shiptodepartment1</term>
2632 <para>Abteilung 1 (Lieferadresse) <link
2633 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2638 <term>shiptodepartment2</term>
2641 <para>Abteilung 2 (Lieferadresse) <link
2642 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2647 <term>shiptoemail</term>
2650 <para>Email (Lieferadresse) <link
2651 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2656 <term>shiptofax</term>
2659 <para>Fax (Lieferadresse) <link
2660 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2665 <term>shiptoname</term>
2668 <para>Firmenname (Lieferadresse) <link
2669 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2674 <term>shiptophone</term>
2677 <para>Telefonnummer (Lieferadresse) <link
2678 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2683 <term>shiptostreet</term>
2686 <para>Straße und Hausnummer (Lieferadresse) <link
2687 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2692 <term>shiptozipcode</term>
2695 <para>Postleitzahl (Lieferadresse) <link
2696 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2704 <para>Straße und Hausnummer</para>
2709 <term>taxnumber</term>
2712 <para>Steuernummer</para>
2720 <para>Umsatzsteuer-Identifikationsnummer</para>
2725 <term>vendoremail</term>
2728 <para>Email des Lieferanten; nur für Lieferanten</para>
2733 <term>vendorfax</term>
2736 <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
2741 <term>vendornotes</term>
2744 <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
2749 <term>vendornumber</term>
2752 <para>Lieferantennummer; nur für Lieferanten</para>
2757 <term>vendorphone</term>
2760 <para>Telefonnummer des Lieferanten; nur für
2766 <term>zipcode</term>
2769 <para>Postleitzahl</para>
2774 <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
2775 <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
2776 Stammdaten nicht eingetragen, so haben die Variablen
2777 <varname>shipto*</varname> den gleichen Wert wie die die
2778 entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
2779 einige <varname>shipto*</varname>-Variablen so nicht in den
2780 Stammdaten wiederfinden sondern schlicht Kopien der
2781 Lieferdatenvariablen sind (z.B.
2782 <varname>shiptocontact</varname>).</para>
2786 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
2787 <title>Informationen über den Bearbeiter</title>
2791 <term>employee_address</term>
2794 <para>Adressfeld</para>
2799 <term>employee_businessnumber</term>
2802 <para>Firmennummer</para>
2807 <term>employee_company</term>
2810 <para>Firmenname</para>
2815 <term>employee_co_ustid</term>
2818 <para>Usatzsteuer-Identifikationsnummer</para>
2823 <term>employee_duns</term>
2826 <para>DUNS-Nummer</para>
2831 <term>employee_email</term>
2839 <term>employee_fax</term>
2847 <term>employee_name</term>
2850 <para>voller Name</para>
2855 <term>employee_signature</term>
2858 <para>Signatur</para>
2863 <term>employee_taxnumber</term>
2866 <para>Steuernummer</para>
2871 <term>employee_tel</term>
2874 <para>Telefonnummer</para>
2880 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
2881 <title>Informationen über den Bearbeiter</title>
2885 <term>salesman_address</term>
2888 <para>Adressfeld</para>
2893 <term>salesman_businessnumber</term>
2896 <para>Firmennummer</para>
2901 <term>salesman_company</term>
2904 <para>Firmenname</para>
2909 <term>salesman_co_ustid</term>
2912 <para>Usatzsteuer-Identifikationsnummer</para>
2917 <term>salesman_duns</term>
2920 <para>DUNS-Nummer</para>
2925 <term>salesman_email</term>
2933 <term>salesman_fax</term>
2941 <term>salesman_name</term>
2944 <para>voller Name</para>
2949 <term>salesman_signature</term>
2952 <para>Signatur</para>
2957 <term>salesman_taxnumber</term>
2960 <para>Steuernummer</para>
2965 <term>salesman_tel</term>
2968 <para>Telefonnummer</para>
2974 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
2975 <title>Variablen für die einzelnen Steuern</title>
2987 <term>taxbase</term>
2990 <para>zu versteuernder Betrag</para>
2995 <term>taxdescription</term>
2998 <para>Name der Steuer</para>
3003 <term>taxrate</term>
3006 <para>Steuersatz</para>
3013 <sect2 id="dokumentenvorlagen-und-variablen.invoice">
3014 <title>Variablen in Rechnungen</title>
3016 <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
3017 <title>Allgemeine Variablen</title>
3021 <term>creditremaining</term>
3024 <para>Verbleibender Kredit</para>
3029 <term>currency</term>
3032 <para>Währung</para>
3037 <term>cusordnumber</term>
3040 <para>Bestellnummer beim Kunden</para>
3045 <term>deliverydate</term>
3048 <para>Lieferdatum</para>
3053 <term>duedate</term>
3056 <para>Fälligkeitsdatum</para>
3061 <term>globalprojectnumber</term>
3064 <para>Projektnummer des ganzen Beleges</para>
3069 <term>globalprojectdescription</term>
3072 <para>Projekbeschreibung des ganzen Beleges</para>
3077 <term>intnotes</term>
3080 <para>Interne Bemerkungen</para>
3085 <term>invdate</term>
3088 <para>Rechnungsdatum</para>
3093 <term>invnumber</term>
3096 <para>Rechnungsnummer</para>
3101 <term>invtotal</term>
3104 <para>gesamter Rechnungsbetrag</para>
3112 <para>Bemerkungen der Rechnung</para>
3117 <term>orddate</term>
3120 <para>Auftragsdatum</para>
3125 <term>ordnumber</term>
3128 <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
3129 erstellt wurde</para>
3134 <term>payment_description</term>
3137 <para>Name der Zahlart</para>
3142 <term>payment_terms</term>
3145 <para>Zahlungskonditionen</para>
3150 <term>quodate</term>
3153 <para>Angebotsdatum</para>
3158 <term>quonumber</term>
3161 <para>Angebotsnummer</para>
3166 <term>shippingpoint</term>
3169 <para>Versandort</para>
3174 <term>shipvia</term>
3177 <para>Transportmittel</para>
3182 <term>subtotal</term>
3185 <para>Zwischensumme aller Posten ohne Steuern</para>
3193 <para>Restsumme der Rechnung (Summe abzüglich bereits
3194 bezahlter Posten)</para>
3199 <term>transaction_description</term>
3202 <para>Vorgangsbezeichnung</para>
3207 <term>transdate</term>
3210 <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
3211 erstellt wurde</para>
3217 <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
3218 <title>Variablen für jeden Posten auf der Rechnung</title>
3225 <para>Stellage</para>
3230 <term>description</term>
3233 <para>Artikelbeschreibung</para>
3238 <term>discount</term>
3241 <para>Rabatt als Betrag</para>
3246 <term>discount_sub</term>
3249 <para>Zwischensumme mit Rabatt</para>
3254 <term>drawing</term>
3257 <para>Zeichnung</para>
3265 <para>EAN-Code</para>
3278 <term>linetotal</term>
3281 <para>Zeilensumme (Anzahl * Einzelpreis)</para>
3286 <term>longdescription</term>
3289 <para>Langtext</para>
3294 <term>microfiche</term>
3297 <para>Mikrofilm</para>
3302 <term>netprice</term>
3305 <para>Nettopreis</para>
3310 <term>nodiscount_linetotal</term>
3313 <para>Zeilensumme ohne Rabatt</para>
3318 <term>nodiscount_sub</term>
3321 <para>Zwischensumme ohne Rabatt</para>
3329 <para>Artikelnummer</para>
3334 <term>ordnumber_oe</term>
3337 <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3338 aus einem Sammelauftrag erstellt wurde</para>
3343 <term>p_discount</term>
3346 <para>Rabatt in Prozent</para>
3351 <term>partnotes</term>
3354 <para>Die beim Artikel gespeicherten Bemerkungen</para>
3359 <term>partsgroup</term>
3362 <para>Warengruppe</para>
3367 <term>price_factor</term>
3370 <para>Der Preisfaktor als Zahl, sofern einer eingestellt
3376 <term>price_factor_name</term>
3379 <para>Der Name des Preisfaktors, sofern einer eingestellt
3385 <term>projectnumber</term>
3388 <para>Projektnummer</para>
3393 <term>projectdescription</term>
3396 <para>Projektbeschreibung</para>
3409 <term>reqdate</term>
3412 <para>Lieferdatum</para>
3417 <term>runningnumber</term>
3420 <para>Position auf der Rechnung (1, 2, 3...)</para>
3425 <term>sellprice</term>
3428 <para>Verkaufspreis</para>
3433 <term>serialnumber</term>
3436 <para>Seriennummer</para>
3441 <term>tax_rate</term>
3444 <para>Steuersatz</para>
3449 <term>transdate_oe</term>
3452 <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
3453 aus einem Sammelauftrag erstellt wurde</para>
3461 <para>Einheit</para>
3469 <para>Gewicht</para>
3474 <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
3475 über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
3476 einer <function>foreach</function>-Schleife ausgegeben werden, da
3477 für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
3478 können. Die Variablen dafür lauten:</para>
3485 <para>Lieferant</para>
3493 <para>Lieferantenartikelnummer</para>
3499 <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
3500 <title>Variablen für die einzelnen Zahlungseingänge</title>
3504 <term>payment</term>
3512 <term>paymentaccount</term>
3520 <term>paymentdate</term>
3528 <term>paymentmemo</term>
3536 <term>paymentsource</term>
3545 <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
3546 <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
3548 <para>Die vom Benutzer definierten Variablen für Kunden und
3549 Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
3550 ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
3551 <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
3552 Variablennamen zusammen.</para>
3554 <para>Beispiel: Der Benutzer hat eine Variable namens
3555 <varname>number_of_employees</varname> definiert, die die Anzahl der
3556 Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
3557 unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
3562 <sect2 id="dokumentenvorlagen-und-variablen.dunning">
3563 <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
3565 <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
3566 <title>Namen der Vorlagen</title>
3568 <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
3569 eingegeben. Wird für ein Mahnlevel die Option zur automatischen
3570 Erstellung einer Rechnung über die Mahngebühren und Zinsen
3571 aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
3572 Vorlagenname für diese Mahnstufe mit dem Zusatz
3573 <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
3574 für die ausgewählte Sprache und den ausgewählten Drucker
3578 <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
3579 <title>Allgemeine Variablen in Mahnungen</title>
3581 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3582 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3583 Kunden stehen als Variablen <varname>name</varname>,
3584 <varname>street</varname>, <varname>zipcode</varname>,
3585 <varname>city</varname>, <varname>country</varname>,
3586 <varname>department_1</varname>, <varname>department_2</varname>,
3587 und <varname>email</varname> zur Verfügung.</para>
3589 <para>Weitere Variablen beinhalten:</para>
3593 <term>dunning_date</term>
3596 <para>Datum der Mahnung</para>
3601 <term>dunning_duedate</term>
3604 <para>Fälligkeitsdatum für diese Mahhnung</para>
3609 <term>dunning_id</term>
3612 <para>Mahnungsnummer</para>
3620 <para>Kummulative Mahngebühren</para>
3625 <term>interest_rate</term>
3628 <para>Zinssatz per anno in Prozent</para>
3633 <term>total_amount</term>
3636 <para>Gesamter noch zu zahlender Betrag als
3637 <function>fee</function> + <function>total_interest</function>
3638 + <function>total_open_amount</function></para>
3643 <term>total_interest</term>
3646 <para>Zinsen per anno über alle Rechnungen</para>
3651 <term>total_open_amount</term>
3654 <para>Summe über alle offene Beträge der Rechnungen</para>
3660 <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
3661 <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
3665 <term>dn_amount</term>
3668 <para>Rechnungssumme (brutto)</para>
3673 <term>dn_duedate</term>
3676 <para>Originales Fälligkeitsdatum der Rechnung</para>
3681 <term>dn_dunning_date</term>
3684 <para>Datum der Mahnung</para>
3689 <term>dn_dunning_duedate</term>
3692 <para>Fälligkeitsdatum der Mahnung</para>
3700 <para>Kummulative Mahngebühr</para>
3705 <term>dn_interest</term>
3708 <para>Zinsen per anno für diese Rechnung</para>
3713 <term>dn_invnumber</term>
3716 <para>Rechnungsnummer</para>
3721 <term>dn_linetotal</term>
3724 <para>Noch zu zahlender Betrag (ergibt sich aus
3725 <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
3726 + <varname>dn_interest</varname>)</para>
3731 <term>dn_netamount</term>
3734 <para>Rechnungssumme (netto)</para>
3739 <term>dn_open_amount</term>
3742 <para>Offener Rechnungsbetrag</para>
3747 <term>dn_ordnumber</term>
3750 <para>Bestellnummer</para>
3755 <term>dn_transdate</term>
3758 <para>Rechnungsdatum</para>
3763 <term>dn_curr</term>
3766 <para>Währung, in der die Rechnung erstellt wurde. (Die
3767 Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
3773 <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
3774 <title>Variablen in automatisch erzeugten Rechnungen über
3775 Mahngebühren</title>
3777 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3778 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3779 Kunden stehen als Variablen <varname>name</varname>,
3780 <varname>street</varname>, <varname>zipcode</varname>,
3781 <varname>city</varname>, <varname>country</varname>,
3782 <varname>department_1</varname>, <varname>department_2</varname>,
3783 und <varname>email</varname> zur Verfügung.</para>
3785 <para>Weitere Variablen beinhalten:</para>
3789 <term>duedate</term>
3792 <para>Fälligkeitsdatum der Rechnung</para>
3797 <term>dunning_id</term>
3800 <para>Mahnungsnummer</para>
3808 <para>Mahngebühren</para>
3813 <term>interest</term>
3821 <term>invamount</term>
3824 <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
3825 <varname>interest</varname>)</para>
3830 <term>invdate</term>
3833 <para>Rechnungsdatum</para>
3838 <term>invnumber</term>
3841 <para>Rechnungsnummer</para>
3848 <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
3849 <title>Variablen in anderen Vorlagen</title>
3852 <title>Einführung</title>
3854 <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
3855 Rechnung. Allerdings heißen die Variablen, die mit
3856 <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
3857 fangen sie mit <varname>quo</varname> für "quotation" an:
3858 <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
3859 wiederum fangen sie mit <varname>ord</varname> für "order" an:
3860 <varname>ordnumber</varname> für Bestellnummer etc.</para>
3862 <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
3863 vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
3864 sind Variablen, die vom Geschäftsablauf her in der entsprechenden
3865 Vorlage keine Bedeutung haben oder noch nicht belegt sein
3868 <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
3869 in Rechnungen aufgeführt.</para>
3872 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
3873 <title>Angebote und Preisanfragen</title>
3877 <term>quonumber</term>
3880 <para>Angebots- bzw. Anfragenummer</para>
3885 <term>reqdate</term>
3888 <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
3889 Preisanfragen)</para>
3894 <term>transdate</term>
3897 <para>Angebots- bzw. Anfragedatum</para>
3903 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
3904 <title>Auftragsbestätigungen und Lieferantenaufträge</title>
3908 <term>ordnumber</term>
3911 <para>Auftragsnummer</para>
3916 <term>reqdate</term>
3919 <para>Lieferdatum</para>
3924 <term>transdate</term>
3927 <para>Auftragsdatum</para>
3933 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
3934 <title>Lieferscheine (Verkauf und Einkauf)</title>
3938 <term>cusordnumber</term>
3941 <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
3942 des Lieferanten (im Einkauf)</para>
3947 <term>donumber</term>
3950 <para>Lieferscheinnummer</para>
3955 <term>transdate</term>
3958 <para>Lieferscheindatum</para>
3963 <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
3964 mit den Informationen darüber, von welchem Lager und Lagerplatz aus
3965 die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
3966 Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
3967 <function>foreach</function>-Schleife ausgegeben werden. Diese
3968 Variablen sind:</para>
3975 <para>Lagerplatz</para>
3980 <term>si_chargenumber</term>
3983 <para>Chargennummer</para>
3988 <term>si_bestbefore</term>
3991 <para>Mindesthaltbarkeit</para>
3996 <term>si_number</term>
3999 <para>Artikelnummer</para>
4007 <para>Anzahl bzw. Menge</para>
4012 <term>si_runningnumber</term>
4015 <para>Positionsnummer (1, 2, 3 etc)</para>
4020 <term>si_unit</term>
4023 <para>Einheit</para>
4028 <term>si_warehouse</term>
4037 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
4038 <title>Variablen für Sammelrechnung</title>
4042 <term>c0total</term>
4045 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit < 30
4051 <term>c30total</term>
4054 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
4055 und < 60 Tage</para>
4060 <term>c60total</term>
4063 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
4064 und < 90 Tage</para>
4069 <term>c90total</term>
4072 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90
4081 <para>Gesamtbetrag aller Rechnungen</para>
4086 <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
4090 <term>invnumber</term>
4093 <para>Rechnungsnummer</para>
4098 <term>invdate</term>
4101 <para>Rechnungsdatum</para>
4106 <term>duedate</term>
4109 <para>Fälligkeitsdatum</para>
4117 <para>Summe der Rechnung</para>
4125 <para>Noch offener Betrag der Rechnung</para>
4133 <para>Noch offener Rechnungsbetrag mit Fälligkeit < 30
4142 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
4151 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
4160 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 90
4168 <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
4169 <title>Blöcke, bedingte Anweisungen und Schleifen</title>
4171 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
4172 <title>Einfürhung</title>
4174 <para>Der Parser kennt neben den Variablen einige weitere
4175 Konstrukte, die gesondert behandelt werden. Diese sind wie
4176 Variablennamen in spezieller Weise markiert:
4177 <command><%anweisung%> ... <%end%></command></para>
4179 <para>Anmerkung zum <command><%end%></command>: Der besseren
4180 Verständlichkeit halber kann man nach dem <command>end</command>
4181 noch beliebig weitere Wörter schreiben, um so zu markieren, welche
4182 Anweisung (z.B. <command>if</command> oder
4183 <command>foreach</command>) damit abgeschlossen wird.</para>
4185 <para>Beispiel: Lautet der Beginn eines Blockes z.B.
4186 <command><%if type == "sales_quotation"%></command>, so könnte
4187 er mit <command><%end%></command> genauso abgeschlossen werden
4188 wie mit <command><%end if%></command> oder auch
4189 <command><%end type == "sales_quotation"%></command>.</para>
4192 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
4193 <title>Der if-Block</title>
4195 <programlisting><%if variablenname%>
4197 <%end%></programlisting>
4199 <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
4200 und dem "end" werden nur ausgegeben, wenn die Variable
4201 <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
4203 <para>Die Bedingung kann auch negiert werden, indem das Wort
4204 <function>not</function> nach dem <filename>if</filename> verwendet
4205 wird. Beispiel:</para>
4207 <programlisting><%if not cp_greeting%>
4209 <%end%></programlisting>
4211 <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
4212 oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
4213 einer Variablen mit einer festen Zeichenkette oder einer anderen
4214 Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
4215 oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
4216 die rechte Seite des Vergleichsoperators in Anführungszeichen
4217 gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
4218 anderer Variablen). Zwei Beispiele, die beide Vergleiche
4221 <programlisting><%if var1 == "Wert"%></programlisting>
4223 <para>Testet die Variable <varname>var1</varname> auf
4224 übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
4225 Mittels <function>!=</function> anstelle von <function>==</function>
4226 würde auf Ungleichheit getestet.</para>
4228 <programlisting>%if var1 == var2%></programlisting>
4230 <para>Testet die Variable <varname>var1</varname> auf
4231 übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
4232 <function>!=</function> anstelle von <function>==</function> würde
4233 auf Ungleichheit getestet.</para>
4235 <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
4236 auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
4237 Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
4238 dieselbe Syntax wie oben nur mit <function>=~</function> und
4239 <function>!~</function> als Vergleichsoperatoren.</para>
4241 <para>Beispiel für einen Test, ob die Variable
4242 <varname>intnotes</varname> (interne Bemerkungen) das Wort
4243 <constant>schwierig</constant> enthält:</para>
4245 <programlisting><%if intnotes =~ "schwierig"%></programlisting>
4248 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
4249 <title>Der foreach-Block</title>
4251 <programlisting><%foreach variablenname%>
4253 <%end%></programlisting>
4255 <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
4256 wie das Perl-Array der Variablen <varname>variablenname</varname>
4257 Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
4258 Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
4259 benutzt. In jedem Durchlauf werden die <link
4260 linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
4261 Variablen</link> jeweils auf den Wert für die aktuelle Position
4264 <para>Die Syntax sieht normalerweise wie folgt aus:</para>
4266 <programlisting><%foreach number%>
4267 Position: <%runningnumber%>
4268 Anzahl: <%qty%>
4269 Artikelnummer: <%number%>
4270 Beschreibung: <%description%>
4272 <%end%></programlisting>
4274 <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
4275 <function><%foreach%></function>-Block innerhalb einer
4276 Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
4277 wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
4278 Inhalt zwischen <function><%foreach%></function> und
4279 <function><%end%></function> wiederholt, nicht aber die
4280 komplette Zeile, in der er steht.</para>
4284 <sect2 id="dokumentenvorlagen-und-variablen.markup">
4285 <title>Markup-Code zur Textformatierung innerhalb von
4288 <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
4289 anders formatiert haben möchte, so ist dies begrenzt möglich.
4290 Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
4291 Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
4292 Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
4293 dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
4294 (HTML oder PDF über LaTeX) umgesetzt.</para>
4296 <para>Die unterstützen Formatierungen sind:</para>
4300 <term><b>Text</b></term>
4303 <para>Text wird in Fettdruck gesetzt.</para>
4308 <term><i>Text</i></term>
4311 <para>Text wird kursiv gesetzt.</para>
4316 <term><u>Text</u></term>
4319 <para>Text wird unterstrichen.</para>
4324 <term><s>Text</s></term>
4327 <para>Text wird durchgestrichen. Diese Formatierung ist nicht
4328 bei der Ausgabe als PDF über LaTeX verfügbar.</para>
4333 <term><bullet></term>
4336 <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
4342 <para>Der Befehl <command><bullet></command> funktioniert
4343 momentan auch nur in Latex-Vorlagen.</para>
4347 <sect1 id="excel-templates">
4348 <title>Excel-Vorlagen</title>
4350 <sect2 id="excel-templates.summary">
4351 <title>Zusammenfassung</title>
4353 <para>Dieses Dokument beschreibt den Mechanismus, mit dem
4354 Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
4358 <sect2 id="excel-templates.usage">
4359 <title>Bedienung</title>
4361 <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
4362 werden. Die Konfigurationsoption heißt <varname>excel_templates =
4363 1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
4365 <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
4366 anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
4367 werden. In den normalen Verkaufsmasken taucht nun
4368 <constant>Excel</constant> als auswählbares Format auf und kann von da
4369 an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
4371 <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
4372 eine Angebotsvorlage und wird unter dem internen Namen der Angebote
4373 <filename>sales_quotation.xls</filename> gespeichert.</para>
4376 <sect2 id="excel-templates.syntax">
4377 <title>Variablensyntax</title>
4379 <para>Einfache Syntax:
4380 <command><<varname>></command></para>
4382 <para>Dabei sind <constant><<</constant> und
4383 <constant>>></constant> die Delimiter. Da Excel auf festen
4384 Breiten besteht, kann der Tag künstlich verlängert werden, indem
4385 weitere <constant><</constant> oder <constant>></constant>
4386 eingefügt werden. Der Tag muss nicht symmetrisch sein.
4389 <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4391 <para>Um die Limitierung der festen Breite zu reduzieren, können
4392 weitere Variablen in einem Block interpoliert werden. Whitespace wird
4393 dazwishen dann erhalten. Beispiel:</para>
4395 <programlisting><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4397 <para>Die Variablen werden interpoliert, und linksbündig mit
4398 Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
4399 lang, werden überzählige Zeichen abgeschnitten.</para>
4401 <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
4402 der Block mit einem Leerzeichen anfängt. Beispiel:</para>
4404 <programlisting><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4406 <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
4407 Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
4411 <sect2 id="excel-templates.limitations">
4412 <title>Einschränkungen</title>
4414 <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
4415 mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
4416 beschränkt sich daher darauf, Textstellen exakt durch einen anderen
4417 Text zu ersetzen.</para>
4419 <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
4420 <command><%if%></command> und
4421 <command><%foreach%></command> nicht vorhanden. Der Delimiter
4422 <constant><% %></constant> kommt in den Headerinformationen
4423 evtl. vor. Deshalb wurde auf den sichereren Delimiter
4424 <constant><<</constant> und <constant>>></constant>
4429 <sect1 id="devel.fcgi">
4430 <title>Entwicklung unter FastCGI</title>
4432 <sect2 id="devel.fcgi.general">
4433 <title>Allgemeines</title>
4435 <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
4436 werden, muss der Webserver neu gestartet werden.</para>
4438 <para>Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu
4439 achten. Dadurch, dass das Programm in einer Endlosschleife läuft,
4440 müssen folgende Aspekte beachtet werden.</para>
4443 <sect2 id="devel.fcgi.exiting">
4444 <title>Programmende und Ausnahmen</title>
4446 <para>Betrifft die Funktionen <function>warn</function>,
4447 <function>die</function>, <function>exit</function>,
4448 <function>carp</function> und <function>confess</function>.</para>
4450 <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
4451 Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
4452 am Laufen zu halten. Man kann mit <function>die</function>,
4453 <function>confess</function> oder <function>carp</function> Fehler
4454 ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
4455 eigene <function>$::form-</function>error()> tut im Prinzip das
4456 Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
4457 <function>exit</function> hingegen werden nicht abgefangen.
4458 <function>warn</function> wird direkt nach STDERR, also in Server Log
4459 eine Nachricht schreiben (sofern in der Konfiguration nicht die
4460 Warnungen in das Lx-Office Log umgeleitet wurden), und
4461 <function>exit</function> wird die Ausführung beenden.</para>
4463 <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
4464 beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
4465 Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
4466 benutzen, alle anderen Exceptionmechanismen sind ok.</para>
4469 <sect2 id="devel.fcgi.globals">
4470 <title>Globale Variablen</title>
4472 <para>Um zu vermeiden, dass Informationen von einem Request in einen
4473 anderen gelangen, müssen alle globalen Variablen vor einem Request
4474 sauber initialisiert werden. Das ist besonders wichtig im
4475 <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
4476 diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
4479 <para>In <classname>SL::Dispatcher</classname> gibt es einen sauber
4480 abgetrennten Block, der alle kanonischen globalen Variablen listet und
4481 erklärt. Bitte keine anderen einführen ohne das sauber zu
4482 dokumentieren.</para>
4484 <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
4485 man sicher geht, dass man die richtige erwischt.</para>
4488 <sect2 id="devel.fcgi.performance">
4489 <title>Performance und Statistiken</title>
4491 <para>Die kritischen Pfade des Programms sind die Belegmasken, und
4492 unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
4493 Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
4494 4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
4495 sind es je nach Menge der definierten Variablen 1-2s. Ab der
4496 Moose/Rose::DB Version sind es 5-6s.</para>
4498 <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
4499 den kritischen Pfaden, unter 0,15 sonst.</para>
4502 <sect2 id="devel.fcgi.known-issues">
4503 <title>Bekannte Probleme</title>
4505 <sect3 id="devel.fcgi.known-issues.encoding">
4506 <title>Encoding Awareness</title>
4508 <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
4509 fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
4510 falsch kodierte Zeichen eher unwissend, und geben sie einfach
4511 weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
4512 das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
4518 <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
4519 <title>SQL-Upgradedateien</title>
4521 <sect2 id="db-upgrade-files.introduction" xreflabel="Einführung in die Datenbank-Upgradedateien">
4522 <title>Einführung</title>
4525 Der alte Mechanismus für SQL-Upgradescripte, der auf einer Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
4526 diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele Entwicklung im stable- und unstable-Baum betrifft.
4530 Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es werden weiterhin alle Scripte aus sql/Pg-upgrade
4531 ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
4532 Datei existieren, die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige Kontrollinformationen enthält.
4536 Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten definieren können werden, sodass Datenbankscripte zwar in
4537 einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
4538 angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern mehr braucht.
4542 Lx-Office merkt sich dabei, welches der Upgradescripte in sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht erneut
4543 aus. Dazu dient die Tabelle "schema_info", die bei der Anmeldung automatisch angelegt wird.
4547 <sect2 id="db-upgrade-files.format" xreflabel="Format der Upgradedateien">
4548 <title>Format der Kontrollinformationen</title>
4551 Die Kontrollinformationen sollten sich am Anfang der jeweiligen Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
4552 hat dabei das folgende Format:
4556 Für SQL-Upgradedateien:
4559 <programlisting>-- @key: value</programlisting>
4562 Für Perl-Upgradedateien:
4565 <programlisting># @key: value</programlisting>
4568 Leerzeichen vor "<varname>value</varname>" werden entfernt.
4572 Die folgenden Schlüsselworte werden verarbeitet:
4580 Wird zwingend benötigt. Dies ist der "Name" des Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren Abhängigkeiten
4581 verwendet werden (Schlüsselwort "<varname>depends</varname>"). Der "tag" ist auch der Name, der in der Datenbank eingetragen wird.
4585 Normalerweise sollte die Kontrolldatei genau so heißen wie der "tag", nur mit der Endung ".sql" bzw. "pl".
4589 Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
4590 sollten stattdessen mit Unterstrichen ersetzt werden.
4596 <term>charset</term>
4599 Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
4600 Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags der Zeichensatz "<literal>ISO-8859-15</literal>"
4607 <term>description</term>
4610 Benötigt. Eine Beschreibung, was in diesem Update passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
4611 angezeigt. Während der Tag in englisch gehalten sein sollte, sollte die Beschreibung auf Deutsch erfolgen.
4617 <term>depends</term>
4620 Optional. Eine mit Leerzeichen getrennte Liste von "tags", von denen dieses Upgradescript abhängt. Lx-Office stellt sicher, dass
4621 die in dieser Liste aufgeführten Scripte bereits durchgeführt wurden, bevor dieses Script ausgeführt wird.
4625 Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b" existiert, das von Änderungen in "a" abhängt, und eine neue
4626 Kontrolldatei für "c" erstellt wird, die von Änderungen in "a" und "b" abhängt, so genügt es, in "c" nur den Tag "b" als
4627 Abhängigkeit zu definieren.
4631 Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu definieren (z.B. "a" -> "b",
4632 "b" -> "c" und "c" -> "a").
4638 <term>priority</term>
4641 Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
4642 besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
4646 Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends" benutzt werden. Lx-Office sortiert die auszuführenden Scripte
4647 zuerst nach der Abhängigkeitstiefe (wenn "z" von "y" abhängt und "y" von "x", so hat "z" eine Abhängigkeitstiefe von 2, "y" von 1
4648 und "x" von 0. "x" würde hier zuerst ausgeführt, dann "y", dann "z"), dann nach der Priorität und bei gleicher Priorität
4649 alphabetisch nach dem "tag".
4656 <sect2 id="db-upgrade-files.dbupgrade-tool" xreflabel="Hilfsscript dbupgrade2_tool.pl">
4657 <title>Hilfsscript dbupgrade2_tool.pl</title>
4660 Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert ein Hilfsscript namens
4661 "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses
4662 Tool liest alle Datenbankupgradescripte aus dem Verzeichnis <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die gleichen
4663 Methoden wie Lx-Office selber, sodass alle Fehlersituationen von der Kommandozeile überprüft werden können.
4667 Wird dem Script kein weiterer Parameter übergeben, so wird nur eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
4668 sich aber auch Informationen auf verschiedene Art ausgeben lassen:
4673 <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl --list</command>"</para>
4676 Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge sortiert, in der Lx-Office die Scripte ausführen würde. Es
4677 werden neben der Listenposition der Tag, die Abhängigkeitstiefe und die Priorität ausgegeben.
4682 <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl --tree</command>"</para>
4685 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
4686 anderen abhängen. Die Unterknoten sind Scripte, die beim übergeordneten Script als Abhängigkeit eingetragen sind.
4690 <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
4691 <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl --rtree</command>"</para>
4694 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
4695 Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das übergeordnete Script als Abhängigkeit eingetragen haben.
4700 <para>Baumform mit Postscriptausgabe: "<command>./scripts/dbupgrade2_tool.pl --graphviz</command>"</para>
4703 Benötigt das Tool "<command>graphviz</command>", um mit seiner Hilfe die <link
4704 linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte Baumform</link> in eine Postscriptdatei namens
4705 "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist vermutlich die übersichtlichste Form, weil hierbei jeder Knoten nur
4706 einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben werden.
4712 Scripte, von denen kein anderes Script abhängt: "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"
4716 Listet die Tags aller Scripte auf, von denen keine anderen Scripte abhängen.
4723 <sect1 id="translations-languages" xreflabel="Translations and languages">
4724 <title>Translations and languages</title>
4726 <sect2 id="translations-languages.introduction"
4727 xreflabel="Introduction to translations and languages">
4728 <title>Introduction</title>
4731 <para>Dieser Abschnitt ist in Englisch geschrieben, um
4732 internationalen Übersetzern die Arbeit zu erleichtern.</para>
4735 <para>This section describes how localization packages in Lx-Office
4736 are built. Currently the only language fully supported is German, and
4737 since most of the internal messages are held in English the English
4738 version is usable too.</para>
4740 <para>A stub version of French is included but not functunal at this
4744 <sect2 id="translations-languages.file-structure"
4745 xreflabel="File structure">
4746 <title>File structure</title>
4748 <para>The structure of locales in Lx-Office is:</para>
4750 <programlisting>lx-office/locale/<langcode>/</programlisting>
4752 <para>where <langcode> stands for an abbreviation of the
4753 language package. The builtin packages use two letter <ulink
4754 url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
4755 but the actual name is not relevant for the program and can easily be
4757 url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
4758 tags</ulink> (i.e. "en_GB"). In fact the original language packages
4759 from SQL Ledger are named in this way.</para>
4761 <para>In such a language directory the following files are
4766 <term>LANGUAGE</term>
4769 <para>This file is mandatory.</para>
4771 <para>The <filename>LANGUAGE</filename> file contains the self
4772 descripted name of the language. It should contain a native
4773 representation first, and in parenthesis an english translation
4774 after that. Example:</para>
4776 <programlisting>Deutsch (German)</programlisting>
4781 <term>charset</term>
4784 <para>This file should be present.</para>
4786 <para>The <filename>charset</filename> file describes which
4787 charset a language package is written in and applies to all
4788 other language files in the package. It is possible to write
4789 some language packages without an explicit charset, but it is
4790 still strongly recommended. You'll never know in what
4791 environment your language package will be used, and neither
4792 UTF-8 nor Latin1 are guaranteed.</para>
4794 <para>The whole content of this file is a string that can be
4795 recognized as a valid charset encoding. Example:</para>
4797 <programlisting>UTF-8</programlisting>
4805 <para>This file is mandatory.</para>
4807 <para>The central translation file. It is essentially an inline
4808 Perl script autogenerated by <command>locales.pl</command>. To
4809 generate it, generate the directory and the two files mentioned
4810 above, and execute the following command:</para>
4812 <programlisting>scripts/locales.pl <langcode></programlisting>
4814 <para>Otherwise you can simply copy one of the other languages.
4815 You will be told how many are missing like this:</para>
4817 <programlisting>$ scripts/locales.pl en
4818 English - 0.6% - 2015/2028 missing</programlisting>
4820 <para>A file named "<filename>missing</filename>" will be
4821 generated and can be edited. You can also edit the
4822 "<filename>all</filename>" file directly. Edit everything you
4823 like to fit the target language and execute
4824 <command>locales.pl</command> again. See how the missing words
4830 <term>Num2text</term>
4833 <para>Legacy code from SQL Ledger. It provides a means for
4834 numbers to be converted into natural language, like
4835 <literal>1523 => one thousand five hundred twenty
4836 three</literal>. If you want to provide it, it must be inlinable
4837 Perl code which provides a <function>num2text</function> sub. If
4838 an <function>init</function> sub exists it will be executed
4841 <para>Only used in the check and receipt printing module.</para>
4846 <term>special_chars</term>
4849 <para>Lx-Office comes with a lot of interfaces to different
4850 formats, some of which are rather picky with their accepted
4851 charset. The <filename>special_chars</filename> file contains a
4852 listing of chars not suited for different file format and
4853 provides substitutions. It is written in "Simple Ini" style,
4854 containing a block for every file format.</para>
4856 <para>First entry should be the order of substitution for
4857 entries as a whitespace separated list. All entries are
4858 interpolated, so <literal>\n</literal>, <literal>\x20</literal>
4859 and <literal>\\</literal> all work.</para>
4861 <para>After that every entry is a special char that should be
4862 translated when writing text into such a file.</para>
4864 <para>Example:</para>
4866 <programlisting>[Template/XML]
4867 order=& < > \n
4871 \n=<br></programlisting>
4873 <para>Note the importance of the order in this example.
4874 Substituting < and > befor & would lead to $gt; become
4877 <para>For a list of valid formats, see the German
4878 <filename>special_chars</filename> entry. As of this writing the
4879 following are recognized:</para>
4881 <programlisting>HTML
4886 Template/OpenDocument
4887 filenames</programlisting>
4889 <para>The last of which is very machine dependant. Remember that
4890 a lot of characters are forbidden by some filesystems, for
4891 exmaple MS Windows doesn't like ':' in its files where Linux
4892 doesn't mind that. If you want the files created with your
4893 language pack to be portable, find all chars that could cause
4899 <term>missing</term>
4902 <para>This file is not a part of the language package
4905 <para>This is a file generated by
4906 <command>scripts/locales.pl</command> while processing your
4907 locales. It's only to have the missing entries singled out and
4908 does not belong to a language package.</para>
4916 <para>This file is not a part of the language package
4919 <para>Another file generated by
4920 <command>scripts/locales.pl</command>. If for any reason a
4921 translation does not appear anymore and can be deleted, it gets
4922 moved here. The last 50 or so entries deleted are saved here in
4923 case you made a typo, so that you don't have to translate
4924 everything again. If a tranlsation is missing, the lost file is
4925 checked first. If you maintain a language package, you might
4926 want to keep this safe somewhere.</para>
4932 <sect2 id="devel.style-guide">
4933 <title>Stil-Richtlinien</title>
4936 Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar zu machen. Dazu gehört zum Einen, dass der Code
4937 einheitlich eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte "Klammern" oder "Hash-Keys").
4941 Diese Regeln sind keine Schikane sondern erleichtern allen das Leben!
4945 Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
4952 Es werden keine echten Tabs sondern Leerzeichen verwendet.
4958 Die Einrückung beträgt zwei Leerzeichen. Beispiel:
4961 <programlisting>foreach my $row (@data) {
4963 # do something with $row
4967 $row->{modules} = MODULE->retrieve(
4968 id => $row->{id},
4969 date => $use_now ? localtime() : $row->{time},
4973 $report->add($row);
4978 <para>Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie der letzte Befehl. Beispiele:</para>
4980 <programlisting>sub debug {
4986 <programlisting>if ($form->{item_rows} > 0) {
4993 Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl / die öffnende schließende Klammer, die den Block gestartet
4994 hat, und nicht auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
5000 Die Wörter "<function>else</function>", "<function>elsif</function>", "<function>while</function>" befinden sich auf der gleichen
5001 Zeile wie schließende geschweifte Klammern. Beispiele:
5004 <programlisting>if ($form->{sum} > 1000) {
5006 } elsif ($form->{sum} > 0) {
5014 } until ($a > 0);</programlisting>
5019 Parameter von Funktionsaufrufen müssen mit runden Klammern versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
5020 und grep-ähnliche Operatoren. Beispiel:
5023 <programlisting>$main::lxdebug->message("Could not find file.");
5024 %options = map { $_ => 1 } grep { !/^#/ } @config_file;</programlisting>
5029 Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
5033 Generell gilt: Hashkeys und Arrayindices sollten nicht durch Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
5034 Blöcke schon. Beispiel:
5037 <programlisting>if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
5042 $form->{sum} += $form->{"row_$i"};
5043 $form->{ $form->{index} } += 1;
5045 map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;</programlisting>
5056 Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
5057 werden, in der die ersten Funktionsparameter in der ersten Zeile stehen. Beispiel:
5060 <programlisting>$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
5061 $form->{some_col_value});</programlisting>
5066 Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer übersichtlichen Tabellenstruktur organisiert
5070 <programlisting>my $rowcount = $form->{"row_$i"} ? $i
5071 : $form->{oldcount} ? $form->{oldcount} + 1
5072 : $form->{rowcount} - $form->{rowbase};</programlisting>
5084 <para>Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der Code eingerückt sein.</para>
5088 <para>Seitliche hängende Kommentare sollten einheitlich formatiert werden.</para>
5093 Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch zu verfassen. So wie ich keine Lust habe, französischen
5094 Quelltext zu lesen, sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein. Beispiel:
5097 <programlisting>my $found = 0;
5105 $i = 0 # initialize $i
5107 $i *= $const; # do something crazy
5108 $i = $n; # recover $i</programlisting>
5115 Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation gewünscht ist. Beispiel:
5118 <programlisting>$form->{sum} = 0;
5119 $form->{"row_$i"} = $form->{"row_$i"} - 5;
5120 $some_hash{42} = 54;</programlisting>
5125 Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
5126 wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann ist Lesbarkeit vorzuziehen.
5130 Als Beispiel sei die Funktion <function>print_options</function> aus <filename>bin/mozilla/io.pl</filename> angeführt.
5136 Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die
5141 Emacs und vim haben beide recht einfache Methoden zur Entfernung von trailing whitespace. Emacs kennt das Kommande
5142 <command>nuke-trailing-whitespace</command>, vim macht das gleiche manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
5143 BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern gebunden.
5149 Es wird kein <command>perltidy</command> verwendet.
5153 In der Vergangenheit wurde versucht, <command>perltidy</command> zu verwenden, um einen einheitlichen Stil zu erlangen. Es hat
5154 sich aber gezeigt, dass <command>perltidy</command>s sehr eigenwilliges Verhalten, was Zeilenumbrüche angeht, oftmals gut
5155 formatierten Code zerstört. Für den Interessierten sind hier die <command>perltidy</command>-Optionen, die grob den
5156 beschriebenen Richtlinien entsprechen:
5159 <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
5160 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
5161 -lp -vt=1 -vtc=1</programlisting>
5166 <varname>STDERR</varname> ist tabu. Unkonditionale Debugmeldungen auch.
5170 Lx-Office bietet mit dem Modul <classname>LXDebug</classname> einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
5171 Grund, nach <varname>STDERR</varname> zu schreiben.
5175 Die <classname>LXDebug</classname>-Methode "<function>message</function>" nimmt als ersten Paramter außerdem eine Flagmaske, für
5176 die die Meldung angezeigt wird, wobei "0" immer angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden und werden in
5177 den meisten Fällen auch vom Repository zurückgewiesen.
5183 Alle neuen Module müssen use strict verwenden.
5187 <varname>$form</varname>, <varname>$auth</varname>, <varname>$locale</varname>, <varname>$lxdebug</varname> und
5188 <varname>%myconfig</varname> werden derzeit aus dem main package importiert (siehe <xref linkend="devel.globals"/>. Alle anderen
5189 Konstrukte sollten lexikalisch lokal gehalten werden.