Merge branch 'von-opendynamic'
[kivitendo-erp.git] / doc / dokumentation.xml
index b053c3f..aeeb56f 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
 <book id="kivitendo-documentation" lang="de">
-  <title>kivitendo: Installation, Konfiguration, Entwicklung</title>
+  <title>kivitendo 3.1.0: Installation, Konfiguration, Entwicklung</title>
 
   <chapter id="Aktuelle-Hinweise">
     <title>Aktuelle Hinweise</title>
         <para>im kivitendo-Forum: <ulink
         url="https://forum.kivitendo.org/">https://forum.kivitendo.org/</ulink></para>
       </listitem>
-
       <listitem>
-        <para>im alten Lx-Office-Wiki unter Dokumentation (<ulink
-        url="http://wiki.lx-office.org/index.php?title=Installation_Lx-Office_ERP">http://wiki.lx-office.org/index.php?title=Installation_Lx-Office_ERP</ulink>)</para>
+        <para>in der doc/UPGRADE Datei im doc-Verzeichnis der Installation</para>
+      </listitem>
+      <listitem>
+        <para>Im Schulungs- und Dienstleistungsangebot der entsprechenden kivitendo-Partner: <ulink
+        url="http://www.kivitendo.de/partner.html">http://www.kivitendo.de/partner.html</ulink></para>
       </listitem>
     </itemizedlist>
   </chapter>
   <chapter id="config">
     <title>Installation und Grundkonfiguration</title>
 
+    <sect1 id="Installation-Übersicht">
+      <title>Übersicht</title>
+
+      <para>
+        Die Installation von kivitendo umfasst mehrere Schritte. Die folgende Liste kann sowohl für Neulinge als auch für alte Hasen als
+        Übersicht und Stichpunktliste zum Abhaken dienen, um eine Version mit minimalen Features möglichst schnell zum Laufen zu kriegen.
+      </para>
+
+      <orderedlist>
+        <listitem><para><emphasis>Voraussetzungen überprüfen</emphasis>: kivitendo benötigt gewisse Ressourcen und benutzt weitere
+        Programme. Das Kapitel "<xref linkend="Benötigte-Software-und-Pakete"/>" erläutert diese. Auch die Liste der benötigten Perl-Module
+        befindet sich hier.</para></listitem>
+
+        <listitem><para><emphasis>Installation von kivitendo</emphasis>: Diese umfasst die "<xref
+        linkend="Manuelle-Installation-des-Programmpaketes"/>" sowie grundlegende Einstellungen, die der "<xref
+        linkend="config.config-file"/>" erläutert.</para></listitem>
+
+        <listitem><para><emphasis>Konfiguration externer Programme</emphasis>: hierzu gehören die Datenbank ("<xref
+        linkend="Anpassung-der-PostgreSQL-Konfiguration"/>") und der Webserver ("<xref
+        linkend="Apache-Konfiguration"/>"). </para></listitem>
+
+        <listitem><para><emphasis>Benutzerinformationen speichern können</emphasis>: man benötigt mindestens eine Datenbank, in der
+        Informationen zur Authentifizierung sowie die Nutzdaten gespeichert werden. Wie man das als Administrator macht, verrät "<xref
+        linkend="Benutzerauthentifizierung-und-Administratorpasswort"/>".</para></listitem>
+
+        <listitem><para><emphasis>Benutzer, Gruppen und Datenbanken anlegen</emphasis>: wie dies alles zusammenspielt erläutert "<xref
+        linkend="Benutzer--und-Gruppenverwaltung"/>".</para></listitem>
+
+        <listitem><para><emphasis>Los geht's</emphasis>: alles soweit erledigt? Dann kann es losgehen: "<xref
+        linkend="kivitendo-ERP-verwenden"/>"</para></listitem>
+      </orderedlist>
+
+      <para>
+        Alle weiteren Unterkapitel in diesem Kapitel sind ebenfalls wichtig und sollten vor einer ernsthaften Inbetriebnahme gelesen
+        werden.
+      </para>
+    </sect1>
+
     <sect1 id="Benötigte-Software-und-Pakete">
       <title>Benötigte Software und Pakete</title>
 
         ohne große Probleme auf den derzeit aktuellen verbreiteten
         Distributionen läuft.</para>
 
-        <para>Mitte 2012 sind das folgende Systeme, von denen bekannt ist,
+        <para>Anfang 2014 sind das folgende Systeme, von denen bekannt ist,
         dass kivitendo auf ihnen läuft:</para>
 
         <itemizedlist>
+
           <listitem>
-            <para>Ubuntu 10.04 LTS Lucid Lynx bis 12.04 Precise Pangolin</para>
+            <para>Debian</para>
+            <itemizedlist>
+               <listitem>
+                 <para>6.0 "Squeeze" (hier muss allerdings das Modul FCGI in der Version >= 0.72 compiled werden, und <literal>Rose::DB::Object</literal> ist zu alt)</para>
+               </listitem>
+               <listitem>
+                 <para>7.0 "Wheezy"</para>
+               </listitem>
+            </itemizedlist>
           </listitem>
 
           <listitem>
-            <para>Debian 5.0 Lenny und 6.0 Squeeze</para>
+            <para>Ubuntu 12.04 LTS "Precise Pangolin", 12.10 "Quantal Quetzal", 13.04 "Precise Pangolin" und 14.04 "Trusty Tahr" LTS Alpha</para>
           </listitem>
 
           <listitem>
-            <para>openSUSE 11.2 und 11.3</para>
+            <para>openSUSE 12.2, 12.3 und 13.1</para>
           </listitem>
 
           <listitem>
           </listitem>
 
           <listitem>
-            <para>Fedora 13 bis 16</para>
+            <para>Fedora 16 bis 19</para>
           </listitem>
         </itemizedlist>
       </sect2>
 
       <sect2 id="Pakete" xreflabel="Pakete">
-        <title>Pakete</title>
+        <title>Benötigte Perl-Pakete installieren</title>
 
         <para>Zum Betrieb von kivitendo werden zwingend ein Webserver (meist
-        Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
+        Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.4)
         benötigt.</para>
 
-        <para>Zusätzlich benötigt kivitendo die folgenden Perl-Pakete, die
-        nicht Bestandteil einer Standard-Perl-Installation sind:</para>
+        <para>Zusätzlich benötigt kivitendo einige Perl-Pakete, die nicht Bestandteil einer Standard-Perl-Installation sind. Um zu
+        überprüfen, ob die erforderlichen Pakete installiert und aktuell genug sind, wird ein Script mitgeliefert, das wie folgt aufgerufen
+        wird:</para>
+
+        <programlisting>./scripts/installation_check.pl</programlisting>
+
+        <para>Die vollständige Liste der benötigten Perl-Module lautet:</para>
 
         <itemizedlist>
-          <listitem>
-            <para>parent</para>
-          </listitem>
+          <listitem><para><literal>parent</literal> (nur bei Perl vor 5.10.1)</para></listitem>
 
-          <listitem>
-            <para>Archive::Zip</para>
-          </listitem>
+          <listitem><para><literal>Archive::Zip</literal></para></listitem>
 
-          <listitem>
-            <para>Config::Std</para>
-          </listitem>
+          <listitem><para><literal>Config::Std</literal></para></listitem>
 
-          <listitem>
-            <para>DateTime</para>
-          </listitem>
+          <listitem><para><literal>DateTime</literal></para></listitem>
 
-          <listitem>
-            <para>DBI</para>
-          </listitem>
+          <listitem><para><literal>DBI</literal></para></listitem>
 
-          <listitem>
-            <para>DBD::Pg</para>
-          </listitem>
+          <listitem><para><literal>DBD::Pg</literal></para></listitem>
 
-          <listitem>
-            <para>Email::Address</para>
-          </listitem>
+          <listitem><para><literal>Email::Address</literal></para></listitem>
 
-          <listitem>
-            <para>JSON</para>
-          </listitem>
+          <listitem><para><literal>Email::MIME</literal></para></listitem>
 
-          <listitem>
-            <para>List::MoreUtils</para>
-          </listitem>
+          <listitem><para><literal>FCGI</literal> (nicht Versionen 0.68 bis 0.71 inklusive; siehe <xref linkend="Apache-Konfiguration.FCGI.WebserverUndPlugin"/>)</para></listitem>
 
-          <listitem>
-            <para>Params::Validate</para>
-          </listitem>
+          <listitem><para><literal>File::Copy::Recursive</literal></para></listitem>
 
-          <listitem>
-            <para>PDF::API2</para>
-          </listitem>
+          <listitem><para><literal>JSON</literal></para></listitem>
 
-          <listitem>
-            <para>Rose::Object</para>
-          </listitem>
+          <listitem><para><literal>List::MoreUtils</literal></para></listitem>
 
-          <listitem>
-            <para>Rose::DB</para>
-          </listitem>
+          <listitem><para><literal>Net::SMTP::SSL</literal> (optional, bei E-Mail-Versand über SSL; siehe Abschnitt "<xref
+          linkend="config.sending-email.smtp"/>")</para></listitem>
 
-          <listitem>
-            <para>Rose::DB::Object</para>
-          </listitem>
+          <listitem><para><literal>Net::SSLGlue</literal> (optional, bei E-Mail-Versand über TLS; siehe Abschnitt "<xref
+          linkend="config.sending-email.smtp"/>")</para></listitem>
 
-          <listitem>
-            <para>Template</para>
-          </listitem>
+          <listitem><para><literal>Params::Validate</literal></para></listitem>
 
-          <listitem>
-            <para>Text::CSV_XS</para>
-          </listitem>
+          <listitem><para><literal>PDF::API2</literal></para></listitem>
 
-          <listitem>
-            <para>Text::Iconv</para>
-          </listitem>
+          <listitem><para><literal>Rose::Object</literal></para></listitem>
 
-          <listitem>
-            <para>URI</para>
-          </listitem>
+          <listitem><para><literal>Rose::DB</literal></para></listitem>
 
-          <listitem>
-            <para>XML::Writer</para>
-          </listitem>
+          <listitem><para><literal>Rose::DB::Object</literal> Version 0.788 oder neuer</para></listitem>
 
-          <listitem>
-            <para>YAML</para>
-          </listitem>
+          <listitem><para><literal>Template</literal></para></listitem>
+
+          <listitem><para><literal>Text::CSV_XS</literal></para></listitem>
+
+          <listitem><para><literal>Text::Iconv</literal></para></listitem>
+
+          <listitem><para><literal>URI</literal></para></listitem>
+
+          <listitem><para><literal>XML::Writer</literal></para></listitem>
+
+          <listitem><para><literal>YAML</literal></para></listitem>
         </itemizedlist>
 
+        <para>Seit v3.0.0 sind die folgenden Pakete hinzugekommen: <literal>File::Copy::Recursive</literal>.</para>
+
+        <para>Seit v2.7.0 sind die folgenden Pakete hinzugekommen: <literal>Email::MIME</literal>, <literal>Net::SMTP::SSL</literal>,
+        <literal>Net::SSLGlue</literal>.</para>
+
         <para>Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
         hinzugekommen, <literal>URI</literal> und
         <literal>XML::Writer</literal> sind notwendig. Ohne startet kivitendo
         empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
         installieren.</para>
 
-        <para>Die zu installierenden Pakete können in den verschiedenen
-        Distributionen unterschiedlich heißen.</para>
-
-        <para>Für Debian oder Ubuntu benötigen Sie diese Pakete:</para>
+        <sect3>
+          <title>Debian und Ubuntu</title>
+
+          <para>Alle benötigten Perl-Pakete stehen für Debian und Ubuntu als Debian-Pakete zur Verfügung. Sie können mit folgendem Befehl
+          installiert werden:</para>
+
+          <programlisting>apt-get install apache2 libarchive-zip-perl libclone-perl \
+  libconfig-std-perl libdatetime-perl libdbd-pg-perl libdbi-perl \
+  libemail-address-perl  libemail-mime-perl libfcgi-perl libjson-perl \
+  liblist-moreutils-perl libnet-smtp-ssl-perl libnet-sslglue-perl \
+  libparams-validate-perl libpdf-api2-perl librose-db-object-perl \
+  librose-db-perl librose-object-perl libsort-naturally-perl \
+  libstring-shellquote-perl libtemplate-perl libtext-csv-xs-perl \
+  libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl \
+  libfile-copy-recursive-perl postgresql</programlisting>
+        </sect3>
 
-        <programlisting>apt-get install apache2 postgresql libparent-perl libarchive-zip-perl \
-  libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl \
-  libemail-address-perl liblist-moreutils-perl libpdf-api2-perl \
-  librose-object-perl librose-db-perl librose-db-object-perl \
-  libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl \
-  libxml-writer-perl libyaml-perl libconfig-std-perl \
-  libparams-validate-perl libjson-perl libclass-accessor-perl</programlisting>
+        <sect3>
+          <title>Fedora Core</title>
 
-        <para>Für Fedora Core benötigen Sie diese Pakete:</para>
+          <para>Für Fedora Core stehen die meisten der benötigten Perl-Pakete als RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl installeirt werden:</para>
 
-        <programlisting>yum install httpd postgresql-server perl-parent perl-DateTime \
-  perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils \
-  perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object \
+          <programlisting>yum install httpd perl-Archive-Zip perl-Clone perl-DBD-Pg \
+  perl-DBI perl-DateTime perl-Email-Address perl-Email-MIME perl-FCGI \
+  perl-File-Copy-Recursive perl-JSON perl-List-MoreUtils perl-Net-SMTP-SSL perl-Net-SSLGlue \
+  perl-PDF-API2 perl-Params-Validate perl-Rose-DB perl-Rose-DB-Object \
+  perl-Rose-Object perl-Sort-Naturally perl-String-ShellQuote \
   perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \
-  perl-XML-Writer perl-YAML</programlisting>
+  perl-XML-Writer perl-YAML perl-parent postgresql-server</programlisting>
 
-        <para>Für OpenSuSE benötigen Sie diese Pakete:</para>
+          <para>Zusätzlich müssen einige Pakete aus dem CPAN installiert werden. Dazu können Sie die folgenden Befehle nutzen:</para>
 
-        <programlisting>zypper install apache2 postgresql-server perl-Archive-Zip \
-  perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils \
-  perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
-  perl-URI perl-XML-Writer perl-YAML</programlisting>
+          <programlisting>yum install perl-CPAN
+cpan Config::Std</programlisting>
 
-        <para>Bei openSuSE 11 ist <literal>parent</literal> bereits enthalten,
-        und braucht nicht nachinstalliert werden. Die
-        <literal>Rose::*</literal> Pakete sind derzeit nicht für SuSE gepackt,
-        und müssen anderweitig nachinstalliert werden.</para>
+        </sect3>
 
-        <para>kivitendo enthält ein Script, mit dem überprüft werden kann, ob
-        alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
-        folgt:</para>
+        <sect3>
+          <title>openSUSE</title>
 
-        <programlisting>./scripts/installation_check.pl</programlisting>
+          <para>Für openSUSE stehen die meisten der benötigten Perl-Pakete als RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl
+          installiert werden:</para>
+
+          <programlisting>zypper install apache2 perl-Archive-Zip perl-Clone \
+  perl-Config-Std perl-DBD-Pg perl-DBI perl-DateTime perl-Email-Address \
+  perl-Email-MIME perl-FastCGI perl-File-Copy-Recursive perl-JSON perl-List-MoreUtils \
+  perl-Net-SMTP-SSL perl-Net-SSLGlue perl-PDF-API2 perl-Params-Validate \
+  perl-Sort-Naturally perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
+  perl-URI perl-XML-Writer perl-YAML postgresql-server</programlisting>
+
+          <para>Zusätzlich müssen einige Pakete aus dem CPAN installiert werden. Dazu können Sie die folgenden Befehle nutzen:</para>
+
+          <programlisting>yum install perl-CPAN
+cpan Rose::Db::Object</programlisting>
+
+        </sect3>
       </sect2>
     </sect1>
 
     <sect1 id="Manuelle-Installation-des-Programmpaketes"
            xreflabel="Manuelle Installation des Programmpaketes">
       <title>Manuelle Installation des Programmpaketes</title>
-
-      <para>Die kivitendo ERP Installationsdatei (kivitendo-erp-2.6.3.tgz) wird
-      im Dokumentenverzeichnis des Webservers (z.B.
-      <filename>/var/www/html/</filename>,
-      <filename>/srv/www/htdocs</filename> oder
-      <filename>/var/www/</filename>) entpackt:</para>
+      <para>Der aktuelle Stable-Release, bzw. beta Release wird bei github gehostet und kann
+ <ulink url="https://github.com/kivitendo/kivitendo-erp/releases">hier</ulink> heruntergeladen werden.</para>
+      <para>Die kivitendo ERP Installationsdatei (<filename>kivitendo-erp-3.1.0.tgz</filename>) wird im Dokumentenverzeichnis des Webservers
+      (z.B.  <filename>/var/www/html/</filename>, <filename>/srv/www/htdocs</filename> oder <filename>/var/www/</filename>) entpackt:</para>
 
       <programlisting>cd /var/www
-tar xvzf kivitendo-erp-2.6.3.tgz</programlisting>
+tar xvzf kivitendo-erp-3.1.0.tgz</programlisting>
 
       <para>Wechseln Sie in das entpackte Verzeichnis:</para>
 
@@ -239,10 +286,14 @@ tar xvzf kivitendo-erp-2.6.3.tgz</programlisting>
       Webserverkonfiguration benutzen, um auf das tatsächliche
       Installationsverzeichnis zu verweisen.</para>
 
+      <para>Bei einer Neuinstallation der Version 3.1.0 muß das WebDAV Verzeichnis derzeit manuell angelegt werden:</para>
+
+      <programlisting>mkdir webdav</programlisting>
+
       <para>Die Verzeichnisse <filename>users</filename>, <filename>spool</filename> und <filename>webdav</filename> müssen für den Benutzer
       beschreibbar sein, unter dem der Webserver läuft. Die restlichen Dateien müssen für diesen Benutzer lesbar sein. Die Benutzer- und
       Gruppennamen sind bei verschiedenen Distributionen unterschiedlich (z.B. bei Debian/Ubuntu <constant>www-data</constant>, bei Fedora
-      core <constant>apache</constant> oder bei OpenSuSE <constant>wwwrun</constant>).</para>
+      core <constant>apache</constant> oder bei OpenSUSE <constant>wwwrun</constant>).</para>
 
       <para>Der folgende Befehl ändert den Besitzer für die oben genannten
       Verzeichnisse auf einem Debian/Ubuntu-System:</para>
@@ -303,57 +354,39 @@ tar xvzf kivitendo-erp-2.6.3.tgz</programlisting>
         entsprechend kommentiert sind:</para>
 
         <itemizedlist>
-          <listitem>
-            <para><literal>authentication</literal></para>
-          </listitem>
+          <listitem><para><literal>authentication</literal> (siehe Abschnitt "<xref
+          linkend="Benutzerauthentifizierung-und-Administratorpasswort"/>" in diesem Kapitel)</para></listitem>
 
-          <listitem>
-            <para><literal>authentication/database</literal></para>
-          </listitem>
+          <listitem><para><literal>authentication/database</literal></para></listitem>
 
-          <listitem>
-            <para><literal>authentication/ldap</literal></para>
-          </listitem>
+          <listitem><para><literal>authentication/ldap</literal></para></listitem>
 
-          <listitem>
-            <para><literal>system</literal></para>
-          </listitem>
+          <listitem><para><literal>system</literal></para></listitem>
 
-          <listitem>
-            <para><literal>features</literal></para>
-          </listitem>
+          <listitem><para><literal>paths</literal></para></listitem>
 
-          <listitem>
-            <para><literal>paths</literal></para>
-          </listitem>
+          <listitem><para><literal>mail_delivery</literal> (siehe Abschnitt "<xref linkend="config.sending-email.smtp"/>)</para></listitem>
 
-          <listitem>
-            <para><literal>applications</literal></para>
-          </listitem>
+          <listitem><para><literal>applications</literal></para></listitem>
 
-          <listitem>
-            <para><literal>environment</literal></para>
-          </listitem>
+          <listitem><para><literal>environment</literal></para></listitem>
 
-          <listitem>
-            <para><literal>print_templates</literal></para>
-          </listitem>
 
-          <listitem>
-            <para><literal>task_server</literal></para>
-          </listitem>
+          <listitem><para><literal>print_templates</literal></para></listitem>
 
-          <listitem>
-            <para><literal>periodic_invoices</literal></para>
-          </listitem>
+          <listitem><para><literal>task_server</literal></para></listitem>
 
-          <listitem>
-            <para><literal>console</literal></para>
-          </listitem>
+          <listitem><para><literal>periodic_invoices</literal></para></listitem>
 
-          <listitem>
-            <para><literal>debug</literal></para>
-          </listitem>
+          <listitem><para><literal>self_tests</literal></para></listitem>
+
+          <listitem><para><literal>console</literal></para></listitem>
+
+          <listitem><para><literal>testing</literal></para></listitem>
+
+          <listitem><para><literal>testing/database</literal></para></listitem>
+
+          <listitem><para><literal>debug</literal></para></listitem>
         </itemizedlist>
 
         <para>Die üblicherweise wichtigsten Parameter, die am Anfang
@@ -367,22 +400,20 @@ host     = localhost
 port     = 5432
 db       = kivitendo_auth
 user     = postgres
-password =
-
-[system]
-dbcharset = UTF-8</programlisting>
+password =</programlisting>
 
         <para>Nutzt man wiederkehrende Rechnungen, kann man unter
         <varname>[periodic_invoices]</varname> den Login eines Benutzers
         angeben, der nach Erstellung der Rechnungen eine entsprechende E-Mail
         mit Informationen über die erstellten Rechnungen bekommt.</para>
 
-        <para>Nutzt man den <link
-        linkend="config.task-server">Taskserver</link> für <link
-        linkend="features.periodic-invoices">wiederkehrende Rechnungen</link>,
-        muss unter <varname>[task_server]</varname> ein Login eines Benutzers
-        angegeben werden, mit dem sich der Taskserver an kivitendo bei der
-        Datenbank anmeldet, die dem Benutzer zugewiesen ist.</para>
+        <para>kivitendo bringt eine eigene Komponente zur zeitgesteuerten Ausführung bestimmter Aufgaben mit, den <link
+        linkend="config.task-server">Taskserver</link>. Er wird u.a. für Features wie die <link
+        linkend="features.periodic-invoices">wiederkehrenden Rechnungen</link> benötigt, erledigt aber auch andere erforderliche Aufgaben
+        und muss daher in Betrieb genommen werden. Der Taskserver benötigt zwei Konfigurationseinstellungen, die unter
+        <varname>[task_server]</varname> anzugeben sind: ein Mandant (entweder der Mandantenname oder eine Datenbank-ID, Variable
+        <varname>client</varname>), aus dem die Datenbankkonfiguration entnommen wird, sowie ein Login (Variable <varname>login</varname>)
+        eines Benutzers, der für gewisse Dinge wie die Rechnungserstellung als Verkäufer eingetragen wird.</para>
 
         <para>Für Entwickler finden sich unter <varname>[debug]</varname>
         wichtige Funktionen, um die Fehlersuche zu erleichtern.</para>
@@ -413,32 +444,30 @@ dbcharset = UTF-8</programlisting>
       <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
 
       <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
-        <title>Zeichensätze/die Verwendung von UTF-8</title>
-
-        <para>kivitendo kann komplett mit UTF-8 als Zeichensatz verwendet
-        werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
-        Version 8.2 oder neuer benutzt werden, und der
-        PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
-        angelegt worden sein.</para>
-
-        <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
-        “template1” “UTF8”, so kann auch kivitendo mit UTF-8 betrieben werden.
-        Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
-        UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
-        Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl
+        <title>Zeichensätze/die Verwendung von Unicode/UTF-8</title>
+
+             <para>kivitendo setzt zwingend voraus, dass die Datenbank Unicode/UTF-8 als Encoding einsetzt. Bei aktuellen Serverinstallationen
+             braucht man hier meist nicht einzugreifen.</para>
+
+        <para>Das Encoding des Datenbankservers kann überprüft werden. Ist das Encoding der Datenbank "template1" "Unicode" bzw. "UTF-8", so
+        braucht man nichts weiteres diesbezüglich unternehmen. Zum Testen:</para>
+
+        <programlisting>su postgres
+echo '\l' | psql
+exit </programlisting>
+
+        <para>Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
+        Unicode-Encoding anzulegen und diesen zu verwenden. Unter Debian und
+        Ubuntu kann dies z.B. für PostgreSQL 9.3 mit dem folgenden Befehl
         getan werden:</para>
 
-        <programlisting>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername</programlisting>
+        <programlisting>pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 9.3 clustername</programlisting>
 
         <para>Die Datenbankversionsnummer muss an die tatsächlich verwendete
         Versionsnummer angepasst werden.</para>
 
         <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
 
-        <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
-        ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
-        kivitendo mit ISO-8859-15 als Encoding betrieben werden.</para>
-
         <para>Das Encoding einer Datenbank kann in <command>psql</command> mit
         <literal>\l</literal> geprüft werden.</para>
       </sect2>
@@ -460,14 +489,9 @@ dbcharset = UTF-8</programlisting>
         <para>In der Datei <filename>pg_hba.conf</filename>, die im gleichen
         Verzeichnis wie die <filename>postgresql.conf</filename> zu finden
         sein sollte, müssen die Berichtigungen für den Zugriff geändert
-        werden. Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
-        Verbindungen immer zuzulassen:</para>
-
-        <programlisting>local all all trust
-host all all 127.0.0.1 255.0.0.0 trust</programlisting>
-
-        <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
-        Passwort zuzulassen. Beispielsweise:</para>
+       werden. Hier gibt es mehrere Möglichkeiten. Sinnvoll ist es nur die
+       nögiten Verbindungen immer zuzulassen, für eine lokal laufenden
+       Datenbank zum Beispiel:</para>
 
         <programlisting>local all kivitendo password
 host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
@@ -478,10 +502,14 @@ host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
 
         <para>In der Datenbank <literal>template1</literal> muss die
         Unterstützung für servergespeicherte Prozeduren eingerichet werden.
-        Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
+        Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an:
+        <programlisting>su - postgres
+psql template1</programlisting>
+
         führen Sie die folgenden Kommandos aus:</para>
 
-        <programlisting>create language 'plpgsql';</programlisting>
+        <programlisting>create language 'plpgsql';
+\q</programlisting>
       </sect2>
 
       <sect2 id="Datenbankbenutzer-anlegen">
@@ -492,7 +520,12 @@ host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
         anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
         können:</para>
 
-        <programlisting>su - postgres createuser -d -P kivitendo</programlisting>
+       <para>Die Frage, ob der neue User Superuser sein soll, können Sie mit nein
+       beantworten, genauso ist die Berechtigung neue User (Roles) zu
+       generieren nicht nötig.</para>
+             <programlisting>su - postgres
+createuser -d -P kivitendo
+exit</programlisting>
 
         <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
         Sie den evtl. voreingestellten Benutzer “postgres” auf “kivitendo” bzw.
@@ -519,7 +552,7 @@ host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
         wird:</para>
 
         <programlisting>AddHandler cgi-script .pl
-Alias /kivitendo-erp/ /var/www/kiviteno-erp/
+Alias /kivitendo-erp/ /var/www/kivitendo-erp/
 
 &lt;Directory /var/www/kivitendo-erp&gt;
  Options ExecCGI Includes FollowSymlinks
@@ -594,7 +627,7 @@ Alias /kivitendo-erp/ /var/www/kiviteno-erp/
             </listitem>
 
             <listitem>
-              <para>Apache 2.2.11 (Ubuntu) und mod_fastcgi.</para>
+              <para>Apache 2.2.11 / 2.2.22 (Ubuntu) und mod_fastcgi.</para>
             </listitem>
           </itemizedlist>
 
@@ -606,12 +639,11 @@ Alias /kivitendo-erp/ /var/www/kiviteno-erp/
           verwendet.</para>
 
           <warning>
-            <para>FCGI 0.69 und höher ist extrem strict in der Behandlung von
-            Unicode, und verweigert bestimmte Eingaben von kivitendo. Falls es
-            Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
-            Vorgängerversion FCGI 0.68 ausgewichen werden.</para>
+            <para>FCGI-Versionen ab 0.69 und bis zu 0.71 inklusive sind extrem strict in der Behandlung von Unicode, und verweigern
+            bestimmte Eingaben von kivitendo. Falls es Probleme mit Umlauten in Ihrere Installation gibt, muss zwingend Version 0.68 oder
+            aber Version 0.72 und neuer eingesetzt werden.</para>
 
-            <para>Mit CPAN lässt sie sich die Vorgängerversion wie folgt
+            <para>Mit <ulink url="http://www.cpan.org">CPAN</ulink> lässt sie sich die Vorgängerversion wie folgt
             installieren:</para>
 
             <programlisting>force install M/MS/MSTROUT/FCGI-0.68.tar.gz</programlisting>
@@ -658,7 +690,7 @@ Alias       /url/for/kivitendo-erp/          /path/to/kivitendo-erp/
   Deny from All
 &lt;/DirectoryMatch&gt;</programlisting>
 
-          <para>Seit mod_fcgid-Version 2.6.3 gelten sehr kleine Grenzen für
+          <para>Seit mod_fcgid-Version 2.3.6 gelten sehr kleine Grenzen für
           die maximale Größe eines Requests. Diese sollte wie folgt
           hochgesetzt werden:</para>
 
@@ -710,12 +742,9 @@ Alias       /url/for/kivitendo-erp-fcgid/          /path/to/kivitendo-erp/</prog
     <sect1 id="config.task-server">
       <title>Der Task-Server</title>
 
-      <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in
-      regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu
-      festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess
-      wird bisher nur für die Erzeugung der wiederkehrenden Rechnungen
-      benutzt, wird aber in Zukunft deutlich mehr Aufgaben übertragen
-      bekommen.</para>
+      <para>Der Task-Server ist ein Prozess, der im Hintergrund läuft, in regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und
+      diese zu festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess wird u.a. für die Erzeugung der wiederkehrenden
+      Rechnungen und weitere essenzielle Aufgaben benutzt.</para>
 
       <sect2 id="Konfiguration-des-Task-Servers">
         <title>Verfügbare und notwendige Konfigurationsoptionen</title>
@@ -726,14 +755,25 @@ Alias       /url/for/kivitendo-erp-fcgid/          /path/to/kivitendo-erp/</prog
         Optionen sind:</para>
 
         <variablelist>
+          <varlistentry>
+            <term><varname>client</varname></term>
+
+            <listitem>
+              <para>Name oder Datenbank-ID eines vorhandenen kivitendo-Mandanten, der benutzt wird, um die zu verwendende
+              Datenbankverbindung auszulesen. Der Mandant muss in der Administration angelegt werden. Diese Option muss angegeben
+              werden.</para>
+
+              <para>Diese Option kam mit Release v3.x.0 hinzu und muss daher in Konfigurationen, die von älteren Versionen aktualisiert
+              wurden, ergänzt werden.</para>
+            </listitem>
+          </varlistentry>
+
           <varlistentry>
             <term><varname>login</varname></term>
 
             <listitem>
-              <para>gültiger kivitendo-Benutzername, der benutzt wird, um die
-              zu verwendende Datenbankverbindung auszulesen. Der Benutzer muss
-              in der Administration angelegt werden. Diese Option muss
-              angegeben werden.</para>
+              <para>gültiger kivitendo-Benutzername, der z.B. als Verkäufer beim Erzeugen wiederkehrender Rechnungen benötigt wird. Der
+              Benutzer muss in der Administration angelegt werden. Diese Option muss angegeben werden.</para>
             </listitem>
           </varlistentry>
 
@@ -776,8 +816,7 @@ Alias       /url/for/kivitendo-erp-fcgid/          /path/to/kivitendo-erp/</prog
         anstelle eines symbolischen Links verwendet werden können.</para>
 
         <sect3>
-          <title>SystemV-basierende Systeme (z.B. Debian, OpenSuSE, Fedora
-          Core)</title>
+          <title>SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)</title>
 
           <para>Kopieren Sie die Datei
           <filename>scripts/boot/system-v/kivitendo-server</filename>
@@ -796,15 +835,16 @@ insserv kivitendo-task-server</programlisting>
             </listitem>
 
             <listitem>
-              <para>OpenSuSE und Fedora Core:</para>
+              <para>Ältere OpenSUSE und ältere Fedora Core:</para>
 
               <programlisting>chkconfig --add kivitendo-task-server</programlisting>
             </listitem>
           </itemizedlist>
 
           <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
-          werden: <command>/etc/init.d/kivitendo-task-server
-          start</command></para>
+          werden:</para>
+
+          <programlisting>/etc/init.d/kivitendo-task-server start</programlisting>
         </sect3>
 
         <sect3>
@@ -817,8 +857,28 @@ insserv kivitendo-task-server</programlisting>
           <literal>exec ....</literal>).</para>
 
           <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
-          werden: <command>service kivitendo-task-server
-          start</command></para>
+          werden:</para>
+
+          <programlisting>service kivitendo-task-server start</programlisting>
+        </sect3>
+
+        <sect3>
+          <title>systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)</title>
+
+          <para>Verlinken Sie die Datei <filename>scripts/boot/systemd/kivitendo-task-server.service</filename> nach
+          <filename>/etc/systemd/system/</filename>. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
+          <literal>ExecStart=....</literal> und <literal>ExecStop=...</literal>). Binden Sie das Script in den Boot-Prozess ein.
+          </para>
+
+          <para>Alle hierzu benötigten Befehle sehen so aus:</para>
+
+          <programlisting>cd /var/www/kivitendo-erp/scripts/boot/systemd
+ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/</programlisting>
+
+          <para>Danach kann der Task-Server mit dem folgenden Befehl gestartet
+          werden:</para>
+
+          <programlisting>systemctl start kivitendo-task-server.service</programlisting>
         </sect3>
       </sect2>
 
@@ -861,6 +921,20 @@ insserv kivitendo-task-server</programlisting>
         <para>Dieselben Optionen können auch für die SystemV-basierenden
         Runlevel-Scripte benutzt werden (siehe oben).</para>
       </sect2>
+      <sect2 id="Prozesskontrolle2">
+        <title>Task-Server mit mehreren Mandanten</title>
+
+        <para>Beim Task-Server werden der zu verwendende Mandant und Login-Name des Benutzers, unter dem der Task-Server laufen soll, in die
+        Konfigurationsdatei geschrieben. Hat man mehrere Mandanten, muss man auch mehrere Konfigurationsdateien anlegen.</para>
+
+        <para>Die Konfigurationsdatei ist eine Kopie der Datei kivitendo.conf, wo in der Kategorie <varname>[task_server]</varname> die
+        gewünschten Werte für <varname>client</varname> und <varname>login</varname> eingetragen werden.</para>
+
+        <para>Der alternative Task-Server wird dann mit folgendem Befehl
+        gestartet:</para>
+
+        <programlisting>./scripts/task_server.pl -c config/DATEINAME.conf</programlisting>
+      </sect2>
     </sect1>
 
     <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
@@ -1087,19 +1161,18 @@ insserv kivitendo-task-server</programlisting>
         der folgenden URL erreichbar sein sollte:</para>
 
         <para><ulink
-        url="http://localhost/kivitendo-erp/admin.pl">http://localhost/kivitendo-erp/admin.pl</ulink></para>
+        url="http://localhost/kivitendo-erp/controller.pl?action=Admin/login">http://localhost/kivitendo-erp/controller.pl?action=Admin/login</ulink></para>
       </sect2>
     </sect1>
 
     <sect1 id="Benutzer--und-Gruppenverwaltung">
-      <title>Benutzer- und Gruppenverwaltung</title>
+      <title>Mandanten-, Benutzer- und Gruppenverwaltung</title>
 
-      <para>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
-      angelegt werden. Dieses geschieht im Administrationsmenü, das Sie unter
-      folgender URL finden:</para>
+      <para>Nach der Installation müssen Mandanten, Benutzer, Gruppen und Datenbanken angelegt werden. Dieses geschieht im
+      Administrationsmenü, das Sie unter folgender URL finden:</para>
 
       <para><ulink
-      url="http://localhost/kivitendo-erp/admin.pl">http://localhost/kivitendo-erp/admin.pl</ulink></para>
+      url="http://localhost/kivitendo-erp/controller.pl?action=Admin/login">http://localhost/kivitendo-erp/controller.pl?action=Admin/login</ulink></para>
 
       <para>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
       <filename>config/kivitendo.conf</filename> eingetragen haben.</para>
@@ -1107,38 +1180,45 @@ insserv kivitendo-task-server</programlisting>
       <sect2 id="Zusammenhänge">
         <title>Zusammenhänge</title>
 
-        <para>kivitendo verwendet eine Datenbank zum Speichern all seiner
-        Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
-        mit kivitendo arbeiten zu können, muss eine Person einen
-        Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
-        Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
-        möglich und normal, dass mehreren Benutzern die selbe Datenbank
-        zugewiesen wird, sodass sie alle mit den selben Daten arbeiten
-        können.</para>
-
-        <para>Die Basisdaten der Benutzer, die in der Administration
-        eingegeben werden können, werden in einer zweiten Datenbank
-        gespeichert, der bereits erwähnten Authentifizierungsdatenbank. Diese
-        ist also den Produktivdaten enthaltenden Datenbanken vorgeschaltet.
-        Pro kivitendo-Installation gibt es nur eine
-        Authentifizierungsdatenbank, aber beliebig viele Datenbanken mit
-        Firmendaten.</para>
-
-        <para>kivitendo kann seinen Benutzern Zugriff auf bestimmte
-        Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
-        gestattet, so werden der entsprechenden Menüpunkte auch nicht
-        angezeigt. Diese Rechte werden ebenfalls in der
-        Authentifizierungsdatenbank gespeichert.</para>
-
-        <para>Um Rechte verteilen zu können, verwendet kivitendo ein
-        Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
-        erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
-        mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
-        Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
-        Benutzer Mitglied ist.</para>
-
-        <para>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und
-        Benutzer angelegt werden sollten, lautet:</para>
+        <para>kivitendo verwaltet zwei Sets von Daten, die je nach Einrichtung in einer oder zwei Datenbanken gespeichert werden.</para>
+
+        <para>Das erste Set besteht aus Anmeldeinformationen: welche Benutzer und Mandanten gibt es, welche Gruppen, welche BenutzerIn hat
+        Zugriff auf welche Mandanten, und welche Gruppe verfügt über welche Rechte. Diese Informationen werden in der
+        Authentifizierungsdatenbank gespeichert. Dies ist diejenige Datenbank, deren Verbindungsparameter in der Konfigurationsdatei
+        <filename>config/kivitendo.conf</filename> gespeichert werden.</para>
+
+        <para>Das zweite Set besteht aus den eigentlichen Verkehrsdaten eines Mandanten, wie beispielsweise die Stammdaten (Kunden, Lieferanten, Waren) und Belege
+        (Angebote, Lieferscheine, Rechnungen). Diese werden in einer Mandantendatenbank gespeichert. Die
+        Verbindungsinformationen einer solchen Mandantendatenbank werden im Administrationsbereich konfiguriert, indem man einen Mandanten
+        anlegt und dort die Parameter einträgt. Dabei hat jeder Mandant eine eigene Datenbank.</para>
+
+        <para>Aufgrund des Datenbankdesigns ist es für einfache Fälle möglich, die Authentifizierungsdatenbank und eine der
+        Mandantendatenbanken in ein und derselben Datenbank zu speichern. Arbeitet man hingegen mit mehr als einem Mandanten, wird
+        empfohlen, für die Authentifizierungsdatenbank eine eigene Datenbank zu verwenden, die nicht gleichzeitig für einen Mandanten
+        verwendet wird.</para>
+     </sect2>
+
+      <sect2 id="Mandanten-Benutzer-Gruppen">
+        <title>Mandanten, Benutzer und Gruppen</title>
+
+        <para>kivitendos Administration kennt Mandanten, Benutzer und Gruppen, die sich frei zueinander zuordnen lassen.</para>
+
+        <para>kivitendo kann mehrere Mandaten aus einer Installation heraus verwalten. Welcher Mandant benutzt wird, kann direkt beim Login
+        ausgewählt werden. Für jeden Mandanten wird ein eindeutiger Name vergeben, der beim Login angezeigt wird. Weiterhin benötigt der
+        Mandant Datenbankverbindungsparameter für seine Mandantendatenbank. Diese sollte über die <link
+        linkend="Datenbanken-anlegen">Datenbankverwaltung</link> geschehen.</para>
+
+        <para>Ein Benutzer ist eine Person, die Zugriff auf kivitendo erhalten soll. Sie erhält einen Loginnamen sowie ein
+        Passwort. Weiterhin legt der Administrator fest, an welchen Mandanten sich ein Benutzer anmelden kann, was beim Login verifiziert
+        wird.</para>
+
+        <para>Gruppen dienen dazu, Benutzern innerhalb eines Mandanten Zugriff auf bestimmte Funktionen zu geben. Einer Gruppe werden dafür
+        vom Administrator gewisse Rechte zugeordnet. Weiterhin legt der Administrator fest, für welche Mandanten eine Gruppe gilt, und
+        welche Benutzer Mitglieder in dieser Gruppe sind. Meldet sich ein Benutzer dann an einem Mandanten an, so erhält er alle Rechte von
+        allen denjenigen Gruppen, die zum Einen dem Mandanten zugeordnet sind und in denen der Benutzer zum Anderen Mitglied ist, </para>
+
+        <para>Die Reihenfolge, in der Datenbanken, Mandanten, Gruppen und Benutzer angelegt werden, kann im Prinzip beliebig gewählt
+        werden. Die folgende Reihenfolge beinhaltet die wenigsten Arbeitsschritte:</para>
 
         <orderedlist numeration="arabic">
           <listitem>
@@ -1150,11 +1230,11 @@ insserv kivitendo-task-server</programlisting>
           </listitem>
 
           <listitem>
-            <para>Benutzer anlegen</para>
+            <para>Benutzer anlegen und Gruppen als Mitglied zuordnen</para>
           </listitem>
 
           <listitem>
-            <para>Benutzer den Gruppen zuordnen</para>
+            <para>Mandanten anlegen und Gruppen sowie Benutzer zuweisen</para>
           </listitem>
         </orderedlist>
       </sect2>
@@ -1165,16 +1245,6 @@ insserv kivitendo-task-server</programlisting>
         <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
         den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
         Beispielen ist dies ‘<literal>kivitendo</literal>’).</para>
-
-        <para>Wenn Sie für die kivitendo-Installation nicht Unicode (UTF-8) sondern den europäischen Schriftsatz ISO-8859-15 benutzen
-        wollen, so müssen Sie vor dem Anlegen der Datenbank in der Datei <filename>config/kivitendo.conf</filename> die Variable
-        <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf den Wert ‘<literal>ISO-8859-15</literal>’ setzen.</para>
-
-        <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
-        verwenden müssen, da diese Einstellungen momentan global in kivitendo
-        vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
-        Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
-        angelegt worden sein.</para>
       </sect2>
 
       <sect2 id="Gruppen-anlegen">
@@ -1185,121 +1255,440 @@ insserv kivitendo-task-server</programlisting>
         Anlegen können Sie die verschiedenen Bereiche wählen, auf die
         Mitglieder dieser Gruppe Zugriff haben sollen.</para>
 
-        <para>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
-        Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
-        Datenbanken, die in dieser Installation verwaltet werden.</para>
+        <para>Benutzergruppen werden zwar in der Authentifizierungsdatenbank gespeichert, gelten aber nicht automatisch für alle
+        Mandanten. Der Administrator legt vielmehr fest, für welche Mandanten eine Gruppe gültig ist. Dies kann entweder beim Bearbeiten der
+        Gruppe geschehen ("diese Gruppe ist gültig für Mandanten X, Y und Z"), oder aber wenn man einen Mandanten bearbeitet ("für diesen
+        Mandanten sind die Gruppen A, B und C gültig").</para>
+
+        <para>Wurden bereits Benutzer angelegt, so können hier die Mitglieder dieser Gruppe festgelegt werden ("in dieser Gruppe sind die
+        Benutzer X, Y und Z Mitglieder"). Dies kann auch nachträglich beim Bearbeiten eines Benutzers geschehen ("dieser Benutzer ist
+        Mitglied in den Gruppen A, B und C").</para>
       </sect2>
 
       <sect2 id="Benutzer-anlegen">
         <title>Benutzer anlegen</title>
 
-        <para>Beim Anlegen von Benutzern werden für viele Parameter
-        Standardeinstellungen vorgenommen, die den Gepflogenheiten des
-        deutschen Raumes entsprechen.</para>
+        <para>Beim Anlegen von Benutzern werden für viele Parameter Standardeinstellungen vorgenommen, die den Gepflogenheiten des deutschen
+        Raumes entsprechen.</para>
 
-        <para>Zwingend anzugeben sind der Loginname sowie die komplette
-        Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
-        Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
-        gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
-        aktiv, so ist das Passwort-Feld deaktiviert.</para>
+        <para>Zwingend anzugeben ist der Loginname. Wenn die Passwortauthentifizierung über die Datenbank eingestellt ist, so kann hier auch
+        das Benutzerpasswort gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung aktiv, so ist das Passwort-Feld
+        deaktiviert.</para>
 
-        <para>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der
-        eben angelegten Datenbanken eingetragen werden.</para>
+        <para>Hat man bereits Mandanten und Gruppen angelegt, so kann hier auch konfiguriert werden, auf welche Mandanten der Benutzer
+        Zugriff hat bzw. in welchen Gruppen er Mitglied ist. Beide Zuweisungen können sowohl beim Benutzer vorgenommen werden ("dieser
+        Benutzer hat Zugriff auf Mandanten X, Y, Z" bzw. "dieser Benutzer ist Mitglied in Gruppen X, Y und Z") als auch beim Mandanten ("auf
+        diesen Mandanten haben Benutzer A, B und C Zugriff") bzw. bei der Gruppe ("in dieser Gruppe sind Benutzer A, B und C
+        Mitglieder").</para>
       </sect2>
 
-      <sect2 id="Gruppenmitgliedschaften-verwalten">
-        <title>Gruppenmitgliedschaften verwalten</title>
+      <sect2 id="Mandanten-anlegen">
+        <title>Mandanten anlegen</title>
 
-        <para>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den
-        Gruppen zugewiesen werden. Dazu gibt es zwei Möglichkeiten:</para>
+        <para>Ein Mandant besteht aus Administrationssicht primär aus einem eindeutigen Namen. Weiterhin wird hier hinterlegt, welche
+        Datenbank als Mandantendatenbank benutzt wird. Hier müssen die Zugriffsdaten einer der eben angelegten Datenbanken eingetragen
+        werden.</para>
 
-        <orderedlist numeration="arabic">
-          <listitem>
-            <para>In der Gruppenverwaltung wählt man eine Gruppe aus. Im
-            folgenden Dialog kann man dann einzeln die Benutzer der Gruppe
-            hinzufügen.</para>
-          </listitem>
+        <para>Hat man bereits Benutzer und Gruppen angelegt, so kann hier auch konfiguriert werden, welche Benutzer Zugriff auf den
+        Mandanten haben bzw. welche Gruppen für den Mandanten gültig sind. Beide Zuweisungen können sowohl beim Mandanten vorgenommen werden
+        ("auf diesen Mandanten haben Benutzer X, Y und Z Zugriff" bzw. "für diesen Mandanten sind die Gruppen X, Y und Z gültig") als auch
+        beim Benutzer ("dieser Benutzer hat Zugriff auf Mandanten A, B und C") bzw. bei der Gruppe ("diese Gruppe ist für Mandanten A, B und
+        C gültig").</para>
+      </sect2>
+    </sect1>
+    <sect1 id="Drucker--Systemverwaltung">
+      <title>Drucker- und Systemverwaltung</title>
+      <para>Im Administrationsmenü gibt es ferner noch die beiden Menüpunkte Druckeradministration und System.</para>
+      <sect2 id="Druckeradministration">
+        <title>Druckeradministration</title>
+      <para>Unter dem Menüpunkt Druckeradministration lassen sich beliebig viele "Druckbefehle" im System verwalten. Diese Befehle werden mandantenweise
+      zugeordnet. Unter Druckerbeschreibung wird der Namen des Druckbefehls festgelegt, der dann in der Druckerauswahl des Belegs angezeigt wird.</para>
+      <para>Unter Druckbefehl definiert man den eigentlichen Druckbefehl, der direkt auf dem Webserver ausgeführt wird, bspw. 'lpr -P meinDrucker' oder ein
+      kompletter Pfad zu einem Skript (/usr/local/src/kivitendo/scripts/pdf_druck_in_verzeichnis.sh).
+      Wird ferner noch ein optionales Vorlagenkürzel verwendet, wird dieses Kürzel bei der Auswahl der Druckvorlagendatei mit einem Unterstrich ergänzt, ist
+      bspw. das Kürzel 'epson_drucker' definiert, so wird beim Ausdruck eines Angebots folgende Vorlage geparst: sales_quotation_epson_drucker.tex.</para>
+     </sect2>
+      <sect2 id="System">
+        <title>System sperren / entsperren</title>
+
+        <para>Unter dem Menüpunkt System gibt es den Eintrag 'Installation sperren/entsperren'. Setz man diese Sperre so ist der Zugang zu der gesamten kivitendo Installation gesperrt.</para>
+        <para>Falls die Sperre gesetzt ist, erscheint anstelle der Anmeldemaske die Information: 'kivitendo ist momentan zwecks Wartungsarbeiten nicht zugänglich.'.
+        </para>
+        <para>Wichtig zu erwähnen ist hierbei noch, dass sich kivitendo automatisch 'sperrt', falls es bei einem Versionsupdate zu einem Datenbankfehler kam. Somit kann hier nicht aus Versehen
+        mit einem inkonsistenten Datenbestand weitergearbeitet werden.</para>
+     </sect2>
+    </sect1>
 
-          <listitem>
-            <para>In der Gruppenverwaltung wählt man das Tool zur Verwaltung
-            der Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die
-            alle im System angelegten Gruppen und Benutzer enthält. Durch
-            Setzen der Häkchen wird der Benutzer in der ausgewählten Zeile der
-            Gruppe in der ausgewählten Spalte hinzugefügt.</para>
-          </listitem>
-        </orderedlist>
+    <sect1 id="config.sending-email" xreflabel="E-Mail-Versand aus kivitendo heraus">
+      <title>E-Mail-Versand aus kivitendo heraus</title>
+
+      <para>kivitendo kann direkt aus dem Programm heraus E-Mails versenden, z.B. um ein Angebot direkt an einen Kunden zu
+      verschicken. Damit dies funktioniert, muss eingestellt werden, über welchen Server die E-Mails verschickt werden sollen. kivitendo
+      unterstützt dabei zwei Mechanismen: Versand über einen lokalen E-Mail-Server (z.B. mit <productname>Postfix</productname> oder
+      <productname>Exim</productname>, was auch die standardmäßig aktive Methode ist) sowie Versand über einen SMTP-Server (z.B. der des
+      eigenen Internet-Providers).</para>
+
+      <para>Welche Methode und welcher Server verwendet werden, wird über die Konfigurationsdatei <filename>config/kivitendo.conf</filename>
+      festgelegt. Dort befinden sich alle Einstellungen zu diesem Thema im Abschnitt '<literal>[mail_delivery]</literal>'.</para>
+
+      <sect2 id="config.sending-email.sendmail" xreflabel="E-Mail-Versand über lokalen E-Mail-Server">
+        <title>Versand über lokalen E-Mail-Server</title>
+
+        <para>Diese Methode bietet sich an, wenn auf dem Server, auf dem kivitendo läuft, bereits ein funktionsfähiger E-Mail-Server wie
+        z.B. <productname>Postfix</productname>, <productname>Exim</productname> oder <productname>Sendmail</productname> läuft.</para>
+
+        <para>Um diese Methode auszuwählen, muss der Konfigurationsparameter '<literal>method = sendmail</literal>' gesetzt sein. Dies ist
+        gleichzeitig der Standardwert, falls er nicht verändert wird.</para>
+
+        <para>Um zu kontrollieren, wie das Programm zum Einliefern gestartet wird, dient der Parameter '<literal>sendmail =
+        ...</literal>'. Der Standardwert verweist auf das Programm <filename>/usr/bin/sendmail</filename>, das bei allen oben genannten
+        E-Mail-Serverprodukten für diesen Zweck funktionieren sollte.</para>
+
+        <para>Die Konfiguration des E-Mail-Servers selber würde den Rahmen dieses sprengen. Hierfür sei auf die Dokumentation des
+        E-Mail-Servers verwiesen.</para>
       </sect2>
 
-      <sect2 id="Migration-alter-Installationen">
-        <title>Migration alter Installationen</title>
-
-        <para>Wenn kivitendo 2.6.3 über eine ältere Version installiert wird,
-        in der die Benutzerdaten noch im Dateisystem im Verzeichnis
-        <literal>users</literal> verwaltet wurden, so bietet kivitendo die
-        Möglichkeit, diese Benutzerdaten automatisch in die
-        Authentifizierungsdatenbank zu übernehmen. Dies geschieht, wenn man
-        sich nach dem Update der Installation das erste Mal im
-        Administrationsbereich anmeldet. Findet kivitendo die Datei
-        <literal>users/members</literal>, so wird der Migrationsprozess
-        gestartet.</para>
-
-        <para>Der Migrationsprozess ist nahezu vollautomatisch. Alle
-        Benutzerdaten können übernommen werden. Nach den Benutzerdaten bietet
-        kivitendo noch die Möglichkeit an, dass automatisch eine
-        Benutzergruppe angelegt wird. Dieser Gruppe wird Zugriff auf alle
-        Funktionen von kivitendo gewährt. Alle migrierten Benutzern werden
-        Mitglied in dieser Gruppe. Damit wird das Verhalten von kivitendo bis
-        Version 2.4.3 inklusive wiederhergestellt, und die Benutzer können
-        sich sofort wieder anmelden und mit dem System arbeiten.</para>
+      <sect2 id="config.sending-email.smtp" xreflabel="E-Mail-Versand über einen SMTP-Server">
+        <title>Versand über einen SMTP-Server</title>
+
+        <para>Diese Methode bietet sich an, wenn kein lokaler E-Mail-Server vorhanden oder zwar einer vorhanden, dieser aber nicht
+        konfiguriert ist.</para>
+
+        <para>Um diese Methode auszuwählen, muss der Konfigurationsparameter '<literal>method = smtp</literal>' gesetzt sein. Die folgenden
+        Parameter dienen dabei der weiteren Konfiguration:</para>
+
+        <variablelist>
+          <varlistentry>
+            <term><varname>hostname</varname></term>
+
+            <listitem><para>Name oder IP-Adresse des SMTP-Servers. Standardwert: '<literal>localhost</literal>'</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>port</varname></term>
+
+            <listitem><para>Portnummer. Der Standardwert hängt von der verwendeten Verschlüsselungsmethode ab. Gilt '<literal>security =
+            none</literal>' oder '<literal>security = tls</literal>', so ist 25 die Standardportnummer. Für '<literal>security =
+            ssl</literal>' ist 465 die Portnummer. Muss normalerweise nicht geändert werden.</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>security</varname></term>
+
+            <listitem><para>Wahl der zu verwendenden Verschlüsselung der Verbindung mit dem Server. Standardwert ist
+            '<literal>none</literal>', wodurch keine Verschlüsselung verwendet wird. Mit '<literal>tls</literal>' wird TLS-Verschlüsselung
+            eingeschaltet, und mit '<literal>ssl</literal>' wird Verschlüsselung via SSL eingeschaltet. Achtung: Für
+            '<literal>tls</literal>' und '<literal>ssl</literal>' werden zusätzliche Perl-Module benötigt (siehe unten).</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>login</varname> und <varname>password</varname></term>
+
+            <listitem><para>Falls der E-Mail-Server eine Authentifizierung verlangt, so können mit diesen zwei Parametern der Benutzername
+            und das Passwort angegeben werden. Wird Authentifizierung verwendet, so sollte aus Sicherheitsgründen auch eine Form von
+            Verschlüsselung aktiviert werden.</para></listitem>
+          </varlistentry>
+        </variablelist>
+
+        <para>Wird Verschlüsselung über TLS oder SSL aktiviert, so werden zusätzliche Perl-Module benötigt. Diese sind:</para>
+
+        <itemizedlist>
+          <listitem><para>TLS-Verschlüsselung: Modul <literal>Net::SSLGlue</literal> (Debian-Paketname
+          <literal>libnet-sslglue-perl</literal>, Fedora Core: <literal>perl-Net-SSLGlue</literal>, openSUSE:
+          <literal>perl-Net-SSLGlue</literal></para></listitem>
+
+          <listitem><para>SSL-Verschlüsselung: Modul <literal>Net::SMTP::SSL</literal> (Debian-Paketname
+          <literal>libnet-smtp-ssl-perl</literal>, Fedora Core: <literal>perl-Net-SMTP-SSL</literal>, openSUSE:
+          <literal>perl-Net-SMTP-SSL</literal></para></listitem>
+        </itemizedlist>
       </sect2>
     </sect1>
 
     <sect1 id="Drucken-mit-kivitendo">
       <title>Drucken mit kivitendo</title>
 
-      <para>Das Drucksystem von kivitendo benutzt von Haus aus LaTeX Vorlagen.
-      Um drucken zu können, braucht der Server ein geeignetes LaTeX System. Am
-      einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter
-      Debianoiden Betriebssystemen sind das die Pakete:</para>
+      <para>Das Drucksystem von kivitendo benutzt von Haus aus LaTeX-Vorlagen.  Um drucken zu können, braucht der Server ein geeignetes
+      LaTeX System. Am einfachsten ist dazu eine <literal>texlive</literal> Installation. Unter Debianoiden Betriebssystemen installiert man
+      die Pakete mit:</para>
 
-      <para><literal>texlive-latex-base texlive-latex-extra
-      texlive-fonts-recommended</literal></para>
+      <para><programlisting>aptitude install texlive-base-bin texlive-latex-recommended texlive-fonts-recommended \
+  texlive-latex-extra texlive-lang-german texlive-generic-extra</programlisting></para>
 
-      <para>Diese hinteren beiden enthalten Bibliotheken und Schriftarten die
-      von den Standardvorlagen verwendet werden.</para>
+      <para>TODO: RPM-Pakete.</para>
 
-      <para>TODO: rpm Pakete.</para>
+      <para>kivitendo bringt drei alternative Vorlagensätze mit:</para>
+      <itemizedlist>
+        <listitem><para>Standard</para></listitem>
+        <listitem><para>f-tex</para></listitem>
+        <listitem><para>RB</para></listitem>
+      </itemizedlist>
 
-      <para>In den allermeisten Installationen sollte drucken jetzt schon
-      funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
-      Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
-      die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
-      Beispiel:</para>
+      <sect2 id="Vorlagenverzeichnis-anlegen" xreflabel="Vorlagenverzeichnis anlegen">
+        <title>Vorlagenverzeichnis anlegen</title>
+        <para>Es lässt sich ein initialer Vorlagensatz erstellen. Die LaTeX-System-Abhängigkeiten hierfür kann man prüfen mit:</para>
 
-      <itemizedlist>
-        <listitem>
-          <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
-          LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
-          Vorlagen aus der Community auf. Installieren Sie die entsprechenden
-          Pakete.</para>
-        </listitem>
+        <programlisting>./scripts/installation_check.pl -lv</programlisting>
 
-        <listitem>
-          <para>! Package inputenc Error: Unicode char \u8:æ¡\9c not set up for
-          use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
-          einer Standardinstallation exotische utf8 Zeichen zu drucken.
-          TeXLive unterstützt von Haus nur romanische Schriften und muss mit
-          diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
-          Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
-        </listitem>
-      </itemizedlist>
+       <para>Der Angemmeldete Benutzer muss in einer Gruppe sein, die über das
+              Recht "Konfiguration -> Mandantenverwaltung" verfügt. Siehe auch <xref linkend="Gruppen-anlegen"/>.
+        </para>
+        <para>Im Userbereich lässt sich unter:
+        "<guimenu>System</guimenu> -&gt;
+        <guisubmenu>Mandantenverwaltung</guisubmenu> -&gt; <guimenuitem>Verschiedenes</guimenuitem>" die Option
+        "Neue Druckvorlagen aus Vorlagensatz erstellen" auswählen.</para>
+
+        <orderedlist>
+          <listitem><para><option>Vorlagen auswählen</option>: Wählen Sie hier den Vorlagensatz aus, der kopiert werden soll
+          (<filename>Standard</filename>, <filename>f-tex</filename> oder <filename>RB</filename>.)</para></listitem>
+          <listitem><para><option>Neuer Name</option>: Der Verzeichnisname für den neuen Vorlagensatz. Dieser kann im Rahmen der üblichen
+          Bedingungen für Verzeichnisnamen frei gewählt werden.</para></listitem>
+        </orderedlist>
+
+        <para>Nach dem Speichern wird das Vorlagenverzeichnis angelegt und ist für den aktuellen Mandanten ausgewählt.
+           Der gleiche Vorlagensatz kann, wenn er mal angelegt ist, bei mehreren Mandanten verwendet werden.
+           Eventuell muessen Anpassungen (Logo, Erscheinungsbild, etc) noch vorgenommen werden. Den Ordner findet man im Dateisistem unter
+           <filename>./templates/[Neuer Name]</filename></para>
+
+
+      </sect2>
+      <sect2 id="Vorlagen-Standard">
+        <title>Standard</title>
+
+        <para>Der Standard-Vorlagensatz von Kivitendo. Wie unter <ulink url="http://demo.kivitendo.org">http://demo.kivitendo.org</ulink> zu
+        sehen.</para>
+
+      </sect2>
+
+      <sect2 id="f-tex">
+        <title>f-tex</title>
+
+        <para>Ein Vorlagensatz, der in wenigen Minuten alle Dokumente zur Verfügung stellt.</para>
+
+        <sect3 id="f-tex-Feature-Übersicht">
+          <title>Feature-Übersicht</title>
+          <itemizedlist>
+            <listitem><para>Keine Redundanz. Es wird ein- und dieselbe LaTeX-Vorlage für alle briefartigen Dokumente verwendet. Also
+            Angebot, Rechnung, Performarechnung, Lieferschein, aber eben nicht für Paketaufkleber etc..</para></listitem>
+
+            <listitem><para>Leichte Anpassung an das Firmen-Layout durch verwendung eines Hintergrund-PDF. Dieses kann leicht mit dem
+            eigenen Lieblingsprogramm erstellt werden (Openoffice, Inkscape, Gimp, Adobe*)</para></listitem>
+
+            <listitem><para>Hintergrund-PDF umschaltbar auf "nur erste Seite" (Standard) oder "alle Seiten" (Option
+            "<option>bgPdfFirstPageOnly</option>" in Datei <filename>letter.lco</filename>)</para></listitem>
+
+            <listitem><para>Hintergrund-PDF für Ausdruck auf bereits bedrucktem Briefpapier abschaltbar. Es wird dann nur bei per E-Mail
+            versendeten Dokumenten eingebunden (Option "<option>bgPdfEmailOnly</option>" in Datei
+            <filename>letter.lco</filename>).</para></listitem>
+
+            <listitem><para>Nutzung der Layout-Funktionen von LaTeX für Seitenumbruch, Wiederholung von Kopfzeilen, Zwischensummen
+            etc. (danke an Kai-Martin Knaak für die Vorarbeit)</para></listitem>
+
+            <listitem><para>Anzeige des Empfängerlandes im Adressfeld nur, wenn es vom Land des eigenen Unternehmens abweicht (also die
+            Rechnung das Land verlässt).</para></listitem>
+
+            <listitem><para>Multisprachfähig leicht um weitere Sprachen zu erweitern, alle Übersetzungen in der Datei
+            <filename>translatinos.tex</filename>.</para></listitem>
+
+            <listitem><para>Auflistung von Bruttopreisen für Endverbraucher.</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="f-tex-Installation">
+          <title>Die Installation</title>
+          <itemizedlist>
+            <listitem><para>Vorlagenverzeichnis mit Option f-tex anlegen, siehe: <xref linkend="Vorlagenverzeichnis-anlegen"/>. Das
+            Vorlagensystem funktioniert jetzt schon, hat allerdings noch einen Beispiel-Briefkopf.</para></listitem>
+
+            <listitem><para>Erstelle eine pdf-Hintergrund Datei und verlinke sie nach <filename>./letter_head.pdf</filename>.</para></listitem>
+            <listitem><para>Editiere den Bereich "<option>settings</option>" in der datei <filename>letter.lco</filename>.</para></listitem>
+          </itemizedlist>
+
+          <para>oder etwas Detaillierter:</para>
+
+          <para>
+            Es wird eine Datei <filename>sample.lco</filename> erstellt und diese nach <filename>letter.lco</filename> verlinkt.  Eigentlich
+            ist dies die Datei die für die Firmenspezifischen Anpassungen gedacht ist.  Da die Einstiegshürde in LaTeX nicht ganz niedrig
+            ist, wird in dieser Datei auf ein Hintergrundpdf verwiesen. Ich empfehle über dieses PDF die persönlichen Layoutanpassungen
+            vorzunehmen und <filename>sample.lco</filename> unverändert zu lassen. Die die Anpassung über eine
+            <filename>*.lco</filename>-Datei die letztlich auf <filename>letter.lco</filename> verlinkt ist ist aber auch möglich.
+          </para>
+
+          <para>
+            Es wird eine Datei <filename>sample_head.pdf</filename> mit ausgeliefert, diese wird nach <filename>letter_head.pdf</filename>
+            verlinkt. Damit gibt es schon mal eine Funktionsfähige Vorlage. Schau Dir nach Abschluss der Installation die Datei
+            <filename>sample_haed.pdf</filename> an und erstelle ein entsprechendes PDF passend zum Briefkopf Deiner Firma, diese dann im
+            Template Verzeichniss ablegen und statt <filename>sample_head.pdf</filename> nach <filename>letter_head.pdf</filename>
+            verlinken.
+          </para>
+
+          <para>
+            letzlich muss <filename>letter_head.pdf</filename> auf das passende Hintergrund-PDF verweisen, welches gewünschten Briefkopf
+            enthält. Bei Updates oder nach erneutem
+          </para>
+
+          <para>
+            Es wird eine Datei <filename>mydata.tex.example</filename> ausgeliefert, die nach <filename>mytdata.tex</filename> verlinkt
+            ist. Bei verwendetem Hintergrund-PDF wird nur der Eintrag für das Land verwendet. Die Datei muss also nicht angefasst
+            werden. Die Anderen Werte sind für das Modul 'lp' (Label Print in erp - zur Zeit nicht im öffentlichen Zweig).
+          </para>
+          <para>
+            Alle Anpassungen zum Briefkopf, Fusszeilen, Firmenlogos, etc.  sollten über die Hintergrund-PDF-Datei oder die
+            <filename>*.lco</filename>-Datei erfolgen.
+          </para>
+        </sect3>
+
+        <sect3 id="f-tex-Funktionsübersicht">
+          <title>f-tex Funktionsübersicht</title>
+          <para>
+            Das Konzept von kivitendo sieht vor, für jedes Dokument (Auftragsbestätigung, Lieferschein, Rechnung, etc.) eine LaTeX-Vorlage
+            vorzuhalten, dies ist sehr Wartungsunfreundlich. Auch das Einlesen einer einheitlichen Quelle für den Briefkopf bringt nur
+            bedingte Vorteile, da hier leicht die Pflege der Artikel-Tabellen aus dem Ruder läuft. Bei dem vorliegenden Ansatz wird für alle
+            briefartigen Dokumente mit Artikel-Tabellen eine einheitliche LaTeX-Vorlage verwendet, welche über Codeweichen die
+            Besonderheiten der jeweiligen Dokumente Berücksichtigt.
+          </para>
+
+          <itemizedlist>
+            <listitem><para>Tabellen mit oder ohne Preis</para></listitem>
+            <listitem><para>Sprache der Tabellenüberschriften etc.</para></listitem>
+            <listitem><para>Anpassung der Bezugs-Zeile (z.B. Rechnungsnummer versus Angebotsnummer)</para></listitem>
+            <listitem><para>Darstellung von Brutto oder Netto-Preisen in der Auflistung (Endverbraucher versus Gewerblicher
+            Kunde)</para></listitem>
+           </itemizedlist>
+
+           <para>Nachteil:</para>
+
+           <para>
+             LaTeX hat ohnehin eine sehr steile Lehrnkurve. Die Datei <filename>letter.tex</filename> ist sehr komplex und verstärkt damit
+             diesen Effekt noch einmal erheblich.  Wer LaTeX-Erfahrung hat, oder geübt ist Scriptsparachen nachzuvollziehen kann natürlich
+             auch innerhalb der Tabellendarstellung gut persönliche Anpassungen vornehmen. Aber man kann sich hier bei Veränderungen sehr
+             schnell häftig in den Fuss schiessen.
+           </para>
+
+           <para>Wer nicht so tief in die Materie einsteigen will oder leicht zu frustrieren ist, sollte sein Hintergrund PDF auf Basis der
+           mitglieferten Datei <filename>sample_head.pdf</filename> erstellen, und sich an der Form der dargestellten Tabellen wie sie
+           ausgeliefert werden, erfreuen.
+           </para>
+
+           <para>Kleiner Tipp: Nicht zu viel auf einmal wollen, lieber kleine kontinuierliche Schritte gehen.</para>
+
+        </sect3>
+
+        <sect3 id="f-tex-Bruttopreise">
+          <title>Bruttopreise für Endverbraucher</title>
+
+                <para>Der auszuweisende Bruttopreis wird innerhalb der LaTeX-Umgebung berechnet. Es gibt zwar ein Feld, um bei Aufträgen "alle
+                Preise Brutto" auszuwählen, aber:</para>
+          <itemizedlist>
+            <listitem>
+              <para>hierfür müssen die Preise auch in Brutto in der Datenbank stehen (ja - das lässt sich über die Preisgruppen und die
+              Zuordung einer Default-Preisgruppe handhaben)</para>
+            </listitem>
+            <listitem>
+              <para>man darf beim Anlegen des Vorgangs nicht vergessen Dieses Häkchen zu setzen.  (das ist in der Praxis wenn man sowohl
+              Endverbraucher- wie Gewerbekunden beliefert der eigentliche Knackpunkt)</para>
+            </listitem>
+          </itemizedlist>
+
+          <para>
+            Es gibt mit f-tex eine weitere Alternative. Die Information ob Brutto oder Nettorechnung wird mit den Zahlarten
+            verknüpft. Zahlarten bei denen Rechnungen, Angebote, etc, in Brutto ausgegeben werden sollen, enden mit "_E" (für
+            Endverbraucher). Falls identische Zahlarten für Gewerbekunden und Endverbraucher vorhanden sind, legt man diese einfach doppelt
+            an (einmal mit der Namensendung "_E"). Gewinn:</para>
+
+          <itemizedlist>
+            <listitem><para>Die Entscheidung, ob Netopreise ausgewiesen werden, ist nicht mehr fix mit einer Preisliste Verbunden.</para></listitem>
+            <listitem><para>Die Default-Zahlart kann im Kundendatensatz hinterlegt werden, und man muss nicht mehr daran denken, "alle Preise
+            Netto" auszuwählen.</para></listitem>
+            <listitem><para>Die Entscheidung, ob Netto- oder Bruttopreise ausgewiesen werden, kann direkt beim Drucken reviediert werden,
+            ohne dass sich der Auftragswert ändert.</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="f-tex-lieferadressen">
+          <title>Lieferadressen</title>
+
+          <para>In Lieferscheinen kommen <varname>shipto*</varname>-Variablen im Adressfeld zum Einsatz. Wenn die
+          <varname>shipto*</varname>-Variable leer ist, wird die entsprechende Adressvariable eingesetzt.  Wenn also die Lieferadresse in
+          Straße, Hausnummer und Ort abweicht, müssen auch nur diese Felder in der Lieferadresse ausgefüllt werden. Für den Firmenname wird
+          der Wert der Hauptadresse angezeigt.
+          </para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="Vorlagen-RB">
+        <title>Der Druckvorlagensatz RB</title>
+
+        <para>Hierbei handelt es sich um einen vollständigen Dokumentensatz mit alternativem Design.</para>
+        <para>Die konzeptionelle Idee der Vorlagen wird <ulink
+          url="http://www.kivitendo-support.de/vortraege/Lx-Office%20Anwendertreffen%20LaTeX-Druckvorlagen-Teil3-finale.pdf">hier</ulink>
+          auf Folie 5 bis 10 vorgestellt. Informationen zur Anpassung an die eigenen Firmendaten finden sich in der Datei Readme.tex im Vorlagenverzeichnis.</para>
+
+      </sect2>
+
+      <sect2 id="allgemeine-hinweise-zu-latex">
+        <title>Allgemeine Hinweise zu LaTeX Vorlagen</title>
+        <para>In den allermeisten Installationen sollte drucken jetzt schon
+        funktionieren. Sollte ein Fehler auftreten wirft TeX sehr lange
+        Fehlerbeschreibungen, der eigentliche Fehler ist immer die erste Zeite
+        die mit einem Ausrufezeichen anfängt. Häufig auftretende Fehler sind zum
+        Beispiel:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>! LaTeX Error: File `eurosym.sty' not found. Die entsprechende
+            LaTeX-Bibliothek wurde nicht gefunden. Das tritt vor allem bei
+            Vorlagen aus der Community auf. Installieren Sie die entsprechenden
+            Pakete.</para>
+          </listitem>
+          <listitem>
+            <para>! Package inputenc Error: Unicode char \u8:... set up for
+            use with LaTeX. Dieser Fehler tritt auf, wenn sie versuchen mit
+            einer Standardinstallation exotische utf8 Zeichen zu drucken.
+            TeXLive unterstützt von Haus nur romanische Schriften und muss mit
+            diversen Tricks dazu gebracht werden andere Zeichen zu akzeptieren.
+            Adere TeX Systeme wie XeTeX schaffen hier Abhilfe.</para>
+          </listitem>
+        </itemizedlist>
 
-      <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
-      heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
-      Prüfen Sie den Namen in der Konfiguration (Standard:
-      <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
-      (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
-      darf.</para>
+        <para>Wird garkein Fehler angezeigt sondern nur der Name des Templates,
+        heißt das normalerweise, dass das LaTeX Binary nicht gefunden wurde.
+        Prüfen Sie den Namen in der Konfiguration (Standard:
+        <literal>pdflatex</literal>), und stellen Sie sicher, dass pdflatex
+        (oder das von Ihnen verwendete System) vom Webserver ausgeführt werden
+        darf.</para>
+
+        <para>Wenn sich das Problem nicht auf Grund der ausgabe im Webbrowser verifizieren lässt:</para>
+        <itemizedlist>
+          <listitem>
+             <para> editiere [kivitendo-home]/config/kivitendo.conf und ändere "keep_temp_files" auf 1</para>
+             <para><programlisting>keep_temp_files = 1;</programlisting></para>
+          </listitem>
+          <listitem>
+             <para>bei fastcgi oder mod_perl den Webserver neu Starten</para>
+          </listitem>
+          <listitem>
+            <para>Nochmal einen Druckversuch im Webfrontend auslösen</para>
+          </listitem>
+          <listitem>
+            <para>wechsele in das users Verzeichnis von kivitendo</para>
+            <para><programlisting>cd [kivitendo-home]/users</programlisting></para>
+          </listitem>
+          <listitem>
+            <para>LaTeX Suchpfad anpassen:</para>
+            <para><programlisting>export TEXINPUTS=".:[kivitendo-home]/templates/[aktuelles_template_verzeichniss]:"</programlisting></para>
+          </listitem>
+          <listitem>
+            <para>Finde herraus welche Datei kivitendo beim letzten Durchlauf erstellt hat</para>
+            <para><programlisting>ls -lahtr ./1*.tex</programlisting></para>
+            <para>Es sollte die letzte Datei ganz unten sein</para>
+          </listitem>
+          <listitem>
+            <para>für besseren Hinweis auf Fehler texdatei nochmals übersetzen</para>
+            <para><programlisting>pdflatex ./1*.tex</programlisting></para>
+            <para>in der *.tex datei nach dem Fehler suchen.</para>
+          </listitem>
+        </itemizedlist>
+      </sect2>
     </sect1>
 
     <sect1 id="OpenDocument-Vorlagen">
@@ -1315,13 +1704,6 @@ insserv kivitendo-task-server</programlisting>
       <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
       Dieses ist die Standardeinstellung.</para>
 
-      <para>Weiterhin muss in der Datei
-      <filename>config/kivitendo.conf</filename> die Variable
-      <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
-      die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
-      Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
-      "UTF-8".</para>
-
       <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
       weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
       OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
@@ -1348,6 +1730,23 @@ insserv kivitendo-task-server</programlisting>
       Python-UNO-Bindings benötigt, die Bestandteil von OpenOffice 2
       sind.</para>
 
+      <note>
+        <para>
+          Für die Verbindung zu OpenOffice wird normalerweise der Python-Interpreter <filename>/usr/bin/python</filename> benutzt. Sollte
+          dies nicht der richtige sein, so kann man mit zwei Konfigurationsvariablen entscheiden, welcher Python-Interpreter genutzt
+          wird. Mit der Option <literal>python_uno</literal> aus dem Abschnitt <literal>applications</literal> wird der Interpreter selber
+          festgelegt; sie steht standardmäßig auf dem eben erwähnten Wert <literal>/usr/bin/python</literal>.
+        </para>
+
+        <para>
+          Zusätzlich ist es möglich, Pfade anzugeben, in denen Python neben seinen normalen Suchpfaden ebenfalls nach Modulen gesucht wird,
+          z.B. falls sich diese in einem gesonderten OpenOffice-Verzeichnis befinden. Diese zweite Variable heißt
+          <literal>python_uno_path</literal> und befindet sich im Abschnitt <literal>environment</literal>. Sie ist standardmäßig
+          leer. Werden hier mehrere Pfade angegeben, so müssen diese durch Doppelpunkte voneinander getrennt werden. Der Inhalt wird an den
+          Python-Interpreter über die Umgebungsvariable <literal>PYTHONPATH</literal> übergeben.
+        </para>
+      </note>
+
       <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
       wird für jedes Dokument OpenOffice neu gestartet und die Konvertierung
       mit Hilfe eines Makros durchgeführt. Dieses Makro muss in der
@@ -1385,11 +1784,9 @@ insserv kivitendo-task-server</programlisting>
              xreflabel="Einführung in die Konfiguration zur EUR">
         <title>Einführung</title>
 
-        <para>kivitendo besaß bis inklusive Version 2.6.3 einen
-        Konfigurationsparameter namens <varname>eur</varname>, der sich in der
-        Konfigurationsdatei <filename>config/lx_office.conf</filename>
-        befand. Somit galt er für alle Mandanten, die in dieser Installation
-        benutzt wurden.</para>
+        <para>kivitendo besaß bis inklusive Version 2.6.3 einen Konfigurationsparameter namens <varname>eur</varname>, der sich in der
+        Konfigurationsdatei <filename>config/kivitendo.conf</filename> (damals noch <filename>config/lx_office.conf</filename>)
+        befand. Somit galt er für alle Mandanten, die in dieser Installation benutzt wurden.</para>
 
         <para>Mit der nachfolgenden Version wurde der Parameter zum Einen in
         die Mandantendatenbank verschoben und dabei auch gleich in drei
@@ -1466,11 +1863,15 @@ insserv kivitendo-task-server</programlisting>
         ändert.</para>
 
         <para>Die aktuelle Konfiguration wird unter Nummernkreise und
-        Standardkonten unter dem neuen Punkt "Einstellungen" angezeigt
-        (read-only). Eine spätere Änderung ist für einen bestehenden Mandanten
-        nicht mehr möglich. Dies war auch vorher nicht möglich, bzw.
-        vorhandene Daten wurden so belassen und haben damit die Ergebnisse
-        verfälscht.</para>
+        Standardkonten unter dem neuen Punkt "Einstellungen" (read-only)
+        angezeigt. Unter <guimenu>System</guimenu>
+        -&gt; <guisubmenu>Mandantenkonfiguration</guisubmenu> können
+        die Einstellungen auch geändert werden. Dabei ist zu beachten,
+        dass eine Änderung vorhandene Daten so belässt und damit
+        evtl. die Ergebnisse verfälscht. Dies gilt vor Allem für die
+        Warenbuchungsmethode (siehe auch
+        <link linkend="config.eur.inventory-system-perpetual">
+        Bemerkungen zu Bestandsmethode</link>).</para>
       </sect2>
 
       <sect2 id="config.eur.inventory-system-perpetual">
@@ -1613,6 +2014,73 @@ insserv kivitendo-task-server</programlisting>
         </screenshot>
       </sect2>
     </sect1>
+    <sect1 id="bilanz">
+     <title>Verhalten des Bilanzberichts</title>
+      <para>
+    Bis Version 3.0 wurde "closedto" ("Bücher schließen zum") als Grundlage für das
+    Startdatum benutzt. Schließt man die Bücher allerdings monatsweise führt dies
+    zu falschen Werten.</para>
+    <para>In der Mandantenkonfiguration kann man dieses Verhalten genau einstellen indem man:</para>
+  <itemizedlist>
+   <listitem>
+    <para>weiterhin closed_to benutzt (Default, es ändert sich nichts zu vorher)</para>
+  </listitem>
+   <listitem>
+    <para>immer den Jahresanfang nimmt (1.1. relativ zum Stichtag)</para>
+  </listitem>
+   <listitem>
+    <para>immer die letzte Eröffnungsbuchung als Startdatum nimmt</para>
+       <para>- mit Jahresanfang als Alternative wenn es keine EB-Buchungen gibt</para>
+      <para>- oder mit "alle Buchungen" als Alternative"</para>
+   </listitem>
+   <listitem>
+     <para>mit Jahresanfang als Alternative wenn es keine EB-Buchungen gibt </para>
+  </listitem>
+   <listitem>
+    <para>immer alle Buchungen seit Beginn der Datenbank nimmt</para>
+  </listitem>
+  </itemizedlist>
+   Folgende Hinweise zu den Optionen:
+    Das "Bücher schließen Datum" ist sinnvoll, wenn man nur komplette Jahre
+    schließt. Bei Wirtschaftsjahr = Kalendarjahr entspricht dies aber auch
+    Jahresanfang.
+    "Alle Buchungen" kann z.B. sinnvoll sein wenn man ohne Jahresabschluß
+    durchbucht.
+    Eröffnungsbuchung mit "alle Buchungen" als Fallback ist z.B. sinnvoll, wenn man
+    am sich Anfang des zweiten Buchungsjahres befindet, und noch keinen
+    Jahreswechsel und auch noch keine EB-Buchungen hat.
+    Bei den Optionen mit EB-Buchungen wird vorausgesetzt, daß diese immer am 1. Tag
+    des Wirtschaftsjahres gebucht werden.
+    Zur Sicherheit wird das Startdatum im Bilanzbericht jetzt zusätzlich zum
+    Stichtag mit angezeigt. Das hilft auch bei der Kontrolle für den
+    Abgleich mit der GuV.
+    </sect1>
+    <sect1 id="config.client">
+      <title>Einstellungen pro Mandant</title>
+
+      <para>Einige Einstellungen können von einem Benutzer mit dem
+      <link linkend="Zusammenhänge">Recht</link> "Administration
+      (Für die Verwaltung der aktuellen Instanz aus einem Userlogin heraus)"
+      gemacht werden. Diese Einstellungen sind dann für die aktuellen
+      Mandanten-Datenbank gültig. Die Einstellungen sind
+      unter <guimenu>System</guimenu>
+      -&gt; <guisubmenu>Mandantenkonfiguration</guisubmenu> erreichbar.</para>
+
+      <para>Bitte beachten Sie die Hinweise zu den einzelnen
+      Einstellungen. Einige Einstellungen sollten nicht ohne Weiteres
+      im laufenden Betrieb geändert werden (siehe
+      auch <link linkend="config.eur.inventory-system-perpetual">Bemerkungen zu
+      Bestandsmethode</link>).</para>
+
+      <para>Die Einstellungen <literal>show_bestbefore</literal>
+      und <literal>payments_changeable</literal> aus dem
+      Abschnitt <literal>features</literal> und die Einstellungen im
+      Abschnitt <literal>datev_check</literal> (sofern schon vorhanden)
+      der <link linkend="config.config-file">kivitendo-Konfigurationsdatei</link>
+      werden bei einem Datenbankupdate einer älteren Version automatisch
+      übernommen. Diese Einträge können danach aus der Konfigurationsdatei
+      entfernt werden.</para>
+    </sect1>
 
     <sect1 id="kivitendo-ERP-verwenden">
       <title>kivitendo ERP verwenden</title>
@@ -1626,7 +2094,7 @@ insserv kivitendo-task-server</programlisting>
       <para>Die Administrationsseite erreichen Sie unter:</para>
 
       <para><ulink
-      url="http://localhost/kivitendo-erp/admin.pl">http://localhost/kivitendo-erp/admin.pl</ulink></para>
+      url="http://localhost/kivitendo-erp/controller.pl?action=Admin/login">http://localhost/kivitendo-erp/controller.pl?action=Admin/login</ulink></para>
     </sect1>
   </chapter>
 
@@ -1755,6 +2223,82 @@ insserv kivitendo-task-server</programlisting>
         <varname>[periodic_invoices]</varname>.</para>
       </sect2>
 
+      <sect2 id="features.periodic-invoices.variables">
+        <title>Spezielle Variablen</title>
+
+        <para>
+          Um die erzeugten Rechnungen individualisieren zu können, werden beim Umwandeln des Auftrags in eine Rechnung einige speziell
+          formatierte Variablen durch für die jeweils aktuelle Abrechnungsperiode gültigen Werte ersetzt. Damit ist es möglich, z.B. den
+          Abrechnungszeitraum explizit auszuweisen. Eine Variable hat dabei die Syntax <literal>&lt;%variablenname%&gt;</literal>.
+        </para>
+
+        <para>
+          Diese Variablen werden in den folgenden Elementen des Auftrags ersetzt:
+        </para>
+
+        <itemizedlist>
+          <listitem><para>Bemerkungen</para></listitem>
+          <listitem><para>Interne Bemerkungen</para></listitem>
+          <listitem><para>Vorgangsbezeichnung</para></listitem>
+          <listitem><para>In den Beschreibungs- und Langtextfeldern aller Positionen</para></listitem>
+        </itemizedlist>
+
+        <para>Die zur Verfügung stehenden Variablen sind die Folgenden:</para>
+
+        <variablelist>
+          <varlistentry>
+            <term><varname>&lt;%current_quarter%&gt;</varname>, <varname>&lt;%previous_quarter%&gt;</varname>, <varname>&lt;%next_quarter%&gt;</varname></term>
+
+            <listitem>
+              <para>
+                Aktuelles, vorheriges und nächstes Quartal als Zahl zwischen <literal>1</literal> und <literal>4</literal>.
+              </para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>&lt;%current_month%&gt;</varname>, <varname>&lt;%previous_month%&gt;</varname>, <varname>&lt;%next_month%&gt;</varname></term>
+
+            <listitem>
+              <para>
+                Aktueller, vorheriger und nächster Monat als Zahl zwischen <literal>1</literal> und <literal>12</literal>.
+              </para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>&lt;%current_month_long%&gt;</varname>, <varname>&lt;%previous_month_long%&gt;</varname>, <varname>&lt;%next_month_long%&gt;</varname></term>
+
+            <listitem>
+              <para>
+                Aktueller, vorheriger und nächster Monat als Name (<literal>Januar</literal>, <literal>Februar</literal> etc.).
+              </para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>&lt;%current_year%&gt;</varname>, <varname>&lt;%previous_year%&gt;</varname>, <varname>&lt;%next_year%&gt;</varname></term>
+
+            <listitem>
+              <para>
+                Aktuelles, vorheriges und nächstes Jahr als vierstellige Jahreszahl (<literal>2013</literal> etc.).
+              </para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><varname>&lt;%period_start_date%&gt;</varname>, <varname>&lt;%period_end_date%&gt;</varname></term>
+
+            <listitem>
+              <para>
+                Formatiertes Datum des ersten und letzten Tages im Abrechnungszeitraum (z.B. bei quartalsweiser Abrechnung und im ersten
+                Quartal von 2013 wären dies der <literal>01.01.2013</literal> und <literal>31.03.2013</literal>).
+              </para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </sect2>
+
       <sect2 id="features.periodic-invoices.reports">
         <title>Auflisten</title>
 
@@ -1786,8 +2330,7 @@ insserv kivitendo-task-server</programlisting>
         manuell über den Workflow.</para>
       </sect2>
     </sect1>
-
-    <sect1 id="dokumentenvorlagen-und-variablen">
+        <sect1 id="dokumentenvorlagen-und-variablen">
       <title>Dokumentenvorlagen und verfügbare Variablen</title>
 
       <sect2 id="dokumentenvorlagen-und-variablen.einführung">
@@ -2193,6 +2736,14 @@ insserv kivitendo-task-server</programlisting>
                 dem Kürzel das im Dateinamen verwendetet wird.</para>
               </listitem>
             </varlistentry>
+
+            <varlistentry>
+              <term><varname>template_meta.tmpfile</varname></term>
+
+              <listitem>
+                <para>Datei-Prefix für temporäre Dateien.</para>
+              </listitem>
+            </varlistentry>
           </variablelist>
         </sect3>
 
@@ -2265,6 +2816,22 @@ insserv kivitendo-task-server</programlisting>
               </listitem>
             </varlistentry>
 
+            <varlistentry>
+              <term><varname>c_vendor_id</varname></term>
+
+              <listitem>
+                <para>Lieferantennummer beim Kunden (nur Kunden)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><varname>v_customer_id</varname></term>
+
+              <listitem>
+                <para>Kundennummer beim Lieferanten (nur Lieferanten)</para>
+              </listitem>
+            </varlistentry>
+
             <varlistentry>
               <term><varname>cp_email</varname></term>
 
@@ -2730,7 +3297,7 @@ insserv kivitendo-task-server</programlisting>
         </sect3>
 
         <sect3 id="dokumentenvorlagen-und-variablen.allgemein-verkaeufer">
-          <title>Informationen über den Bearbeiter</title>
+          <title>Informationen über den Verkäufer</title>
 
           <variablelist>
             <varlistentry>
@@ -2860,6 +3427,25 @@ insserv kivitendo-task-server</programlisting>
             </varlistentry>
           </variablelist>
         </sect3>
+
+        <sect3 id="dokumentenvorlagen-und-variablen.allgemein-lieferbedingungen">
+          <title>Variablen für Lieferbedingungen</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><varname>delivery_term</varname></term>
+              <listitem><para>Datenbank-Objekt der Lieferbedingung</para></listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><varname>delivery_term.description</varname></term>
+              <listitem><para>Beschreibung der Lieferbedingung</para></listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><varname>delivery_term.long_description</varname></term>
+              <listitem><para>Langtext bzw. übersetzter Langtext der Lieferbedingung</para></listitem>
+            </varlistentry>
+          </variablelist>
+        </sect3>
       </sect2>
 
       <sect2 id="dokumentenvorlagen-und-variablen.invoice">
@@ -3191,6 +3777,15 @@ insserv kivitendo-task-server</programlisting>
               </listitem>
             </varlistentry>
 
+            <varlistentry>
+              <term><varname>donumber_do</varname></term>
+
+              <listitem>
+                <para>Lieferscheinnummer desjenigen Lieferscheins, aus dem die Position stammt, sofern die Rechnung aus einem oder
+                mehreren Lieferscheinen erstellt wurde</para>
+              </listitem>
+            </varlistentry>
+
             <varlistentry>
               <term><varname>p_discount</varname></term>
 
@@ -4052,6 +4647,18 @@ insserv kivitendo-task-server</programlisting>
           und dem "end" werden nur ausgegeben, wenn die Variable
           <varname>variablenname</varname> gesetzt und ungleich 0 ist.</para>
 
+          <para>Handelt es sich bei der benannten Variable um ein Array, also um einen Variablennamen, über den man mit
+          <command>&lt;%foreach variablenname%&gt;</command> iteriert, so wird mit diesem Konstrukt darauf getestet, ob das Array Elemente
+          enthält. Somit würde im folgenden Beispiel nur dann eine Liste von Zahlungseingängen samt ihrer Überschrift "Zahlungseingänge"
+          ausgegeben, wenn tatsächlich welche getätigt wurden:</para>
+
+          <programlisting>&lt;%if payment%&gt;
+Zahlungseingänge:
+ &lt;%foreach payment%&gt;
+   Am &lt;%paymentdate%&gt;: &lt;%payment%&gt; €
+ &lt;%end foreach%&gt;
+&lt;%end if%&gt;</programlisting>
+
           <para>Die Bedingung kann auch negiert werden, indem das Wort
           <function>not</function> nach dem <filename>if</filename> verwendet
           wird. Beispiel:</para>
@@ -4077,7 +4684,7 @@ insserv kivitendo-task-server</programlisting>
           Mittels <function>!=</function> anstelle von <function>==</function>
           würde auf Ungleichheit getestet.</para>
 
-          <programlisting>%if var1 == var2%&gt;</programlisting>
+          <programlisting>&lt;%if var1 == var2%&gt;</programlisting>
 
           <para>Testet die Variable <varname>var1</varname> auf
           übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
@@ -4277,6 +4884,41 @@ Beschreibung: &lt;%description%&gt;
         gewechselt.</para>
       </sect2>
     </sect1>
+    <sect1 id="features.warehouse">
+    <title>Mandantenkonfiguration Lager</title>
+        Die Lagerverwaltung in kivitendo funktioniert standardmässig wie folgt:
+        Wird ein Lager mit einem Lagerplatz angelegt, so gibt es die Möglichkeit hier über den
+        Menüpunkt Lager entsprechende Warenbewegungen durchzuführen. Ferner kann
+        jede Position eines Lieferscheins ein-, bzw. ausgelagert werden (Einkauf-, bzw. Verkauf).
+        Es können beliebig viele Lager mit beliebig vielen Lagerplätzen abgebildet werden.
+        Die Lagerbewegungen über einen Lieferschein erfolgt durch Anklicken jeder Einzelposition und
+        das Auswählen dieser Position zu einem Lager mit Lagerplatz.
+        Dieses Verfahren lässt sich schrittweise vereinfachen, je nachdem wie die Einstellungen in
+        der Mandatenkonfiguration gesetzt werden.
+       <itemizedlist>
+          <listitem>
+            <para><option>Auslagern über Standardlagerplatz</option> Hier wird ein zusätzlicher Knopf (Auslagern über Standard-Lagerplatz)
+            in dem Lieferschein-Beleg hinzugefügt, der dann alle Lagerbewegungen über den Standardlagerplatz (konfigurierbar pro Ware) durchführt.
+            </para>
+          </listitem>
+          <listitem>
+            <para><option>Auslagern ohne Bestandsprüfung</option>Das obige Auslagern schlägt fehl, wenn die entsprechende Menge für
+            die Lagerbewegung nicht vorhanden ist, möchte man dies auch ignorieren und ggf. dann nachpflegen, so kann man eine Negativ-Warenmenge mit dieser Option
+            erlauben. Hierfür muss ein entsprechender Lagerplatz (Fehlbestand, o.ä.) konfiguriert sein.</para>
+          </listitem>
+       </itemizedlist>
+        Zusätzliche Funktionshinweise:
+         <itemizedlist>
+          <listitem><para><option>Standard-Lagerplatz</option>Ist dieser konfiguriert, wird dies auch als Standard-Voreinstellung bei der Neuerfassung von
+          Stammdaten-> Waren / Dienstleistung / Erzeugnis verwendet.
+          </para>
+          </listitem>
+          <listitem><para><option>Standard-Lagerplatz verwenden, falls keiner in Stammdaten definiert</option>Wird beim 'Auslagern über Standardlagerplatz'
+          keine Standardlagerplatz zu der Ware gefunden, so wird mit dieser Option einfach der Standardlagerplatz verwendet.
+          </para>
+          </listitem>
+       </itemizedlist>
+    </sect1>
   </chapter>
 
   <chapter>
@@ -4575,7 +5217,7 @@ Beschreibung: &lt;%description%&gt;
           überwiegend die Daten, die sich unter <guimenu>Programm</guimenu>
           -&gt; <guimenuitem>Einstellungen</guimenuitem> befinden, bzw. die
           Informationen über den Benutzer die über die
-          Administrator-Schnittstelle (admin.pl) eingegeben wurden.</para>
+          Administrator-Schnittstelle eingegeben wurden.</para>
         </sect3>
 
         <sect3>
@@ -4664,6 +5306,10 @@ $main::lxdebug-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{
           vom aktuellen User abhängen wird das Objekt aus
           Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
           Request kurz resettet.</para>
+
+          <para>Dieses Objekt kapselt auch den gerade aktiven Mandanten. Dessen Einstellungen können über
+          <literal>$::auth-&gt;client</literal> abgefragt werden; Rückgabewert ist ein Hash mit den Werten aus der Tabelle
+          <literal>auth.clients</literal>.</para>
         </sect3>
 
         <sect3>
@@ -4694,7 +5340,7 @@ $main::lxdebug-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{
           verfügbar:</para>
 
           <programlisting>[debug]
-file = /tmp/kivitendo-debug.log</programlisting>
+file_name = /tmp/kivitendo-debug.log</programlisting>
 
           <para>ist der Key <varname>file</varname> im Programm als
           <varname>$::lx_office_conf-&gt;{debug}{file}</varname>
@@ -4946,21 +5592,6 @@ file = /tmp/kivitendo-debug.log</programlisting>
         <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
         den kritischen Pfaden, unter 0,15 sonst.</para>
       </sect2>
-
-      <sect2 id="devel.fcgi.known-issues">
-        <title>Bekannte Probleme</title>
-
-        <sect3 id="devel.fcgi.known-issues.encoding">
-          <title>Encoding Awareness</title>
-
-          <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
-          fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
-          falsch kodierte Zeichen eher unwissend, und geben sie einfach
-          weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
-          das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
-          beseitigen.</para>
-        </sect3>
-      </sect2>
     </sect1>
 
     <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
@@ -4970,29 +5601,17 @@ file = /tmp/kivitendo-debug.log</programlisting>
              xreflabel="Einführung in die Datenbank-Upgradedateien">
         <title>Einführung</title>
 
-        <para>Der alte Mechanismus für SQL-Upgradescripte, der auf einer
-        Versionsnummer beruht und dann in sql/Pg-upgrade nach einem Script für
-        diese Versionsnummer sucht, schränkt sehr ein, z.B. was die parallele
-        Entwicklung im stable- und unstable-Baum betrifft.</para>
-
-        <para>Dieser Mechanismus wurde für kivitendo 2.4.1 deutlich erweitert.
-        Es werden weiterhin alle Scripte aus sql/Pg-upgrade ausgeführt.
-        Zusätzlich gibt es aber ein zweites Verzeichnis, sql/Pg-upgrade2. In
-        diesem Verzeichnis muss pro Datenbankupgrade eine Datei existieren,
-        die neben den eigentlich auszuführenden SQL- oder Perl-Befehlen einige
-        Kontrollinformationen enthält.</para>
-
-        <para>Neu sind die Kontrollinformationen, die Abhängigkeiten und
-        Prioritäten definieren können werden, sodass Datenbankscripte zwar in
-        einer sicheren Reihenfolge ausgeführt werden (z.B. darf ein "ALTER
-        TABLE" erst ausgeführt werden, wenn die Tabelle mit "CREATE TABLE"
-        angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man
-        keine Versionsnummern mehr braucht.</para>
-
-        <para>kivitendo merkt sich dabei, welches der Upgradescripte in
-        sql/Pg-upgrade2 bereits durchgeführt wurde und führt diese nicht
-        erneut aus. Dazu dient die Tabelle "schema_info", die bei der
-        Anmeldung automatisch angelegt wird.</para>
+        <para>Datenbankupgrades werden über einzelne Upgrade-Scripte gesteuert, die sich im Verzeichnis <filename>sql/Pg-upgrade2</filename>
+        befinden. In diesem Verzeichnis muss pro Datenbankupgrade eine Datei existieren, die neben den eigentlich auszuführenden SQL- oder
+        Perl-Befehlen einige Kontrollinformationen enthält.</para>
+
+        <para>Kontrollinformationen definieren Abhängigkeiten und Prioritäten, sodass Datenbankscripte zwar in einer sicheren Reihenfolge
+        ausgeführt werden (z.B. darf ein <literal>ALTER TABLE</literal> erst ausgeführt werden, wenn die Tabelle mit <literal>CREATE
+        TABLE</literal> angelegt wurde), diese Reihenfolge aber so flexibel ist, dass man keine Versionsnummern braucht.</para>
+
+        <para>kivitendo merkt sich dabei, welches der Upgradescripte in <filename>sql/Pg-upgrade2</filename> bereits durchgeführt wurde und
+        führt diese nicht erneut aus. Dazu dient die Tabelle "<literal>schema_info</literal>", die bei der Anmeldung automatisch angelegt
+        wird.</para>
       </sect2>
 
       <sect2 id="db-upgrade-files.format"
@@ -5041,11 +5660,10 @@ file = /tmp/kivitendo-debug.log</programlisting>
             <term><varname>charset</varname></term>
 
             <listitem>
-              <para>Empfohlen. Gibt den Zeichensatz an, in dem das Script
-              geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
-              Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei
-              Abwesenheit des Tags der Zeichensatz
-              "<literal>ISO-8859-15</literal>" angenommen.</para>
+              <para>Empfohlen. Gibt den Zeichensatz an, in dem das Script geschrieben wurde, z.B. "<literal>UTF-8</literal>". Aus
+              Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei Abwesenheit des Tags für SQL-Upgradedateien der Zeichensatz
+              "<literal>ISO-8859-15</literal>" angenommen. Perl-Upgradescripte hingegen müssen immer in UTF-8 encodiert sein und sollten
+              demnach auch ein "<literal>use utf8;</literal>" enthalten.</para>
             </listitem>
           </varlistentry>
 
@@ -5113,6 +5731,48 @@ file = /tmp/kivitendo-debug.log</programlisting>
         </variablelist>
       </sect2>
 
+      <sect2 id="db-upgrade-files.format-perl-files" xreflabel="Format von Perl-Upgradedateien">
+       <title>Format von in Perl geschriebenen Datenbankupgradescripten</title>
+
+       <para>In Perl geschriebene Datenbankscripte werden nicht einfach so ausgeführt sondern müssen sich an gewisse Konventionen
+       halten. Dafür bekommen sie aber auch einige Komfortfunktionen bereitgestellt.</para>
+
+       <para>Ein Upgradescript stellt dabei eine vollständige Objektklasse dar, die vom Elternobjekt
+       "<literal>SL::DBUpgrade2::Base</literal>" erben und eine Funktion namens "<literal>run</literal>" zur Verfügung stellen muss. Das
+       Script wird ausgeführt, indem eine Instanz dieser Klasse erzeugt und darauf die erwähnte "<literal>run</literal>" aufgerufen
+       wird.</para>
+
+       <para>Zu beachten ist, dass sich der Paketname der Datei aus dem Wert für "<literal>@tag</literal>" ableitet. Dabei werden alle
+       Zeichen, die in Paketnamen ungültig wären (gerade Bindestriche), durch Unterstriche ersetzt. Insgesamt sieht der Paketname wie folgt
+       aus: "<literal>SL::DBUpgrade2::tag</literal>".</para>
+
+       <para>Welche Komfortfunktionen zur Verfügung stehen, erfahren Sie in der Perl-Dokumentation zum oben genannten Modul; aufzurufen mit
+       "<command>perldoc SL/DBUpgrade2/Base.pm</command>".</para>
+
+       <para>Ein Mindestgerüst eines gültigen Perl-Upgradescriptes sieht wie folgt aus:</para>
+
+       <programlisting># @tag: beispiel-upgrade-file42
+# @description: Ein schönes Beispielscript
+# @depends: release_3_1_0
+package SL::DBUpgrade2::beispiel_upgrade_file42;
+
+use strict;
+use utf8;
+
+use parent qw(SL::DBUpgrade2::Base);
+
+sub run {
+  my ($self) = @_;
+
+  # hier Aktionen ausführen
+
+  return 1;
+}
+
+1;
+</programlisting>
+      </sect2>
+
       <sect2 id="db-upgrade-files.dbupgrade-tool"
              xreflabel="Hilfsscript dbupgrade2_tool.pl">
         <title>Hilfsscript dbupgrade2_tool.pl</title>
@@ -5212,6 +5872,13 @@ file = /tmp/kivitendo-debug.log</programlisting>
         point.</para>
       </sect2>
 
+      <sect2 id="translations-languages.character-set"
+             xreflabel="Character set">
+        <title>Character set</title>
+
+        <para>All files included in a language pack must use UTF-8 as their encoding.</para>
+      </sect2>
+
       <sect2 id="translations-languages.file-structure"
              xreflabel="File structure">
         <title>File structure</title>
@@ -5248,27 +5915,6 @@ file = /tmp/kivitendo-debug.log</programlisting>
             </listitem>
           </varlistentry>
 
-          <varlistentry>
-            <term>charset</term>
-
-            <listitem>
-              <para>This file should be present.</para>
-
-              <para>The <filename>charset</filename> file describes which
-              charset a language package is written in and applies to all
-              other language files in the package. It is possible to write
-              some language packages without an explicit charset, but it is
-              still strongly recommended. You'll never know in what
-              environment your language package will be used, and neither
-              UTF-8 nor Latin1 are guaranteed.</para>
-
-              <para>The whole content of this file is a string that can be
-              recognized as a valid charset encoding. Example:</para>
-
-              <programlisting>UTF-8</programlisting>
-            </listitem>
-          </varlistentry>
-
           <varlistentry>
             <term>all</term>
 
@@ -5401,6 +6047,164 @@ filenames</programlisting>
       </sect2>
     </sect1>
 
+    <sect1 id="devel.testsuite">
+      <title>Die kivitendo-Test-Suite</title>
+
+      <sect2 id="devel.testsuite.intro">
+        <title>Einführung</title>
+
+        <para>kivitendo enthält eine Suite für automatisierte Tests. Sie basiert auf dem Standard-Perl-Modul <literal>Test::More</literal>.</para>
+
+        <para>Die grundlegenden Fakten sind:</para>
+
+        <itemizedlist>
+          <listitem><para>Alle Tests liegen im Unterverzeichnis <filename>t/</filename>.</para></listitem>
+
+          <listitem><para>Ein Script (bzw. ein Test) in <filename>t/</filename> enthält einen oder mehrere Testfälle.</para></listitem>
+
+          <listitem><para>Alle Dateinamen von Tests enden auf <literal>.t</literal>. Es sind selbstständig ausführbare Perl-Scripte.</para></listitem>
+
+          <listitem><para>Die Test-Suite besteht aus der Gesamtheit aller Tests, sprich aller Scripte in <filename>t/</filename>, deren
+          Dateiname auf <literal>.t</literal> endet.</para></listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="devel.testsuite.prerequisites">
+        <title>Voraussetzungen</title>
+
+        <para>Für die Ausführung werden neben den für kivitendo eh schon benötigten Module noch weitere Perl-Module benötigt. Diese sind:</para>
+
+        <itemizedlist>
+          <listitem><para><literal>Test::Deep</literal> (Debian-Paketname: <literal>libtest-deep-perl</literal>; Fedora Core:
+          <literal>perl-Test-Deep</literal>; openSUSE: <literal>perl-Test-Deep</literal>)</para></listitem>
+          <listitem><para><literal>Test::Exception</literal> (Debian-Paketname: <literal>libtest-exception-perl</literal>; Fedora Core:
+          <literal>perl-Test-Exception</literal>; openSUSE: <literal>perl-Test-Exception</literal>)</para></listitem>
+          <listitem><para><literal>Test::Output</literal> (Debian-Paketname: <literal>libtest-output-perl</literal>; Fedora Core:
+          <literal>perl-Test-Output</literal>; openSUSE: <literal>perl-Test-Output</literal>)</para></listitem>
+          <listitem><para><literal>Test::Harness</literal> 3.0.0 oder höher. Dieses Modul ist ab Perl 5.10.1 Bestandteil der
+          Perl-Distribution und kann für frühere Versionen aus dem <ulink url="http://www.cpan.org">CPAN</ulink> bezogen
+          werden.</para></listitem>
+          <listitem><para><literal>LWP::Simple</literal> aus dem Paket <literal>libwww-perl</literal> (Debian-Panetname:
+          <literal>libwww-perl</literal>; Fedora Core: <literal>perl-libwww-perl</literal>; openSUSE:
+          <literal>perl-libwww-perl</literal>)</para></listitem>
+          <listitem><para><literal>URI::Find</literal> (Debian-Panetname: <literal>liburi-find-perl</literal>; Fedora Core:
+          <literal>perl-URI-Find</literal>; openSUSE: <literal>perl-URI-Find</literal>)</para></listitem>
+        </itemizedlist>
+
+        <para>Weitere Voraussetzung ist, dass die Testsuite ihre eigene Datenbank anlegen kann, um Produktivdaten nicht zu gefährden. Dazu
+        müssen in der Konfigurationsdatei im Abschnit <literal>testing/database</literal> Datenbankverbindungsparameter angegeben
+        werden. Der hier angegebene Benutzer muss weiterhin das Recht haben, Datenbanken anzulegen und zu löschen.</para>
+      </sect2>
+
+      <sect2 id="devel.testsuite.execution">
+        <title>
+          Existierende Tests ausführen
+        </title>
+
+        <para>Es gibt mehrere Möglichkeiten zum Ausführen der Tests: entweder, man lässt alle Tests auf einmal ausführen, oder man führt
+        gezielt einzelne Scripte aus. Für beide Fälle gibt es das Helferscript <filename>t/test.pl</filename>.</para>
+
+        <para>Will man die komplette Test-Suite ausführen, so muss man einfach nur <filename>t/test.pl</filename> ohne weitere Parameter aus
+        dem kivitendo-Basisverzeichnis heraus ausführen.</para>
+
+        <para>Um einzelne Test-Scripte auszuführen, übergibt man deren Namen an <filename>t/test.pl</filename>. Beispielsweise:</para>
+
+        <programlisting>t/test.pl t/form/format_amount.t t/background_job/known_jobs.t</programlisting>
+      </sect2>
+
+
+      <sect2 id="devel.testsuite.meaning_of_scripts">
+        <title>
+          Bedeutung der verschiedenen Test-Scripte
+        </title>
+
+        <para>Die Test-Suite umfasst Tests sowohl für Funktionen als auch für Programmierstil. Einige besonders zu erwähnende, weil auch
+        während der Entwicklung nützliche Tests sind:</para>
+
+        <itemizedlist>
+          <listitem><para><filename>t/001compile.t</filename> -- compiliert alle Quelldateien und bricht bei Fehlern sofort ab</para></listitem>
+          <listitem><para><filename>t/002goodperl.t</filename> -- überprüft alle Perl-Dateien auf Anwesenheit von '<literal>use strict</literal>'-Anweisungen</para></listitem>
+          <listitem><para><filename>t/003safesys.t</filename> -- überprüft Aufrufe von <function>system()</function> und <function>exec()</function> auf Gültigkeit</para></listitem>
+          <listitem><para><filename>t/005no_tabs.t</filename> -- überprüft, ob Dateien Tab-Zeichen enthalten</para></listitem>
+          <listitem><para><filename>t/006spelling.t</filename> -- sucht nach häufigen Rechtschreibfehlern</para></listitem>
+          <listitem><para><filename>t/011pod.t</filename> -- überprüft die Syntax von Dokumentation im POD-Format auf Gültigkeit</para></listitem>
+        </itemizedlist>
+
+        <para>Weitere Test-Scripte überprüfen primär die Funktionsweise einzelner Funktionen und Module.</para>
+      </sect2>
+
+      <sect2 id="devel.testsuite.create_new">
+        <title>
+          Neue Test-Scripte erstellen
+        </title>
+
+        <para>Es wird sehr gern gesehen, wenn neue Funktionalität auch gleich mit einem Test-Script abgesichert wird. Auch bestehende
+        Funktion darf und soll ausdrücklich nachträglich mit Test-Scripten abgesichert werden.</para>
+
+        <sect3 id="devel.testsuite.ideas_for_non_function_tests">
+          <title>
+            Ideen für neue Test-Scripte, die keine konkreten Funktionen testen
+          </title>
+
+          <para> Ideen, die abgesehen von Funktionen noch nicht umgesetzt wurden:</para>
+
+          <itemizedlist>
+            <listitem><para>Überprüfung auf fehlende symbolische Links</para></listitem>
+            <listitem><para>Suche nach Nicht-ASCII-Zeichen in Perl-Code-Dateien (mit gewissen Einschränkungen wie das Erlauben von deutschen Umlauten)</para></listitem>
+            <listitem><para>Test auf DOS-Zeilenenden (\r\n anstelle von nur \n)</para></listitem>
+            <listitem><para>Überprüfung auf Leerzeichen am Ende von Zeilen</para></listitem>
+            <listitem><para>Test, ob alle zu übersetzenden Strings in <filename>locale/de/all</filename> vorhanden sind</para></listitem>
+            <listitem><para>Test, ob alle Webseiten-Templates in <filename>templates/webpages</filename> mit vom Perl-Modul <literal>Template</literal> compiliert werden können</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="devel.testsuite.directory_and_test_names">
+          <title>
+            Konvention für Verzeichnis- und Dateinamen
+          </title>
+
+          <para>Es gibt momentan eine wenige Richtlinien, wie Test-Scripte zu benennen sind. Bitte die folgenden Punkte als Richtlinie betrachten und ihnen soweit es geht folgen:</para>
+
+          <itemizedlist>
+            <listitem><para>Die Dateiendung muss <filename>.t</filename> lauten.</para></listitem>
+
+            <listitem><para>Namen sind englisch, komplett klein geschrieben und einzelne Wörter mit Unterstrichten getrennt (beispielsweise
+            <filename>bad_function_params.t</filename>).</para></listitem>
+
+            <listitem><para>Unterverzeichnisse sollten grob nach dem Themenbereich benannt sein, mit dem sich die Scripte darin befassen
+            (beispielsweise <filename>background_jobs</filename> für Tests rund um Hintergrund-Jobs).</para></listitem>
+
+            <listitem><para>Test-Scripte sollten einen überschaubaren Bereich von Funktionalität testen, der logisch zusammenhängend ist
+            (z.B. nur Tests für eine einzelne Funktion in einem Modul). Lieber mehrere Test-Scripte schreiben.</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="devel.testsuite.minimal_example">
+          <title>
+            Minimales Skelett für eigene Scripte
+          </title>
+
+          <para>Der folgenden Programmcode enthält das kleinstmögliche Testscript und kann als Ausgangspunkt für eigene Tests verwendet werden:</para>
+
+          <programlisting>use Test::More tests =&gt; 0;
+
+use lib 't';
+
+use Support::TestSetup;
+
+Support::TestSetup::login();</programlisting>
+
+          <para>Wird eine vollständig initialisierte kivitendo-Umgebung benötigt (Stichwort: alle globalen Variablen wie
+          <varname>$::auth</varname>, <varname>$::form</varname> oder <varname>$::lxdebug</varname>), so muss in der Konfigurationsdatei
+          <filename>config/kivitendo.conf</filename> im Abschnitt <literal>testing.login</literal> ein gültiger Login-Name eingetragen
+          sein. Dieser wird für die Datenbankverbindung benötigt.</para>
+
+          <para>Wir keine vollständig initialisierte Umgebung benötigt, so kann die letzte Zeile <code>Support::TestSetup::login();</code>
+          weggelassen werden, was die Ausführungszeit des Scripts leicht verringert.</para>
+        </sect3>
+      </sect2>
+    </sect1>
+
     <sect1 id="devel.style-guide">
       <title>Stil-Richtlinien</title>