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="config.eur">
1383 <title>Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung: EUR</title>
1385 <sect2 id="config.eur.introduction" xreflabel="Einführung in die Konfiguration zur EUR">
1386 <title>Einführung</title>
1389 Lx-Office besaß bis inklusive Version 2.6.3 einen Konfigurationsparameter namens <varname>eur</varname>, der sich in der
1390 Konfigurationsdatei <filename>config/lx_office.conf</filename> befindet. Somit galt er für alle Mandanten, die in dieser
1391 Installation benutzt wurden.
1395 Mit der nachfolgenden Version wurde der Parameter zum Einen in die Mandantendatenbank verschoben und dabei auch gleich in drei
1396 Einzelparameter aufgeteilt, mit denen sich das Verhalten genauer steuern lässt.
1400 <sect2 id="config.eur.parameters" xreflabel="Konfigurationsparameter für EUR">
1401 <title>Konfigurationsparameter</title>
1404 Es gibt drei Parameter, die die Gewinnermittlungsart, Versteuerungsart und die Warenbuchungsmethode regeln:
1409 <term>profit_determination</term>
1412 Dieser Parameter legt die Berechnungsmethode für die Gewinnermittlung fest. Er enthält entweder <literal>balance</literal> für
1413 Betriebsvermögensvergleich/Bilanzierung oder <literal>income</literal> für die Einnahmen-Überschuss-Rechnung.
1419 <term>accounting_method</term>
1422 Dieser Parameter steuert die Buchungs- und Berechnungsmethoden für die Versteuerungsart. Er enthält entweder
1423 <literal>accrual</literal> für die Soll-Versteuerung oder <literal>cash</literal> für die Ist-Versteuerung.
1429 <term>inventory_system</term>
1432 Dieser Parameter legt die Warenbuchungsmethode fest. Er enthält entweder <literal>perpetual</literal> für die Bestandsmethode
1433 oder <literal>periodic</literal> für die Aufwandsmethode.
1440 Zum Vergleich der Funktionalität bis und nach 2.6.3: <varname>eur</varname> = 1 bedeutete Einnahmen-Überschuss-Rechnung,
1441 Ist-Versteuerung und Aufwandsmethode. <varname>eur</varname> = 0 bedeutete hingegen Bilanzierung, Soll-Versteuerung und
1446 Die Konfiguration "<varname>eur</varname>" unter <varname>[system]</varname> in der <link
1447 linkend="config.config-file">Konfigurationsdatei</link> <filename>config/lx_office.conf</filename> wird nun nicht mehr benötigt und
1448 kann entfernt werden. Dies muss manuell geschehen.
1452 <sect2 id="config.eur.setting-parameters">
1453 <title>Festlegen der Parameter</title>
1456 Beim Anlegen eines neuen Mandanten bzw. einer neuen Datenbank in der Admininstration können diese Optionen nun unabhängig
1457 voneinander eingestellt werden.
1461 Beim Upgrade bestehender Mandanten wird eur ausgelesen und die Variablen werden so gesetzt, daß sich an der Funktionalität nichts
1466 Die aktuelle Konfiguration wird unter Nummernkreise und Standardkonten unter dem neuen Punkt "Einstellungen" angezeigt (read-only).
1467 Eine spätere Änderung ist für einen bestehenden Mandanten nicht mehr möglich. Dies war auch vorher nicht möglich, bzw. vorhandene
1468 Daten wurden so belassen und haben damit die Ergebnisse verfälscht.
1472 <sect2 id="config.eur.inventory-system-perpetual">
1473 <title>Bemerkungen zu Bestandsmethode</title>
1476 Die Bestandsmethode ist eigentlich eine sehr elegante Methode, funktioniert in Lx-Office aber nur unter bestimmten Bedingungen:
1477 Voraussetzung ist, daß auch immer alle Einkaufsrechnungen gepflegt werden, und man beim Jahreswechsel nicht mit einer leeren
1478 Datenbank anfängt, da bei jedem Verkauf anhand der gesamten Rechnungshistorie der Einkaufswert der Ware nach dem FIFO-Prinzip aus
1479 den Einkaufsrechnungen berechnet wird.
1483 Die Bestandsmethode kann vom Prinzip her also nur funktioneren, wenn man mit den Buchungen bei Null anfängt, und man kann auch nicht
1484 im laufenden Betrieb von der Aufwandsmethode zur Bestandsmethode wechseln.
1488 <sect2 id="config.eur.knonw-issues">
1489 <title>Bekannte Probleme</title>
1492 Bei bestimmten Berichten kann man derzeit noch inviduell einstellen, ob man nach Ist- oder Sollversteuerung auswertet, und es werden
1493 im Code Variablen wie $accrual oder $cash gesetzt. Diese Codestellen wurden noch nicht angepasst, sondern nur die, wo bisher
1494 die Konfigurationsvariable <varname>$::lx_office_conf{system}->{eur}</varname> ausgewertet wurde.
1498 Es fehlen Hilfetext beim Neuanlegen eines Mandanten, was die Optionen bewirken, z.B. mit zwei Standardfällen.
1503 <sect1 id="Lx-Office-ERP-verwenden">
1504 <title>Lx-Office ERP verwenden</title>
1506 <para>Nach erfolgreicher Installation ist der Loginbildschirm unter
1507 folgender URL erreichbar:</para>
1510 url="http://localhost/lx-office-erp/login.pl">http://localhost/lx-office-erp/login.pl</ulink></para>
1512 <para>Die Administrationsseite erreichen Sie unter:</para>
1515 url="http://localhost/lx-office-erp/admin.pl">http://localhost/lx-office-erp/admin.pl</ulink></para>
1519 <chapter id="features" xreflabel="Features und Funktionen">
1520 <title>Features und Funktionen</title>
1522 <sect1 id="features.periodic-invoices" xreflabel="Wiedekehrende Rechnungen">
1523 <title>Wiederkehrende Rechnungen</title>
1525 <sect2 id="features.periodic-invoices.introduction" xreflabel="Einführung in wiederkehrende Rechnungen">
1526 <title>Einführung</title>
1529 Wiederkehrende Rechnungen werden als normale Aufträge definiert und konfiguriert, mit allen dazugehörigen Kunden- und
1530 Artikelangaben. Die konfigurierten Aufträge werden später automatisch in Rechnungen umgewandelt, so als ob man den Workflow benutzen
1531 würde, und auch die Auftragsnummer wird übernommen, sodass alle wiederkehrenden Rechnungen, die aus einem Auftrag erstellt wurden,
1532 später leicht wiederzufinden sind.
1537 <sect2 id="features.periodic-invoices.configuration" xreflabel="Konfiguration von wiederkehrenden Rechnungen">
1538 <title>Konfiguration</title>
1541 Um einen Auftrag für wiederkehrende Rechnung zu konfigurieren, findet sich beim Bearbeiten des Auftrags ein neuer Knopf
1542 "Konfigurieren", der ein neues Fenster öffnet, in dem man die nötigen Parameter einstellen kann. Hinter dem Knopf wird außerdem noch
1543 angezeigt, ob der Auftrag als wiederkehrende Rechnung konfiguriert ist oder nicht.
1547 Folgende Parameter kann man konfigurieren:
1555 Bei aktiven Rechnungen wird automatisch eine Rechnung erstellt, wenn die Periodizität erreicht ist (z.B. Anfang eines neuen
1560 Ist ein Auftrag nicht aktiv, so werden für ihn auch keine wiederkehrenden Rechnungen erzeugt. Stellt man nach längerer
1561 nicht-aktiver Zeit einen Auftrag wieder auf aktiv, wird beim nächsten Periodenwechsel für alle Perioden, seit der letzten aktiven
1562 Periode, jeweils eine Rechnung erstellt. Möchte man dies verhindern, muss man vorher das Startdatum neu setzen.
1566 Für gekündigte Aufträge werden nie mehr Rechnungen erstellt. Man kann sich diese Aufträge aber gesondert in den Berichten anzeigen
1573 <term>Periodizität</term>
1576 Ob monatlich, quartalsweise oder jährlich auf neue Rechnungen überprüft werden soll. Für jede Periode seit dem Startdatum wird
1577 überprüft, ob für die Periode (beginnend immer mit dem ersten Tag der Periode) schon eine Rechnung erstellt wurde. Unter Umständen
1578 können bei einem Startdatum in der Vergangenheit gleich mehrere Rechnungen erstellt werden.
1584 <term>Buchen auf</term>
1587 Das Forderungskonto, in der Regel "Forderungen aus Lieferungen und Leistungen". Das Gegenkonto ergibt sich aus den Buchungsgruppen
1588 der betreffenden Waren.
1594 <term>Startdatum</term>
1597 ab welchem Datum auf Rechnungserstellung geprüft werden soll
1603 <term>Enddatum</term>
1606 ab wann keine Rechnungen mehr erstellt werden sollen
1612 <term>Automatische Verlängerung um x Monate</term>
1615 Sollen die wiederkehrenden Rechnungen bei Erreichen des eingetragenen Enddatums weiterhin erstellt werden, so kann man hier die
1616 Anzahl der Monate eingeben, um die das Enddatum automatisch nach hinten geschoben wird.
1622 <term>Drucken</term>
1625 Sind Drucker konfiguriert, so kann man sich die erstellten Rechnungen auch gleich ausdrucken lassen.
1632 Nach Erstellung der Rechnungen kann eine E-Mail mit Informationen zu den erstellten Rechnungen verschickt werden. Konfiguriert wird
1633 dies in der <link linkend="config.config-file.sections-parameters">Konfigurationsdatei</link>
1634 <filename>config/lx_office.conf</filename> im Abschnitt <varname>[periodic_invoices]</varname>.
1638 <sect2 id="features.periodic-invoices.reports">
1639 <title>Auflisten</title>
1642 Unter Verkauf->Berichte->Aufträge finden sich zwei neue Checkboxen, "Wiederkehrende Rechnungen aktiv" und
1643 "Wiederkehrende Rechnungen inaktiv", mit denen man sich einen Überglick über die wiederkehrenden Rechnungen verschaffen
1648 <sect2 id="features.periodic-invoices.task-server">
1649 <title>Erzeugung der eigentlichen Rechnungen</title>
1652 Die zeitliche und periodische Überprüfung, ob eine wiederkehrende Rechnung automatisch erstellt werden soll, geschieht durch den
1653 <link linkend="config.task-server">Taskserver</link>, einen externen Dienst, der automatisch beim Start des Servers gestartet
1658 <sect2 id="features.periodic-invoices.create-for-current-month">
1659 <title>Erste Rechnung für aktuellen Monat erstellen</title>
1662 Will man im laufenden Monat eine monatlich wiederkehrende Rechnung inkl. des laufenden Monats starten, stellt man das Startdatum auf
1663 den Monatsanfang und wartet ein paar Minuten, bis der Taskserver den neu konfigurieren Auftrag erkennt und daraus eine Rechnung
1664 generiert hat. Alternativ setzt man das Startdatum auf den Monatsersten des Folgemonats und erstellt die erste Rechnung direkt
1665 manuell über den Workflow.
1672 <title>Entwicklerdokumentation</title>
1674 <sect1 id="devel.globals" xreflabel="Globale Variablen">
1675 <title>Globale Variablen</title>
1678 <title>Wie sehen globale Variablen in Perl aus?</title>
1680 <para>Globale Variablen liegen in einem speziellen namespace namens
1681 "main", der von überall erreichbar ist. Darüber hinaus sind bareword
1682 globs global und die meisten speziellen Variablen sind...
1685 <para>Daraus ergeben sich folgende Formen:</para>
1689 <term>$main::form</term>
1692 <para>expliziter Namespace "main"</para>
1697 <term>$::form</term>
1700 <para>impliziter Namespace "main"</para>
1705 <term>open FILE, "file.txt"</term>
1708 <para><varname>FILE</varname> ist global</para>
1716 <para>speziell</para>
1721 <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
1722 Schlüsselwort wie "<function>global</function>", mit dem man
1723 importieren kann. <function>my</function>, <function>our</function>
1724 und <function>local</function> machen was anderes.</para>
1728 <term>my $form</term>
1731 <para>lexikalische Variable, gültig bis zum Ende des
1737 <term>our $form</term>
1740 <para><varname>$form</varname> referenziert ab hier
1741 <varname>$PACKAGE::form</varname>.</para>
1746 <term>local $form</term>
1749 <para>Alle Änderungen an <varname>$form</varname> werden am Ende
1750 des scopes zurückgesetzt</para>
1757 <title>Warum sind globale Variablen ein Problem?</title>
1759 <para>Das erste Problem ist <productname>FCGI</productname>.</para>
1761 <para><productname>SQL-Ledger</productname> hat fast alles im globalen
1762 namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
1763 Unter <productname>FCGI</productname> müssen diese Sachen auch wieder
1764 aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
1765 Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
1766 Datenbankverbindungen, weil die ne Ewigkeit zum initialisieren
1769 <para>Das zweite Problem ist <function>strict</function>. Unter
1770 <function>strict</function> werden alle Variablen die nicht explizit
1771 mit <function>Package</function>, <function>my</function> oder
1772 <function>our</function> angegeben werden als Tippfehler angemarkert,
1773 was einen vor so mancher Stunde suchen nach einem Bug erspart. Da
1774 globale Variablen aber implizit mit Package angegeben werden, werden
1775 die nicht geprüft, und ein Tippfehler da fällt niemandem auf.</para>
1779 <title>Kanonische globale Variablen</title>
1781 <para>Um dieses Problem im Griff zu halten gibt es einige wenige
1782 globale Variablen, die kanonisch sind, und alles andere sollte
1783 anderweitig umhergereicht werden.</para>
1785 <para>Diese Variablen sind im Moment die folgenden neun:</para>
1789 <para><varname>$::form</varname></para>
1793 <para><varname>%::myconfig</varname></para>
1797 <para><varname>$::locale</varname></para>
1801 <para><varname>$::lxdebug</varname></para>
1805 <para><varname>$::auth</varname></para>
1809 <para><varname>$::lx_office_conf</varname></para>
1813 <para><varname>$::instance_conf</varname></para>
1817 <para><varname>$::dispatcher</varname></para>
1821 <para><varname>$::request</varname></para>
1825 <para>Damit diese nicht als Müllhalde misbrauch werden, im Folgenden
1826 eine kurze Erläuterung was man von denn erwarten kann.</para>
1829 <title>$::form</title>
1833 <para>Ist ein Objekt der Klasse
1834 "<classname>Form</classname>"</para>
1838 <para>Wird nach jedem Request gelöscht</para>
1842 <para>Muss auch in Tests und Konsolenscripts vorhanden
1847 <para>Enthält am Anfang eines Requests die Requestparameter vom
1852 <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
1853 cachen, das wird aber momentan absichtlich zerstört</para>
1857 <para><varname>$::form</varname> wurde unter <productname>SQL
1858 Ledger</productname> als Gottobjekt für alles misbraucht. Sämtliche
1859 alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
1860 heißt, alles was einem lieb ist, sollte man vor einem Aufruf von zum
1861 Beispiel <function>IS->retrieve_customer()</function> in
1862 Sicherheit bringen.</para>
1864 <para>Das Objekt der Klasse Form hat leider im Moment noch viele
1865 zentrale Funktionen Gdie vom internen Zustand abhängen, deshalb
1866 bitte nie einfach zerstören oder überschreiben. Es geht ziemlich
1867 sicher etwas kaputt.</para>
1869 <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
1870 in den <productname>Template::Toolkit</productname> Templates
1871 außerhalb der Controller: der Ausdruck <function>[% var
1872 %]</function> greift auf <varname>$::form->{var}</varname> zu.
1873 Unter Controllern ist der Standard Scope anders, da lautet der
1874 Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
1875 normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
1876 <function><%var%></function> zeigt auf
1877 <varname>$::form->{var}</varname>. Innerhalb von Schleifen wird
1878 <varname>$::form->{TEMPLATE_ARRAYS}{var}[$index]</varname>
1879 bevorzugt, wenn vorhanden.</para>
1883 <title>%::myconfig</title>
1887 <para>Das einzige Hash unter den globalen Variablen</para>
1891 <para>Wird spätestens benötigt wenn auf die Datenbank
1892 zugegriffen wird</para>
1896 <para>Wird bei jedem Request neu erstellt.</para>
1900 <para>Enthält die Userdaten des aktuellen Logins</para>
1904 <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
1905 extern serialisiert werden, weil da auch der Datenbankzugriff
1906 für diesenuser drinsteht.</para>
1910 <para>Enthält unter anderem Listenbegrenzung vclimit,
1911 Datumsformat dateformat und Nummernformat numberformat</para>
1915 <para>Enthält Datenbankzugriffinformationen</para>
1919 <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
1920 ein Userobjekt. Die meisten Funktionen, die etwas anhand des
1921 aktuellen Users entscheiden müssen, befragen
1922 <varname>%::myconfig</varname>.</para>
1926 <title>$::locale</title>
1930 <para>Objekt der Klasse "Locale"</para>
1934 <para>Wird pro Request erstellt</para>
1938 <para>Muss auch für Tests und Scripte immer verfügbar
1943 <para>Cached intern über Requestgrenzen hinweg benutzte
1948 <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
1949 Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
1953 <title>$::lxdebug</title>
1957 <para>Objekt der Klasse "LXDebug"</para>
1961 <para>Wird global gecached</para>
1965 <para>Muss immer verfügbar sein, in nahezu allen
1970 <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
1971 bereit, wie "<function>enter_sub</function>" und
1972 "<function>leave_sub</function>", mit denen in den alten Modulen ein
1973 brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
1974 der man die Wallclockzeit seit Requeststart loggen kann, sowie
1975 "<function>message</function>" und "<function>dump</function>" mit
1976 denen man flott Informationen ins Log packen kann.</para>
1980 <title>$::auth</title>
1984 <para>Objekt der Klasse "SL::Auth"</para>
1988 <para>Wird global gecached</para>
1992 <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
1996 <para>Wird nach jedem Request resettet.</para>
2000 <para><varname>$::auth</varname> stellt Funktionen bereit um die
2001 Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
2002 vom aktuellen User abhängen wird das Objekt aus
2003 Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
2004 Request kurz resettet.</para>
2008 <title>$::lx_office_conf</title>
2012 <para>Objekt der Klasse
2013 "<classname>SL::LxOfficeConf</classname>"</para>
2017 <para>Global gecached</para>
2021 <para>Repräsentation der
2022 <filename>config/lx_office.conf[.default]</filename>-Dateien</para>
2026 <para>Globale Konfiguration. Configdateien werden zum Start gelesen,
2027 und nicht mehr angefasst. Es ist derzeit nicht geplant, dass das
2028 Programm die Konfiguration ändern kann oder sollte.</para>
2030 <para>Für die folgende Konfigurationsdatei:</para>
2032 <programlisting>[debug]
2033 file = /tmp/lxoffice_debug_log.txt</programlisting>
2035 <para>ist der Key <varname>file</varname> im Programm als
2036 <varname>$::lx_office_conf->{debug}{file}</varname>
2040 <para>Zugriff auf die Konfiguration erfolgt im Moment über
2041 Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
2046 <title>$::instance_conf</title>
2050 <para>Objekt der Klasse
2051 "<classname>SL::InstanceConfiguration</classname>"</para>
2055 <para>wird pro Request neu erstellt</para>
2059 <para>Funktioniert wie <varname>$::lx_office_conf</varname>,
2060 speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
2061 ist hier eine Mandantendatenbank. Prominentestes Datum ist "eur",
2062 die Information ob Bilanz oder Einnahmenüberschussrechnung gemacht
2067 <title>$::dispatcher</title>
2071 <para>Objekt der Klasse
2072 "<varname>SL::Dispatcher</varname>"</para>
2076 <para>wird pro Serverprozess erstellt.</para>
2080 <para>enthält Informationen über die technische Verbindung zum
2085 <para>Der dritte Punkt ist auch der einzige Grund warum das Objekt
2086 global gespeichert wird. Wird vermutlich irgendwann in einem anderen
2087 Objekt untergebracht.</para>
2091 <title>$::request</title>
2095 <para>Hashref (evtl später Objekt)</para>
2099 <para>Wird pro Request neu initialisiert.</para>
2103 <para>Keine Unterstruktur garantiert.</para>
2107 <para><varname>$::request</varname> ist ein generischer Platz um
2108 Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
2109 at a distance benutzt werden, sondern um lokales memoizing zu
2110 ermöglichen, das garantiert am Ende des Requests zerstört
2113 <para>Vieles von dem, was im moment in <varname>$::form</varname>
2114 liegt, sollte eigentlich hier liegen. Die groben
2115 Differentialkriterien sind:</para>
2119 <para>Kommt es vom User, und soll unverändert wieder an den
2120 User? Dann $::form, steht da eh schon</para>
2124 <para>Sind es Daten aus der Datenbank, die nur bis zum Ende des
2125 Requests gebraucht werden? Dann $::request</para>
2129 <para>Muss ich von anderen Teilen des Programms lesend drauf
2130 zugreifen? Dann $::request, aber Zugriff über
2131 Wrappermethode</para>
2138 <title>Ehemalige globale Variablen</title>
2140 <para>Die folgenden Variablen waren einmal im Programm, und wurden
2144 <title>$::cgi</title>
2148 <para>war nötig, weil cookie Methoden nicht als
2149 Klassenfunktionen funktionieren</para>
2153 <para>Aufruf als Klasse erzeugt Dummyobjekt was im
2154 Klassennamespace gehalten wird und über Requestgrenzen
2159 <para>liegt jetzt unter
2160 <varname>$::request->{cgi}</varname></para>
2166 <title>$::all_units</title>
2170 <para>war nötig, weil einige Funktionen in Schleifen zum Teil
2171 ein paar hundert mal pro Request eine Liste der Einheiten
2172 brauchen, und de als Parameter durch einen Riesenstack von
2173 Funktionen geschleift werden müssten.</para>
2177 <para>Liegt jetzt unter
2178 <varname>$::request->{cache}{all_units}</varname></para>
2183 <function>AM->retrieve_all_units()</function> gesetzt oder
2190 <title>%::called_subs</title>
2194 <para>wurde benutzt um callsub deep recursions
2199 <para>Wurde entfernt, weil callsub nur einen Bruchteil der
2200 möglichen Rekursioenen darstellt, und da nie welche
2205 <para>komplette recursion protection wurde entfernt.</para>
2212 <sect1 id="dokumentenvorlagen-und-variablen">
2213 <title>Dokumentenvorlagen und verfügbare Variablen</title>
2215 <sect2 id="dokumentenvorlagen-und-variablen.einführung">
2216 <title>Einführung</title>
2218 <para>Dies ist eine Auflistung der Standard-Dokumentenvorlagen und
2219 aller zur Bearbeitung verfügbaren Variablen. Eine Variable wird in
2220 einer Vorlage durch ihren Inhalt ersetzt, wenn sie in der Form
2221 <function><%variablenname%></function> verwendet wird. Für
2222 LaTeX- und HTML-Vorlagen kann man die Form dieser Tags auch verändern
2224 linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
2226 <para>Früher wurde hier nur über LaTeX gesprochen. Inzwischen
2227 unterstützt Lx-Office aber auch OpenDocument-Vorlagen. Sofern es nicht
2228 ausdrücklich eingeschränkt wird, gilt das im Folgenden gesagte für
2229 alle Vorlagenarten.</para>
2231 <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
2232 verfügbar als hier aufgelistet werden. Die meisten davon können
2233 allerdings innerhalb einer solchen Vorlage nicht sinnvoll verwendet
2234 werden. Wenn eine Auflistung dieser Variablen gewollt ist, so kann
2235 diese wie folgt erhalten werden:</para>
2239 <para><filename>SL/Form.pm</filename> öffnen und am Anfang die
2240 Zeile "<command>use Data::Dumper;</command>" einfügen.</para>
2244 <para>In <filename>Form.pm</filename> die Funktion
2245 <function>parse_template</function> suchen und hier die Zeile
2246 <command>print(STDERR Dumper($self));</command> einfügen.</para>
2250 <para>Einmal per Browser die gewünschte Vorlage "benutzen", z.B.
2251 ein PDF für eine Rechnung erzeugen.</para>
2255 <para>Im <filename>error.log</filename> Apache steht die Ausgabe
2256 der Variablen <varname>$self</varname> in der Form <varname>'key'
2257 => 'value',</varname>. Alle <varname>key</varname>s sind
2263 <sect2 id="dokumentenvorlagen-und-variablen.variablen-ausgeben">
2264 <title>Variablen ausgeben</title>
2266 <para>Um eine Variable auszugeben, müssen sie einfach nur zwischen die
2267 Tags geschrieben werden, also z.B.
2268 <varname><%variablenname%></varname>.</para>
2270 <para>Optional kann man auch mit Leerzeichen getrennte Flags angeben,
2271 die man aber nur selten brauchen wird. Die Syntax sieht also so aus:
2272 <varname><%variablenname FLAG1 FLAG2%></varname>. Momentan
2273 werden die folgenden Flags unterstützt:</para>
2277 <para><option>NOFORMAT</option> gilt nur für Zahlenwerte und gibt
2278 den Wert ohne Formatierung, also ohne Tausendertrennzeichen mit
2279 mit einem Punkt als Dezimaltrennzeichen aus. Nützlich z.B., wenn
2280 damit in der Vorlage z.B. von LaTeX gerechnet werden soll.</para>
2284 <para><parameter>NOESCAPE</parameter> unterdrückt das Escapen von
2285 Sonderzeichen für die Vorlagensprache. Wenn also in einer
2286 Variablen bereits gültiger LaTeX-Code steht und dieser von LaTeX
2287 auch ausgewertet und nicht wortwörtlich angezeigt werden soll, so
2288 ist dieses Flag sinnvoll.</para>
2292 <para>Beispiel:</para>
2294 <programlisting><%quototal NOFORMAT%></programlisting>
2297 <sect2 id="dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">
2298 <title>Verwendung in Druckbefehlen</title>
2300 <para>In der Admininstration können Drucker definiert werden. Auch im
2301 dort eingebbaren Druckbefehl können die hier aufgelisteten Variablen
2302 und Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach
2303 den Regeln der gängigen Shells formatiert, sodass Sonderzeichen wie
2304 <function>`...`</function> nicht zu unerwünschtem Verhalten
2307 <para>Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl,
2308 für das die Telefonnummer eines Ansprechpartners als Teil der
2309 Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das
2310 z.B. wie folgt aussehen:</para>
2312 <programlisting>send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%></programlisting>
2315 <sect2 id="dokumentenvorlagen-und-variablen.tag-style"
2316 xreflabel="Anfang und Ende der Tags verändern">
2317 <title>Anfang und Ende der Tags verändern</title>
2319 <para>Der Standardstil für Tags sieht vor, dass ein Tag mit dem
2320 Kleinerzeichen und einem Prozentzeichen beginnt und mit dem
2321 Prozentzeichen und dem Größerzeichen endet, beispielsweise
2322 <function><%customer%></function>. Da diese Form aber z.B. in
2323 LaTeX zu Problemen führen kann, weil das Prozentzeichen dort
2324 Kommentare einleitet, kann pro HTML- oder LaTeX-Dokumentenvorlage der
2325 Stil umgestellt werden.</para>
2327 <para>Dazu werden in die Datei Zeilen geschrieben, die mit dem für das
2328 Format gültigen Kommentarzeichen anfangen, dann
2329 <function>config:</function> enthalten, die entsprechende Option
2330 setzen und bei HTML-Dokumentenvorlagen mit dem Kommentarendzeichen
2331 enden. Beispiel für LaTeX:</para>
2333 <programlisting>% config: tag-style=($ $)</programlisting>
2335 <para>Dies würde Lx-Office dazu veranlassen, Variablen zu ersetzen,
2336 wenn sie wie folgt aussehen: <function>($customer$)</function>. Das
2337 äquivalente Beispiel für HTML-Dokumentenvorlagen sieht so aus:</para>
2339 <programlisting><!-- config: tag-style=($ $) --></programlisting>
2342 <sect2 id="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">
2343 <title>Zuordnung von den Dateinamen zu den Funktionen</title>
2345 <para>Diese folgende kurze Auflistung zeigt, welche Vorlage bei
2346 welcher Funktion ausgelesen wird. Dabei ist die Dateiendung
2347 "<filename>.ext</filename>" geeignet zu ersetzen:
2348 "<filename>.tex</filename>" für LaTeX-Vorlagen und
2349 "<filename>.odt</filename>" für OpenDocument-Vorlagen.</para>
2353 <term><filename>bin_list.ext</filename></term>
2356 <para>Lagerliste</para>
2361 <term><filename>check.ext</filename></term>
2369 <term><filename>invoice.ext</filename></term>
2372 <para>Rechnung</para>
2377 <term><filename>packing_list.ext</filename></term>
2380 <para>Packliste</para>
2385 <term><filename>pick_list.ext</filename></term>
2388 <para>Sammelliste</para>
2393 <term><filename>purchase_delivery_order.ext</filename></term>
2396 <para>Lieferschein (Einkauf)</para>
2401 <term><filename>purcharse_order.ext</filename></term>
2404 <para>Bestellung an Lieferanten</para>
2409 <term><filename>request_quotation.ext</filename></term>
2412 <para>Anfrage an Lieferanten</para>
2417 <term><filename>sales_delivery_order.ext</filename></term>
2420 <para>Lieferschein (Verkauf)</para>
2425 <term><filename>sales_order.ext</filename></term>
2428 <para>Bestellung</para>
2433 <term><filename>sales_quotation.ext</filename></term>
2436 <para>Angebot an Kunden</para>
2441 <term><filename>zahlungserinnerung.ext</filename></term>
2444 <para>Mahnung (Dateiname im Programm konfigurierbar)</para>
2449 <term><filename>zahlungserinnerung_invoice.ext</filename></term>
2452 <para>Rechnung über Mahngebühren (Dateiname im Programm
2453 konfigurierbar)</para>
2459 <sect2 id="dokumentenvorlagen-und-variablen.dateinamen-erweitert">
2460 <title>Sprache, Drucker und E-Mail</title>
2462 <para>Angeforderte Sprache und Druckerkürzel in den Dateinamen mit
2463 eingearbeitet. So wird aus der Vorlage
2464 <filename>sales_order.ext</filename> bei Sprache
2465 <function>de</function> und Druckerkürzel <function>lpr2</function>
2466 der Vorlagenname <filename>sales_order_de_lpr2.ext</filename>.
2467 Zusätzlich können für E-Mails andere Vorlagen erstellt werden, diese
2468 bekommen dann noch das Kürzel <filename>_email</filename>, der
2469 vollständige Vorlagenname wäre dann
2470 <filename>sales_order_email_de_lpr2.ext</filename>. In allen Fällen
2471 kann eine Standarddatei <filename>default.ext</filename> hinterlegt
2472 werden. Diese wird verwendet, wenn keine der anderen Varianten
2473 gefunden wird.</para>
2475 <para>Die vollständige Suchreihenfolge für einen Verkaufsauftrag mit
2476 der Sprache "de" und dem Drucker "lpr2", der per E-Mail im Format PDF
2477 verschickt wird, ist:</para>
2481 <para><filename>sales_order_email_de_lpr2.tex</filename></para>
2485 <para><filename>sales_order_de_lpr2.tex</filename></para>
2489 <para><filename>sales_order.tex</filename></para>
2493 <para><filename>default.tex</filename></para>
2497 <para>Die kurzen Varianten dieser Vorlagentitel müssen dann entweder
2498 Standardwerte anzeigen, oder die angeforderten Werte selbst auswerten,
2500 linkend="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"/>.</para>
2503 <sect2 id="dokumentenvorlagen-und-variablen.allgemeine-variablen">
2504 <title>Allgemeine Variablen, die in allen Vorlagen vorhanden
2507 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.meta"
2508 xreflabel="Metainformationen zur angeforderten Vorlage">
2509 <title>Metainformationen zur angeforderten Vorlage</title>
2511 <para>Diese Variablen liefern Informationen darüber welche Variante
2512 einer Vorlage der Benutzer angefragt hat. Sie sind nützlich für
2513 Vorlagenautoren, die aus einer zentralen Layoutvorlage die einzelnen
2514 Formulare einbinden möchten.</para>
2518 <term>template_meta.formname</term>
2521 <para>Basisname der Vorlage. Identisch mit der <link
2522 linkend="dokumentenvorlagen-und-variablen.zuordnung-dateinamen">Zurordnung
2523 zu den Dateinamen</link> ohne die Erweiterung. Ein
2524 Verkaufsauftrag enthält hier
2525 <constant>sales_order</constant>.</para>
2530 <term>template_meta.language.description</term>
2533 <para>Beschreibung der verwendeten Sprache</para>
2538 <term>template_meta.language.template_code</term>
2541 <para>Vorlagenürzel der verwendeten Sprache, identisch mit dem
2542 Kürzel das im Dateinamen verwendetet wird.</para>
2547 <term>template_meta.language.output_numberformat</term>
2550 <para>Zahlenformat der verwendeten Sprache in der Form
2551 "<constant>1.000,00</constant>". Experimentell! Nur
2552 interessant für Vorlagen die mit unformatierten Werten
2558 <term>template_meta.language.output_dateformat</term>
2561 <para>Datumsformat der verwendeten Sprache in der Form
2562 "<constant>dd.mm.yyyy</constant>". Experimentell! Nur
2563 interessant für Vorlagen die mit unformatierten Werten
2569 <term>template_meta.format</term>
2572 <para>Das angeforderte Format. Kann im Moment die Werte
2573 <constant>pdf</constant>, <constant>postscript</constant>,
2574 <constant>html</constant>, <constant>opendocument</constant>,
2575 <constant>opendocument_pdf</constant> und
2576 <constant>excel</constant> enthalten.</para>
2581 <term>template_meta.extension</term>
2584 <para>Dateierweiterung, wie im Dateinamen. Wird aus
2585 <constant>format</constant> entschieden.</para>
2590 <term>template_meta.media</term>
2593 <para>Ausgabemedium. Kann zur Zeit die Werte
2594 <constant>screen</constant> für Bildschirm,
2595 <constant>email</constant> für E-Mmail (triggert das
2596 <constant>_email</constant> Kürzel im Dateinamen),
2597 <constant>printer</constant> für Drucker, und
2598 <constant>queue</constant> für Warteschlange enthalten.</para>
2603 <term>template_meta.printer.description</term>
2606 <para>Beschreibung des ausgewählten Druckers</para>
2611 <term>template_meta.printer.template_code</term>
2614 <para>Vorlagenürzel des ausgewählten Druckers, identisch mit
2615 dem Kürzel das im Dateinamen verwendetet wird.</para>
2621 <sect3 id="dokumentenvorlagen-und-variablen.allgemeine-variablen.kunden-lieferanten">
2622 <title>Stammdaten von Kunden und Lieferanten</title>
2626 <term>account_number</term>
2629 <para>Kontonummer</para>
2637 <para>Name der Bank</para>
2642 <term>bank_code</term>
2645 <para>Bankleitzahl</para>
2653 <para>Bank-Identifikations-Code (Bank Identifier Code,
2659 <term>business</term>
2662 <para>Kunden-/Lieferantentyp</para>
2675 <term>contact</term>
2678 <para>Kontakt</para>
2683 <term>country</term>
2691 <term>cp_email</term>
2694 <para>Email des Ansprechpartners</para>
2699 <term>cp_givenname</term>
2702 <para>Vorname des Ansprechpartners</para>
2707 <term>cp_greeting</term>
2710 <para>Anrede des Ansprechpartners</para>
2715 <term>cp_name</term>
2718 <para>Name des Ansprechpartners</para>
2723 <term>cp_phone1</term>
2726 <para>Telefonnummer 1 des Ansprechpartners</para>
2731 <term>cp_phone2</term>
2734 <para>Telefonnummer 2 des Ansprechpartners</para>
2739 <term>cp_title</term>
2742 <para>Titel des Ansprechpartners</para>
2747 <term>creditlimit</term>
2750 <para>Kreditlimit</para>
2755 <term>customeremail</term>
2758 <para>Email des Kunden; nur für Kunden</para>
2763 <term>customerfax</term>
2766 <para>Faxnummer des Kunden; nur für Kunden</para>
2771 <term>customernotes</term>
2774 <para>Bemerkungen beim Kunden; nur für Kunden</para>
2779 <term>customernumber</term>
2782 <para>Kundennummer; nur für Kunden</para>
2787 <term>customerphone</term>
2790 <para>Telefonnummer des Kunden; nur für Kunden</para>
2795 <term>discount</term>
2806 <para>Emailadresse</para>
2814 <para>Faxnummer</para>
2819 <term>homepage</term>
2822 <para>Homepage</para>
2830 <para>Internationale Kontonummer (International Bank Account
2831 Number, IBAN)</para>
2836 <term>language</term>
2839 <para>Sprache</para>
2847 <para>Firmenname</para>
2852 <term>payment_description</term>
2855 <para>Name der Zahlart</para>
2860 <term>payment_terms</term>
2863 <para>Zahlungskonditionen</para>
2871 <para>Telefonnummer</para>
2876 <term>shiptocity</term>
2879 <para>Stadt (Lieferadresse) <link
2880 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2885 <term>shiptocontact</term>
2888 <para>Kontakt (Lieferadresse) <link
2889 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2894 <term>shiptocountry</term>
2897 <para>Land (Lieferadresse) <link
2898 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2903 <term>shiptodepartment1</term>
2906 <para>Abteilung 1 (Lieferadresse) <link
2907 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2912 <term>shiptodepartment2</term>
2915 <para>Abteilung 2 (Lieferadresse) <link
2916 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2921 <term>shiptoemail</term>
2924 <para>Email (Lieferadresse) <link
2925 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2930 <term>shiptofax</term>
2933 <para>Fax (Lieferadresse) <link
2934 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2939 <term>shiptoname</term>
2942 <para>Firmenname (Lieferadresse) <link
2943 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2948 <term>shiptophone</term>
2951 <para>Telefonnummer (Lieferadresse) <link
2952 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2957 <term>shiptostreet</term>
2960 <para>Straße und Hausnummer (Lieferadresse) <link
2961 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2966 <term>shiptozipcode</term>
2969 <para>Postleitzahl (Lieferadresse) <link
2970 linkend="dokumentenvorlagen-und-variablen.anmerkung-shipto">*</link></para>
2978 <para>Straße und Hausnummer</para>
2983 <term>taxnumber</term>
2986 <para>Steuernummer</para>
2994 <para>Umsatzsteuer-Identifikationsnummer</para>
2999 <term>vendoremail</term>
3002 <para>Email des Lieferanten; nur für Lieferanten</para>
3007 <term>vendorfax</term>
3010 <para>Faxnummer des Lieferanten; nur für Lieferanten</para>
3015 <term>vendornotes</term>
3018 <para>Bemerkungen beim Lieferanten; nur für Lieferanten</para>
3023 <term>vendornumber</term>
3026 <para>Lieferantennummer; nur für Lieferanten</para>
3031 <term>vendorphone</term>
3034 <para>Telefonnummer des Lieferanten; nur für
3040 <term>zipcode</term>
3043 <para>Postleitzahl</para>
3048 <note id="dokumentenvorlagen-und-variablen.anmerkung-shipto">
3049 <para>Anmerkung: Sind die <varname>shipto*</varname>-Felder in den
3050 Stammdaten nicht eingetragen, so haben die Variablen
3051 <varname>shipto*</varname> den gleichen Wert wie die die
3052 entsprechenden Variablen der Lieferdaten. Das bedeutet, dass sich
3053 einige <varname>shipto*</varname>-Variablen so nicht in den
3054 Stammdaten wiederfinden sondern schlicht Kopien der
3055 Lieferdatenvariablen sind (z.B.
3056 <varname>shiptocontact</varname>).</para>
3060 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-bearbeiter">
3061 <title>Informationen über den Bearbeiter</title>
3065 <term>employee_address</term>
3068 <para>Adressfeld</para>
3073 <term>employee_businessnumber</term>
3076 <para>Firmennummer</para>
3081 <term>employee_company</term>
3084 <para>Firmenname</para>
3089 <term>employee_co_ustid</term>
3092 <para>Usatzsteuer-Identifikationsnummer</para>
3097 <term>employee_duns</term>
3100 <para>DUNS-Nummer</para>
3105 <term>employee_email</term>
3113 <term>employee_fax</term>
3121 <term>employee_name</term>
3124 <para>voller Name</para>
3129 <term>employee_signature</term>
3132 <para>Signatur</para>
3137 <term>employee_taxnumber</term>
3140 <para>Steuernummer</para>
3145 <term>employee_tel</term>
3148 <para>Telefonnummer</para>
3154 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
3155 <title>Informationen über den Bearbeiter</title>
3159 <term>salesman_address</term>
3162 <para>Adressfeld</para>
3167 <term>salesman_businessnumber</term>
3170 <para>Firmennummer</para>
3175 <term>salesman_company</term>
3178 <para>Firmenname</para>
3183 <term>salesman_co_ustid</term>
3186 <para>Usatzsteuer-Identifikationsnummer</para>
3191 <term>salesman_duns</term>
3194 <para>DUNS-Nummer</para>
3199 <term>salesman_email</term>
3207 <term>salesman_fax</term>
3215 <term>salesman_name</term>
3218 <para>voller Name</para>
3223 <term>salesman_signature</term>
3226 <para>Signatur</para>
3231 <term>salesman_taxnumber</term>
3234 <para>Steuernummer</para>
3239 <term>salesman_tel</term>
3242 <para>Telefonnummer</para>
3248 <sect3 id="dokumentenvorlagen-und-variablen.allgemein-steuern">
3249 <title>Variablen für die einzelnen Steuern</title>
3261 <term>taxbase</term>
3264 <para>zu versteuernder Betrag</para>
3269 <term>taxdescription</term>
3272 <para>Name der Steuer</para>
3277 <term>taxrate</term>
3280 <para>Steuersatz</para>
3287 <sect2 id="dokumentenvorlagen-und-variablen.invoice">
3288 <title>Variablen in Rechnungen</title>
3290 <sect3 id="dokumentenvorlagen-und-variablen.invoice-allgemein">
3291 <title>Allgemeine Variablen</title>
3295 <term>creditremaining</term>
3298 <para>Verbleibender Kredit</para>
3303 <term>currency</term>
3306 <para>Währung</para>
3311 <term>cusordnumber</term>
3314 <para>Bestellnummer beim Kunden</para>
3319 <term>deliverydate</term>
3322 <para>Lieferdatum</para>
3327 <term>duedate</term>
3330 <para>Fälligkeitsdatum</para>
3335 <term>globalprojectnumber</term>
3338 <para>Projektnummer des ganzen Beleges</para>
3343 <term>globalprojectdescription</term>
3346 <para>Projekbeschreibung des ganzen Beleges</para>
3351 <term>intnotes</term>
3354 <para>Interne Bemerkungen</para>
3359 <term>invdate</term>
3362 <para>Rechnungsdatum</para>
3367 <term>invnumber</term>
3370 <para>Rechnungsnummer</para>
3375 <term>invtotal</term>
3378 <para>gesamter Rechnungsbetrag</para>
3386 <para>Bemerkungen der Rechnung</para>
3391 <term>orddate</term>
3394 <para>Auftragsdatum</para>
3399 <term>ordnumber</term>
3402 <para>Auftragsnummer, wenn die Rechnung aus einem Auftrag
3403 erstellt wurde</para>
3408 <term>payment_description</term>
3411 <para>Name der Zahlart</para>
3416 <term>payment_terms</term>
3419 <para>Zahlungskonditionen</para>
3424 <term>quodate</term>
3427 <para>Angebotsdatum</para>
3432 <term>quonumber</term>
3435 <para>Angebotsnummer</para>
3440 <term>shippingpoint</term>
3443 <para>Versandort</para>
3448 <term>shipvia</term>
3451 <para>Transportmittel</para>
3456 <term>subtotal</term>
3459 <para>Zwischensumme aller Posten ohne Steuern</para>
3467 <para>Restsumme der Rechnung (Summe abzüglich bereits
3468 bezahlter Posten)</para>
3473 <term>transaction_description</term>
3476 <para>Vorgangsbezeichnung</para>
3481 <term>transdate</term>
3484 <para>Auftragsdatum wenn die Rechnung aus einem Auftrag
3485 erstellt wurde</para>
3491 <sect3 id="dokumentenvorlagen-und-variablen.invoice-posten">
3492 <title>Variablen für jeden Posten auf der Rechnung</title>
3499 <para>Stellage</para>
3504 <term>description</term>
3507 <para>Artikelbeschreibung</para>
3512 <term>discount</term>
3515 <para>Rabatt als Betrag</para>
3520 <term>discount_sub</term>
3523 <para>Zwischensumme mit Rabatt</para>
3528 <term>drawing</term>
3531 <para>Zeichnung</para>
3539 <para>EAN-Code</para>
3552 <term>linetotal</term>
3555 <para>Zeilensumme (Anzahl * Einzelpreis)</para>
3560 <term>longdescription</term>
3563 <para>Langtext</para>
3568 <term>microfiche</term>
3571 <para>Mikrofilm</para>
3576 <term>netprice</term>
3579 <para>Nettopreis</para>
3584 <term>nodiscount_linetotal</term>
3587 <para>Zeilensumme ohne Rabatt</para>
3592 <term>nodiscount_sub</term>
3595 <para>Zwischensumme ohne Rabatt</para>
3603 <para>Artikelnummer</para>
3608 <term>ordnumber_oe</term>
3611 <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3612 aus einem Sammelauftrag erstellt wurde</para>
3617 <term>p_discount</term>
3620 <para>Rabatt in Prozent</para>
3625 <term>partnotes</term>
3628 <para>Die beim Artikel gespeicherten Bemerkungen</para>
3633 <term>partsgroup</term>
3636 <para>Warengruppe</para>
3641 <term>price_factor</term>
3644 <para>Der Preisfaktor als Zahl, sofern einer eingestellt
3650 <term>price_factor_name</term>
3653 <para>Der Name des Preisfaktors, sofern einer eingestellt
3659 <term>projectnumber</term>
3662 <para>Projektnummer</para>
3667 <term>projectdescription</term>
3670 <para>Projektbeschreibung</para>
3683 <term>reqdate</term>
3686 <para>Lieferdatum</para>
3691 <term>runningnumber</term>
3694 <para>Position auf der Rechnung (1, 2, 3...)</para>
3699 <term>sellprice</term>
3702 <para>Verkaufspreis</para>
3707 <term>serialnumber</term>
3710 <para>Seriennummer</para>
3715 <term>tax_rate</term>
3718 <para>Steuersatz</para>
3723 <term>transdate_oe</term>
3726 <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
3727 aus einem Sammelauftrag erstellt wurde</para>
3735 <para>Einheit</para>
3743 <para>Gewicht</para>
3748 <para>Für jeden Posten gibt es ein Unterarray mit den Informationen
3749 über Lieferanten und Lieferantenartikelnummer. Diese müssen mit
3750 einer <function>foreach</function>-Schleife ausgegeben werden, da
3751 für jeden Artikel mehrere Lieferanteninformationen hinterlegt sein
3752 können. Die Variablen dafür lauten:</para>
3759 <para>Lieferant</para>
3767 <para>Lieferantenartikelnummer</para>
3773 <sect3 id="dokumentenvorlagen-und-variablen.invoice-zahlungen">
3774 <title>Variablen für die einzelnen Zahlungseingänge</title>
3778 <term>payment</term>
3786 <term>paymentaccount</term>
3794 <term>paymentdate</term>
3802 <term>paymentmemo</term>
3810 <term>paymentsource</term>
3819 <sect3 id="dokumentenvorlagen-und-variablen.benutzerdefinierte-variablen-vc">
3820 <title>Benutzerdefinierte Kunden- und Lieferantenvariablen</title>
3822 <para>Die vom Benutzer definierten Variablen für Kunden und
3823 Lieferanten stehen beim Ausdruck von Einkaufs- und Verkaufsbelegen
3824 ebenfalls zur Verfügung. Ihre Namen setzen sich aus dem Präfix
3825 <varname>vc_cvar_</varname> und dem vom Benutzer festgelegten
3826 Variablennamen zusammen.</para>
3828 <para>Beispiel: Der Benutzer hat eine Variable namens
3829 <varname>number_of_employees</varname> definiert, die die Anzahl der
3830 Mitarbeiter des Unternehmens enthält. Diese Variable steht dann
3831 unter dem Namen <varname>vc_cvar_number_of_employees</varname> zur
3836 <sect2 id="dokumentenvorlagen-und-variablen.dunning">
3837 <title>Variablen in Mahnungen und Rechnungen über Mahngebühren</title>
3839 <sect3 id="dokumentenvorlagen-und-variablen.dunning-vorlagennamen">
3840 <title>Namen der Vorlagen</title>
3842 <para>Die Namen der Vorlagen werden im System-Menü vom Benutzer
3843 eingegeben. Wird für ein Mahnlevel die Option zur automatischen
3844 Erstellung einer Rechnung über die Mahngebühren und Zinsen
3845 aktiviert, so wird der Name der Vorlage für diese Rechnung aus dem
3846 Vorlagenname für diese Mahnstufe mit dem Zusatz
3847 <constant>_invoice</constant> gebildet. Weiterhin werden die Kürzel
3848 für die ausgewählte Sprache und den ausgewählten Drucker
3852 <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
3853 <title>Allgemeine Variablen in Mahnungen</title>
3855 <para>Die Variablen des Verkäufers stehen wie gewohnt als
3856 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
3857 Kunden stehen als Variablen <varname>name</varname>,
3858 <varname>street</varname>, <varname>zipcode</varname>,
3859 <varname>city</varname>, <varname>country</varname>,
3860 <varname>department_1</varname>, <varname>department_2</varname>,
3861 und <varname>email</varname> zur Verfügung.</para>
3863 <para>Weitere Variablen beinhalten:</para>
3867 <term>dunning_date</term>
3870 <para>Datum der Mahnung</para>
3875 <term>dunning_duedate</term>
3878 <para>Fälligkeitsdatum für diese Mahhnung</para>
3883 <term>dunning_id</term>
3886 <para>Mahnungsnummer</para>
3894 <para>Kummulative Mahngebühren</para>
3899 <term>interest_rate</term>
3902 <para>Zinssatz per anno in Prozent</para>
3907 <term>total_amount</term>
3910 <para>Gesamter noch zu zahlender Betrag als
3911 <function>fee</function> + <function>total_interest</function>
3912 + <function>total_open_amount</function></para>
3917 <term>total_interest</term>
3920 <para>Zinsen per anno über alle Rechnungen</para>
3925 <term>total_open_amount</term>
3928 <para>Summe über alle offene Beträge der Rechnungen</para>
3934 <sect3 id="dokumentenvorlagen-und-variablen.dunning-details">
3935 <title>Variablen für jede gemahnte Rechnung in einer Mahnung</title>
3939 <term>dn_amount</term>
3942 <para>Rechnungssumme (brutto)</para>
3947 <term>dn_duedate</term>
3950 <para>Originales Fälligkeitsdatum der Rechnung</para>
3955 <term>dn_dunning_date</term>
3958 <para>Datum der Mahnung</para>
3963 <term>dn_dunning_duedate</term>
3966 <para>Fälligkeitsdatum der Mahnung</para>
3974 <para>Kummulative Mahngebühr</para>
3979 <term>dn_interest</term>
3982 <para>Zinsen per anno für diese Rechnung</para>
3987 <term>dn_invnumber</term>
3990 <para>Rechnungsnummer</para>
3995 <term>dn_linetotal</term>
3998 <para>Noch zu zahlender Betrag (ergibt sich aus
3999 <varname>dn_open_amount</varname> + <varname>dn_fee</varname>
4000 + <varname>dn_interest</varname>)</para>
4005 <term>dn_netamount</term>
4008 <para>Rechnungssumme (netto)</para>
4013 <term>dn_open_amount</term>
4016 <para>Offener Rechnungsbetrag</para>
4021 <term>dn_ordnumber</term>
4024 <para>Bestellnummer</para>
4029 <term>dn_transdate</term>
4032 <para>Rechnungsdatum</para>
4037 <term>dn_curr</term>
4040 <para>Währung, in der die Rechnung erstellt wurde. (Die
4041 Rechnungsbeträge sind aber immer in der Hauptwährung)</para>
4047 <sect3 id="dokumentenvorlagen-und-variablen.dunning-invoice">
4048 <title>Variablen in automatisch erzeugten Rechnungen über
4049 Mahngebühren</title>
4051 <para>Die Variablen des Verkäufers stehen wie gewohnt als
4052 <varname>employee_...</varname> zur Verfügung. Die Adressdaten des
4053 Kunden stehen als Variablen <varname>name</varname>,
4054 <varname>street</varname>, <varname>zipcode</varname>,
4055 <varname>city</varname>, <varname>country</varname>,
4056 <varname>department_1</varname>, <varname>department_2</varname>,
4057 und <varname>email</varname> zur Verfügung.</para>
4059 <para>Weitere Variablen beinhalten:</para>
4063 <term>duedate</term>
4066 <para>Fälligkeitsdatum der Rechnung</para>
4071 <term>dunning_id</term>
4074 <para>Mahnungsnummer</para>
4082 <para>Mahngebühren</para>
4087 <term>interest</term>
4095 <term>invamount</term>
4098 <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
4099 <varname>interest</varname>)</para>
4104 <term>invdate</term>
4107 <para>Rechnungsdatum</para>
4112 <term>invnumber</term>
4115 <para>Rechnungsnummer</para>
4122 <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
4123 <title>Variablen in anderen Vorlagen</title>
4126 <title>Einführung</title>
4128 <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
4129 Rechnung. Allerdings heißen die Variablen, die mit
4130 <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
4131 fangen sie mit <varname>quo</varname> für "quotation" an:
4132 <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
4133 wiederum fangen sie mit <varname>ord</varname> für "order" an:
4134 <varname>ordnumber</varname> für Bestellnummer etc.</para>
4136 <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
4137 vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
4138 sind Variablen, die vom Geschäftsablauf her in der entsprechenden
4139 Vorlage keine Bedeutung haben oder noch nicht belegt sein
4142 <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
4143 in Rechnungen aufgeführt.</para>
4146 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
4147 <title>Angebote und Preisanfragen</title>
4151 <term>quonumber</term>
4154 <para>Angebots- bzw. Anfragenummer</para>
4159 <term>reqdate</term>
4162 <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
4163 Preisanfragen)</para>
4168 <term>transdate</term>
4171 <para>Angebots- bzw. Anfragedatum</para>
4177 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
4178 <title>Auftragsbestätigungen und Lieferantenaufträge</title>
4182 <term>ordnumber</term>
4185 <para>Auftragsnummer</para>
4190 <term>reqdate</term>
4193 <para>Lieferdatum</para>
4198 <term>transdate</term>
4201 <para>Auftragsdatum</para>
4207 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
4208 <title>Lieferscheine (Verkauf und Einkauf)</title>
4212 <term>cusordnumber</term>
4215 <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
4216 des Lieferanten (im Einkauf)</para>
4221 <term>donumber</term>
4224 <para>Lieferscheinnummer</para>
4229 <term>transdate</term>
4232 <para>Lieferscheindatum</para>
4237 <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
4238 mit den Informationen darüber, von welchem Lager und Lagerplatz aus
4239 die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
4240 Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
4241 <function>foreach</function>-Schleife ausgegeben werden. Diese
4242 Variablen sind:</para>
4249 <para>Lagerplatz</para>
4254 <term>si_chargenumber</term>
4257 <para>Chargennummer</para>
4262 <term>si_bestbefore</term>
4265 <para>Mindesthaltbarkeit</para>
4270 <term>si_number</term>
4273 <para>Artikelnummer</para>
4281 <para>Anzahl bzw. Menge</para>
4286 <term>si_runningnumber</term>
4289 <para>Positionsnummer (1, 2, 3 etc)</para>
4294 <term>si_unit</term>
4297 <para>Einheit</para>
4302 <term>si_warehouse</term>
4311 <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
4312 <title>Variablen für Sammelrechnung</title>
4316 <term>c0total</term>
4319 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit < 30
4325 <term>c30total</term>
4328 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
4329 und < 60 Tage</para>
4334 <term>c60total</term>
4337 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
4338 und < 90 Tage</para>
4343 <term>c90total</term>
4346 <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90
4355 <para>Gesamtbetrag aller Rechnungen</para>
4360 <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
4364 <term>invnumber</term>
4367 <para>Rechnungsnummer</para>
4372 <term>invdate</term>
4375 <para>Rechnungsdatum</para>
4380 <term>duedate</term>
4383 <para>Fälligkeitsdatum</para>
4391 <para>Summe der Rechnung</para>
4399 <para>Noch offener Betrag der Rechnung</para>
4407 <para>Noch offener Rechnungsbetrag mit Fälligkeit < 30
4416 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
4425 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
4434 <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 90
4442 <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
4443 <title>Blöcke, bedingte Anweisungen und Schleifen</title>
4445 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
4446 <title>Einfürhung</title>
4448 <para>Der Parser kennt neben den Variablen einige weitere
4449 Konstrukte, die gesondert behandelt werden. Diese sind wie
4450 Variablennamen in spezieller Weise markiert:
4451 <command><%anweisung%> ... <%end%></command></para>
4453 <para>Anmerkung zum <command><%end%></command>: Der besseren
4454 Verständlichkeit halber kann man nach dem <command>end</command>
4455 noch beliebig weitere Wörter schreiben, um so zu markieren, welche
4456 Anweisung (z.B. <command>if</command> oder
4457 <command>foreach</command>) damit abgeschlossen wird.</para>
4459 <para>Beispiel: Lautet der Beginn eines Blockes z.B.
4460 <command><%if type == "sales_quotation"%></command>, so könnte
4461 er mit <command><%end%></command> genauso abgeschlossen werden
4462 wie mit <command><%end if%></command> oder auch
4463 <command><%end type == "sales_quotation"%></command>.</para>
4466 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
4467 <title>Der if-Block</title>
4469 <programlisting><%if variablenname%>
4471 <%end%></programlisting>
4473 <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
4474 und dem "end" werden nur ausgegeben, wenn die Variable
4475 <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
4477 <para>Die Bedingung kann auch negiert werden, indem das Wort
4478 <function>not</function> nach dem <filename>if</filename> verwendet
4479 wird. Beispiel:</para>
4481 <programlisting><%if not cp_greeting%>
4483 <%end%></programlisting>
4485 <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
4486 oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
4487 einer Variablen mit einer festen Zeichenkette oder einer anderen
4488 Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
4489 oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
4490 die rechte Seite des Vergleichsoperators in Anführungszeichen
4491 gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
4492 anderer Variablen). Zwei Beispiele, die beide Vergleiche
4495 <programlisting><%if var1 == "Wert"%></programlisting>
4497 <para>Testet die Variable <varname>var1</varname> auf
4498 übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
4499 Mittels <function>!=</function> anstelle von <function>==</function>
4500 würde auf Ungleichheit getestet.</para>
4502 <programlisting>%if var1 == var2%></programlisting>
4504 <para>Testet die Variable <varname>var1</varname> auf
4505 übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
4506 <function>!=</function> anstelle von <function>==</function> würde
4507 auf Ungleichheit getestet.</para>
4509 <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
4510 auch Tests auf übereinstimmung mit regulären Ausdrücken ohne
4511 Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
4512 dieselbe Syntax wie oben nur mit <function>=~</function> und
4513 <function>!~</function> als Vergleichsoperatoren.</para>
4515 <para>Beispiel für einen Test, ob die Variable
4516 <varname>intnotes</varname> (interne Bemerkungen) das Wort
4517 <constant>schwierig</constant> enthält:</para>
4519 <programlisting><%if intnotes =~ "schwierig"%></programlisting>
4522 <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
4523 <title>Der foreach-Block</title>
4525 <programlisting><%foreach variablenname%>
4527 <%end%></programlisting>
4529 <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
4530 wie das Perl-Array der Variablen <varname>variablenname</varname>
4531 Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
4532 Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
4533 benutzt. In jedem Durchlauf werden die <link
4534 linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
4535 Variablen</link> jeweils auf den Wert für die aktuelle Position
4538 <para>Die Syntax sieht normalerweise wie folgt aus:</para>
4540 <programlisting><%foreach number%>
4541 Position: <%runningnumber%>
4542 Anzahl: <%qty%>
4543 Artikelnummer: <%number%>
4544 Beschreibung: <%description%>
4546 <%end%></programlisting>
4548 <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
4549 <function><%foreach%></function>-Block innerhalb einer
4550 Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
4551 wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
4552 Inhalt zwischen <function><%foreach%></function> und
4553 <function><%end%></function> wiederholt, nicht aber die
4554 komplette Zeile, in der er steht.</para>
4558 <sect2 id="dokumentenvorlagen-und-variablen.markup">
4559 <title>Markup-Code zur Textformatierung innerhalb von
4562 <para>Wenn der Benutzer innhalb von Formularen in Lx-Office Text
4563 anders formatiert haben möchte, so ist dies begrenzt möglich.
4564 Lx-Office unterstützt die Textformatierung mit HTML-ähnlichen Tags.
4565 Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
4566 Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
4567 dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
4568 (HTML oder PDF über LaTeX) umgesetzt.</para>
4570 <para>Die unterstützen Formatierungen sind:</para>
4574 <term><b>Text</b></term>
4577 <para>Text wird in Fettdruck gesetzt.</para>
4582 <term><i>Text</i></term>
4585 <para>Text wird kursiv gesetzt.</para>
4590 <term><u>Text</u></term>
4593 <para>Text wird unterstrichen.</para>
4598 <term><s>Text</s></term>
4601 <para>Text wird durchgestrichen. Diese Formatierung ist nicht
4602 bei der Ausgabe als PDF über LaTeX verfügbar.</para>
4607 <term><bullet></term>
4610 <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
4616 <para>Der Befehl <command><bullet></command> funktioniert
4617 momentan auch nur in Latex-Vorlagen.</para>
4621 <sect1 id="excel-templates">
4622 <title>Excel-Vorlagen</title>
4624 <sect2 id="excel-templates.summary">
4625 <title>Zusammenfassung</title>
4627 <para>Dieses Dokument beschreibt den Mechanismus, mit dem
4628 Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
4632 <sect2 id="excel-templates.usage">
4633 <title>Bedienung</title>
4635 <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
4636 werden. Die Konfigurationsoption heißt <varname>excel_templates =
4637 1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
4639 <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
4640 anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
4641 werden. In den normalen Verkaufsmasken taucht nun
4642 <constant>Excel</constant> als auswählbares Format auf und kann von da
4643 an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
4645 <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
4646 eine Angebotsvorlage und wird unter dem internen Namen der Angebote
4647 <filename>sales_quotation.xls</filename> gespeichert.</para>
4650 <sect2 id="excel-templates.syntax">
4651 <title>Variablensyntax</title>
4653 <para>Einfache Syntax:
4654 <command><<varname>></command></para>
4656 <para>Dabei sind <constant><<</constant> und
4657 <constant>>></constant> die Delimiter. Da Excel auf festen
4658 Breiten besteht, kann der Tag künstlich verlängert werden, indem
4659 weitere <constant><</constant> oder <constant>></constant>
4660 eingefügt werden. Der Tag muss nicht symmetrisch sein.
4663 <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4665 <para>Um die Limitierung der festen Breite zu reduzieren, können
4666 weitere Variablen in einem Block interpoliert werden. Whitespace wird
4667 dazwishen dann erhalten. Beispiel:</para>
4669 <programlisting><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4671 <para>Die Variablen werden interpoliert, und linksbündig mit
4672 Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
4673 lang, werden überzählige Zeichen abgeschnitten.</para>
4675 <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
4676 der Block mit einem Leerzeichen anfängt. Beispiel:</para>
4678 <programlisting><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
4680 <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
4681 Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
4685 <sect2 id="excel-templates.limitations">
4686 <title>Einschränkungen</title>
4688 <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
4689 mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
4690 beschränkt sich daher darauf, Textstellen exakt durch einen anderen
4691 Text zu ersetzen.</para>
4693 <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
4694 <command><%if%></command> und
4695 <command><%foreach%></command> nicht vorhanden. Der Delimiter
4696 <constant><% %></constant> kommt in den Headerinformationen
4697 evtl. vor. Deshalb wurde auf den sichereren Delimiter
4698 <constant><<</constant> und <constant>>></constant>
4703 <sect1 id="devel.fcgi">
4704 <title>Entwicklung unter FastCGI</title>
4706 <sect2 id="devel.fcgi.general">
4707 <title>Allgemeines</title>
4709 <para>Wenn Änderungen in der Konfiguration von Lx-Office gemacht
4710 werden, muss der Webserver neu gestartet werden.</para>
4712 <para>Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu
4713 achten. Dadurch, dass das Programm in einer Endlosschleife läuft,
4714 müssen folgende Aspekte beachtet werden.</para>
4717 <sect2 id="devel.fcgi.exiting">
4718 <title>Programmende und Ausnahmen</title>
4720 <para>Betrifft die Funktionen <function>warn</function>,
4721 <function>die</function>, <function>exit</function>,
4722 <function>carp</function> und <function>confess</function>.</para>
4724 <para>Fehler, die dass Programm normalerweise sofort beenden (fatale
4725 Fehler), werden mit dem FastCGI Dispatcher abgefangen, um das Programm
4726 am Laufen zu halten. Man kann mit <function>die</function>,
4727 <function>confess</function> oder <function>carp</function> Fehler
4728 ausgeben, die dann vom Dispatcher angezeigt werden. Die Lx-Office
4729 eigene <function>$::form-</function>error()> tut im Prinzip das
4730 Gleiche, mit ein paar Extraoptionen. <function>warn</function> und
4731 <function>exit</function> hingegen werden nicht abgefangen.
4732 <function>warn</function> wird direkt nach STDERR, also in Server Log
4733 eine Nachricht schreiben (sofern in der Konfiguration nicht die
4734 Warnungen in das Lx-Office Log umgeleitet wurden), und
4735 <function>exit</function> wird die Ausführung beenden.</para>
4737 <para>Prinzipiell ist es kein Beinbruch, wenn sich der Prozess
4738 beendet, fcgi wird ihn sofort neu starten. Allerdings sollte das die
4739 Ausnahme sein. Quintessenz: Bitte kein <function>exit</function>
4740 benutzen, alle anderen Exceptionmechanismen sind ok.</para>
4743 <sect2 id="devel.fcgi.globals">
4744 <title>Globale Variablen</title>
4746 <para>Um zu vermeiden, dass Informationen von einem Request in einen
4747 anderen gelangen, müssen alle globalen Variablen vor einem Request
4748 sauber initialisiert werden. Das ist besonders wichtig im
4749 <varname>$::cgi</varname> und <varname>$::auth</varname> Objekt, weil
4750 diese nicht gelöscht werden pro Instanz, sondern persistent gehalten
4753 <para>In <classname>SL::Dispatcher</classname> gibt es einen sauber
4754 abgetrennten Block, der alle kanonischen globalen Variablen listet und
4755 erklärt. Bitte keine anderen einführen ohne das sauber zu
4756 dokumentieren.</para>
4758 <para>Datenbankverbindungen wird noch ein Guide verfasst werden, wie
4759 man sicher geht, dass man die richtige erwischt.</para>
4762 <sect2 id="devel.fcgi.performance">
4763 <title>Performance und Statistiken</title>
4765 <para>Die kritischen Pfade des Programms sind die Belegmasken, und
4766 unter diesen ganz besonders die Verkaufsrechnungsmaske. Ein Aufruf der
4767 Rechnungsmaske in Lx-Office 2.4.3 stable dauert auf einem Core2duo mit
4768 4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
4769 sind es je nach Menge der definierten Variablen 1-2s. Ab der
4770 Moose/Rose::DB Version sind es 5-6s.</para>
4772 <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
4773 den kritischen Pfaden, unter 0,15 sonst.</para>
4776 <sect2 id="devel.fcgi.known-issues">
4777 <title>Bekannte Probleme</title>
4779 <sect3 id="devel.fcgi.known-issues.encoding">
4780 <title>Encoding Awareness</title>
4782 <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
4783 fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
4784 falsch kodierte Zeichen eher unwissend, und geben sie einfach
4785 weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
4786 das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
4792 <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
4793 <title>SQL-Upgradedateien</title>
4795 <sect2 id="db-upgrade-files.introduction" xreflabel="Einführung in die Datenbank-Upgradedateien">
4796 <title>Einführung</title>
4799 Der alte Mechanismus für SQL-Upgradescripte, der auf einer Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
4800 diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele Entwicklung im stable- und unstable-Baum betrifft.
4804 Dieser Mechanismus wurde für Lx-Office 2.4.1 deutlich erweitert. Es werden weiterhin alle Scripte aus sql/Pg-upgrade
4805 ausgeführt. Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In diesem Verzeichnis muss pro Datenbankupgrade eine
4806 Datei existieren, die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige Kontrollinformationen enthält.
4810 Neu sind die Kontrollinformationen, die Abhängigkeiten und Prioritäten definieren können werden, sodass Datenbankscripte zwar in
4811 einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
4812 angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern mehr braucht.
4816 Lx-Office merkt sich dabei, welches der Upgradescripte in sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht erneut
4817 aus. Dazu dient die Tabelle "schema_info", die bei der Anmeldung automatisch angelegt wird.
4821 <sect2 id="db-upgrade-files.format" xreflabel="Format der Upgradedateien">
4822 <title>Format der Kontrollinformationen</title>
4825 Die Kontrollinformationen sollten sich am Anfang der jeweiligen Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
4826 hat dabei das folgende Format:
4830 Für SQL-Upgradedateien:
4833 <programlisting>-- @key: value</programlisting>
4836 Für Perl-Upgradedateien:
4839 <programlisting># @key: value</programlisting>
4842 Leerzeichen vor "<varname>value</varname>" werden entfernt.
4846 Die folgenden Schlüsselworte werden verarbeitet:
4854 Wird zwingend benötigt. Dies ist der "Name" des Upgrades. Dieser "tag" kann von anderen Kontrolldateien in ihren Abhängigkeiten
4855 verwendet werden (Schlüsselwort "<varname>depends</varname>"). Der "tag" ist auch der Name, der in der Datenbank eingetragen wird.
4859 Normalerweise sollte die Kontrolldatei genau so heißen wie der "tag", nur mit der Endung ".sql" bzw. "pl".
4863 Ein Tag darf nur aus alphanumerischen Zeichen sowie den Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht erlaubt und
4864 sollten stattdessen mit Unterstrichen ersetzt werden.
4870 <term>charset</term>
4873 Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
4874 Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags der Zeichensatz "<literal>ISO-8859-15</literal>"
4881 <term>description</term>
4884 Benötigt. Eine Beschreibung, was in diesem Update passiert. Diese wird dem Benutzer beim eigentlichen Datenbankupdate
4885 angezeigt. Während der Tag in englisch gehalten sein sollte, sollte die Beschreibung auf Deutsch erfolgen.
4891 <term>depends</term>
4894 Optional. Eine mit Leerzeichen getrennte Liste von "tags", von denen dieses Upgradescript abhängt. Lx-Office stellt sicher, dass
4895 die in dieser Liste aufgeführten Scripte bereits durchgeführt wurden, bevor dieses Script ausgeführt wird.
4899 Abhängigkeiten werden rekursiv betrachtet. Wenn also ein Script "b" existiert, das von Änderungen in "a" abhängt, und eine neue
4900 Kontrolldatei für "c" erstellt wird, die von Änderungen in "a" und "b" abhängt, so genügt es, in "c" nur den Tag "b" als
4901 Abhängigkeit zu definieren.
4905 Es ist nicht erlaubt, sich selbst referenzierende Abhängigkeiten zu definieren (z.B. "a" -> "b",
4906 "b" -> "c" und "c" -> "a").
4912 <term>priority</term>
4915 Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in der Scripte ausgeführt werden, die die gleichen Abhängigkeitstiefen
4916 besitzen. Fehlt dieser Parameter, so wird der Wert 1000 benutzt.
4920 Dies ist reine Kosmetik. Für echte Reihenfolgen muss "depends" benutzt werden. Lx-Office sortiert die auszuführenden Scripte
4921 zuerst nach der Abhängigkeitstiefe (wenn "z" von "y" abhängt und "y" von "x", so hat "z" eine Abhängigkeitstiefe von 2, "y" von 1
4922 und "x" von 0. "x" würde hier zuerst ausgeführt, dann "y", dann "z"), dann nach der Priorität und bei gleicher Priorität
4923 alphabetisch nach dem "tag".
4930 <sect2 id="db-upgrade-files.dbupgrade-tool" xreflabel="Hilfsscript dbupgrade2_tool.pl">
4931 <title>Hilfsscript dbupgrade2_tool.pl</title>
4934 Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern, existiert ein Hilfsscript namens
4935 "<filename>scripts/dbupgrade2_tool.pl</filename>". Es muss aus dem Lx-Office-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses
4936 Tool liest alle Datenbankupgradescripte aus dem Verzeichnis <filename>sql/Pg-upgrade2</filename> aus. Es benutzt dafür die gleichen
4937 Methoden wie Lx-Office selber, sodass alle Fehlersituationen von der Kommandozeile überprüft werden können.
4941 Wird dem Script kein weiterer Parameter übergeben, so wird nur eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
4942 sich aber auch Informationen auf verschiedene Art ausgeben lassen:
4947 <para>Listenform: "<command>./scripts/dbupgrade2_tool.pl --list</command>"</para>
4950 Gibt eine Liste aller Scripte aus. Die Liste ist in der Reihenfolge sortiert, in der Lx-Office die Scripte ausführen würde. Es
4951 werden neben der Listenposition der Tag, die Abhängigkeitstiefe und die Priorität ausgegeben.
4956 <para>Baumform: "<command>./scripts/dbupgrade2_tool.pl --tree</command>"</para>
4959 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von denen keine
4960 anderen abhängen. Die Unterknoten sind Scripte, die beim übergeordneten Script als Abhängigkeit eingetragen sind.
4964 <listitem id="db-upgrade-files.dbupgrade-tool.reverse-tree">
4965 <para>Umgekehrte Baumform: "<command>./scripts/dbupgrade2_tool.pl --rtree</command>"</para>
4968 Listet alle Tags in Baumform basierend auf den Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte mit der geringsten
4969 Abhängigkeitstiefe. Die Unterknoten sind Scripte, die das übergeordnete Script als Abhängigkeit eingetragen haben.
4974 <para>Baumform mit Postscriptausgabe: "<command>./scripts/dbupgrade2_tool.pl --graphviz</command>"</para>
4977 Benötigt das Tool "<command>graphviz</command>", um mit seiner Hilfe die <link
4978 linkend="db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte Baumform</link> in eine Postscriptdatei namens
4979 "<filename>db_dependencies.ps</filename>" auszugeben. Dies ist vermutlich die übersichtlichste Form, weil hierbei jeder Knoten nur
4980 einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben werden.
4986 Scripte, von denen kein anderes Script abhängt: "<command>./scripts/dbupgrade2_tool.pl --nodeps</command>"
4990 Listet die Tags aller Scripte auf, von denen keine anderen Scripte abhängen.
4997 <sect1 id="translations-languages" xreflabel="Translations and languages">
4998 <title>Translations and languages</title>
5000 <sect2 id="translations-languages.introduction"
5001 xreflabel="Introduction to translations and languages">
5002 <title>Introduction</title>
5005 <para>Dieser Abschnitt ist in Englisch geschrieben, um
5006 internationalen Übersetzern die Arbeit zu erleichtern.</para>
5009 <para>This section describes how localization packages in Lx-Office
5010 are built. Currently the only language fully supported is German, and
5011 since most of the internal messages are held in English the English
5012 version is usable too.</para>
5014 <para>A stub version of French is included but not functunal at this
5018 <sect2 id="translations-languages.file-structure"
5019 xreflabel="File structure">
5020 <title>File structure</title>
5022 <para>The structure of locales in Lx-Office is:</para>
5024 <programlisting>lx-office/locale/<langcode>/</programlisting>
5026 <para>where <langcode> stands for an abbreviation of the
5027 language package. The builtin packages use two letter <ulink
5028 url="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</ulink> codes,
5029 but the actual name is not relevant for the program and can easily be
5031 url="http://en.wikipedia.org/wiki/IETF_language_tag">IETF language
5032 tags</ulink> (i.e. "en_GB"). In fact the original language packages
5033 from SQL Ledger are named in this way.</para>
5035 <para>In such a language directory the following files are
5040 <term>LANGUAGE</term>
5043 <para>This file is mandatory.</para>
5045 <para>The <filename>LANGUAGE</filename> file contains the self
5046 descripted name of the language. It should contain a native
5047 representation first, and in parenthesis an english translation
5048 after that. Example:</para>
5050 <programlisting>Deutsch (German)</programlisting>
5055 <term>charset</term>
5058 <para>This file should be present.</para>
5060 <para>The <filename>charset</filename> file describes which
5061 charset a language package is written in and applies to all
5062 other language files in the package. It is possible to write
5063 some language packages without an explicit charset, but it is
5064 still strongly recommended. You'll never know in what
5065 environment your language package will be used, and neither
5066 UTF-8 nor Latin1 are guaranteed.</para>
5068 <para>The whole content of this file is a string that can be
5069 recognized as a valid charset encoding. Example:</para>
5071 <programlisting>UTF-8</programlisting>
5079 <para>This file is mandatory.</para>
5081 <para>The central translation file. It is essentially an inline
5082 Perl script autogenerated by <command>locales.pl</command>. To
5083 generate it, generate the directory and the two files mentioned
5084 above, and execute the following command:</para>
5086 <programlisting>scripts/locales.pl <langcode></programlisting>
5088 <para>Otherwise you can simply copy one of the other languages.
5089 You will be told how many are missing like this:</para>
5091 <programlisting>$ scripts/locales.pl en
5092 English - 0.6% - 2015/2028 missing</programlisting>
5094 <para>A file named "<filename>missing</filename>" will be
5095 generated and can be edited. You can also edit the
5096 "<filename>all</filename>" file directly. Edit everything you
5097 like to fit the target language and execute
5098 <command>locales.pl</command> again. See how the missing words
5104 <term>Num2text</term>
5107 <para>Legacy code from SQL Ledger. It provides a means for
5108 numbers to be converted into natural language, like
5109 <literal>1523 => one thousand five hundred twenty
5110 three</literal>. If you want to provide it, it must be inlinable
5111 Perl code which provides a <function>num2text</function> sub. If
5112 an <function>init</function> sub exists it will be executed
5115 <para>Only used in the check and receipt printing module.</para>
5120 <term>special_chars</term>
5123 <para>Lx-Office comes with a lot of interfaces to different
5124 formats, some of which are rather picky with their accepted
5125 charset. The <filename>special_chars</filename> file contains a
5126 listing of chars not suited for different file format and
5127 provides substitutions. It is written in "Simple Ini" style,
5128 containing a block for every file format.</para>
5130 <para>First entry should be the order of substitution for
5131 entries as a whitespace separated list. All entries are
5132 interpolated, so <literal>\n</literal>, <literal>\x20</literal>
5133 and <literal>\\</literal> all work.</para>
5135 <para>After that every entry is a special char that should be
5136 translated when writing text into such a file.</para>
5138 <para>Example:</para>
5140 <programlisting>[Template/XML]
5141 order=& < > \n
5145 \n=<br></programlisting>
5147 <para>Note the importance of the order in this example.
5148 Substituting < and > befor & would lead to $gt; become
5151 <para>For a list of valid formats, see the German
5152 <filename>special_chars</filename> entry. As of this writing the
5153 following are recognized:</para>
5155 <programlisting>HTML
5160 Template/OpenDocument
5161 filenames</programlisting>
5163 <para>The last of which is very machine dependant. Remember that
5164 a lot of characters are forbidden by some filesystems, for
5165 exmaple MS Windows doesn't like ':' in its files where Linux
5166 doesn't mind that. If you want the files created with your
5167 language pack to be portable, find all chars that could cause
5173 <term>missing</term>
5176 <para>This file is not a part of the language package
5179 <para>This is a file generated by
5180 <command>scripts/locales.pl</command> while processing your
5181 locales. It's only to have the missing entries singled out and
5182 does not belong to a language package.</para>
5190 <para>This file is not a part of the language package
5193 <para>Another file generated by
5194 <command>scripts/locales.pl</command>. If for any reason a
5195 translation does not appear anymore and can be deleted, it gets
5196 moved here. The last 50 or so entries deleted are saved here in
5197 case you made a typo, so that you don't have to translate
5198 everything again. If a tranlsation is missing, the lost file is
5199 checked first. If you maintain a language package, you might
5200 want to keep this safe somewhere.</para>
5206 <sect2 id="devel.style-guide">
5207 <title>Stil-Richtlinien</title>
5210 Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar zu machen. Dazu gehört zum Einen, dass der Code
5211 einheitlich eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte "Klammern" oder "Hash-Keys").
5215 Diese Regeln sind keine Schikane sondern erleichtern allen das Leben!
5219 Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
5226 Es werden keine echten Tabs sondern Leerzeichen verwendet.
5232 Die Einrückung beträgt zwei Leerzeichen. Beispiel:
5235 <programlisting>foreach my $row (@data) {
5237 # do something with $row
5241 $row->{modules} = MODULE->retrieve(
5242 id => $row->{id},
5243 date => $use_now ? localtime() : $row->{time},
5247 $report->add($row);
5252 <para>Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie der letzte Befehl. Beispiele:</para>
5254 <programlisting>sub debug {
5260 <programlisting>if ($form->{item_rows} > 0) {
5267 Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl / die öffnende schließende Klammer, die den Block gestartet
5268 hat, und nicht auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.
5274 Die Wörter "<function>else</function>", "<function>elsif</function>", "<function>while</function>" befinden sich auf der gleichen
5275 Zeile wie schließende geschweifte Klammern. Beispiele:
5278 <programlisting>if ($form->{sum} > 1000) {
5280 } elsif ($form->{sum} > 0) {
5288 } until ($a > 0);</programlisting>
5293 Parameter von Funktionsaufrufen müssen mit runden Klammern versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
5294 und grep-ähnliche Operatoren. Beispiel:
5297 <programlisting>$main::lxdebug->message("Could not find file.");
5298 %options = map { $_ => 1 } grep { !/^#/ } @config_file;</programlisting>
5303 Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
5307 Generell gilt: Hashkeys und Arrayindices sollten nicht durch Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
5308 Blöcke schon. Beispiel:
5311 <programlisting>if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
5316 $form->{sum} += $form->{"row_$i"};
5317 $form->{ $form->{index} } += 1;
5319 map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;</programlisting>
5330 Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
5331 werden, in der die ersten Funktionsparameter in der ersten Zeile stehen. Beispiel:
5334 <programlisting>$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
5335 $form->{some_col_value});</programlisting>
5340 Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer übersichtlichen Tabellenstruktur organisiert
5344 <programlisting>my $rowcount = $form->{"row_$i"} ? $i
5345 : $form->{oldcount} ? $form->{oldcount} + 1
5346 : $form->{rowcount} - $form->{rowbase};</programlisting>
5358 <para>Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der Code eingerückt sein.</para>
5362 <para>Seitliche hängende Kommentare sollten einheitlich formatiert werden.</para>
5367 Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch zu verfassen. So wie ich keine Lust habe, französischen
5368 Quelltext zu lesen, sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein. Beispiel:
5371 <programlisting>my $found = 0;
5379 $i = 0 # initialize $i
5381 $i *= $const; # do something crazy
5382 $i = $n; # recover $i</programlisting>
5389 Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation gewünscht ist. Beispiel:
5392 <programlisting>$form->{sum} = 0;
5393 $form->{"row_$i"} = $form->{"row_$i"} - 5;
5394 $some_hash{42} = 54;</programlisting>
5399 Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
5400 wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann ist Lesbarkeit vorzuziehen.
5404 Als Beispiel sei die Funktion <function>print_options</function> aus <filename>bin/mozilla/io.pl</filename> angeführt.
5410 Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die
5415 Emacs und vim haben beide recht einfache Methoden zur Entfernung von trailing whitespace. Emacs kennt das Kommande
5416 <command>nuke-trailing-whitespace</command>, vim macht das gleiche manuell über <literal>:%s/\s\+$//e</literal> Mit <literal>:au
5417 BufWritePre * :%s/\s\+$//e</literal> wird das an Speichern gebunden.
5423 Es wird kein <command>perltidy</command> verwendet.
5427 In der Vergangenheit wurde versucht, <command>perltidy</command> zu verwenden, um einen einheitlichen Stil zu erlangen. Es hat
5428 sich aber gezeigt, dass <command>perltidy</command>s sehr eigenwilliges Verhalten, was Zeilenumbrüche angeht, oftmals gut
5429 formatierten Code zerstört. Für den Interessierten sind hier die <command>perltidy</command>-Optionen, die grob den
5430 beschriebenen Richtlinien entsprechen:
5433 <programlisting>-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
5434 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
5435 -lp -vt=1 -vtc=1</programlisting>
5440 <varname>STDERR</varname> ist tabu. Unkonditionale Debugmeldungen auch.
5444 Lx-Office bietet mit dem Modul <classname>LXDebug</classname> einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
5445 Grund, nach <varname>STDERR</varname> zu schreiben.
5449 Die <classname>LXDebug</classname>-Methode "<function>message</function>" nimmt als ersten Paramter außerdem eine Flagmaske, für
5450 die die Meldung angezeigt wird, wobei "0" immer angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden und werden in
5451 den meisten Fällen auch vom Repository zurückgewiesen.
5457 Alle neuen Module müssen use strict verwenden.
5461 <varname>$form</varname>, <varname>$auth</varname>, <varname>$locale</varname>, <varname>$lxdebug</varname> und
5462 <varname>%myconfig</varname> werden derzeit aus dem main package importiert (siehe <xref linkend="devel.globals"/>. Alle anderen
5463 Konstrukte sollten lexikalisch lokal gehalten werden.