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 <link linkend="config.task-server">Taskserver</link> für <link
408 linkend="features.periodic-invoices">wiederkehrende Rechnungen</link>, muss unter <literal>[task_server]</literal> ein Login eines
409 Benutzers angegeben werden, mit dem sich der Taskserver an Lx-Office bei der Datenbank anmeldet, die dem Benutzer zugewiesen ist.
413 Für Entwickler finden sich unter <literal>[debug]</literal> wichtige Funktionen, um die Fehlersuche zu erleichtern.
417 <sect2 id="config.config-file.prior-versions">
418 <title>Versionen vor 2.6.3</title>
421 In älteren Lx-Office Versionen gab es im Verzeichnis <filename>config</filename> die Dateien <filename>authentication.pl</filename>
422 und <filename>lx-erp.conf</filename>, die jeweils Perl-Dateien waren. Es gab auch die Möglichkeit, eine lokale Version der
423 Konfigurationsdatei zu erstellen (<literal>lx-erp-local.conf</literal>). Dies ist ab 2.6.3 nicht mehr möglich, aber auch nicht mehr
428 Beim Update von einer Lx-Office-Version vor 2.6.3 auf 2.6.3 oder jünger müssen die Einstellungen aus den alten Konfigurationsdateien
429 manuell übertragen und die alten Konfigurationsdateien anschließend gelöscht oder verschoben werden. Ansonsten zeigt Lx-Office eine
430 entsprechende Fehlermeldung an.
435 <sect1 id="Anpassung-der-PostgreSQL-Konfiguration">
436 <title>Anpassung der PostgreSQL-Konfiguration</title>
438 <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
440 <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
441 <title>Zeichensätze/die Verwendung von UTF-8</title>
443 <para>Lx-Office kann komplett mit UTF-8 als Zeichensatz verwendet
444 werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
445 Version 8.0 oder neuer benutzt werden, und der
446 PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
447 angelegt worden sein.</para>
449 <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
450 “template1” “UTF8”, so kann auch Lx-Office mit UTF-8 betrieben werden.
451 Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
452 UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
453 Ubuntu kann dies z.B. mit dem folgenden Befehl getan werden:</para>
455 <para><literal>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8
456 8.2 clustername</literal></para>
458 <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete
459 Versionsnummer angepasst werden.</para>
461 <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
463 <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
464 ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
465 Lx-Office mit ISO-8859-15 als Encoding betrieben werden.</para>
467 <para>Das Encoding einer Datenbank kann in <literal>psql</literal> mit
468 <literal>\l</literal> geprüft werden.</para>
471 <sect2 id="Änderungen-an-Konfigurationsdateien">
472 <title>Änderungen an Konfigurationsdateien</title>
474 <para>In der Datei <literal>postgresql.conf</literal>, die je nach
475 Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
476 <literal>/var/lib/pgsql/data/</literal> oder
477 <literal>/etc/postgresql/</literal>, muss sichergestellt werden, dass
478 TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
479 Parameter <literal>listen_address</literal> gesteuert. Laufen
480 PostgreSQL und Lx-Office auf demselben Rechner, so kann dort der Wert
481 <literal>localhost</literal> verwendet werden. Andernfalls müssen
482 Datenbankverbindungen auch von anderen Rechnern aus zugelassen werden,
483 was mit dem Wert \<literal>*</literal> geschieht.</para>
485 <para>In der Datei <literal>pg_hba.conf</literal>, die im gleichen
486 Verzeichnis wie die <literal>postgresql.conf</literal> zu finden sein
487 sollte, müssen die Berichtigungen für den Zugriff geändert werden.
488 Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
489 Verbindungen immer zuzulassen</para>
491 <para><literal>local all all trust host all all 127.0.0.1 255.0.0.0
492 trust</literal></para>
494 <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
495 Passwort zuzulassen. Beispielsweise:</para>
497 <para><literal>local all lxoffice password host all lxoffice 127.0.0.1
498 255.255.255.255 password</literal></para>
503 <sect2 id="Erweiterung-für-servergespeicherte-Prozeduren">
504 <title>Erweiterung für servergespeicherte Prozeduren</title>
506 <para>In der Datenbank <literal>template1</literal> muss die
507 Unterstützung für servergespeicherte Prozeduren eingerichet werden.
508 Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
509 führen Sie die folgenden Kommandos aus:</para>
511 <para><literal>create language 'plpgsql';</literal></para>
513 <para>Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler
514 für die Sprache manuell anlelegt werden, diese Versionen werden aber
515 nicht mehr offiziell von Lx-Office unterstützt. Dafür dann die
516 folgenden Kommandos:</para>
518 <para><literal>create function plpgsql_call_handler () returns opaque
519 as '/usr/lib/pgsql/plpgsql.so' language 'c'; create language 'plpgsql'
520 handler plpgsql_call_handler lancompiler 'pl/pgsql';</literal></para>
522 <para>Bitte beachten Sie, dass der Pfad zur Datei
523 <literal>plpgsql.so</literal> von Distribution zu Distribution
524 verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich unter
525 <literal>/usr/lib/postgresql/lib/plpgsql.so</literal>.</para>
530 <sect2 id="Datenbankbenutzer-anlegen">
531 <title>Datenbankbenutzer anlegen</title>
533 <para>Wenn Sie nicht den Datenbanksuperuser “postgres” zum Zugriff
534 benutzen wollen, so sollten Sie bei PostgreSQL einen neuen Benutzer
535 anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
538 <para><literal>su - postgres createuser -d -P
539 lxoffice</literal></para>
541 <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
542 Sie den evtl. voreingestellten Benutzer “postgres” auf “lxoffice” bzw.
543 den hier gewählten Benutzernamen.</para>
549 <sect1 id="Apache-Konfiguration">
550 <title>Webserver-Konfiguration</title>
553 <title>Grundkonfiguration mittels CGI</title>
556 <para>Für einen deutlichen Performanceschub sorgt die Ausführung
557 mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
558 <xref linkend="Apache-Konfiguration.FCGI"/> beschrieben.</para>
561 <para>Der Zugriff auf das Programmverzeichnis muss in der Apache
562 Webserverkonfigurationsdatei <literal>httpd.conf</literal> eingestellt
563 werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
564 anderen Datei hinzu, die beim Starten des Webservers eingelesen
567 <para><literal> AddHandler cgi-script .pl Alias /lx-erp/
568 /var/www/lx-erp/ <Directory /var/www/lx-erp> Options ExecCGI
569 Includes FollowSymlinks </Directory> <Directory
570 /var/www/lx-erp/users> Order Deny,Allow Deny from All
571 </Directory> </literal></para>
573 <para>Ersetzen Sie dabei die Pfade durch diejenigen, in die Sie vorher
574 das Lx-Office-Archiv entpacket haben.</para>
576 <para>Achtung: Vor den einzelnen Optionen muss bei einigen
577 Distributionen ein Plus ‘<literal>+</literal>’ gesetzt werden.</para>
579 <para>Auf einigen Webservern werden manchmal die Grafiken und
580 Style-Sheets nicht ausgeliefert. In solchen Fällen hat es oft
581 geholfen, die folgende Option in die Konfiguration aufzunehmen:</para>
583 <para><literal>EnableSendfile Off</literal></para>
586 <sect2 id="Apache-Konfiguration.FCGI"
587 xreflabel="Konfiguration für FastCGI/FCGI">
588 <title>Konfiguration für FastCGI/FCGI</title>
590 <sect3 id="Apache-Konfiguration.FCGI.WasIstEs">
591 <title>Was ist FastCGI?</title>
593 <para>Direkt aus <ulink
594 url="http://de.wikipedia.org/wiki/FastCGI">Wikipedia</ulink>
597 <para><citation> FastCGI ist ein Standard für die Einbindung
598 externer Software zur Generierung dynamischer Webseiten in einem
599 Webserver. FastCGI ist vergleichbar zum Common Gateway Interface
600 (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu
601 umgehen. </citation></para>
604 <sect3 id="Apache-Konfiguration.FCGI.Warum">
605 <title>Warum FastCGI?</title>
607 <para>Perl Programme (wie Lx-Office eines ist) werden nicht statisch
608 kompiliert. Stattdessen werden die Quelldateien bei jedem Start
609 übersetzt, was bei kurzen Laufzeiten einen Großteil der Laufzeit
610 ausmacht. Während SQL Ledger einen Großteil der Funktionalität in
611 einzelne Module kapselt, um immer nur einen kleinen Teil laden zu
612 müssen, ist die Funktionalität von Lx-Office soweit gewachsen, dass
613 immer mehr Module auf den Rest des Programms zugreifen. Zusätzlich
614 benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
615 entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies
616 führt dazu dass ein Lx-Office Aufruf der Kernmasken mittlerweile
617 deutlich länger dauert als früher, und dass davon 90% für das Laden
618 der Module verwendet wird.</para>
620 <para>Mit FastCGI werden nun die Module einmal geladen, und danach
621 wird nur die eigentliche Programmlogik ausgeführt.</para>
624 <sect3 id="Apache-Konfiguration.FCGI.WebserverUndPlugin">
625 <title>Getestete Kombinationen aus Webservern und Plugin</title>
627 <para>Folgende Kombinationen sind getestet:</para>
631 <para>Apache 2.2.11 (Ubuntu) und mod_fcgid.</para>
635 <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
639 <para>Dabei wird mod_fcgid empfohlen, weil mod_fastcgi seit geraumer
640 Zeit nicht mehr weiter entwickelt wird. Im Folgenden wird auf
641 mod_fastcgi nicht mehr explizit eingegangen.</para>
643 <para>Als Perl Backend wird das Modul <filename>FCGI.pm</filename>
647 <para>FCGI 0.69 und höher ist extrem strict in der Behandlung von
648 Unicode, und verweigert bestimmte Eingaben von Lx-Office. Falls es
649 Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
650 Vorgängerversion FCGI 0.68 ausgewichen werden.</para>
653 <para>Mit CPAN lässt sie sich die Vorgängerversion wie folgt
656 <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
659 <sect3 id="Apache-Konfiguration.FCGI.Konfiguration">
660 <title>Konfiguration des Webservers</title>
662 <para>Bevor Sie versuchen, eine Lx-Office Installation unter FCGI
663 laufen zu lassen, empfliehlt es sich die Installation ersteinmal
664 unter CGI aufzusetzen. FCGI macht es nicht einfach Fehler zu
665 debuggen die beim ersten aufsetzen auftreten können. Sollte die
666 Installation schon funktionieren, lesen Sie weiter.</para>
668 <para>Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann
669 unter Debian/Ubuntu z.B. mit folgendem Befehl geschehen:</para>
671 <programlisting>a2enmod fcgid</programlisting>
673 <para>Die Konfiguration für die Verwendung von Lx-Office mit FastCGI
674 erfolgt durch Anpassung der vorhandenen <function>Alias</function>-
675 und <function>Directory</function>-Direktiven. Dabei wird zwischen
676 dem Installationspfad von Lx-Office im Dateisystem
677 ("<filename>/path/to/lx-office-erp</filename>") und der URL
678 unterschieden, unter der Lx-Office im Webbrowser erreichbar ist
679 ("<filename>/web/path/to/lx-office-erp</filename>").</para>
681 <para>Folgender Konfigurationsschnipsel funktioniert mit
684 <programlisting>AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
685 Alias /web/path/to/lx-office-erp/ /path/to/lx-office-erp/
687 <Directory /path/to/lx-office-erp>
689 Options ExecCGI Includes FollowSymlinks
694 <DirectoryMatch /path/to/lx-office-erp/users>
697 </DirectoryMatch></programlisting>
699 <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
700 die maximale Größe eines Requests. Diese sollte wie folgt
701 hochgesetzt werden:</para>
703 <programlisting>FcgidMaxRequestLen 10485760</programlisting>
705 <para>Das ganze sollte dann so aussehen:</para>
707 <programlisting>AddHandler fcgid-script .fpl
708 AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
709 Alias /web/path/to/lx-office-erp/ /path/to/lx-office-erp/
710 FcgidMaxRequestLen 10485760
712 <Directory /path/to/lx-office-erp>
714 Options ExecCGI Includes FollowSymlinks
719 <DirectoryMatch /path/to/lx-office-erp/users>
722 </DirectoryMatch></programlisting>
724 <para>Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle
725 Zugriffe auf die einzelnen Scripte werden auf diesen umgeleitet.
726 Dadurch, dass zur Laufzeit öfter mal Scripte neu geladen werden,
727 gibt es hier kleine Performance-Einbußen.</para>
729 <para>Es ist möglich, die gleiche Lx-Office Version parallel unter
730 CGI und FastCGI zu betreiben. Dafür bleiben die Directorydirektiven
731 wie oben beschrieben, die URLs werden aber umgeleitet:</para>
733 <programlisting># Zugriff über CGI
734 Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
736 # Zugriff mit mod_fcgid:
737 AliasMatch ^/web/path/to/lx-office-erp-fcgid/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
738 Alias /web/path/to/lx-office-erp-fcgid/ /path/to/lx-office-erp/</programlisting>
741 <filename>/web/path/to/lx-office-erp/</filename> die normale Version
742 erreichbar, und unter
743 <constant>/web/path/to/lx-office-erp-fcgid/</constant> die
744 FastCGI-Version.</para>
749 <sect1 id="config.task-server">
750 <title>Der Task-Server</title>
752 <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
753 regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
754 festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
755 wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
756 benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
759 <sect2 id="Konfiguration-des-Task-Servers">
760 <title>Verfügbare und notwendige Konfigurationsoptionen</title>
762 <para>Die Konfiguration erfolgt über den Abschnitt
763 <literal>[task_server]</literal> in der Datei
764 <filename>config/lx_office.conf</filename>. Die dort verfügbaren
765 Optionen sind:</para>
769 <para><literal>login</literal>: gültiger Lx-Office-Benutzername,
770 der benutzt wird, um die zu verwendende Datenbankverbindung
771 auszulesen. Der Benutzer muss in der Administration angelegt
772 werden. Diese Option muss angegeben werden.</para>
776 <para><literal>run_as</literal>: Wird der Server vom
777 Systembenutzer <literal>root</literal> gestartet, so wechselt er
778 auf den mit <literal>run_as</literal> angegebenen Systembenutzer.
779 Der Systembenutzer muss dieselben Lese- und Schreibrechte haben,
780 wie auch der Webserverbenutzer (siehe see <xref
781 linkend="Manuelle-Installation-des-Programmpaketes"/>). Daher ist
782 es sinnvoll, hier denselben Systembenutzer einzutragen, unter dem
783 auch der Webserver läuft.</para>
787 <para><literal>debug</literal>: Schaltet Debug-Informationen an
793 <sect2 id="Einbinden-in-den-Boot-Prozess">
794 <title>Automatisches Starten des Task-Servers beim Booten</title>
796 <para>Der Task-Server verhält sich von seinen Optionen her wie ein
797 reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim
798 Starten automatisch in das Lx-Office-Installationsverzeichnis.</para>
800 <para>Deshalb ist es möglich, ihn durch Setzen eines symbolischen
801 Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
802 einzubinden. Da das bei neueren Linux-Distributionen aber nicht
803 zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
804 anstelle eines symbolischen Links verwendet werden können.</para>
807 <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
810 <para>Kopieren Sie die Datei
811 <filename>scripts/boot/system-v/lx-office-task-server</filename>
812 nach <filename>/etc/init.d/lx-office-task-server</filename>. Passen
813 Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
814 <literal>DAEMON=....</literal>). Binden Sie das Script in den
815 Boot-Prozess ein. Dies ist distributionsabhängig:</para>
819 <para>Debian-basierende Systeme:</para>
821 <para><literal>update-rc.d lx-office-task-server defaults # Nur
822 bei Debian Squeeze und neuer: insserv
823 lx-office-task-server</literal></para>
827 <para>OpenSuSE und Fedora Core:</para>
829 <para><literal>chkconfig --add
830 lx-office-task-server</literal></para>
834 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
835 werden: <literal>/etc/init.d/lx-office-task-server
836 start</literal></para>
840 <title>Upstart-basierende Systeme (z.B. Ubuntu)</title>
842 <para>Kopieren Sie die Datei
843 <filename>scripts/boot/upstart/lx-office-task-server.conf</filename>
844 nach <filename>/etc/init/lx-office-task-server.conf</filename>.
845 Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
846 <literal>exec ....</literal>).</para>
848 <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
849 werden: <literal>service lx-office-task-server
850 start</literal></para>
854 <sect2 id="Prozesskontrolle">
855 <title>Wie der Task-Server gestartet und beendet wird</title>
857 <para>Der Task-Server wird wie folgt kontrolliert:</para>
859 <para><literal>./scripts/task_server.pl Befehl</literal></para>
861 <para><literal>Befehl</literal> ist dabei eine der folgenden
866 <para><literal>start</literal> startet eine neue Instanz des
867 Task-Servers. Die Prozess-ID wird innerhalb des
868 <filename>users</filename>-Verzeichnisses abgelegt.</para>
872 <para><literal>stop</literal> beendet einen laufenden
877 <para><literal>restart</literal> beendet und startet ihn
882 <para><literal>status</literal> berichtet, ob der Task-Server
887 <para>Der Task-Server wechselt beim Starten automatisch in das
888 Lx-Office-Installationsverzeichnis.</para>
890 <para>Dieselben Optionen können auch für die SystemV-basierenden
891 Runlevel-Scripte benutzt werden (siehe oben).</para>
897 <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
898 <title>Benutzerauthentifizierung und Administratorpasswort</title>
900 <para>Informationen über die Einrichtung der Benutzerauthentifizierung,
901 über die Verwaltung von Gruppen und weitere Einstellungen</para>
905 <sect2 id="Grundlagen-zur-Benutzerauthentifizierung">
906 <title>Grundlagen zur Benutzerauthentifizierung</title>
908 <para>Lx-Office verwaltet die Benutzerinformationen in einer
909 Datenbank, die im folgenden “Authentifizierungsdatenbank” genannt
910 wird. Für jeden Benutzer kann dort eine eigene Datenbank für die
911 eigentlichen Finanzdaten hinterlegt sein. Diese beiden Datenbanken
912 können, müssen aber nicht unterschiedlich sein.</para>
914 <para>Im einfachsten Fall gibt es für Lx-Office nur eine einzige
915 Datenbank, in der sowohl die Benutzerinformationen als auch die Daten
916 abgelegt werden.</para>
918 <para>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
919 entweder gegen die Authentifizierungsdatenbank oder gegen einen
920 LDAP-Server überprüft werden.</para>
922 <para>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
923 Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
924 Konfigurationsdatei <filename>config/lx_office.conf</filename>
925 festgelegt. Diese muss bei der Installation und bei einem Upgrade von
926 einer Version vor v2.6.0 angelegt werden. Eine
927 Beispielkonfigurationsdatei
928 <filename>config/lx_office.conf.default</filename> existiert, die als
929 Vorlage benutzt werden kann.</para>
932 <sect2 id="Administratorpasswort">
933 <title>Administratorpasswort</title>
935 <para>Das Passwort, das zum Zugriff auf das Aministrationsinterface
936 benutzt wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch
937 nur dort und nicht mehr im Administrationsinterface selber geändert
938 werden. Der Parameter dazu heißt
939 <literal>$self->{admin_password}</literal>.</para>
942 <sect2 id="Authentifizierungsdatenbank">
943 <title>Authentifizierungsdatenbank</title>
945 <para>Die Verbindung zur Authentifizierungsdatenbank wird mit den
946 Parametern in <literal>$self->{DB_config}</literal> konfiguriert.
947 Hier sind die folgenden Parameter anzugeben:</para>
951 <para>‘<literal>host</literal>’ – Der Rechnername oder die
952 IP-Adresse des Datenbankservers</para>
956 <para>‘<literal>port</literal>’ – Die Portnummer des
957 Datenbankservers, meist 5432</para>
961 <para>‘<literal>db</literal>’ – Der Name der
962 Authentifizierungsdatenbank</para>
966 <para>‘<literal>user</literal>’ – Der Benutzername, mit dem sich
967 Lx-Office beim Datenbankserver anmeldet (z.B. “postgres”)</para>
971 <para>‘<literal>password</literal>’ – Das Passwort für den
972 Datenbankbenutzer</para>
976 <para>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
977 automatisch anlegen (mehr dazu siehe unten).</para>
980 <sect2 id="Passwortüberprüfung">
981 <title>Passwortüberprüfung</title>
983 <para>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen
984 die Authentifizierungsdatenbank und gegen einen externen LDAP- oder
985 Active-Directory-Server. Welche davon benutzt wird, regelt der
986 Parameter <literal>$self->{module}</literal>.</para>
988 <para>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
989 gespeichert werden, so muss der Parameter
990 <literal>$self->{module}</literal> den Wert ‘<literal>DB</literal>’
991 enthalten. In diesem Fall können sowohl der Administrator als auch die
992 Benutzer selber ihre Psaswörter in Lx-Office ändern.</para>
994 <para>Soll hingegen ein externer LDAP- oder Active-Directory-Server
995 benutzt werden, so muss der Parameter
996 <literal>$self->{module}</literal> auf ‘<literal>LDAP</literal>’
997 gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
998 den LDAP-Server in <literal>$self->{LDAP_config}</literal>
999 angegeben werden:</para>
1003 <para>‘<literal>host</literal>’ – Der Rechnername oder die
1004 IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe
1005 ist zwingend erforderlich.</para>
1009 <para>‘<literal>port</literal>’ – Die Portnummer des LDAP-Servers;
1014 <para>‘<literal>tls</literal>’ – Wenn Verbindungsverschlüsselung
1015 gewünscht ist, so diesen Wert auf ‘<literal>1</literal>’ setzen,
1016 andernfalls auf ‘<literal>0</literal>’ belassen</para>
1020 <para>‘<literal>attribute</literal>’ – Das LDAP-Attribut, in dem
1021 der Benutzername steht, den der Benutzer eingegeben hat. Für
1022 Active-Directory-Server ist dies meist
1023 ‘<literal>sAMAccountName</literal>’, für andere LDAP-Server
1024 hingegen ‘<literal>uid</literal>’. Diese Angabe ist zwingend
1025 erforderlich.</para>
1029 <para>‘<literal>base_dn</literal>’ – Der Abschnitt des
1030 LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend
1031 erforderlich.</para>
1035 <para>‘<literal>filter</literal>’ – Ein optionaler LDAP-Filter.
1036 Enthält dieser Filter das Wort <literal><%login%></literal>,
1037 so wird dieses durch den vom Benutzer eingegebenen Benutzernamen
1038 ersetzt. Andernfalls wird der LDAP-Baum nach einem Element
1039 durchsucht, bei dem das oben angegebene Attribut mit dem
1040 Benutzernamen identisch ist.</para>
1044 <para>‘<literal>bind_dn</literal>’ und
1045 ‘<literal>bind_password</literal>’ – Wenn der LDAP-Server eine
1046 Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist
1047 dies bei Active-Directory-Servern der Fall), so kann diese hier
1048 angegeben werden. Für Active-Directory-Server kann als
1049 ‘<literal>bind_dn</literal>’ entweder eine komplette LDAP-DN wie
1050 z.B. ‘<literal>cn=Martin
1051 Mustermann,cn=Users,dc=firmendomain</literal>’ auch nur der volle
1052 Name des Benutzers eingegeben werden; in diesem Beispiel also
1053 ‘<literal>Martin Mustermann</literal>’.</para>
1058 <sect2 id="Name-des-Session-Cookies">
1059 <title>Name des Session-Cookies</title>
1061 <para>Sollen auf einem Server mehrere Lx-Office-Installationen
1062 aufgesetzt werden, so müssen die Namen der Session-Cookies für alle
1063 Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
1064 Parameter <literal>$self->{cookie_name}</literal> gesetzt.</para>
1066 <para>Diese Angabe ist optional, wenn nur eine Installation auf dem
1067 Server existiert.</para>
1070 <sect2 id="Anlegen-der-Authentifizierungsdatenbank">
1071 <title>Anlegen der Authentifizierungsdatenbank</title>
1073 <para>Nachdem alle Einstellungen in
1074 <filename>config/lx_office.conf</filename> vorgenommen wurden, muss
1075 Lx-Office die Authentifizierungsdatenbank anlegen. Dieses geschieht
1076 automatisch, wenn Sie sich im Administrationsmodul anmelden, das unter
1077 der folgenden URL erreichbar sein sollte:</para>
1080 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1086 <sect1 id="Benutzer--und-Gruppenverwaltung">
1087 <title>Benutzer- und Gruppenverwaltung</title>
1089 <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
1090 angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
1091 folgender URL finden:</para>
1094 url="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</ulink></para>
1096 <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
1097 <filename>config/lx_office.conf</filename> eingetragen haben.</para>
1099 <sect2 id="Zusammenhänge">
1100 <title>Zusammenhänge</title>
1102 <para>Lx-Office verwendet eine Datenbank zum Speichern all seiner
1103 Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
1104 mit Lx-Office arbeiten zu können, muss eine Person einen
1105 Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
1106 Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
1107 möglich und normal, dass mehreren Benutzern die selbe Datenbank
1108 zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
1111 <para>Die Basisdaten der Benutzer, die in der Administration
1112 eingegeben werden können, werden in einer zweiten Datenbank
1113 gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
1114 ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
1115 Pro Lx-Office-Installation gibt es nur eine
1116 Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
1119 <para>Lx-Office kann seinen Benutzern Zugriff auf bestimmte
1120 Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
1121 gestattet, so werden der entsprechenden Menüpunkte auch nicht
1122 angezeigt. Diese Rechte werden ebenfalls in der
1123 Authentifizierungsdatenbank gespeichert.</para>
1125 <para>Um Rechte verteilen zu können, verwendet Lx-Office ein
1126 Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
1127 erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
1128 mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
1129 Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
1130 Benutzer Mitglied ist.</para>
1132 <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
1133 Benutzer angelegt werden sollten, lautet:</para>
1135 <orderedlist numeration="arabic">
1137 <para>Datenbank anlegen</para>
1141 <para>Gruppen anlegen</para>
1145 <para>Benutzer anlegen</para>
1149 <para>Benutzer den Gruppen zuordnen</para>
1154 <sect2 id="Datenbanken-anlegen">
1155 <title>Datenbanken anlegen</title>
1157 <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
1158 den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
1159 Beispielen ist dies ‘<literal>lxoffice</literal>’).</para>
1161 <para>Wenn Sie für die Lx-Office-Installation nicht den europäischen
1162 Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
1163 müssen Sie vor dem Anlegen der Datenbank in der Datei
1164 <filename>config/lx_office.conf</filename> die Variable
1165 <literal>dbcharset</literal> im Abschnitt <literal>system</literal>
1166 auf den Wert ‘<literal>UTF-8</literal>’ setzen. Zusätzlich muss beim
1167 Anlegen der Datenbank ‘<literal>UTF-8 Unicode</literal>’ als
1168 Schriftsatz ausgewählt werden.</para>
1170 <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
1171 verwenden müssen, da diese Einstellungen momentan global in Lx-Office
1172 vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
1173 Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
1174 angelegt worden sein.</para>
1177 <sect2 id="Gruppen-anlegen">
1178 <title>Gruppen anlegen</title>
1180 <para>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
1181 Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
1182 Anlegen können Sie die verschiedenen Bereiche wählen, auf die
1183 Mitglieder dieser Gruppe Zugriff haben sollen.</para>
1185 <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
1186 Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
1187 Datenbanken, die in dieser Installation verwaltet werden.</para>
1190 <sect2 id="Benutzer-anlegen">
1191 <title>Benutzer anlegen</title>
1193 <para>Beim Anlegen von Benutzern werden für viele Parameter
1194 Standardeinstellungen vorgenommen, die den Gepflogenheiten des
1195 deutschen Raumes entsprechen.</para>
1197 <para>Zwingend anzugeben sind der Loginname sowie die komplette
1198 Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
1199 Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
1200 gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
1201 aktiv, so ist das Passwort-Feld deaktiviert.</para>
1203 <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
1204 eben angelegten Datenbanken eingetragen werden.</para>
1207 <sect2 id="Gruppenmitgliedschaften-verwalten">
1208 <title>Gruppenmitgliedschaften verwalten</title>
1210 <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
1211 Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
1213 <orderedlist numeration="arabic">
1215 <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
1216 folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
1221 <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
1222 der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
1223 alle im System angelegten Gruppen und Benutzer enthält. Durch
1224 Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
1225 Gruppe in der ausgewählten Spalte hinzugefügt.</para>
1230 <sect2 id="Migration-alter-Installationen">
1231 <title>Migration alter Installationen</title>
1233 <para>Wenn Lx-Office 2.6.2 über eine ältere Version installiert wird,
1234 in der die Benutzerdaten noch im Dateisystem im Verzeichnis
1235 <literal>users</literal> verwaltet wurden, so bietet Lx-Office die
1236 Möglichkeit, diese Benutzerdaten automatisch in die
1237 Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
1238 sich nach dem Update der Installation das erste Mal im
1239 Administrationsbereich anmeldet. Findet Lx-Office die Datei
1240 <literal>users/members</literal>, so wird der Migrationsprozess
1243 <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
1244 Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
1245 Lx-Office noch die Möglichkeit an, dass automatisch eine
1246 Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
1247 Funktionen von Lx-Office gewährt. Alle migrierten Benutzern werden
1248 Mitglied in dieser Gruppe. Damit wird das Verhalten von Lx-Office bis
1249 Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
1250 sich sofort wieder anmelden und mit dem System arbeiten.</para>
1256 <sect1 id="Drucken-mit-Lx-Office">
1257 <title>Drucken mit Lx-Office</title>
1259 <para>Das Drucksystem von Lx-Office benutzt von Haus aus LaTeX Vorlagen.
1260 Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
1261 einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
1262 Debianoiden Betriebssystemen sind das die Pakete:</para>
1264 <para><literal>texlive-latex-base texlive-latex-extra
1265 texlive-fonts-recommended</literal></para>
1267 <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
1268 von den Standardvorlagen verwendet werden.</para>
1270 <para>TODO: rpm Pakete.</para>
1272 <para>In den allermeisten Installationen sollte drucken jetzt schon
1273 funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
1274 Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
1275 die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
1280 <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
1281 LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
1282 Vorlagen aus der Community auf. Installieren Sie die entsprechenden
1287 <para>! Package inputenc Error: Unicode char \u8:æ¡
\9c not set up for
1288 use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
1289 einer Standardinstallation exotische utf8 Zeichen zu drucken.
1290 TeXLive unterstützt von Haus nur romanische Schriften und muss mit
1291 diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
1292 Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
1296 <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
1297 heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
1298 Prüfen Sie den Namen in der Konfiguration (Standard:
1299 <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
1300 (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
1306 <sect1 id="OpenDocument-Vorlagen">
1307 <title>OpenDocument-Vorlagen</title>
1309 <para>Lx-Office unterstützt die Verwendung von Vorlagen im
1310 OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
1311 Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
1312 diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
1313 OpenDocument-Vorlagen zu aktivieren muss in der Datei
1314 <filename>config/lx_office.conf</filename> die Variable
1315 <literal>opendocument</literal> im Abschnitt
1316 <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
1317 Dieses ist die Standardeinstellung.</para>
1319 <para>Weiterhin muss in der Datei
1320 <filename>config/lx_office.conf</filename> die Variable
1321 <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
1322 die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
1323 Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
1326 <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
1327 weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
1328 OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
1329 neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
1330 (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
1331 Andere Distributionen enthalten ihn in anderen Paketen.</para>
1333 <para>Nach der Installation müssen in der Datei
1334 <filename>config/lx_config.conf</filename> zwei weitere Variablen
1335 angepasst werden: <literal>openofficeorg_writer</literal> muss den
1336 vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
1337 <literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
1338 enthalten. Beide stehen im Abschnitt
1339 <literal>applications</literal>.</para>
1341 <para>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
1342 OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
1343 Variable <literal>$openofficeorg_daemon</literal> gesetzt ist, startet
1344 ein OpenOffice, das auch nach der Umwandlung des Dokumentes gestartet
1345 bleibt. Bei weiteren Umwandlungen wird dann diese laufende Instanz
1346 benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung deutlich
1347 reduziert wird, weil nicht für jedes Dokument ein OpenOffice gestartet
1348 werden muss. Der Nachteil ist, dass diese Methode Python und die
1349 Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
1352 <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
1353 wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
1354 mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
1355 Dokumentenvorlage enthalten sein und
1356 “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
1357 ‘<literal>templates/mastertemplates/German/invoice.odt</literal>’
1358 enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
1359 ebenfalls enthalten sein muss.</para>
1361 <para>Als letztes muss herausgefunden werden, welchen Namen
1362 OpenOffice.org Writer dem Verzeichnis mit den Benutzereinstellungen
1363 gibt. Unter Debian ist dies momentan
1364 <literal>~/.openoffice.org2</literal>. Sollte der Name bei Ihrer
1365 OpenOffice.org-Installation anders sein, so muss das Verzeichnis
1366 <literal>users/.openoffice.org2</literal> entsprechend umbenannt werden.
1367 Ist der Name z.B. einfach nur <literal>.openoffice</literal>, so wäre
1368 folgender Befehl auszuführen:</para>
1370 <para><literal>mv users/.openoffice.org2
1371 users/.openoffice</literal></para>
1373 <para>Dieses Verzeichnis, wie auch das komplette
1374 <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
1375 sein. Dieses wurde bereits erledigt (siehe <xref
1376 linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber erneut
1377 überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</para>
1382 <sect1 id="Lx-Office-ERP-verwenden">
1383 <title>Lx-Office ERP verwenden</title>
1385 <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
1386 folgender URL erreichbar:</para>
1389 url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
1391 <para>Die Administrationsseite erreichen Sie unter:</para>
1394 url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
1398 <chapter id="features" xreflabel="Features und Funktionen">
1399 <title>Features und Funktionen</title>
1401 <sect1 id="features.periodic-invoices" xreflabel="Wiedekehrende Rechnungen">
1402 <title>Wiederkehrende Rechnungen</title>
1404 <sect2 id="features.periodic-invoices.introduction" xreflabel="Einführung in wiederkehrende Rechnungen">
1405 <title>Einführung</title>
1408 Wiederkehrende Rechnungen werden als normale Aufträge definiert und konfiguriert, mit allen dazugehörigen Kunden- und
1409 Artikelangaben. Die konfigurierten Aufträge werden später automatisch in Rechnungen umgewandelt, so als ob man den Workflow benutzen
1410 würde, und auch die Auftragsnummer wird übernommen, sodass alle wiederkehrenden Rechnungen, die aus einem Auftrag erstellt wurden,
1411 später leicht wiederzufinden sind.
1416 <sect2 id="features.periodic-invoices.configuration" xreflabel="Konfiguration von wiederkehrenden Rechnungen">
1417 <title>Konfiguration</title>
1420 Um einen Auftrag für wiederkehrende Rechnung zu konfigurieren, findet sich beim Bearbeiten des Auftrags ein neuer Knopf
1421 "Konfigurieren", der ein neues Fenster öffnet, in dem man die nötigen Parameter einstellen kann. Hinter dem Knopf wird außerdem noch
1422 angezeigt, ob der Auftrag als wiederkehrende Rechnung konfiguriert ist oder nicht.
1426 Folgende Parameter kann man konfigurieren:
1434 Bei aktiven Rechnungen wird automatisch eine Rechnung erstellt, wenn die Periodizität erreicht ist (z.B. Anfang eines neuen
1439 Ist ein Auftrag nicht aktiv, so werden für ihn auch keine wiederkehrenden Rechnungen erzeugt. Stellt man nach längerer
1440 nicht-aktiver Zeit einen Auftrag wieder auf aktiv, wird beim nächsten Periodenwechsel für alle Perioden, seit der letzten aktiven
1441 Periode, jeweils eine Rechnung erstellt. Möchte man dies verhindern, muss man vorher das Startdatum neu setzen.
1445 Für gekündigte Aufträge werden nie mehr Rechnungen erstellt. Man kann sich diese Aufträge aber gesondert in den Berichten anzeigen
1452 <term>Periodizität</term>
1455 Ob monatlich, quartalsweise oder jährlich auf neue Rechnungen überprüft werden soll. Für jede Periode seit dem Startdatum wird
1456 überprüft, ob für die Periode (beginnend immer mit dem ersten Tag der Periode) schon eine Rechnung erstellt wurde. Unter Umständen
1457 können bei einem Startdatum in der Vergangenheit gleich mehrere Rechnungen erstellt werden.
1463 <term>Buchen auf</term>
1466 Das Forderungskonto, in der Regel "Forderungen aus Lieferungen und Leistungen". Das Gegenkonto ergibt sich aus den Buchungsgruppen
1467 der betreffenden Waren.
1473 <term>Startdatum</term>
1476 ab welchem Datum auf Rechnungserstellung geprüft werden soll
1482 <term>Enddatum</term>
1485 ab wann keine Rechnungen mehr erstellt werden sollen
1491 <term>Automatische Verlängerung um x Monate</term>
1494 Sollen die wiederkehrenden Rechnungen bei Erreichen des eingetragenen Enddatums weiterhin erstellt werden, so kann man hier die
1495 Anzahl der Monate eingeben, um die das Enddatum automatisch nach hinten geschoben wird.
1501 <term>Drucken</term>
1504 Sind Drucker konfiguriert, so kann man sich die erstellten Rechnungen auch gleich ausdrucken lassen.
1511 Nach Erstellung der Rechnungen kann eine E-Mail mit Informationen zu den erstellten Rechnungen verschickt werden. Konfiguriert wird
1512 dies in der <link linkend="config.config-file.sections-parameters">Konfigurationsdatei</link>
1513 <filename>config/lx_office.conf</filename> im Abschnitt <varname>[periodic_invoices]</varname>.
1517 <sect2 id="features.periodic-invoices.reports">
1518 <title>Auflisten</title>
1521 Unter Verkauf->Berichte->Aufträge finden sich zwei neue Checkboxen, "Wiederkehrende Rechnungen aktiv" und
1522 "Wiederkehrende Rechnungen inaktiv", mit denen man sich einen Überglick über die wiederkehrenden Rechnungen verschaffen
1527 <sect2 id="features.periodic-invoices.task-server">
1528 <title>Erzeugung der eigentlichen Rechnungen</title>
1531 Die zeitliche und periodische Überprüfung, ob eine wiederkehrende Rechnung automatisch erstellt werden soll, geschieht durch den
1532 <link linkend="config.task-server">Taskserver</link>, einen externen Dienst, der automatisch beim Start des Servers gestartet
1537 <sect2 id="features.periodic-invoices.create-for-current-month">
1538 <title>Erste Rechnung für aktuellen Monat erstellen</title>
1541 Will man im laufenden Monat eine monatlich wiederkehrende Rechnung inkl. des laufenden Monats starten, stellt man das Startdatum auf
1542 den Monatsanfang und wartet ein paar Minuten, bis der Taskserver den neu konfigurieren Auftrag erkennt und daraus eine Rechnung
1543 generiert hat. Alternativ setzt man das Startdatum auf den Monatsersten des Folgemonats und erstellt die erste Rechnung direkt
1544 manuell über den Workflow.
1551 <title>Entwicklerdokumentation</title>
1553 <sect1 id="devel.globals" xreflabel="Globale Variablen">
1554 <title>Globale Variablen</title>
1557 <title>Wie sehen globale Variablen in Perl aus?</title>
1559 <para>Globale Variablen liegen in einem speziellen namespace namens
1560 "main", der von überall erreichbar ist. Darüber hinaus sind bareword
1561 globs global und die meisten speziellen Variablen sind...
1564 <para>Daraus ergeben sich folgende Formen:</para>
1568 <term>$main::form</term>
1571 <para>expliziter Namespace "main"</para>
1576 <term>$::form</term>
1579 <para>impliziter Namespace "main"</para>
1584 <term>open FILE, "file.txt"</term>
1587 <para><varname>FILE</varname> ist global</para>
1595 <para>speziell</para>
1600 <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
1601 Schlüsselwort wie "<function>global</function>", mit dem man
1602 importieren kann. <function>my</function>, <function>our</function>
1603 und <function>local</function> machen was anderes.</para>
1607 <term>my $form</term>
1610 <para>lexikalische Variable, gültig bis zum Ende des
1616 <term>our $form</term>
1619 <para><varname>$form</varname> referenziert ab hier
1620 <varname>$PACKAGE::form</varname>.</para>
1625 <term>local $form</term>
1628 <para>Alle Änderungen an <varname>$form</varname> werden am Ende
1629 des scopes zurückgesetzt</para>
1636 <title>Warum sind globale Variablen ein Problem?</title>
1638 <para>Das erste Problem ist <productname>FCGI</productname>.</para>
1640 <para><productname>SQL-Ledger</productname> hat fast alles im globalen
1641 namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
1642 Unter <productname>FCGI</productname> müssen diese Sachen auch wieder
1643 aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
1644 Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
1645 Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren
1648 <para>Das zweite Problem ist <function>strict</function>. Unter
1649 <function>strict</function> werden alle Variablen die nicht explizit
1650 mit <function>Package</function>, <function>my</function> oder
1651 <function>our</function> angegeben werden als Tippfehler angemarkert,
1652 was einen vor so mancher Stunde suchen nach einem Bug erspart. Da
1653 globale Variablen aber implizit mit Package angegeben werden, werden
1654 die nicht geprüft, und ein Tippfehler da fällt niemandem auf.</para>
1658 <title>Kanonische globale Variablen</title>
1660 <para>Um dieses Problem im Griff zu halten gibt es einige wenige
1661 globale Variablen, die kanonisch sind, und alles andere sollte
1662 anderweitig umhergereicht werden.</para>
1664 <para>Diese Variablen sind im Moment die folgenden neun:</para>
1668 <para><varname>$::form</varname></para>
1672 <para><varname>%::myconfig</varname></para>
1676 <para><varname>$::locale</varname></para>
1680 <para><varname>$::lxdebug</varname></para>
1684 <para><varname>$::auth</varname></para>
1688 <para><varname>$::lx_office_conf</varname></para>
1692 <para><varname>$::instance_conf</varname></para>
1696 <para><varname>$::dispatcher</varname></para>
1700 <para><varname>$::request</varname></para>
1704 <para>Damit diese nicht als Müllhalde misbrauch werden, im Folgenden
1705 eine kurze Erläuterung was man von denn erwarten kann.</para>
1708 <title>$::form</title>
1712 <para>Ist ein Objekt der Klasse
1713 "<classname>Form</classname>"</para>
1717 <para>Wird nach jedem Request gelöscht</para>
1721 <para>Muss auch in Tests und Konsolenscripts vorhanden
1726 <para>Enthält am Anfang eines Requests die Requestparameter vom
1731 <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
1732 cachen, das wird aber momentan absichtlich zerstört</para>
1736 <para><varname>$::form</varname> wurde unter <productname>SQL
1737 Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
1738 alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
1739 heißt, alles was einem lieb ist, sollte man vor einem Aufruf von zum
1740 Beispiel <function>IS->retrieve_customer()</function> in
1741 Sicherheit bringen.</para>
1743 <para>Das Objekt der Klasse Form hat leider im Moment noch viele
1744 zentrale Funktionen Gdie vom internen Zustand abhängen, deshalb
1745 bitte nie einfach zerstören oder überschreiben. Es geht ziemlich
1746 sicher etwas kaputt.</para>
1748 <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
1749 in den <productname>Template::Toolkit</productname> Templates
1750 außerhalb der Controller: der Ausdruck <function>[% var
1751 %]</function> greift auf <varname>$::form->{var}</varname> zu.
1752 Unter Controllern ist der Standard Scope anders, da lautet der
1753 Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
1754 normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
1755 <function><%var%></function> zeigt auf
1756 <varname>$::form->{var}</varname>. Innerhalb von Schleifen wird
1757 <varname>$::form->{TEMPLATE_ARRAYS}{var}[$index]</varname>
1758 bevorzugt, wenn vorhanden.</para>
1762 <title>%::myconfig</title>
1766 <para>Das einzige Hash unter den globalen Variablen</para>
1770 <para>Wird spätestens benötigt wenn auf die Datenbank
1771 zugegriffen wird</para>
1775 <para>Wird bei jedem Request neu erstellt.</para>
1779 <para>Enthält die Userdaten des aktuellen Logins</para>
1783 <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
1784 extern serialisiert werden, weil da auch der Datenbankzugriff
1785 für diesenuser drinsteht.</para>
1789 <para>Enthält unter anderem Listenbegrenzung vclimit,
1790 Datumsformat dateformat und Nummernformat numberformat</para>
1794 <para>Enthält Datenbankzugriffinformationen</para>
1798 <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
1799 ein Userobjekt. Die meisten Funktionen, die etwas anhand des
1800 aktuellen Users entscheiden müssen, befragen
1801 <varname>%::myconfig</varname>.</para>
1805 <title>$::locale</title>
1809 <para>Objekt der Klasse "Locale"</para>
1813 <para>Wird pro Request erstellt</para>
1817 <para>Muss auch für Tests und Scripte immer verfügbar
1822 <para>Cached intern über Requestgrenzen hinweg benutzte
1827 <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
1828 Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
1832 <title>$::lxdebug</title>
1836 <para>Objekt der Klasse "LXDebug"</para>
1840 <para>Wird global gecached</para>
1844 <para>Muss immer verfügbar sein, in nahezu allen
1849 <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
1850 bereit, wie "<function>enter_sub</function>" und
1851 "<function>leave_sub</function>", mit denen in den alten Modulen ein
1852 brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
1853 der man die Wallclockzeit seit Requeststart loggen kann, sowie
1854 "<function>message</function>" und "<function>dump</function>" mit
1855 denen man flott Informationen ins Log packen kann.</para>
1859 <title>$::auth</title>
1863 <para>Objekt der Klasse "SL::Auth"</para>
1867 <para>Wird global gecached</para>
1871 <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
1875 <para>Wird nach jedem Request resettet.</para>
1879 <para><varname>$::auth</varname> stellt Funktionen bereit um die
1880 Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
1881 vom aktuellen User abhängen wird das Objekt aus
1882 Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
1883 Request kurz resettet.</para>
1887 <title>$::lx_office_conf</title>
1891 <para>Objekt der Klasse
1892 "<classname>SL::LxOfficeConf</classname>"</para>
1896 <para>Global gecached</para>
1900 <para>Repräsentation der
1901 <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
1905 <para>Globale Konfiguration. Configdateien werden zum Start gelesen,
1906 und nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
1907 Programm die Konfiguration ändern kann oder sollte.</para>
1909 <para>Für die folgende Konfigurationsdatei:</para>
1911 <programlisting>[debug]
1912 file = /tmp/lxoffice_debug_log.txt</programlisting>
1914 <para>ist der Key <varname>file</varname> im Programm als
1915 <varname>$::lx_office_conf->{debug}{file}</varname>
1919 <para>Zugriff auf die Konfiguration erfolgt im Moment über
1920 Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
1925 <title>$::instance_conf</title>
1929 <para>Objekt der Klasse
1930 "<classname>SL::InstanceConfiguration</classname>"</para>
1934 <para>wird pro Request neu erstellt</para>
1938 <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
1939 speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
1940 ist hier eine Mandantendatenbank. Prominentestes Datum ist "eur",
1941 die Information ob Bilanz oder Einnahmenüberschussrechnung gemacht
1946 <title>$::dispatcher</title>
1950 <para>Objekt der Klasse
1951 "<varname>SL::Dispatcher</varname>"</para>
1955 <para>wird pro Serverprozess erstellt.</para>
1959 <para>enthält Informationen über die technische Verbindung zum
1964 <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
1965 global gespeichert wird. Wird vermutlich irgendwann in einem anderen
1966 Objekt untergebracht.</para>
1970 <title>$::request</title>
1974 <para>Hashref (evtl später Objekt)</para>
1978 <para>Wird pro Request neu initialisiert.</para>
1982 <para>Keine Unterstruktur garantiert.</para>
1986 <para><varname>$::request</varname> ist ein generischer Platz um
1987 Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
1988 at a distance benutzt werden, sondern um lokales memoizing zu
1989 ermöglichen, das garantiert am Ende des Requests zerstört
1992 <para>Vieles von dem, was im moment in <varname>$::form</varname>
1993 liegt, sollte eigentlich hier liegen. Die groben
1994 Differentialkriterien sind:</para>
1998 <para>Kommt es vom User, und soll unverändert wieder an den
1999 User? Dann $::form, steht da eh schon</para>
2003 <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des
2004 Requests gebraucht werden? Dann $::request</para>
2008 <para>Muss ich von anderen Teilen des Programms lesend drauf
2009 zugreifen? Dann $::request, aber Zugriff über
2010 Wrappermethode</para>
2017 <title>Ehemalige globale Variablen</title>
2019 <para>Die folgenden Variablen waren einmal im Programm, und wurden
2023 <title>$::cgi</title>
2027 <para>war nötig, weil cookie Methoden nicht als
2028 Klassenfunktionen funktionieren</para>
2032 <para>Aufruf als Klasse erzeugt Dummyobjekt was im
2033 Klassennamespace gehalten wird und über Requestgrenzen
2038 <para>liegt jetzt unter
2039 <varname>$::request->{cgi}</varname></para>
2045 <title>$::all_units</title>
2049 <para>war nötig, weil einige Funktionen in Schleifen zum Teil
2050 ein paar hundert mal pro Request eine Liste der Einheiten
2051 brauchen, und de als Parameter durch einen Riesenstack von
2052 Funktionen geschleift werden müssten.</para>
2056 <para>Liegt jetzt unter
2057 <varname>$::request->{cache}{all_units}</varname></para>
2062 <function>AM->retrieve_all_units()</function> gesetzt oder
2069 <title>%::called_subs</title>
2073 <para>wurde benutzt um callsub deep recursions
2078 <para>Wurde entfernt, weil callsub nur einen Bruchteil der
2079 möglichen Rekursioenen darstellt, und da nie welche
2084 <para>komplette recursion protection wurde entfernt.</para>
2091 <sect1 id="dokumentenvorlagen-und-variablen">
2092 <title>Dokumentenvorlagen und verfügbare Variablen</title>
2094 <sect2 id="dokumentenvorlagen-und-variablen.einführung">
2095 <title>Einführung</title>
2097 <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
2098 aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
2099 einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
2100 <function><%variablenname%></function> verwendet wird. Für
2101 LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
2103 linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
2105 <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
2106 unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
2107 ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
2108 alle Vorlagenarten.</para>
2110 <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
2111 verfügbar als hier aufgelistet werden. Die meisten davon können
2112 allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
2113 werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
2114 diese wie folgt erhalten werden:</para>
2118 <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
2119 Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
2123 <para>In <filename>Form.pm</filename> die Funktion
2124 <function>parse_template</function> suchen und hier die Zeile
2125 <command>print(STDERR Dumper($self));</command> einfügen.</para>
2129 <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
2130 ein PDF für eine Rechnung erzeugen.</para>
2134 <para>Im <filename>error.log</filename> Apache steht die Ausgabe
2135 der Variablen <varname>$self</varname> in der Form <varname>'key'
2136 => 'value',</varname>. Alle <varname>key</varname>s sind
2142 <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
2143 <title>Variablen ausgeben</title>
2145 <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
2146 Tags geschrieben werden, also z.B.
2147 <varname><%variablenname%></varname>.</para>
2149 <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
2150 die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
2151 <varname><%variablenname FLAG1 FLAG2%></varname>. Momentan
2152 werden die folgenden Flags unterstützt:</para>
2156 <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
2157 den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
2158 mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
2159 damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
2163 <para><parameter>NOESCAPE</parameter> unterdrückt das Escapen von
2164 Sonderzeichen für die Vorlagensprache. Wenn also in einer
2165 Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
2166 auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
2167 ist dieses Flag sinnvoll.</para>
2171 <para>Beispiel:</para>
2173 <programlisting><%quototal NOFORMAT%></programlisting>
2176 <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
2177 <title>Verwendung in Druckbefehlen</title>
2179 <para>In der Admininstration können Drucker definiert werden. Auch im
2180 dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
2181 und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
2182 den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
2183 <function>`...`</function> nicht zu unerwünschtem Verhalten
2186 <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
2187 für das die Telefonnummer eines Ansprechpartners als Teil der
2188 Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
2189 z.B. wie folgt aussehen:</para>
2191 <programlisting>send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></programlisting>
2194 <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
2195 xreflabel="Anfang und Ende der Tags verändern">
2196 <title>Anfang und Ende der Tags verändern</title>
2198 <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
2199 Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
2200 Prozentzeichen und dem Größerzeichen endet, beispielsweise
2201 <function><%customer%></function>. Da diese Form aber z.B. in
2202 LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
2203 Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
2204 Stil umgestellt werden.</para>
2206 <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
2207 Format gültigen Kommentarzeichen anfangen, dann
2208 <function>config:</function> enthalten, die entsprechende Option
2209 setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
2210 enden. Beispiel für LaTeX:</para>
2212 <programlisting>% config: tag-style=($ $)</programlisting>
2214 <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
2215 wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
2216 äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
2218 <programlisting><!-- config: tag-style=($ $) --></programlisting>
2221 <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
2222 <title>Zuordnung von den Dateinamen zu den Funktionen</title>
2224 <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
2225 welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
2226 "<filename>.ext</filename>" geeignet zu ersetzen:
2227 "<filename>.tex</filename>" für LaTeX-Vorlagen und
2228 "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
2232 <term><filename>bin_list.ext</filename></term>
2235 <para>Lagerliste</para>
2240 <term><filename>check.ext</filename></term>
2248 <term><filename>invoice.ext</filename></term>
2251 <para>Rechnung</para>
2256 <term><filename>packing_list.ext</filename></term>
2259 <para>Packliste</para>
2264 <term><filename>pick_list.ext</filename></term>
2267 <para>Sammelliste</para>
2272 <term><filename>purchase_delivery_order.ext</filename></term>
2275 <para>Lieferschein (Einkauf)</para>
2280 <term><filename>purcharse_order.ext</filename></term>
2283 <para>Bestellung an Lieferanten</para>
2288 <term><filename>request_quotation.ext</filename></term>
2291 <para>Anfrage an Lieferanten</para>
2296 <term><filename>sales_delivery_order.ext</filename></term>
2299 <para>Lieferschein (Verkauf)</para>
2304 <term><filename>sales_order.ext</filename></term>
2307 <para>Bestellung</para>
2312 <term><filename>sales_quotation.ext</filename></term>
2315 <para>Angebot an Kunden</para>
2320 <term><filename>zahlungserinnerung.ext</filename></term>
2323 <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
2328 <term><filename>zahlungserinnerung_invoice.ext</filename></term>
2331 <para>Rechnung über Mahngebühren (Dateiname im Programm
2332 konfigurierbar)</para>
2338 <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
2339 <title>Sprache, Drucker und E-Mail</title>
2341 <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
2342 eingearbeitet. So wird aus der Vorlage
2343 <filename>sales_order.ext</filename> bei Sprache
2344 <function>de</function> und Druckerkürzel <function>lpr2</function>
2345 der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
2346 Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
2347 bekommen dann noch das Kürzel <filename>_email</filename>, der
2348 vollständige Vorlagenname wäre dann
2349 <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
2350 kann eine Standarddatei <filename>default.ext</filename> hinterlegt
2351 werden. Diese wird verwendet, wenn keine der anderen Varianten
2352 gefunden wird.</para>
2354 <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
2355 der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
2356 verschickt wird, ist:</para>
2360 <para><filename>sales_order_email_de_lpr2.tex</filename></para>
2364 <para><filename>sales_order_de_lpr2.tex</filename></para>
2368 <para><filename>sales_order.tex</filename></para>
2372 <para><filename>default.tex</filename></para>
2376 <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
2377 Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
2379 linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"/>.</para>
2382 <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
2383 <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
2386 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
2387 xreflabel="Metainformationen zur angeforderten Vorlage">
2388 <title>Metainformationen zur angeforderten Vorlage</title>
2390 <para>Diese Variablen liefern Informationen darüber welche Variante
2391 einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
2392 Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
2393 Formulare einbinden möchten.</para>
2397 <term>template_meta.formname</term>
2400 <para>Basisname der Vorlage. Identisch mit der <link
2401 linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
2402 zu den Dateinamen</link> ohne die Erweiterung. Ein
2403 Verkaufsauftrag enthält hier
2404 <constant>sales_order</constant>.</para>
2409 <term>template_meta.language.description</term>
2412 <para>Beschreibung der verwendeten Sprache</para>
2417 <term>template_meta.language.template_code</term>
2420 <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
2421 Kürzel das im Dateinamen verwendetet wird.</para>
2426 <term>template_meta.language.output_numberformat</term>
2429 <para>Zahlenformat der verwendeten Sprache in der Form
2430 "<constant>1.000,00</constant>". Experimentell! Nur
2431 interessant für Vorlagen die mit unformatierten Werten
2437 <term>template_meta.language.output_dateformat</term>
2440 <para>Datumsformat der verwendeten Sprache in der Form
2441 "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
2442 interessant für Vorlagen die mit unformatierten Werten
2448 <term>template_meta.format</term>
2451 <para>Das angeforderte Format. Kann im Moment die Werte
2452 <constant>pdf</constant>, <constant>postscript</constant>,
2453 <constant>html</constant>, <constant>opendocument</constant>,
2454 <constant>opendocument_pdf</constant> und
2455 <constant>excel</constant> enthalten.</para>
2460 <term>template_meta.extension</term>
2463 <para>Dateierweiterung, wie im Dateinamen. Wird aus
2464 <constant>format</constant> entschieden.</para>
2469 <term>template_meta.media</term>
2472 <para>Ausgabemedium. Kann zur Zeit die Werte
2473 <constant>screen</constant> für Bildschirm,
2474 <constant>email</constant> für E-Mmail (triggert das
2475 <constant>_email</constant> Kürzel im Dateinamen),
2476 <constant>printer</constant> für Drucker, und
2477 <constant>queue</constant> für Warteschlange enthalten.</para>
2482 <term>template_meta.printer.description</term>
2485 <para>Beschreibung des ausgewählten Druckers</para>
2490 <term>template_meta.printer.template_code</term>
2493 <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
2494 dem Kürzel das im Dateinamen verwendetet wird.</para>
2500 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
2501 <title>Stammdaten von Kunden und Lieferanten</title>
2505 <term>account_number</term>
2508 <para>Kontonummer</para>
2516 <para>Name der Bank</para>
2521 <term>bank_code</term>
2524 <para>Bankleitzahl</para>
2532 <para>Bank-Identifikations-Code (Bank Identifier Code,
2538 <term>business</term>
2541 <para>Kunden-/Lieferantentyp</para>
2554 <term>contact</term>
2557 <para>Kontakt</para>
2562 <term>country</term>
2570 <term>cp_email</term>
2573 <para>Email des Ansprechpartners</para>
2578 <term>cp_givenname</term>
2581 <para>Vorname des Ansprechpartners</para>
2586 <term>cp_greeting</term>
2589 <para>Anrede des Ansprechpartners</para>
2594 <term>cp_name</term>
2597 <para>Name des Ansprechpartners</para>
2602 <term>cp_phone1</term>
2605 <para>Telefonnummer 1 des Ansprechpartners</para>
2610 <term>cp_phone2</term>
2613 <para>Telefonnummer 2 des Ansprechpartners</para>
2618 <term>cp_title</term>
2621 <para>Titel des Ansprechpartners</para>
2626 <term>creditlimit</term>
2629 <para>Kreditlimit</para>
2634 <term>customeremail</term>
2637 <para>Email des Kunden; nur für Kunden</para>
2642 <term>customerfax</term>
2645 <para>Faxnummer des Kunden; nur für Kunden</para>
2650 <term>customernotes</term>
2653 <para>Bemerkungen beim Kunden; nur für Kunden</para>
2658 <term>customernumber</term>
2661 <para>Kundennummer; nur für Kunden</para>
2666 <term>customerphone</term>
2669 <para>Telefonnummer des Kunden; nur für Kunden</para>
2674 <term>discount</term>
2685 <para>Emailadresse</para>
2693 <para>Faxnummer</para>
2698 <term>homepage</term>
2701 <para>Homepage</para>
2709 <para>Internationale Kontonummer (International Bank Account
2710 Number, IBAN)</para>
2715 <term>language</term>
2718 <para>Sprache</para>
2726 <para>Firmenname</para>
2731 <term>payment_description</term>
2734 <para>Name der Zahlart</para>
2739 <term>payment_terms</term>
2742 <para>Zahlungskonditionen</para>
2750 <para>Telefonnummer</para>
2755 <term>shiptocity</term>
2758 <para>Stadt (Lieferadresse) <link
2759 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2764 <term>shiptocontact</term>
2767 <para>Kontakt (Lieferadresse) <link
2768 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2773 <term>shiptocountry</term>
2776 <para>Land (Lieferadresse) <link
2777 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2782 <term>shiptodepartment1</term>
2785 <para>Abteilung 1 (Lieferadresse) <link
2786 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2791 <term>shiptodepartment2</term>
2794 <para>Abteilung 2 (Lieferadresse) <link
2795 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2800 <term>shiptoemail</term>
2803 <para>Email (Lieferadresse) <link
2804 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2809 <term>shiptofax</term>
2812 <para>Fax (Lieferadresse) <link
2813 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2818 <term>shiptoname</term>
2821 <para>Firmenname (Lieferadresse) <link
2822 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2827 <term>shiptophone</term>
2830 <para>Telefonnummer (Lieferadresse) <link
2831 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2836 <term>shiptostreet</term>
2839 <para>Straße und Hausnummer (Lieferadresse) <link
2840 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2845 <term>shiptozipcode</term>
2848 <para>Postleitzahl (Lieferadresse) <link
2849 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2857 <para>Straße und Hausnummer</para>
2862 <term>taxnumber</term>
2865 <para>Steuernummer</para>
2873 <para>Umsatzsteuer-Identifikationsnummer</para>
2878 <term>vendoremail</term>
2881 <para>Email des Lieferanten; nur für Lieferanten</para>
2886 <term>vendorfax</term>
2889 <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
2894 <term>vendornotes</term>
2897 <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
2902 <term>vendornumber</term>
2905 <para>Lieferantennummer; nur für Lieferanten</para>
2910 <term>vendorphone</term>
2913 <para>Telefonnummer des Lieferanten; nur für
2919 <term>zipcode</term>
2922 <para>Postleitzahl</para>
2927 <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
2928 <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
2929 Stammdaten nicht eingetragen, so haben die Variablen
2930 <varname>shipto*</varname> den gleichen Wert wie die die
2931 entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
2932 einige <varname>shipto*</varname>-Variablen so nicht in den
2933 Stammdaten wiederfinden sondern schlicht Kopien der
2934 Lieferdatenvariablen sind (z.B.
2935 <varname>shiptocontact</varname>).</para>
2939 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
2940 <title>Informationen über den Bearbeiter</title>
2944 <term>employee_address</term>
2947 <para>Adressfeld</para>
2952 <term>employee_businessnumber</term>
2955 <para>Firmennummer</para>
2960 <term>employee_company</term>
2963 <para>Firmenname</para>
2968 <term>employee_co_ustid</term>
2971 <para>Usatzsteuer-Identifikationsnummer</para>
2976 <term>employee_duns</term>
2979 <para>DUNS-Nummer</para>
2984 <term>employee_email</term>
2992 <term>employee_fax</term>
3000 <term>employee_name</term>
3003 <para>voller Name</para>
3008 <term>employee_signature</term>
3011 <para>Signatur</para>
3016 <term>employee_taxnumber</term>
3019 <para>Steuernummer</para>
3024 <term>employee_tel</term>
3027 <para>Telefonnummer</para>
3033 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
3034 <title>Informationen über den Bearbeiter</title>
3038 <term>salesman_address</term>
3041 <para>Adressfeld</para>
3046 <term>salesman_businessnumber</term>
3049 <para>Firmennummer</para>
3054 <term>salesman_company</term>
3057 <para>Firmenname</para>
3062 <term>salesman_co_ustid</term>
3065 <para>Usatzsteuer-Identifikationsnummer</para>
3070 <term>salesman_duns</term>
3073 <para>DUNS-Nummer</para>
3078 <term>salesman_email</term>
3086 <term>salesman_fax</term>
3094 <term>salesman_name</term>
3097 <para>voller Name</para>
3102 <term>salesman_signature</term>
3105 <para>Signatur</para>
3110 <term>salesman_taxnumber</term>
3113 <para>Steuernummer</para>
3118 <term>salesman_tel</term>
3121 <para>Telefonnummer</para>
3127 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
3128 <title>Variablen für die einzelnen Steuern</title>
3140 <term>taxbase</term>
3143 <para>zu versteuernder Betrag</para>
3148 <term>taxdescription</term>
3151 <para>Name der Steuer</para>
3156 <term>taxrate</term>
3159 <para>Steuersatz</para>
3166 <sect2 id="dokumentenvorlagen-und-variablen.invoice">
3167 <title>Variablen in Rechnungen</title>
3169 <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
3170 <title>Allgemeine Variablen</title>
3174 <term>creditremaining</term>
3177 <para>Verbleibender Kredit</para>
3182 <term>currency</term>
3185 <para>Währung</para>
3190 <term>cusordnumber</term>
3193 <para>Bestellnummer beim Kunden</para>
3198 <term>deliverydate</term>
3201 <para>Lieferdatum</para>
3206 <term>duedate</term>
3209 <para>Fälligkeitsdatum</para>
3214 <term>globalprojectnumber</term>
3217 <para>Projektnummer des ganzen Beleges</para>
3222 <term>globalprojectdescription</term>
3225 <para>Projekbeschreibung des ganzen Beleges</para>
3230 <term>intnotes</term>
3233 <para>Interne Bemerkungen</para>
3238 <term>invdate</term>
3241 <para>Rechnungsdatum</para>
3246 <term>invnumber</term>
3249 <para>Rechnungsnummer</para>
3254 <term>invtotal</term>
3257 <para>gesamter Rechnungsbetrag</para>
3265 <para>Bemerkungen der Rechnung</para>
3270 <term>orddate</term>
3273 <para>Auftragsdatum</para>
3278 <term>ordnumber</term>
3281 <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
3282 erstellt wurde</para>
3287 <term>payment_description</term>
3290 <para>Name der Zahlart</para>
3295 <term>payment_terms</term>
3298 <para>Zahlungskonditionen</para>
3303 <term>quodate</term>
3306 <para>Angebotsdatum</para>
3311 <term>quonumber</term>
3314 <para>Angebotsnummer</para>
3319 <term>shippingpoint</term>
3322 <para>Versandort</para>
3327 <term>shipvia</term>
3330 <para>Transportmittel</para>
3335 <term>subtotal</term>
3338 <para>Zwischensumme aller Posten ohne Steuern</para>
3346 <para>Restsumme der Rechnung (Summe abzüglich bereits
3347 bezahlter Posten)</para>
3352 <term>transaction_description</term>
3355 <para>Vorgangsbezeichnung</para>
3360 <term>transdate</term>
3363 <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
3364 erstellt wurde</para>
3370 <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
3371 <title>Variablen für jeden Posten auf der Rechnung</title>
3378 <para>Stellage</para>
3383 <term>description</term>
3386 <para>Artikelbeschreibung</para>
3391 <term>discount</term>
3394 <para>Rabatt als Betrag</para>
3399 <term>discount_sub</term>
3402 <para>Zwischensumme mit Rabatt</para>
3407 <term>drawing</term>
3410 <para>Zeichnung</para>
3418 <para>EAN-Code</para>
3431 <term>linetotal</term>
3434 <para>Zeilensumme (Anzahl * Einzelpreis)</para>
3439 <term>longdescription</term>
3442 <para>Langtext</para>
3447 <term>microfiche</term>
3450 <para>Mikrofilm</para>
3455 <term>netprice</term>
3458 <para>Nettopreis</para>
3463 <term>nodiscount_linetotal</term>
3466 <para>Zeilensumme ohne Rabatt</para>
3471 <term>nodiscount_sub</term>
3474 <para>Zwischensumme ohne Rabatt</para>
3482 <para>Artikelnummer</para>
3487 <term>ordnumber_oe</term>
3490 <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3491 aus einem Sammelauftrag erstellt wurde</para>
3496 <term>p_discount</term>
3499 <para>Rabatt in Prozent</para>
3504 <term>partnotes</term>
3507 <para>Die beim Artikel gespeicherten Bemerkungen</para>
3512 <term>partsgroup</term>
3515 <para>Warengruppe</para>
3520 <term>price_factor</term>
3523 <para>Der Preisfaktor als Zahl, sofern einer eingestellt
3529 <term>price_factor_name</term>
3532 <para>Der Name des Preisfaktors, sofern einer eingestellt
3538 <term>projectnumber</term>
3541 <para>Projektnummer</para>
3546 <term>projectdescription</term>
3549 <para>Projektbeschreibung</para>
3562 <term>reqdate</term>
3565 <para>Lieferdatum</para>
3570 <term>runningnumber</term>
3573 <para>Position auf der Rechnung (1, 2, 3...)</para>
3578 <term>sellprice</term>
3581 <para>Verkaufspreis</para>
3586 <term>serialnumber</term>
3589 <para>Seriennummer</para>
3594 <term>tax_rate</term>
3597 <para>Steuersatz</para>
3602 <term>transdate_oe</term>
3605 <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
3606 aus einem Sammelauftrag erstellt wurde</para>
3614 <para>Einheit</para>
3622 <para>Gewicht</para>
3627 <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
3628 über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
3629 einer <function>foreach</function>-Schleife ausgegeben werden, da
3630 für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
3631 können. Die Variablen dafür lauten:</para>
3638 <para>Lieferant</para>
3646 <para>Lieferantenartikelnummer</para>
3652 <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
3653 <title>Variablen für die einzelnen Zahlungseingänge</title>
3657 <term>payment</term>
3665 <term>paymentaccount</term>
3673 <term>paymentdate</term>
3681 <term>paymentmemo</term>
3689 <term>paymentsource</term>
3698 <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
3699 <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
3701 <para>Die vom Benutzer definierten Variablen für Kunden und
3702 Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
3703 ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
3704 <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
3705 Variablennamen zusammen.</para>
3707 <para>Beispiel: Der Benutzer hat eine Variable namens
3708 <varname>number_of_employees</varname> definiert, die die Anzahl der
3709 Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
3710 unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
3715 <sect2 id="dokumentenvorlagen-und-variablen.dunning">
3716 <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
3718 <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
3719 <title>Namen der Vorlagen</title>
3721 <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
3722 eingegeben. Wird für ein Mahnlevel die Option zur automatischen
3723 Erstellung einer Rechnung über die Mahngebühren und Zinsen
3724 aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
3725 Vorlagenname für diese Mahnstufe mit dem Zusatz
3726 <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
3727 für die ausgewählte Sprache und den ausgewählten Drucker
3731 <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
3732 <title>Allgemeine Variablen in Mahnungen</title>
3734 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3735 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3736 Kunden stehen als Variablen <varname>name</varname>,
3737 <varname>street</varname>, <varname>zipcode</varname>,
3738 <varname>city</varname>, <varname>country</varname>,
3739 <varname>department_1</varname>, <varname>department_2</varname>,
3740 und <varname>email</varname> zur Verfügung.</para>
3742 <para>Weitere Variablen beinhalten:</para>
3746 <term>dunning_date</term>
3749 <para>Datum der Mahnung</para>
3754 <term>dunning_duedate</term>
3757 <para>Fälligkeitsdatum für diese Mahhnung</para>
3762 <term>dunning_id</term>
3765 <para>Mahnungsnummer</para>
3773 <para>Kummulative Mahngebühren</para>
3778 <term>interest_rate</term>
3781 <para>Zinssatz per anno in Prozent</para>
3786 <term>total_amount</term>
3789 <para>Gesamter noch zu zahlender Betrag als
3790 <function>fee</function> + <function>total_interest</function>
3791 + <function>total_open_amount</function></para>
3796 <term>total_interest</term>
3799 <para>Zinsen per anno über alle Rechnungen</para>
3804 <term>total_open_amount</term>
3807 <para>Summe über alle offene Beträge der Rechnungen</para>
3813 <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
3814 <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
3818 <term>dn_amount</term>
3821 <para>Rechnungssumme (brutto)</para>
3826 <term>dn_duedate</term>
3829 <para>Originales Fälligkeitsdatum der Rechnung</para>
3834 <term>dn_dunning_date</term>
3837 <para>Datum der Mahnung</para>
3842 <term>dn_dunning_duedate</term>
3845 <para>Fälligkeitsdatum der Mahnung</para>
3853 <para>Kummulative Mahngebühr</para>
3858 <term>dn_interest</term>
3861 <para>Zinsen per anno für diese Rechnung</para>
3866 <term>dn_invnumber</term>
3869 <para>Rechnungsnummer</para>
3874 <term>dn_linetotal</term>
3877 <para>Noch zu zahlender Betrag (ergibt sich aus
3878 <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
3879 + <varname>dn_interest</varname>)</para>
3884 <term>dn_netamount</term>
3887 <para>Rechnungssumme (netto)</para>
3892 <term>dn_open_amount</term>
3895 <para>Offener Rechnungsbetrag</para>
3900 <term>dn_ordnumber</term>
3903 <para>Bestellnummer</para>
3908 <term>dn_transdate</term>
3911 <para>Rechnungsdatum</para>
3916 <term>dn_curr</term>
3919 <para>Währung, in der die Rechnung erstellt wurde. (Die
3920 Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
3926 <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
3927 <title>Variablen in automatisch erzeugten Rechnungen über
3928 Mahngebühren</title>
3930 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3931 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3932 Kunden stehen als Variablen <varname>name</varname>,
3933 <varname>street</varname>, <varname>zipcode</varname>,
3934 <varname>city</varname>, <varname>country</varname>,
3935 <varname>department_1</varname>, <varname>department_2</varname>,
3936 und <varname>email</varname> zur Verfügung.</para>
3938 <para>Weitere Variablen beinhalten:</para>
3942 <term>duedate</term>
3945 <para>Fälligkeitsdatum der Rechnung</para>
3950 <term>dunning_id</term>
3953 <para>Mahnungsnummer</para>
3961 <para>Mahngebühren</para>
3966 <term>interest</term>
3974 <term>invamount</term>
3977 <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
3978 <varname>interest</varname>)</para>
3983 <term>invdate</term>
3986 <para>Rechnungsdatum</para>
3991 <term>invnumber</term>
3994 <para>Rechnungsnummer</para>
4001 <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
4002 <title>Variablen in anderen Vorlagen</title>
4005 <title>Einführung</title>
4007 <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
4008 Rechnung. Allerdings heißen die Variablen, die mit
4009 <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
4010 fangen sie mit <varname>quo</varname> für "quotation" an:
4011 <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
4012 wiederum fangen sie mit <varname>ord</varname> für "order" an:
4013 <varname>ordnumber</varname> für Bestellnummer etc.</para>
4015 <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
4016 vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
4017 sind Variablen, die vom Geschäftsablauf her in der entsprechenden
4018 Vorlage keine Bedeutung haben oder noch nicht belegt sein
4021 <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
4022 in Rechnungen aufgeführt.</para>
4025 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
4026 <title>Angebote und Preisanfragen</title>
4030 <term>quonumber</term>
4033 <para>Angebots- bzw. Anfragenummer</para>
4038 <term>reqdate</term>
4041 <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
4042 Preisanfragen)</para>
4047 <term>transdate</term>
4050 <para>Angebots- bzw. Anfragedatum</para>
4056 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
4057 <title>Auftragsbestätigungen und Lieferantenaufträge</title>
4061 <term>ordnumber</term>
4064 <para>Auftragsnummer</para>
4069 <term>reqdate</term>
4072 <para>Lieferdatum</para>
4077 <term>transdate</term>
4080 <para>Auftragsdatum</para>
4086 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
4087 <title>Lieferscheine (Verkauf und Einkauf)</title>
4091 <term>cusordnumber</term>
4094 <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
4095 des Lieferanten (im Einkauf)</para>
4100 <term>donumber</term>
4103 <para>Lieferscheinnummer</para>
4108 <term>transdate</term>
4111 <para>Lieferscheindatum</para>
4116 <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
4117 mit den Informationen darüber, von welchem Lager und Lagerplatz aus
4118 die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
4119 Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
4120 <function>foreach</function>-Schleife ausgegeben werden. Diese
4121 Variablen sind:</para>
4128 <para>Lagerplatz</para>
4133 <term>si_chargenumber</term>
4136 <para>Chargennummer</para>
4141 <term>si_bestbefore</term>
4144 <para>Mindesthaltbarkeit</para>
4149 <term>si_number</term>
4152 <para>Artikelnummer</para>
4160 <para>Anzahl bzw. Menge</para>
4165 <term>si_runningnumber</term>
4168 <para>Positionsnummer (1, 2, 3 etc)</para>
4173 <term>si_unit</term>
4176 <para>Einheit</para>
4181 <term>si_warehouse</term>
4190 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
4191 <title>Variablen für Sammelrechnung</title>
4195 <term>c0total</term>
4198 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit < 30
4204 <term>c30total</term>
4207 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
4208 und < 60 Tage</para>
4213 <term>c60total</term>
4216 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
4217 und < 90 Tage</para>
4222 <term>c90total</term>
4225 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90
4234 <para>Gesamtbetrag aller Rechnungen</para>
4239 <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
4243 <term>invnumber</term>
4246 <para>Rechnungsnummer</para>
4251 <term>invdate</term>
4254 <para>Rechnungsdatum</para>
4259 <term>duedate</term>
4262 <para>Fälligkeitsdatum</para>
4270 <para>Summe der Rechnung</para>
4278 <para>Noch offener Betrag der Rechnung</para>
4286 <para>Noch offener Rechnungsbetrag mit Fälligkeit < 30
4295 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
4304 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
4313 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 90
4321 <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
4322 <title>Blöcke, bedingte Anweisungen und Schleifen</title>
4324 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
4325 <title>Einfürhung</title>
4327 <para>Der Parser kennt neben den Variablen einige weitere
4328 Konstrukte, die gesondert behandelt werden. Diese sind wie
4329 Variablennamen in spezieller Weise markiert:
4330 <command><%anweisung%> ... <%end%></command></para>
4332 <para>Anmerkung zum <command><%end%></command>: Der besseren
4333 Verständlichkeit halber kann man nach dem <command>end</command>
4334 noch beliebig weitere Wörter schreiben, um so zu markieren, welche
4335 Anweisung (z.B. <command>if</command> oder
4336 <command>foreach</command>) damit abgeschlossen wird.</para>
4338 <para>Beispiel: Lautet der Beginn eines Blockes z.B.
4339 <command><%if type == "sales_quotation"%></command>, so könnte
4340 er mit <command><%end%></command> genauso abgeschlossen werden
4341 wie mit <command><%end if%></command> oder auch
4342 <command><%end type == "sales_quotation"%></command>.</para>
4345 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
4346 <title>Der if-Block</title>
4348 <programlisting><%if variablenname%>
4350 <%end%></programlisting>
4352 <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
4353 und dem "end" werden nur ausgegeben, wenn die Variable
4354 <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
4356 <para>Die Bedingung kann auch negiert werden, indem das Wort
4357 <function>not</function> nach dem <filename>if</filename> verwendet
4358 wird. Beispiel:</para>
4360 <programlisting><%if not cp_greeting%>
4362 <%end%></programlisting>
4364 <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
4365 oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
4366 einer Variablen mit einer festen Zeichenkette oder einer anderen
4367 Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
4368 oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
4369 die rechte Seite des Vergleichsoperators in Anführungszeichen
4370 gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
4371 anderer Variablen). Zwei Beispiele, die beide Vergleiche
4374 <programlisting><%if var1 == "Wert"%></programlisting>
4376 <para>Testet die Variable <varname>var1</varname> auf
4377 übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
4378 Mittels <function>!=</function> anstelle von <function>==</function>
4379 würde auf Ungleichheit getestet.</para>
4381 <programlisting>%if var1 == var2%></programlisting>
4383 <para>Testet die Variable <varname>var1</varname> auf
4384 übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
4385 <function>!=</function> anstelle von <function>==</function> würde
4386 auf Ungleichheit getestet.</para>
4388 <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
4389 auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
4390 Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
4391 dieselbe Syntax wie oben nur mit <function>=~</function> und
4392 <function>!~</function> als Vergleichsoperatoren.</para>
4394 <para>Beispiel für einen Test, ob die Variable
4395 <varname>intnotes</varname> (interne Bemerkungen) das Wort
4396 <constant>schwierig</constant> enthält:</para>
4398 <programlisting><%if intnotes =~ "schwierig"%></programlisting>
4401 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
4402 <title>Der foreach-Block</title>
4404 <programlisting><%foreach variablenname%>
4406 <%end%></programlisting>
4408 <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
4409 wie das Perl-Array der Variablen <varname>variablenname</varname>
4410 Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
4411 Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
4412 benutzt. In jedem Durchlauf werden die <link
4413 linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
4414 Variablen</link> jeweils auf den Wert für die aktuelle Position
4417 <para>Die Syntax sieht normalerweise wie folgt aus:</para>
4419 <programlisting><%foreach number%>
4420 Position: <%runningnumber%>
4421 Anzahl: <%qty%>
4422 Artikelnummer: <%number%>
4423 Beschreibung: <%description%>
4425 <%end%></programlisting>
4427 <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
4428 <function><%foreach%></function>-Block innerhalb einer
4429 Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
4430 wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
4431 Inhalt zwischen <function><%foreach%></function> und
4432 <function><%end%></function> wiederholt, nicht aber die
4433 komplette Zeile, in der er steht.</para>
4437 <sect2 id="dokumentenvorlagen-und-variablen.markup">
4438 <title>Markup-Code zur Textformatierung innerhalb von
4441 <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
4442 anders formatiert haben möchte, so ist dies begrenzt möglich.
4443 Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
4444 Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
4445 Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
4446 dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
4447 (HTML oder PDF über LaTeX) umgesetzt.</para>
4449 <para>Die unterstützen Formatierungen sind:</para>
4453 <term><b>Text</b></term>
4456 <para>Text wird in Fettdruck gesetzt.</para>
4461 <term><i>Text</i></term>
4464 <para>Text wird kursiv gesetzt.</para>
4469 <term><u>Text</u></term>
4472 <para>Text wird unterstrichen.</para>
4477 <term><s>Text</s></term>
4480 <para>Text wird durchgestrichen. Diese Formatierung ist nicht
4481 bei der Ausgabe als PDF über LaTeX verfügbar.</para>
4486 <term><bullet></term>
4489 <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
4495 <para>Der Befehl <command><bullet></command> funktioniert
4496 momentan auch nur in Latex-Vorlagen.</para>
4500 <sect1 id="excel-templates">
4501 <title>Excel-Vorlagen</title>
4503 <sect2 id="excel-templates.summary">
4504 <title>Zusammenfassung</title>
4506 <para>Dieses Dokument beschreibt den Mechanismus, mit dem
4507 Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
4511 <sect2 id="excel-templates.usage">
4512 <title>Bedienung</title>
4514 <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
4515 werden. Die Konfigurationsoption heißt <varname>excel_templates =
4516 1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
4518 <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
4519 anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
4520 werden. In den normalen Verkaufsmasken taucht nun
4521 <constant>Excel</constant> als auswählbares Format auf und kann von da
4522 an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
4524 <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
4525 eine Angebotsvorlage und wird unter dem internen Namen der Angebote
4526 <filename>sales_quotation.xls</filename> gespeichert.</para>
4529 <sect2 id="excel-templates.syntax">
4530 <title>Variablensyntax</title>
4532 <para>Einfache Syntax:
4533 <command><<varname>></command></para>
4535 <para>Dabei sind <constant><<</constant> und
4536 <constant>>></constant> die Delimiter. Da Excel auf festen
4537 Breiten besteht, kann der Tag künstlich verlängert werden, indem
4538 weitere <constant><</constant> oder <constant>></constant>
4539 eingefügt werden. Der Tag muss nicht symmetrisch sein.
4542 <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4544 <para>Um die Limitierung der festen Breite zu reduzieren, können
4545 weitere Variablen in einem Block interpoliert werden. Whitespace wird
4546 dazwishen dann erhalten. Beispiel:</para>
4548 <programlisting><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4550 <para>Die Variablen werden interpoliert, und linksbündig mit
4551 Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
4552 lang, werden überzählige Zeichen abgeschnitten.</para>
4554 <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
4555 der Block mit einem Leerzeichen anfängt. Beispiel:</para>
4557 <programlisting><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4559 <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
4560 Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
4564 <sect2 id="excel-templates.limitations">
4565 <title>Einschränkungen</title>
4567 <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
4568 mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
4569 beschränkt sich daher darauf, Textstellen exakt durch einen anderen
4570 Text zu ersetzen.</para>
4572 <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
4573 <command><%if%></command> und
4574 <command><%foreach%></command> nicht vorhanden. Der Delimiter
4575 <constant><% %></constant> kommt in den Headerinformationen
4576 evtl. vor. Deshalb wurde auf den sichereren Delimiter
4577 <constant><<</constant> und <constant>>></constant>
4582 <sect1 id="devel.fcgi">
4583 <title>Entwicklung unter FastCGI</title>
4585 <sect2 id="devel.fcgi.general">
4586 <title>Allgemeines</title>
4588 <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
4589 werden, muss der Webserver neu gestartet werden.</para>
4591 <para>Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu
4592 achten. Dadurch, dass das Programm in einer Endlosschleife läuft,
4593 müssen folgende Aspekte beachtet werden.</para>
4596 <sect2 id="devel.fcgi.exiting">
4597 <title>Programmende und Ausnahmen</title>
4599 <para>Betrifft die Funktionen <function>warn</function>,
4600 <function>die</function>, <function>exit</function>,
4601 <function>carp</function> und <function>confess</function>.</para>
4603 <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
4604 Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
4605 am Laufen zu halten. Man kann mit <function>die</function>,
4606 <function>confess</function> oder <function>carp</function> Fehler
4607 ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
4608 eigene <function>$::form-</function>error()> tut im Prinzip das
4609 Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
4610 <function>exit</function> hingegen werden nicht abgefangen.
4611 <function>warn</function> wird direkt nach STDERR, also in Server Log
4612 eine Nachricht schreiben (sofern in der Konfiguration nicht die
4613 Warnungen in das Lx-Office Log umgeleitet wurden), und
4614 <function>exit</function> wird die Ausführung beenden.</para>
4616 <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
4617 beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
4618 Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
4619 benutzen, alle anderen Exceptionmechanismen sind ok.</para>
4622 <sect2 id="devel.fcgi.globals">
4623 <title>Globale Variablen</title>
4625 <para>Um zu vermeiden, dass Informationen von einem Request in einen
4626 anderen gelangen, müssen alle globalen Variablen vor einem Request
4627 sauber initialisiert werden. Das ist besonders wichtig im
4628 <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
4629 diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
4632 <para>In <classname>SL::Dispatcher</classname> gibt es einen sauber
4633 abgetrennten Block, der alle kanonischen globalen Variablen listet und
4634 erklärt. Bitte keine anderen einführen ohne das sauber zu
4635 dokumentieren.</para>
4637 <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
4638 man sicher geht, dass man die richtige erwischt.</para>
4641 <sect2 id="devel.fcgi.performance">
4642 <title>Performance und Statistiken</title>
4644 <para>Die kritischen Pfade des Programms sind die Belegmasken, und
4645 unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
4646 Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
4647 4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
4648 sind es je nach Menge der definierten Variablen 1-2s. Ab der
4649 Moose/Rose::DB Version sind es 5-6s.</para>
4651 <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
4652 den kritischen Pfaden, unter 0,15 sonst.</para>
4655 <sect2 id="devel.fcgi.known-issues">
4656 <title>Bekannte Probleme</title>
4658 <sect3 id="devel.fcgi.known-issues.encoding">
4659 <title>Encoding Awareness</title>
4661 <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
4662 fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
4663 falsch kodierte Zeichen eher unwissend, und geben sie einfach
4664 weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
4665 das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
4671 <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
4672 <title>SQL-Upgradedateien</title>
4674 <sect2 id="db-upgrade-files.introduction" xreflabel="Einführung in die Datenbank-Upgradedateien">
4675 <title>Einführung</title>
4678 Der alte Mechanismus für SQL-Upgradescripte, der auf einer Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
4679 diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele Entwicklung im stable- und unstable-Baum betrifft.
4683 Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es werden weiterhin alle Scripte aus sql/Pg-upgrade
4684 ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
4685 Datei existieren, die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige Kontrollinformationen enthält.
4689 Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten definieren können werden, sodass Datenbankscripte zwar in
4690 einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
4691 angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern mehr braucht.
4695 Lx-Office merkt sich dabei, welches der Upgradescripte in sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht erneut
4696 aus. Dazu dient die Tabelle "schema_info", die bei der Anmeldung automatisch angelegt wird.
4700 <sect2 id="db-upgrade-files.format" xreflabel="Format der Upgradedateien">
4701 <title>Format der Kontrollinformationen</title>
4704 Die Kontrollinformationen sollten sich am Anfang der jeweiligen Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
4705 hat dabei das folgende Format:
4709 Für SQL-Upgradedateien:
4712 <programlisting>-- @key: value</programlisting>
4715 Für Perl-Upgradedateien:
4718 <programlisting># @key: value</programlisting>
4721 Leerzeichen vor "<varname>value</varname>" werden entfernt.
4725 Die folgenden Schlüsselworte werden verarbeitet:
4733 Wird zwingend benötigt. Dies ist der "Name" des Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren Abhängigkeiten
4734 verwendet werden (Schlüsselwort "<varname>depends</varname>"). Der "tag" ist auch der Name, der in der Datenbank eingetragen wird.
4738 Normalerweise sollte die Kontrolldatei genau so heißen wie der "tag", nur mit der Endung ".sql" bzw. "pl".
4742 Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
4743 sollten stattdessen mit Unterstrichen ersetzt werden.
4749 <term>charset</term>
4752 Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
4753 Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags der Zeichensatz "<literal>ISO-8859-15</literal>"
4760 <term>description</term>
4763 Benötigt. Eine Beschreibung, was in diesem Update passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
4764 angezeigt. Während der Tag in englisch gehalten sein sollte, sollte die Beschreibung auf Deutsch erfolgen.
4770 <term>depends</term>
4773 Optional. Eine mit Leerzeichen getrennte Liste von "tags", von denen dieses Upgradescript abhängt. Lx-Office stellt sicher, dass
4774 die in dieser Liste aufgeführten Scripte bereits durchgeführt wurden, bevor dieses Script ausgeführt wird.
4778 Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b" existiert, das von Änderungen in "a" abhängt, und eine neue
4779 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
4780 Abhängigkeit zu definieren.
4784 Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu definieren (z.B. "a" -> "b",
4785 "b" -> "c" und "c" -> "a").
4791 <term>priority</term>
4794 Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
4795 besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
4799 Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends" benutzt werden. Lx-Office sortiert die auszuführenden Scripte
4800 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
4801 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
4802 alphabetisch nach dem "tag".
4809 <sect2 id="db-upgrade-files.dbupgrade-tool" xreflabel="Hilfsscript dbupgrade2_tool.pl">
4810 <title>Hilfsscript dbupgrade2_tool.pl</title>
4813 Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert ein Hilfsscript namens
4814 "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses
4815 Tool liest alle Datenbankupgradescripte aus dem Verzeichnis <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die gleichen
4816 Methoden wie Lx-Office selber, sodass alle Fehlersituationen von der Kommandozeile überprüft werden können.
4820 Wird dem Script kein weiterer Parameter übergeben, so wird nur eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
4821 sich aber auch Informationen auf verschiedene Art ausgeben lassen:
4826 <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl --list</command>"</para>
4829 Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge sortiert, in der Lx-Office die Scripte ausführen würde. Es
4830 werden neben der Listenposition der Tag, die Abhängigkeitstiefe und die Priorität ausgegeben.
4835 <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl --tree</command>"</para>
4838 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
4839 anderen abhängen. Die Unterknoten sind Scripte, die beim übergeordneten Script als Abhängigkeit eingetragen sind.
4843 <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
4844 <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl --rtree</command>"</para>
4847 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
4848 Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das übergeordnete Script als Abhängigkeit eingetragen haben.
4853 <para>Baumform mit Postscriptausgabe: "<command>./scripts/dbupgrade2_tool.pl --graphviz</command>"</para>
4856 Benötigt das Tool "<command>graphviz</command>", um mit seiner Hilfe die <link
4857 linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte Baumform</link> in eine Postscriptdatei namens
4858 "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist vermutlich die übersichtlichste Form, weil hierbei jeder Knoten nur
4859 einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben werden.
4865 Scripte, von denen kein anderes Script abhängt: "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"
4869 Listet die Tags aller Scripte auf, von denen keine anderen Scripte abhängen.
4876 <sect1 id="translations-languages" xreflabel="Translations and languages">
4877 <title>Translations and languages</title>
4879 <sect2 id="translations-languages.introduction"
4880 xreflabel="Introduction to translations and languages">
4881 <title>Introduction</title>
4884 <para>Dieser Abschnitt ist in Englisch geschrieben, um
4885 internationalen Übersetzern die Arbeit zu erleichtern.</para>
4888 <para>This section describes how localization packages in Lx-Office
4889 are built. Currently the only language fully supported is German, and
4890 since most of the internal messages are held in English the English
4891 version is usable too.</para>
4893 <para>A stub version of French is included but not functunal at this
4897 <sect2 id="translations-languages.file-structure"
4898 xreflabel="File structure">
4899 <title>File structure</title>
4901 <para>The structure of locales in Lx-Office is:</para>
4903 <programlisting>lx-office/locale/<langcode>/</programlisting>
4905 <para>where <langcode> stands for an abbreviation of the
4906 language package. The builtin packages use two letter <ulink
4907 url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
4908 but the actual name is not relevant for the program and can easily be
4910 url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
4911 tags</ulink> (i.e. "en_GB"). In fact the original language packages
4912 from SQL Ledger are named in this way.</para>
4914 <para>In such a language directory the following files are
4919 <term>LANGUAGE</term>
4922 <para>This file is mandatory.</para>
4924 <para>The <filename>LANGUAGE</filename> file contains the self
4925 descripted name of the language. It should contain a native
4926 representation first, and in parenthesis an english translation
4927 after that. Example:</para>
4929 <programlisting>Deutsch (German)</programlisting>
4934 <term>charset</term>
4937 <para>This file should be present.</para>
4939 <para>The <filename>charset</filename> file describes which
4940 charset a language package is written in and applies to all
4941 other language files in the package. It is possible to write
4942 some language packages without an explicit charset, but it is
4943 still strongly recommended. You'll never know in what
4944 environment your language package will be used, and neither
4945 UTF-8 nor Latin1 are guaranteed.</para>
4947 <para>The whole content of this file is a string that can be
4948 recognized as a valid charset encoding. Example:</para>
4950 <programlisting>UTF-8</programlisting>
4958 <para>This file is mandatory.</para>
4960 <para>The central translation file. It is essentially an inline
4961 Perl script autogenerated by <command>locales.pl</command>. To
4962 generate it, generate the directory and the two files mentioned
4963 above, and execute the following command:</para>
4965 <programlisting>scripts/locales.pl <langcode></programlisting>
4967 <para>Otherwise you can simply copy one of the other languages.
4968 You will be told how many are missing like this:</para>
4970 <programlisting>$ scripts/locales.pl en
4971 English - 0.6% - 2015/2028 missing</programlisting>
4973 <para>A file named "<filename>missing</filename>" will be
4974 generated and can be edited. You can also edit the
4975 "<filename>all</filename>" file directly. Edit everything you
4976 like to fit the target language and execute
4977 <command>locales.pl</command> again. See how the missing words
4983 <term>Num2text</term>
4986 <para>Legacy code from SQL Ledger. It provides a means for
4987 numbers to be converted into natural language, like
4988 <literal>1523 => one thousand five hundred twenty
4989 three</literal>. If you want to provide it, it must be inlinable
4990 Perl code which provides a <function>num2text</function> sub. If
4991 an <function>init</function> sub exists it will be executed
4994 <para>Only used in the check and receipt printing module.</para>
4999 <term>special_chars</term>
5002 <para>Lx-Office comes with a lot of interfaces to different
5003 formats, some of which are rather picky with their accepted
5004 charset. The <filename>special_chars</filename> file contains a
5005 listing of chars not suited for different file format and
5006 provides substitutions. It is written in "Simple Ini" style,
5007 containing a block for every file format.</para>
5009 <para>First entry should be the order of substitution for
5010 entries as a whitespace separated list. All entries are
5011 interpolated, so <literal>\n</literal>, <literal>\x20</literal>
5012 and <literal>\\</literal> all work.</para>
5014 <para>After that every entry is a special char that should be
5015 translated when writing text into such a file.</para>
5017 <para>Example:</para>
5019 <programlisting>[Template/XML]
5020 order=& < > \n
5024 \n=<br></programlisting>
5026 <para>Note the importance of the order in this example.
5027 Substituting < and > befor & would lead to $gt; become
5030 <para>For a list of valid formats, see the German
5031 <filename>special_chars</filename> entry. As of this writing the
5032 following are recognized:</para>
5034 <programlisting>HTML
5039 Template/OpenDocument
5040 filenames</programlisting>
5042 <para>The last of which is very machine dependant. Remember that
5043 a lot of characters are forbidden by some filesystems, for
5044 exmaple MS Windows doesn't like ':' in its files where Linux
5045 doesn't mind that. If you want the files created with your
5046 language pack to be portable, find all chars that could cause
5052 <term>missing</term>
5055 <para>This file is not a part of the language package
5058 <para>This is a file generated by
5059 <command>scripts/locales.pl</command> while processing your
5060 locales. It's only to have the missing entries singled out and
5061 does not belong to a language package.</para>
5069 <para>This file is not a part of the language package
5072 <para>Another file generated by
5073 <command>scripts/locales.pl</command>. If for any reason a
5074 translation does not appear anymore and can be deleted, it gets
5075 moved here. The last 50 or so entries deleted are saved here in
5076 case you made a typo, so that you don't have to translate
5077 everything again. If a tranlsation is missing, the lost file is
5078 checked first. If you maintain a language package, you might
5079 want to keep this safe somewhere.</para>
5085 <sect2 id="devel.style-guide">
5086 <title>Stil-Richtlinien</title>
5089 Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar zu machen. Dazu gehört zum Einen, dass der Code
5090 einheitlich eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte "Klammern" oder "Hash-Keys").
5094 Diese Regeln sind keine Schikane sondern erleichtern allen das Leben!
5098 Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
5105 Es werden keine echten Tabs sondern Leerzeichen verwendet.
5111 Die Einrückung beträgt zwei Leerzeichen. Beispiel:
5114 <programlisting>foreach my $row (@data) {
5116 # do something with $row
5120 $row->{modules} = MODULE->retrieve(
5121 id => $row->{id},
5122 date => $use_now ? localtime() : $row->{time},
5126 $report->add($row);
5131 <para>Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie der letzte Befehl. Beispiele:</para>
5133 <programlisting>sub debug {
5139 <programlisting>if ($form->{item_rows} > 0) {
5146 Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl / die öffnende schließende Klammer, die den Block gestartet
5147 hat, und nicht auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
5153 Die Wörter "<function>else</function>", "<function>elsif</function>", "<function>while</function>" befinden sich auf der gleichen
5154 Zeile wie schließende geschweifte Klammern. Beispiele:
5157 <programlisting>if ($form->{sum} > 1000) {
5159 } elsif ($form->{sum} > 0) {
5167 } until ($a > 0);</programlisting>
5172 Parameter von Funktionsaufrufen müssen mit runden Klammern versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
5173 und grep-ähnliche Operatoren. Beispiel:
5176 <programlisting>$main::lxdebug->message("Could not find file.");
5177 %options = map { $_ => 1 } grep { !/^#/ } @config_file;</programlisting>
5182 Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
5186 Generell gilt: Hashkeys und Arrayindices sollten nicht durch Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
5187 Blöcke schon. Beispiel:
5190 <programlisting>if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
5195 $form->{sum} += $form->{"row_$i"};
5196 $form->{ $form->{index} } += 1;
5198 map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;</programlisting>
5209 Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
5210 werden, in der die ersten Funktionsparameter in der ersten Zeile stehen. Beispiel:
5213 <programlisting>$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
5214 $form->{some_col_value});</programlisting>
5219 Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer übersichtlichen Tabellenstruktur organisiert
5223 <programlisting>my $rowcount = $form->{"row_$i"} ? $i
5224 : $form->{oldcount} ? $form->{oldcount} + 1
5225 : $form->{rowcount} - $form->{rowbase};</programlisting>
5237 <para>Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der Code eingerückt sein.</para>
5241 <para>Seitliche hängende Kommentare sollten einheitlich formatiert werden.</para>
5246 Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch zu verfassen. So wie ich keine Lust habe, französischen
5247 Quelltext zu lesen, sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein. Beispiel:
5250 <programlisting>my $found = 0;
5258 $i = 0 # initialize $i
5260 $i *= $const; # do something crazy
5261 $i = $n; # recover $i</programlisting>
5268 Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation gewünscht ist. Beispiel:
5271 <programlisting>$form->{sum} = 0;
5272 $form->{"row_$i"} = $form->{"row_$i"} - 5;
5273 $some_hash{42} = 54;</programlisting>
5278 Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
5279 wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann ist Lesbarkeit vorzuziehen.
5283 Als Beispiel sei die Funktion <function>print_options</function> aus <filename>bin/mozilla/io.pl</filename> angeführt.
5289 Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die
5294 Emacs und vim haben beide recht einfache Methoden zur Entfernung von trailing whitespace. Emacs kennt das Kommande
5295 <command>nuke-trailing-whitespace</command>, vim macht das gleiche manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
5296 BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern gebunden.
5302 Es wird kein <command>perltidy</command> verwendet.
5306 In der Vergangenheit wurde versucht, <command>perltidy</command> zu verwenden, um einen einheitlichen Stil zu erlangen. Es hat
5307 sich aber gezeigt, dass <command>perltidy</command>s sehr eigenwilliges Verhalten, was Zeilenumbrüche angeht, oftmals gut
5308 formatierten Code zerstört. Für den Interessierten sind hier die <command>perltidy</command>-Optionen, die grob den
5309 beschriebenen Richtlinien entsprechen:
5312 <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
5313 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
5314 -lp -vt=1 -vtc=1</programlisting>
5319 <varname>STDERR</varname> ist tabu. Unkonditionale Debugmeldungen auch.
5323 Lx-Office bietet mit dem Modul <classname>LXDebug</classname> einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
5324 Grund, nach <varname>STDERR</varname> zu schreiben.
5328 Die <classname>LXDebug</classname>-Methode "<function>message</function>" nimmt als ersten Paramter außerdem eine Flagmaske, für
5329 die die Meldung angezeigt wird, wobei "0" immer angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden und werden in
5330 den meisten Fällen auch vom Repository zurückgewiesen.
5336 Alle neuen Module müssen use strict verwenden.
5340 <varname>$form</varname>, <varname>$auth</varname>, <varname>$locale</varname>, <varname>$lxdebug</varname> und
5341 <varname>%myconfig</varname> werden derzeit aus dem main package importiert (siehe <xref linkend="devel.globals"/>. Alle anderen
5342 Konstrukte sollten lexikalisch lokal gehalten werden.