Sammelrechnung / Kundenkonto / Fälligkeitsabrechnung / Statement
authorG. Richardson <information@lx-office-hosting.de>
Wed, 12 Oct 2011 10:22:08 +0000 (12:22 +0200)
committerG. Richardson <information@lx-office-hosting.de>
Thu, 13 Oct 2011 11:34:46 +0000 (13:34 +0200)
Bug 1611

Finanzbuchhaltung -> Berichte -> Offene Forderungen

Jan hatte das ja schon angepasst, daß man die offenen Rechnungen nach einer
Altersstrukturliste filtern kann. Die Ergebnisse stimmten auch, aber wenn man
dann das Ergebnis drucken wollte fehlten die Zahlen.

Die Sammelrechnung soll wohl als Kundenkonto fungieren, damit man dem Kunden
eine Übersicht aller noch offenen Rechnungen schicken kann, mit Übersicht der
Überfälligkeit. Die Druckvorlage ist statement.tex, bzw. statement.html. Bisher
wurden aber nie die Beträge der Rechnungen angezeigt, das funktioniert jetzt
wieder.

* bei der Datenbankabfrage wird für jede Rechnung die Anzahl der Tage über dem
  Fälligkeitsdatum (Today - duedate) für jede offene Rechnung berechnet

* der noch offene Betrag wird je nach Anzahl der überfälligen Tage der Rechnung
  zur Kategorie c0, c30, c60 oder c90 hinzugefügt

Die angegebenen Zahlen sind die noch offenen Teile der Rechnung, es steht aber
auch die Gesamtsumme der Rechnung unter der Variablen <%amount%> in der
Druckvorlage zur Verfügung (siehe doc/dokumentenvorlagen-und-variablen.html)

Rechnungen, deren Fälligkeit noch nicht erreicht ist, tauchen ebenfalls in der
c0-Gruppe auf.

Nicht mit Währungsumrechnung getestet.

Im Lx-Office Buch steht zu Sammelrechnung, daß beim Drucken nur Rechnungen für
den ersten Kunden angezeigt werden, aber alle Sammelrechnungen an den
konfigurierten Drucker geschickt werden, ich bin mir nicht sicher, ob das
stimmt. Es gibt ja den Knopf "Alle Auswählen", aber bei E-Mail kann auch nur an
den ersten versendet werden.

SL/RP.pm
bin/mozilla/rp.pl
doc/dokumentenvorlagen-und-variablen.html

index 113e9dd..49dbff6 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -1219,7 +1219,7 @@ sub aging {
       phone as customerphone, fax as customerfax, ${ct}number,
       "invnumber", "transdate",
       (amount - COALESCE((SELECT sum(amount)*$ml FROM acc_trans LEFT JOIN chart ON (acc_trans.chart_id=chart.id) WHERE link ilike '%paid%' AND acc_trans.trans_id=${arap}.id AND acc_trans.transdate <= (date $todate)),0)) as "open", "amount",
-      "duedate", invoice, ${arap}.id,
+      "duedate", invoice, ${arap}.id, date_part('days', now() - duedate) as overduedays,
       (SELECT $buysell
        FROM exchangerate
        WHERE (${arap}.curr = exchangerate.curr)
index 8d0ec94..125d0b9 100644 (file)
@@ -2032,7 +2032,7 @@ sub print_form {
         $form->{ $form->{ct} } = $form->{name};
         $form->{"$form->{ct}_id"} = $ref->{ctid};
 
-        map { $form->{$_} = () } qw(invnumber invdate duedate);
+        map { $form->{$_} = () } qw(invnumber invdate duedate amount open);
         $form->{total} = 0;
         foreach my $item (qw(c0 c30 c60 c90)) {
           $form->{$item} = ();
@@ -2101,11 +2101,16 @@ sub statement_details {
   push @{ $form->{invnumber} }, $ref->{invnumber};
   push @{ $form->{invdate} },   $ref->{transdate};
   push @{ $form->{duedate} },   $ref->{duedate};
+  push @{ $form->{amount} },    $form->format_amount(\%myconfig, $ref->{amount} / $ref->{exchangerate}, 2);
+  push @{ $form->{open} },      $form->format_amount(\%myconfig, $ref->{open} / $ref->{exchangerate}, 2);
 
   foreach my $item (qw(c0 c30 c60 c90)) {
     if ($ref->{exchangerate} * 1) {
-      $ref->{$item} =
-        $form->round_amount($ref->{$item} / $ref->{exchangerate}, 2);
+      # add only the open amount of the invoice to the aging, not the total amount
+      $ref->{"${item}"} = $form->round_amount($ref->{open} / $ref->{exchangerate}, 2) if $ref->{overduedays} < 30 and $item eq 'c0';
+      $ref->{"${item}"} = $form->round_amount($ref->{open} / $ref->{exchangerate}, 2) if $ref->{overduedays} >= 30 and $ref->{overduedays} < 60 and $item eq 'c30';
+      $ref->{"${item}"} = $form->round_amount($ref->{open} / $ref->{exchangerate}, 2) if $ref->{overduedays} >= 60 and $ref->{overduedays} < 90 and $item eq 'c60';
+      $ref->{"${item}"} = $form->round_amount($ref->{open} / $ref->{exchangerate}, 2) if $ref->{overduedays} >= 90 and $item eq 'c90';
     }
     $form->{"${item}total"} += $ref->{$item};
     $form->{total}          += $ref->{$item};
index 978a529..4e048dc 100644 (file)
@@ -112,6 +112,7 @@ td {
     <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_quotations">Angebote und Preisanfragen</a></li>
     <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_orders">Auftragsbest&auml;tigungen und Lieferantenauftr&auml;ge</a></li>
     <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_delivery_orders">Lieferscheine (Verkauf und Einkauf)</a></li>
+    <li><a href="dokumentenvorlagen-und-variablen.html#anderevorlagen_statement">Sammelrechnung</a></li>
    </ol>
   </li>
 
@@ -1228,6 +1229,14 @@ td {
   </table>
  </p>
 
+ <p>F&uuml;r jede Position eines Lieferscheines gibt es ein Unterarray mit
+  den Informationen dar&uuml;ber, von welchem Lager und Lagerplatz aus die
+  Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
+  Lagerplatz sie eingelagert wurden. Diese m&uuml;ssen mittels
+  einer <code>foreach</code>-Schleife ausgegeben werden. Diese
+  Variablen sind:</p>
+
+
  <p>F&uuml;r jede Position eines Lieferscheines gibt es ein Unterarray mit
   den Informationen dar&uuml;ber, von welchem Lager und Lagerplatz aus die
   Waren verschickt wurden (Verkaufslieferscheine) bzw. auf welchen
@@ -1273,6 +1282,81 @@ td {
   </table>
  </p>
 
+ <h3><a name="anderevorlagen_statement">Sammelrechnung</a></h3>
+
+ <h3> Variablen f&uuml;r Sammelrechnung:</h3>
+ <p>
+  <table border="1">
+   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
+   <tr>
+    <td><code>c0total</code></td>
+    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &lt; 30 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c30total</code></td>
+    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 30 und &lt; 60 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c60total</code></td>
+    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 60 und &lt; 90 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c90total</code></td>
+    <td>Gesamtbetrag aller Rechnungen mit F&auml;lligkeit &gt;= 90 Tage</td>
+   </tr>
+   <tr>
+    <td><code>total</code></td>
+    <td>Gesamtbetrag aller Rechnungen</td>
+   </tr>
+  </table>
+ </p>
+
+ <h3> Variablen f&uuml;r jede Rechnungsposition in Sammelrechnung:</h3>
+ <p>
+  <table border="1">
+   <tr><th>Variablenname</th><th>Bedeutung</th></tr>
+   <tr>
+    <td><code>invnumber</code></td>
+    <td>Rechnungsnummer</td>
+   </tr>
+   <tr>
+    <td><code>invdate</code></td>
+    <td>Rechnungsdatum</td>
+   </tr>
+   <tr>
+    <td><code>duedate</code></td>
+    <td>F&auml;lligkeitsdatum</td>
+   </tr>
+   <tr>
+    <td><code>amount</code></td>
+    <td>Summe der Rechnung</td>
+   </tr>
+   <tr>
+    <td><code>open</code></td>
+    <td>Noch offener Betrag der Rechnung</td>
+   </tr>
+   <tr>
+    <td><code>c0</code></td>
+    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &lt; 30 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c30</code></td>
+    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 30 und &lt; 60 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c60</code></td>
+    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 60 und &lt; 90 Tage</td>
+   </tr>
+   <tr>
+    <td><code>c90</code></td>
+    <td>Noch offener Rechnungsbetrag mit F&auml;lligkeit &gt;= 90 Tage</td>
+   </tr>
+  </table>
+ </p>
+
+
+
+
  <small><a href="dokumentenvorlagen-und-variablen.html#inhaltsverzeichnis">
    zum Inhaltsverzeichnis</a></small><br>
  <hr>
@@ -1286,14 +1370,14 @@ td {
   ... &lt;%end%&gt;</code></p>
 
  <p>Anmerkung zum <code>&lt;%end%&gt;</code>: Der besseren
-  Verständlichkeit halber kann man nach dem <code>end</code> noch
-  beliebig weitere Wörter schreiben, um so zu markieren, welche
+  Verst&auml;ndlichkeit halber kann man nach dem <code>end</code> noch
+  beliebig weitere W&ouml;rter schreiben, um so zu markieren, welche
   Anweisung (z.B. <code>if</code> oder <code>foreach</code>) damit
   abgeschlossen wird.</p>
 
  <p>Beispiel: Lautet der Beginn eines Blockes
    z.B. <code class="blue">&lt;%if type ==
-   &quot;sales_quotation&quot;%&gt;</code>, so könnte er mit
+   &quot;sales_quotation&quot;%&gt;</code>, so k&ouml;nnte er mit
   <code class="blue">&lt;%end%&gt;</code> genauso abgeschlossen werden
   wie mit
   <code class="blue">&lt;%end if%&gt;</code> oder auch
@@ -1316,33 +1400,33 @@ td {
   wird. Beispiel: <code class="blue">&lt;%if not
   cp_greeting%&gt;</code></p>
 
- <p>Zusätzlich zu dem einfachen Test, ob eine Variable gesetzt ist
-  oder nicht, bietet dieser Block auch die Möglichkeit, den Inhalt
+ <p>Zus&auml;tzlich zu dem einfachen Test, ob eine Variable gesetzt ist
+  oder nicht, bietet dieser Block auch die M&ouml;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
+  oder einer anderen Variablen vorgenommen wird, h&auml;ngt davon ab, ob
+  die rechte Seite des Vergleichsoperators in Anf&uuml;hrungszeichen
   gesetzt wird (Vergleich mit Zeichenkette) oder nicht (Vergleich mit
   anderer Variablen). Zwei Beispiele, die beide Vergleiche zeigen:</p>
 
  <p><code class="blue">&lt;%if var1 == &quot;Wert&quot;%&gt;</code>
-  testet die Variable &quot;var1&quot; auf Übereinstimmung mit der
+  testet die Variable &quot;var1&quot; auf &Uuml;bereinstimmung mit der
   Zeichenkette &quot;Wert&quot;. Mittels &quot;!=&quot; anstelle von
-  &quot;==&quot; würde auf Ungleichheit getestet.</p>
+  &quot;==&quot; w&uuml;rde auf Ungleichheit getestet.</p>
 
  <p><code class="blue">&lt;%if var1 == var2%&gt;</code> testet die
-  Variable &quot;var1&quot; auf Übereinstimmung mit der Variablen
+  Variable &quot;var1&quot; auf &Uuml;bereinstimmung mit der Variablen
   &quot;var2&quot;. Mittels &quot;!=&quot; anstelle von &quot;==&quot;
-  würde auf Ungleichheit getestet.</p>
+  w&uuml;rde auf Ungleichheit getestet.</p>
 
- <p>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
+ <p>Erfahrere Benutzer k&ouml;nnen neben der Tests auf (Un-)Gleichheit auch
+  Tests auf &Uuml;bereinstimmung mit regul&auml;ren Ausdr&uuml;cken ohne
+  Ber&uuml;cksichtung der Gro&szlig;- und Kleinschreibung durchf&uuml;hren. Dazu dient
   dieselbe Syntax wie oben nur mit &quot;=~&quot; und &quot;!~&quot;
   als Vergleichsoperatoren.</p>
 
- <p>Beispiel für einen Test, ob die Variable &quot;intnotes&quot;
-  (interne Bemerkungen) das Wort &quot;schwierig&quot; enthält:
+ <p>Beispiel f&uuml;r einen Test, ob die Variable &quot;intnotes&quot;
+  (interne Bemerkungen) das Wort &quot;schwierig&quot; enth&auml;lt:
   <code class="blue">&lt;%if intnotes =~
   &quot;schwierig&quot;%&gt;</code></p>