+ <para>Weitere Variablen beinhalten:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>duedate</varname></term>
+
+ <listitem>
+ <para>Fälligkeitsdatum der Rechnung</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>dunning_id</varname></term>
+
+ <listitem>
+ <para>Mahnungsnummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>fee</varname></term>
+
+ <listitem>
+ <para>Mahngebühren</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>interest</varname></term>
+
+ <listitem>
+ <para>Zinsen</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>invamount</varname></term>
+
+ <listitem>
+ <para>Rechnungssumme (ergibt sich aus <varname>fee</varname> +
+ <varname>interest</varname>)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>invdate</varname></term>
+
+ <listitem>
+ <para>Rechnungsdatum</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>invnumber</varname></term>
+
+ <listitem>
+ <para>Rechnungsnummer</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="dokumentenvorlagen-und-variablen.andere-vorlagen">
+ <title>Variablen in anderen Vorlagen</title>
+
+ <sect3>
+ <title>Einführung</title>
+
+ <para>Die Variablen in anderen Vorlagen sind ähnlich wie in der
+ Rechnung. Allerdings heißen die Variablen, die mit
+ <varname>inv</varname> beginnen, jetzt anders. Bei den Angeboten
+ fangen sie mit <varname>quo</varname> für "quotation" an:
+ <varname>quodate</varname> für Angebotsdatum etc. Bei Bestellungen
+ wiederum fangen sie mit <varname>ord</varname> für "order" an:
+ <varname>ordnumber</varname> für Bestellnummer etc.</para>
+
+ <para>Manche Variablen sind in anderen Vorlagen hingegen gar nicht
+ vorhanden wie z.B. die für bereits verbuchte Zahlungseingänge. Dies
+ sind Variablen, die vom Geschäftsablauf her in der entsprechenden
+ Vorlage keine Bedeutung haben oder noch nicht belegt sein
+ können.</para>
+
+ <para>Im Folgenden werden nur wichtige Unterschiede zu den Variablen
+ in Rechnungen aufgeführt.</para>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-quotations">
+ <title>Angebote und Preisanfragen</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>quonumber</varname></term>
+
+ <listitem>
+ <para>Angebots- bzw. Anfragenummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>reqdate</varname></term>
+
+ <listitem>
+ <para>Gültigkeitsdatum (bei Angeboten) bzw. Lieferdatum (bei
+ Preisanfragen)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>transdate</varname></term>
+
+ <listitem>
+ <para>Angebots- bzw. Anfragedatum</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-orders">
+ <title>Auftragsbestätigungen und Lieferantenaufträge</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>ordnumber</varname></term>
+
+ <listitem>
+ <para>Auftragsnummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>reqdate</varname></term>
+
+ <listitem>
+ <para>Lieferdatum</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>transdate</varname></term>
+
+ <listitem>
+ <para>Auftragsdatum</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-delivery-orders">
+ <title>Lieferscheine (Verkauf und Einkauf)</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>cusordnumber</varname></term>
+
+ <listitem>
+ <para>Bestellnummer des Kunden (im Verkauf) bzw. Bestellnummer
+ des Lieferanten (im Einkauf)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>donumber</varname></term>
+
+ <listitem>
+ <para>Lieferscheinnummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>transdate</varname></term>
+
+ <listitem>
+ <para>Lieferscheindatum</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Für jede Position eines Lieferscheines gibt es ein Unterarray
+ mit den Informationen darüber, von welchem Lager und Lagerplatz aus
+ die Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
+ Lagerplatz sie eingelagert wurden. Diese müssen mittels einer
+ <function>foreach</function>-Schleife ausgegeben werden. Diese
+ Variablen sind:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>si_bin</varname></term>
+
+ <listitem>
+ <para>Lagerplatz</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_chargenumber</varname></term>
+
+ <listitem>
+ <para>Chargennummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_bestbefore</varname></term>
+
+ <listitem>
+ <para>Mindesthaltbarkeit</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_number</varname></term>
+
+ <listitem>
+ <para>Artikelnummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_qty</varname></term>
+
+ <listitem>
+ <para>Anzahl bzw. Menge</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_runningnumber</varname></term>
+
+ <listitem>
+ <para>Positionsnummer (1, 2, 3 etc)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_unit</varname></term>
+
+ <listitem>
+ <para>Einheit</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>si_warehouse</varname></term>
+
+ <listitem>
+ <para>Lager</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.andere-vorlagen-statement">
+ <title>Variablen für Sammelrechnung</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>c0total</varname></term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit < 30
+ Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c30total</varname></term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 30
+ und < 60 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c60total</varname></term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 60
+ und < 90 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c90total</varname></term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen mit Fälligkeit >= 90
+ Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>total</varname></term>
+
+ <listitem>
+ <para>Gesamtbetrag aller Rechnungen</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Variablen für jede Rechnungsposition in Sammelrechnung:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><varname>invnumber</varname></term>
+
+ <listitem>
+ <para>Rechnungsnummer</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>invdate</varname></term>
+
+ <listitem>
+ <para>Rechnungsdatum</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>duedate</varname></term>
+
+ <listitem>
+ <para>Fälligkeitsdatum</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>amount</varname></term>
+
+ <listitem>
+ <para>Summe der Rechnung</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>open</varname></term>
+
+ <listitem>
+ <para>Noch offener Betrag der Rechnung</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c0</varname></term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit < 30
+ Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c30</varname></term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 30 und
+ < 60 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c60</varname></term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 60 und
+ < 90 Tage</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>c90</varname></term>
+
+ <listitem>
+ <para>Noch offener Rechnungsbetrag mit Fälligkeit >= 90
+ Tage</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="dokumentenvorlagen-und-variablen.bloecke">
+ <title>Blöcke, bedingte Anweisungen und Schleifen</title>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.bloecke.einfuehrung">
+ <title>Einführung</title>
+
+ <para>Der Parser kennt neben den Variablen einige weitere
+ Konstrukte, die gesondert behandelt werden. Diese sind wie
+ Variablennamen in spezieller Weise markiert:
+ <command><%anweisung%> ... <%end%></command></para>
+
+ <para>Anmerkung zum <command><%end%></command>: Der besseren
+ Verständlichkeit halber kann man nach dem <command>end</command>
+ noch beliebig weitere Wörter schreiben, um so zu markieren, welche
+ Anweisung (z.B. <command>if</command> oder
+ <command>foreach</command>) damit abgeschlossen wird.</para>
+
+ <para>Beispiel: Lautet der Beginn eines Blockes z.B.
+ <command><%if type == "sales_quotation"%></command>, so könnte
+ er mit <command><%end%></command> genauso abgeschlossen werden
+ wie mit <command><%end if%></command> oder auch
+ <command><%end type == "sales_quotation"%></command>.</para>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.bloecke.if">
+ <title>Der if-Block</title>
+
+ <programlisting><%if variablenname%>
+...
+<%end%></programlisting>
+
+ <para>Eine normale "if-then"-Bedingung. Die Zeilen zwischen dem "if"
+ 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><%foreach
+ variablenname%></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><%if payment%>
+Zahlungseingänge:
+ <%foreach payment%>
+ Am <%paymentdate%>: <%payment%> €
+ <%end foreach%>
+<%end if%></programlisting>
+
+ <para>Die Bedingung kann auch negiert werden, indem das Wort
+ <function>not</function> nach dem <filename>if</filename> verwendet
+ wird. Beispiel:</para>
+
+ <programlisting><%if not cp_greeting%>
+...
+<%end%></programlisting>
+
+ <para>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
+ oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
+ einer Variablen mit einer festen Zeichenkette oder einer anderen
+ Variablen zu vergleichen. Ob der Vergleich mit einer Zeichenkette
+ oder einer anderen Variablen vorgenommen wird, hängt davon ab, ob
+ die rechte Seite des Vergleichsoperators in Anführungszeichen
+ gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
+ anderer Variablen). Zwei Beispiele, die beide Vergleiche
+ zeigen:</para>
+
+ <programlisting><%if var1 == "Wert"%></programlisting>
+
+ <para>Testet die Variable <varname>var1</varname> auf
+ übereinstimmung mit der Zeichenkette <constant>Wert</constant>.
+ Mittels <function>!=</function> anstelle von <function>==</function>
+ würde auf Ungleichheit getestet.</para>
+
+ <programlisting><%if var1 == var2%></programlisting>
+
+ <para>Testet die Variable <varname>var1</varname> auf
+ übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
+ <function>!=</function> anstelle von <function>==</function> würde
+ auf Ungleichheit getestet.</para>
+
+ <para>Erfahrere Benutzer können neben der Tests auf (Un-)Gleichheit
+ auch Tests auf Übereinstimmung mit regulären Ausdrücken ohne
+ Berücksichtung der Groß- und Kleinschreibung durchführen. Dazu dient
+ dieselbe Syntax wie oben nur mit <function>=~</function> und
+ <function>!~</function> als Vergleichsoperatoren.</para>
+
+ <para>Beispiel für einen Test, ob die Variable
+ <varname>intnotes</varname> (interne Bemerkungen) das Wort
+ <constant>schwierig</constant> enthält:</para>
+
+ <programlisting><%if intnotes =~ "schwierig"%></programlisting>
+ </sect3>
+
+ <sect3 id="dokumentenvorlagen-und-variablen.bloecke.foreach">
+ <title>Der foreach-Block</title>
+
+ <programlisting><%foreach variablenname%>
+...
+<%end%></programlisting>
+
+ <para>Fügt die Zeilen zwischen den beiden Anweisungen so oft ein,
+ wie das Perl-Array der Variablen <varname>variablenname</varname>
+ Elemente enthät. Dieses Konstrukt wird zur Ausgabe der einzelnen
+ Posten einer Rechnung / eines Angebots sowie zur Ausgabe der Steuern
+ benutzt. In jedem Durchlauf werden die <link
+ linkend="dokumentenvorlagen-und-variablen.invoice-posten">zeilenbezogenen
+ Variablen</link> jeweils auf den Wert für die aktuelle Position
+ gesetzt.</para>
+
+ <para>Die Syntax sieht normalerweise wie folgt aus:</para>
+
+ <programlisting><%foreach number%>
+Position: <%runningnumber%>
+Anzahl: <%qty%>
+Artikelnummer: <%number%>
+Beschreibung: <%description%>
+...
+<%end%></programlisting>
+
+ <para>Besonderheit in OpenDocument-Vorlagen: Tritt ein
+ <function><%foreach%></function>-Block innerhalb einer
+ Tabellenzelle auf, so wird die komplette Tabellenzeile so oft
+ wiederholt wie notwendig. Tritt er außerhalb auf, so wird nur der
+ Inhalt zwischen <function><%foreach%></function> und
+ <function><%end%></function> wiederholt, nicht aber die
+ komplette Zeile, in der er steht.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="dokumentenvorlagen-und-variablen.markup">
+ <title>Markup-Code zur Textformatierung innerhalb von
+ Formularen</title>
+
+ <para>Wenn der Benutzer innhalb von Formularen in kivitendo Text
+ anders formatiert haben möchte, so ist dies begrenzt möglich.
+ kivitendo unterstützt die Textformatierung mit HTML-ähnlichen Tags.
+ Der Benutzer kann z.B. bei der Artikelbeschreibung auf einer Rechnung
+ Teile des Texts zwischen Start- und Endtags setzen. Dieser Teil wird
+ dann automatisch in Anweisungen für das ausgewählte Vorlagenformat
+ (HTML oder PDF über LaTeX) umgesetzt.</para>
+
+ <para>Die unterstützen Formatierungen sind:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><b>Text</b></term>
+
+ <listitem>
+ <para>Text wird in Fettdruck gesetzt.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><i>Text</i></term>
+
+ <listitem>
+ <para>Text wird kursiv gesetzt.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><u>Text</u></term>
+
+ <listitem>
+ <para>Text wird unterstrichen.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><s>Text</s></term>
+
+ <listitem>
+ <para>Text wird durchgestrichen. Diese Formatierung ist nicht
+ bei der Ausgabe als PDF über LaTeX verfügbar.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><bullet></term>
+
+ <listitem>
+ <para>Erzeugt einen ausgefüllten Kreis für Aufzählungen (siehe
+ unten).</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Der Befehl <command><bullet></command> funktioniert
+ momentan auch nur in Latex-Vorlagen.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="excel-templates">
+ <title>Excel-Vorlagen</title>
+
+ <sect2 id="excel-templates.summary">
+ <title>Zusammenfassung</title>
+
+ <para>Dieses Dokument beschreibt den Mechanismus, mit dem
+ Exceltemplates abgearbeitet werden, und die Einschränkungen, die damit
+ einhergehen.</para>
+ </sect2>
+
+ <sect2 id="excel-templates.usage">
+ <title>Bedienung</title>
+
+ <para>Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert
+ werden. Die Konfigurationsoption heißt <varname>excel_templates =
+ 1</varname> im Abschnitt <varname>[print_templates]</varname>.</para>
+
+ <para>Eine Excelvorlage kann dann unter dem Namen einer beliebigen
+ anderen Vorlage mit der Endung <filename>.xls</filename> gespeichert
+ werden. In den normalen Verkaufsmasken taucht nun
+ <constant>Excel</constant> als auswählbares Format auf und kann von da
+ an wie LaTeX- oder OpenOffice-Vorlagen benutzt werden.</para>
+
+ <para>Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls
+ eine Angebotsvorlage und wird unter dem internen Namen der Angebote
+ <filename>sales_quotation.xls</filename> gespeichert.</para>
+ </sect2>
+
+ <sect2 id="excel-templates.syntax">
+ <title>Variablensyntax</title>
+
+ <para>Einfache Syntax:
+ <command><<varname>></command></para>
+
+ <para>Dabei sind <constant><<</constant> und
+ <constant>>></constant> die Delimiter. Da Excel auf festen
+ Breiten besteht, kann der Tag künstlich verlängert werden, indem
+ weitere <constant><</constant> oder <constant>></constant>
+ eingefügt werden. Der Tag muss nicht symmetrisch sein.
+ Beispiel:</para>
+
+ <programlisting><<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
+
+ <para>Um die Limitierung der festen Breite zu reduzieren, können
+ weitere Variablen in einem Block interpoliert werden. Whitespace wird
+ dazwishen dann erhalten. Beispiel:</para>
+
+ <programlisting><<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
+
+ <para>Die Variablen werden interpoliert, und linksbündig mit
+ Leerzeichen auf die gewünschte Länge aufgefüllt. Ist der String zu
+ lang, werden überzählige Zeichen abgeschnitten.</para>
+
+ <para>Es ist ausserdem möglich, Daten rechtsbündig darzustellen, wenn
+ der Block mit einem Leerzeichen anfängt. Beispiel:</para>
+
+ <programlisting><<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></programlisting>
+
+ <para>Dies würde rechtsbündig triggern. Wenn bei rechtsbündiger
+ Ausrichtung Text abgeschnitten werden muss, wird er vom linken Ende
+ entfernt.</para>
+ </sect2>
+
+ <sect2 id="excel-templates.limitations">
+ <title>Einschränkungen</title>
+
+ <para>Das Excelformat bis 2002 ist ein binäres Format, und kann nicht
+ mit vertretbarem Aufwand editiert werden. Der Templatemechanismus
+ beschränkt sich daher darauf, Textstellen exakt durch einen anderen
+ Text zu ersetzen.</para>
+
+ <para>Aus dem gleichen Grund sind die Kontrolllstrukturen
+ <command><%if%></command> und
+ <command><%foreach%></command> nicht vorhanden. Der Delimiter
+ <constant><% %></constant> kommt in den Headerinformationen
+ evtl. vor. Deshalb wurde auf den sichereren Delimiter
+ <constant><<</constant> und <constant>>></constant>
+ gewechselt.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="features.warehouse">
+
+
+ <title>Mandantenkonfiguration Lager</title>
+
+ <para>
+ 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.
+ </para>
+
+ <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>
+
+ <para>
+ Zusätzliche Funktionshinweise:
+ </para>
+
+ <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>
+
+ <sect1 id="features.swiss-charts-of-accounts">
+ <title>Schweizer Kontenpläne</title>
+
+ <para>Seit der Version 3.4.1 stehen in kivitendo 2 Kontenpläne für
+ den Einsatz in der Schweiz zur Verfügung, einer für Firmen und
+ Organisationen, die nicht mehrwertsteuerpflichtig sind, und einer
+ für Firmen, die mehrwertsteuerpflichtig sind.</para>
+
+ <para>Die Kontenpläne orientieren sich am in der Schweiz üblicherweise
+ verwendeten KMU-Kontenrahmen und sind mit der Revision des Schweizerischen
+ Obligationenrechts (OR) vom 1.1.2013 kompatibel, insbesondere
+ <literal>Art.957a Abs.2</literal>.</para>
+
+ <para>Die Möglichkeit, Saldosteuersätze zu verwenden ist in der aktuellen
+ Version von kivitendo noch nicht integriert.</para>
+
+ <para>Trotzdem können auch Firmen, die per Saldosteuersatz mit der
+ Eidgenössischen Steuerverwaltung abrechnen, kivitendo bereits nutzen.
+ Dazu wird der Kontenplan mit MWST ausgewählt. Anschliessend müssen
+ alle Aufwandskonten editiert werden und dort der Steuersatz auf 0%
+ gesetzt werden.</para>
+
+ <para>So werden bei Kreditorenbuchungen keine Vorsteuern verbucht.</para>
+
+ <para>Wünsche für Anpassungen an den Schweizer Kontenplänen sowie
+ Vorschläge für weitere (z.B. branchenspezifische) Kontenpläne
+ bitte an <literal>empfang@revamp-it.ch</literal> senden.</para>
+ </sect1>
+ <sect1>
+ <title>Artikelklassifizierung</title>
+
+ <sect2>
+ <title>Übersicht</title>
+
+ <para>Die Klassifizierung von Artikeln dient einer weiteren Gliederung
+ um zum Beispiel den Einkauf vom Verkauf zu trennen, gekennzeichnet
+ durch eine Beschreibung (z.B. "Einkauf") und ein Kürzel (z.B. "E").
+ Für jede Klassifizierung besteht eine Beschreibung und eine Abkürzung
+ die normalerweise aus einem Zeichen besteht, kann aber auf mehrere
+ Zeichen erweitert werden, falls zur Unterscheidung notwendig, sinnvoll
+ sind jedoch nur maximal 2 Zeichen.</para>
+ </sect2>
+
+ <sect2>
+ <title>Basisklassifizierung</title>
+
+ <para>Als Basisklassifizierungen gibt es</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Einkauf</para>
+ </listitem>
+
+ <listitem>
+ <para>Verkauf</para>
+ </listitem>
+
+ <listitem>
+ <para>Handelsware</para>
+ </listitem>
+
+ <listitem>
+ <para>Produktion</para>
+ </listitem>
+
+ <listitem>
+ <para>- keine - (diese wird bei einer Aktualisierung für alle
+ existierenden Artikel genommen, gültig für Verkauf und
+ Einkauf)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Es können weitere Klassifizierungen angelegt werden. So kann es
+ z.B. für separat auszuweisende Artikel folgened Klassen geben:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Lieferung (Logistik, Transport) mit Kürzel L</para>
+ </listitem>
+
+ <listitem>
+ <para>Material (Verpackungsmaterial) mit Kürzel M</para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+
+ <sect2>
+ <title>Attribute</title>
+
+ <para>Bisher haben die Klassifizierungen folgende Attribute, die auch
+ alle gleichzeitg gültig sein können</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>gültig für Verkauf - dieser Artikel kann im Verkauf genutzt
+ werden</para>
+ </listitem>
+
+ <listitem>
+ <para>gültig für Einkauf - dieser Artikel kann im Einkauf genutzt
+ werden</para>
+ </listitem>
+
+ <listitem>
+ <para>separat ausweisen - hierzu gibt es zur Dokumentengenerierung
+ (LaTeX) zusätzliche Variable</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Beim separat ausweisen stehen im LaTeX die Variable <emphasis
+ role="bold"><%non_separate_subtotal%> </emphasis>zur Verfügung,
+ die alle nicht separat auszuweisenden Artikelkosten saldiert, sowie
+ pro separat auszuweisenden Klassifizierungen die Variable<emphasis
+ role="bold"> <%separate_X_subtotal%></emphasis> wobei X das
+ Kürzel der Klassifizierung ist.</para>
+
+ <para>Im obigen Beispiel wäre das für Lieferkosten <emphasis
+ role="bold"><%separate_L_subtotal%></emphasis> und für
+ Verpackungsmaterial <emphasis
+ role="bold"><%separate_M_subtotal%> </emphasis>.</para>
+ </sect2>
+
+ <sect2>
+ <title>Zwei-Zeichen Abkürzung</title>
+
+ <para>Der Typ des Artikel und die Klassifizierung werden durch zwei
+ Buchstaben dargestellt. Der erste Buchstabe ist eine Lokalisierung des
+ Typs des Artikel ('P','A','S') , deutch 'W', 'E', und 'D' für Ware
+ Erzeugnis oder Dienstleistung, ggf. weitere Typen.</para>
+
+ <para>Der zweite (und ggf. auch ein dritter Buchstabe, falls nötig)
+ entspricht der lokalisierten Abkürzung der Klassifizierung.</para>
+
+ <para>Diese Abkürzung wird überall beim Auflisten von Artikeln zur
+ Erleichterung mit dargestellt.</para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+ <chapter>
+ <title>Entwicklerdokumentation</title>
+
+ <sect1 id="devel.globals" xreflabel="Globale Variablen">
+ <title>Globale Variablen</title>
+
+ <sect2>
+ <title>Wie sehen globale Variablen in Perl aus?</title>
+
+ <para>Globale Variablen liegen in einem speziellen namespace namens
+ "main", der von überall erreichbar ist. Darüber hinaus sind bareword
+ globs global und die meisten speziellen Variablen sind...
+ speziell.</para>
+
+ <para>Daraus ergeben sich folgende Formen:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>$main::form</literal></term>
+
+ <listitem>
+ <para>expliziter Namespace "main"</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>$::form</literal></term>
+
+ <listitem>
+ <para>impliziter Namespace "main"</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>open FILE, "file.txt"</literal></term>
+
+ <listitem>
+ <para><varname>FILE</varname> ist global</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>$_</literal></term>
+
+ <listitem>
+ <para>speziell</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Im Gegensatz zu <productname>PHP</productname> gibt es kein
+ Schlüsselwort wie "<function>global</function>", mit dem man
+ importieren kann. <function>my</function>, <function>our</function>
+ und <function>local</function> machen was anderes.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>my $form</literal></term>
+
+ <listitem>
+ <para>lexikalische Variable, gültig bis zum Ende des
+ Scopes</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>our $form</literal></term>
+
+ <listitem>
+ <para><varname>$form</varname> referenziert ab hier
+ <varname>$PACKAGE::form</varname>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>local $form</literal></term>
+
+ <listitem>
+ <para>Alle Änderungen an <varname>$form</varname> werden am Ende
+ des scopes zurückgesetzt</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2>
+ <title>Warum sind globale Variablen ein Problem?</title>
+
+ <para>Das erste Problem ist <productname>FCGI</productname>.</para>
+
+ <para><productname>SQL-Ledger</productname> hat fast alles im globalen
+ namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
+ Unter <productname>FCGI</productname> müssen diese Sachen aber wieder
+ aufgeräumt werden, damit sie nicht in den nächsten Request kommen.
+ Einige Sachen wiederum sollen nicht gelöscht werden, wie zum Beispiel
+ Datenbankverbindungen, weil die sehr lange zum Initialisieren
+ brauchen.</para>
+
+ <para>Das zweite Problem ist <function>strict</function>. Unter
+ <function>strict</function> werden alle Variablen die nicht explizit
+ mit <function>Package</function>, <function>my</function> oder
+ <function>our</function> angegeben werden als Tippfehler angemarkert,
+ dies hat, seit der Einführung, u.a. schon so manche langwierige
+ Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package
+ angegeben werden, werden die nicht geprüft, und somit kann sich
+ schnell ein Tippfehler einschleichen.</para>
+ </sect2>
+
+ <sect2>
+ <title>Kanonische globale Variablen</title>
+
+ <para>Um dieses Problem im Griff zu halten gibt es einige wenige
+ globale Variablen, die kanonisch sind, d.h. sie haben bestimmte
+ vorgegebenen Eigenschaften, und alles andere sollte anderweitig
+ umhergereicht werden.</para>
+
+ <para>Diese Variablen sind im Moment die folgenden neun:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><varname>$::form</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>%::myconfig</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::locale</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::lxdebug</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::auth</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::lx_office_conf</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::instance_conf</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::dispatcher</varname></para>
+ </listitem>
+
+ <listitem>
+ <para><varname>$::request</varname></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Damit diese nicht erneut als Müllhalde missbraucht werden, im
+ Folgenden eine kurze Erläuterung der bestimmten vorgegebenen
+ Eigenschaften (Konventionen):</para>
+
+ <sect3>
+ <title>$::form</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Ist ein Objekt der Klasse
+ "<classname>Form</classname>"</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird nach jedem Request gelöscht</para>
+ </listitem>
+
+ <listitem>
+ <para>Muss auch in Tests und Konsolenscripts vorhanden
+ sein.</para>
+ </listitem>
+
+ <listitem>
+ <para>Enthält am Anfang eines Requests die Requestparameter vom
+ User</para>
+ </listitem>
+
+ <listitem>
+ <para>Kann zwar intern über Requestgrenzen ein Datenbankhandle
+ cachen, das wird aber momentan absichtlich zerstört</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><varname>$::form</varname> wurde unter <productname>SQL
+ Ledger</productname> als Gottobjekt für alles missbraucht. Sämtliche
+ alten Funktionen unter SL/ mutieren <varname>$::form</varname>, das
+ heißt, alles was einem lieb ist (alle Variablen die einem ans Herz
+ gewachsen sind), sollte man vor einem Aufruf (!) von zum Beispiel
+ <function>IS->retrieve_customer()</function> in Sicherheit
+ bringen.</para>
+
+ <para>Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man
+ Berechnung in einem bestimmten Format durchführt (SL/Form.pm Zeile
+ 3552, Stand version 2.7beta), um dies hinterher wieder auf den
+ richtigen Wert zu setzen:</para>
+
+ <programlisting> my $saved_numberformat = $::myconfig{numberformat};
+ $::myconfig{numberformat} = $numberformat;
+ # (...) div Berechnungen
+ $::myconfig{numberformat} = $saved_numberformat;</programlisting>
+
+ <para>Das Objekt der Klasse Form hat leider im Moment noch viele
+ zentrale Funktionen die vom internen Zustand abhängen, deshalb bitte
+ nie einfach zerstören oder überschreiben (zumindestens nicht kurz
+ vor einem Release oder in Absprache über bspw. die devel-Liste ;-).
+ Es geht ziemlich sicher etwas kaputt.</para>
+
+ <para><varname>$::form</varname> ist gleichzeitig der Standard Scope
+ in den <productname>Template::Toolkit</productname> Templates
+ außerhalb der Controller: der Ausdruck <function>[% var
+ %]</function> greift auf <varname>$::form->{var}</varname> zu.
+ Unter Controllern ist der Standard Scope anders, da lautet der
+ Zugriff <function>[% FORM.var %]</function>. In Druckvorlagen sind
+ normale Variablen ebenfall im <varname>$::form</varname> Scope, d.h.
+ <function><%var%></function> zeigt auf
+ <varname>$::form->{var}</varname>. Nochmal von der anderen Seite
+ erläutert, innerhalb von (Web-)Templates sieht man häufiger solche
+ Konstrukte:</para>
+
+ <programlisting>[%- IF business %]
+# (... Zeig die Auswahlliste Kunden-/Lieferantentyp an)
+[%- END %]</programlisting>
+
+ <para>Entweder wird hier dann $::form->{business} ausgewertet
+ oder aber der Funktion
+ <function>$form->parse_html_template</function> wird explizit
+ noch ein zusätzlicher Hash übergeben, der dann auch in den
+ (Web-)Templates zu Verfügung steht, bspw. so:</para>
+
+ <programlisting>$form->parse_html_template("is/form_header", \%TMPL_VAR);</programlisting>
+
+ <para>Innerhalb von Schleifen wird
+ <varname>$::form->{TEMPLATE_ARRAYS}{var}[$index]</varname>
+ bevorzugt, wenn vorhanden. Ein Beispiel findet sich in SL/DO.pm,
+ welches über alle Positionen eines Lieferscheins in Schleife
+ läuft:</para>
+
+ <programlisting>for $i (1 .. $form->{rowcount}) {
+ # ...
+ push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position;
+ push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"};
+ push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"};
+ # ...
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>%::myconfig</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Das einzige Hash unter den globalen Variablen</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird spätestens benötigt wenn auf die Datenbank
+ zugegriffen wird</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird bei jedem Request neu erstellt.</para>
+ </listitem>
+
+ <listitem>
+ <para>Enthält die Userdaten des aktuellen Logins</para>
+ </listitem>
+
+ <listitem>
+ <para>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
+ extern serialisiert werden, weil da auch der Datenbankzugriff
+ für diesen user drinsteht.</para>
+ </listitem>
+
+ <listitem>
+ <para>Enthält unter anderem Listenbegrenzung vclimit,
+ Datumsformat dateformat und Nummernformat numberformat</para>
+ </listitem>
+
+ <listitem>
+ <para>Enthält Datenbankzugriffinformationen</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><varname>%::myconfig</varname> ist im Moment der Ersatz für
+ ein Userobjekt. Die meisten Funktionen, die etwas anhand des
+ aktuellen Users entscheiden müssen, befragen
+ <varname>%::myconfig</varname>. Innerhalb der Anwendungen sind dies
+ überwiegend die Daten, die sich unter <guimenu>Programm</guimenu>
+ -> <guimenuitem>Einstellungen</guimenuitem> befinden, bzw. die
+ Informationen über den Benutzer die über die
+ Administrator-Schnittstelle eingegeben wurden.</para>
+ </sect3>
+
+ <sect3>
+ <title>$::locale</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Objekt der Klasse "Locale"</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird pro Request erstellt</para>
+ </listitem>
+
+ <listitem>
+ <para>Muss auch für Tests und Scripte immer verfügbar
+ sein.</para>
+ </listitem>
+
+ <listitem>
+ <para>Cached intern über Requestgrenzen hinweg benutzte
+ Locales</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Lokalisierung für den aktuellen User. Alle Übersetzungen,
+ Zahlen- und Datumsformatierungen laufen über dieses Objekt.</para>
+ </sect3>
+
+ <sect3>
+ <title>$::lxdebug</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Objekt der Klasse "LXDebug"</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird global gecached</para>
+ </listitem>
+
+ <listitem>
+ <para>Muss immer verfügbar sein, in nahezu allen
+ Funktionen</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><varname>$::lxdebug</varname> stellt Debuggingfunktionen
+ bereit, wie "<function>enter_sub</function>" und
+ "<function>leave_sub</function>", mit denen in den alten Modulen ein
+ brauchbares Tracing gebaut ist, "<function>log_time</function>", mit
+ der man die Wallclockzeit seit Requeststart loggen kann, sowie
+ "<function>message</function>" und "<function>dump</function>" mit
+ denen man flott Informationen ins Log (tmp/kivitendo-debug.log)
+ packen kann.</para>
+
+ <para>Beispielsweise so:</para>
+
+ <programlisting>$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
+$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>$::auth</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Objekt der Klasse "SL::Auth"</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird global gecached</para>
+ </listitem>
+
+ <listitem>
+ <para>Hat eine permanente DB Verbindung zur Authdatenbank</para>
+ </listitem>
+
+ <listitem>
+ <para>Wird nach jedem Request resettet.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><varname>$::auth</varname> stellt Funktionen bereit um die
+ Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
+ 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->client</literal> abgefragt werden; Rückgabewert
+ ist ein Hash mit den Werten aus der Tabelle
+ <literal>auth.clients</literal>.</para>
+ </sect3>
+
+ <sect3>
+ <title>$::lx_office_conf</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Objekt der Klasse
+ "<classname>SL::LxOfficeConf</classname>"</para>
+ </listitem>
+
+ <listitem>
+ <para>Global gecached</para>
+ </listitem>
+
+ <listitem>
+ <para>Repräsentation der
+ <filename>config/kivitendo.conf[.default]</filename>-Dateien</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Globale Konfiguration. Configdateien werden zum Start gelesen
+ und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass
+ das Programm die Konfiguration ändern kann oder sollte.</para>
+
+ <para>Beispielsweise ist über den Konfigurationseintrag [debug] die
+ Debug- und Trace-Log-Datei wie folgt konfiguriert und
+ verfügbar:</para>
+
+ <programlisting>[debug]
+file_name = /tmp/kivitendo-debug.log</programlisting>
+
+ <para>ist der Key <varname>file</varname> im Programm als
+ <varname>$::lx_office_conf->{debug}{file}</varname>
+ erreichbar.</para>
+
+ <warning>
+ <para>Zugriff auf die Konfiguration erfolgt im Moment über
+ Hashkeys, sind also nicht gegen Tippfehler abgesichert.</para>
+ </warning>
+ </sect3>