+ <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ürhung</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>
+ 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>
+ <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>