RP.pm income_statement: EÜR/GuV mit Kontennachweis
authorG. Richardson <information@kivitendo-premium.de>
Mon, 3 Apr 2017 06:35:53 +0000 (08:35 +0200)
committerG. Richardson <information@kivitendo-premium.de>
Fri, 7 Apr 2017 09:00:36 +0000 (11:00 +0200)
* Am Ende des Berichts kann man sich eine Liste aller Konten aus dem
Bericht anzeigen, mit Betrag und der Kategorie, in dem das Konto vorkommt.
Die Liste ist nach Kontonummer sortiert.

* Mit Klick auf eine Kategorie werden die dazugehörigen Konten
angezeigt, indem sie unterhalb der Überschrift mit einer etwas
kleineren Schrift innerhalb der Tabelle "aufgeklappt" werden.

* Am Kopf der Seite kann man mit dem Knopf "Konten zeigen" alle Konten
auf einmal aufklappen.

* Der Knopf "Knöpfe verstecken" dient dazu, die Knöpfe auszublenden,
damit man die Seite ausdrucken kann. Mit Klick auf die Überschrift
"Einnahmenüberschußrechnung" werden alle Knöpfe wieder eingeblendet.

* die Namen der Kategorien werden jetzt aus der Datenbank ausgelesen und
stehen nicht mehr hartkodiert im Template. Außerdem wurde das Template
vereinfacht, indem die Summen der Kategorien nicht mehr in einzelnen
Form-Variablen "eur1", "eur2", ... gespeichert werden, sondern alle
Summe in einem zentralen Hash stehen, und per FOREACH-Schleife im
Template ausgelesen werden können.

SL/RP.pm
locale/de/all
templates/webpages/rp/income_statement.html

index a04351e..452f116 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -39,6 +39,7 @@ use SL::DBUtils;
 use Data::Dumper;
 use SL::DB::Helper::AccountingPeriod qw(get_balance_starting_date);
 use List::Util qw(sum);
+use List::UtilsBy qw(partition_by sort_by);
 use SL::DB;
 
 # use warnings;
@@ -1845,19 +1846,34 @@ sub income_statement {
                   $form, "pos_eur");
 
 
+  # add extra information to form to be used by template
+  my %charts_by_category =
+    partition_by { $_->{pos_eur} }
+    sort_by      { $_->{accno}   }
+    map          { $form->{charts}->{$_} }
+    keys %{ $form->{charts} };
+  $form->{"charts_by_category"} = \%charts_by_category;
+
+  $form->{"categories_income"}  = \@categories_einnahmen;
+  $form->{"categories_expense"} = \@categories_ausgaben;
+
+  $form->{category_names} = AM->get_eur_categories($myconfig, $form);
+
+  my %eur_amounts;
+
   foreach my $item (@categories_einnahmen) {
-    $form->{"eur${item}"} =
-      $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
+    $eur_amounts{$item} = $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
     $form->{"sumeura"} += $form->{$item};
   }
   foreach my $item (@categories_ausgaben) {
-    $form->{"eur${item}"} =
-      $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
+    $eur_amounts{$item} = $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
     $form->{"sumeurb"} += $form->{$item};
   }
 
   $form->{"guvsumme"} = $form->{"sumeura"} - $form->{"sumeurb"};
 
+  $form->{eur_amounts} = \%eur_amounts;
+
   foreach my $item (@ergebnisse) {
     $form->{$item} =
       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
index 0896c90..839d7ab 100755 (executable)
@@ -548,6 +548,7 @@ $self->{texts} = {
   'Cash'                        => 'Zahlungsverkehr',
   'Cash accounting'             => 'Ist-Versteuerung',
   'Cash basis accounting'       => 'Einnahmen-Überschuss-Rechnung',
+  'Category'                    => 'Kategorie',
   'Cc'                          => 'Cc',
   'Cc E-mail'                   => 'CC (E-Mail)',
   'Change default bin for this parts' => 'Standardlagerplatz für diese Waren ändern',
@@ -565,6 +566,7 @@ $self->{texts} = {
   'Chart'                       => 'Buchungskonto',
   'Chart Type'                  => 'Kontentyp',
   'Chart balance'               => 'Kontensaldo',
+  'Chart list'                  => 'Kontenliste',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Chart picker'                => 'Kontenauswahl',
   'Chartaccounts connected to this Tax:' => 'Konten, die mit dieser Steuer verknüpft sind:',
@@ -1444,8 +1446,11 @@ $self->{texts} = {
   'Here\'s an example command line:' => 'Hier ist eine Kommandozeile, die als Beispiel dient:',
   'Hide Filter'                 => 'Filter verbergen',
   'Hide all details'            => 'Alle Details verbergen',
+  'Hide buttons'                => 'Knöpfe verstecken',
   'Hide by default'             => 'Standardm&auml;&szlig;ig verstecken',
   'Hide chart details'          => 'Konteninformation verstecken',
+  'Hide chart list'             => 'Kontenliste verstecken',
+  'Hide charts'                 => 'Konten verstecken',
   'Hide details'                => 'Details verbergen',
   'Hide help text'              => 'Hilfetext verbergen',
   'Hide mappings (csv_import)'  => 'Spaltenzuordnungen verbergen',
@@ -2661,6 +2666,8 @@ $self->{texts} = {
   'Show all details'            => 'Alle Details anzeigen',
   'Show all parts'              => 'Alle Artikel anzeigen',
   'Show by default'             => 'Standardm&auml;&szlig;ig anzeigen',
+  'Show chart list'             => 'Kontenliste zeigen',
+  'Show charts'                 => 'Konten zeigen',
   'Show custom variable search inputs' => 'Suchoptionen für Benutzerdefinierte Variablen verstecken',
   'Show delete button in purchase delivery orders?' => 'Soll der "Löschen"-Knopf bei Einkaufslieferscheinen angezeigt werden?',
   'Show delete button in purchase orders?' => 'Soll der "Löschen"-Knopf bei Lieferantenaufträgen angezeigt werden?',
index a38cd99..9800d1e 100644 (file)
@@ -1,8 +1,12 @@
 [%- USE T8 %]
 [%- USE HTML %]
 [%- USE LxERP %]
+[%- USE L %]
+[% L.button_tag('', LxERP.t8('Hide buttons'), id="hide_buttons_button", class="hide") %]
+[% L.button_tag('', LxERP.t8('Show charts'),  id="show_charts_button",  class="hide") %]
+[% L.button_tag('', LxERP.t8('Hide charts'),  id="hide_charts_button",  class="hide") %]
 
-<h3 align=center> [% title %]</h3>
+<h3 align="center" id="show_buttons"> [% title %]</h3>
 <h3 align=center>
 [% period %]<br>
 [% accounting_method %]<br>
 <br>[% report_date %]
 </h3>
 
-<table width=100% border=0>
+<style type="text/css">
+
+#eurtable {
+  border-collapse: collapse;
+  width: 100%;
+}
+
+tr.category {
+  /* background set via jquery */
+}
+
+tr.chart {
+  border: 0;
+}
+
+td.chartname {
+  padding-left: 50px;
+}
+
+tr.chartrow {
+  font-size: 75%;
+}
+
+.guv_row_background {
+  background:#f0f0f0;
+}
+</style>
+
+<table id="eurtable">
 <tr>
   <td width=75% align=left colspan=2><font size="+1"><b>A. Betriebseinnahmen</font></b><br></td>
   <td></td>
 </tr>
 
-<tr>
-  <td>
-    Umsatzerl&ouml;se
-  </td>
-  <td>
-    [% eur1 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    sonstige Erl&ouml;se
-  </td>
-  <td>
-    [% eur2 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Privatanteile
-  </td>
-  <td>
-    [% eur3 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Zinsertr&auml;ge
-  </td>
-  <td>
-    [% eur4 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Au&szlig;erordentliche Ertr&auml;ge
-  </td>
-  <td>
-    [% eur5 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Vereinnahmte Umsatzsteuer
-  </td>
-  <td>
-    [% eur6 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Umsatzsteuererstattungen
-  </td>
-  <td>
-    [% eur7 %]
-  </td>
-</tr>
-
-
+[% FOREACH i IN categories_income %]
+  <tr class="category" data-catid="cat[% i %]">
+    <td>
+      [% HTML.escape(category_names.item(i)) %]
+    </td>
+    <td class="numeric">
+      [% eur_amounts.item(i) %]
+    </td>
+  </tr>
+  [% FOREACH chart = charts_by_category.item(i).list %]
+  <tr class="chartrow cat[% i %]">
+    <td class="chartname">[% chart.accno %] [% chart.description %]</td>
+    <td class="numeric"> [% LxERP.format_amount(chart.amount,2) %] </td>
+  </tr>
+  [% END %]
+[% END %]
 <tr>
   <td> </td>
   <td><hr noshade size=1></td>
   <td></td>
 </tr>
 
-<tr>
-  <td>
-    Wareneing&auml;nge
-  </td>
-  <td>
-    [% eur8 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    L&ouml;hne und Geh&auml;lter
-  </td>
-  <td>
-    [% eur9 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Gesetzlicher sozialer Aufwand
-  </td>
-  <td>
-    [% eur10 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Mieten
-  </td>
-  <td>
-    [% eur11 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Gas, Strom, Wasser
-  </td>
-  <td>
-    [% eur12 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Instandhaltung
-  </td>
-  <td>
-    [% eur13 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Steuern, Versicherungen, Beitr&auml;ge
-  </td>
-  <td>
-    [% eur14 %]
-  </td>
-</tr>
-<tr>
-  <td>
-    Kfz-Steuern
-  </td>
-  <td>
-    [% eur15 %]
-  </td>
-</tr><tr>
-  <td>
-    Kfz-Versicherungen
-  </td>
-  <td>
-    [% eur16 %]
-  </td>
-</tr><tr>
-  <td>
-    Sonstige Fahrzeugkosten
-  </td>
-  <td>
-    [% eur17 %]
-  </td>
-</tr><tr>
-  <td>
-    Werbe- und Reisekosten
-  </td>
-  <td>
-    [% eur18 %]
-  </td>
-</tr><tr>
-  <td>
-    Instandhaltung und Werkzeuge
-  </td>
-  <td>
-    [% eur19 %]
-  </td>
-</tr><tr>
-  <td>
-    Fachzeitschriften, B&uuml;cher
-  </td>
-  <td>
-    [% eur20 %]
-  </td>
-</tr><tr>
-  <td>
-    Miete f&uuml;r Einrichtungen
-  </td>
-  <td>
-    [% eur21 %]
-  </td>
-</tr><tr>
-  <td>
-    Rechts- und Beratungskosten
-  </td>
-  <td>
-    [% eur22 %]
-  </td>
-</tr><tr>
-  <td>
-    B&uuml;robedarf, Porto, Telefon
-  </td>
-  <td>
-    [% eur23 %]
-  </td>
-</tr><tr>
-  <td>
-    Sonstige Aufwendungen
-  </td>
-  <td>
-    [% eur24 %]
-  </td>
-</tr><tr>
-  <td>
-    Abschreibungen auf Anlageverm&ouml;gen
-  </td>
-  <td>
-    [% eur25 %]
-  </td>
-</tr><tr>
-  <td>
-    Abschreibungen auf GWG
-  </td>
-  <td>
-    [% eur26 %]
-  </td>
-</tr><tr>
-  <td>
-    Vorsteuer
-  </td>
-  <td>
-    [% eur27 %]
-  </td>
-</tr><tr>
-  <td>
-    Umsatzsteuerzahlungen
-  </td>
-  <td>
-    [% eur28 %]
-  </td>
-</tr><tr>
-  <td>
-    Zinsaufwand
-  </td>
-  <td>
-    [% eur29 %]
-  </td>
-</tr><tr>
-  <td>
-    Au&szlig;erordentlicher Aufwand
-  </td>
-  <td>
-    [% eur30 %]
-  </td>
-</tr><tr>
-  <td>
-    Betriebliche Steuern
-  </td>
-  <td>
-    [% eur31 %]
-  </td>
-</tr>
-
-
+[% FOREACH i IN categories_expense %]
+  <tr class="category" data-catid="cat[% i %]">
+    <td>
+      [% HTML.escape(category_names.item(i)) %]
+    </td>
+    <td class="numeric">
+      [% eur_amounts.item(i) %]
+    </td>
+  </tr>
+  [% FOREACH chart = charts_by_category.item(i).list %]
+  <tr class="chartrow cat[% i %]">
+    <td class="chartname">[% chart.accno %] [% chart.description %]</td>
+    <td class="numeric"> [% LxERP.format_amount(chart.amount,2) %] </td>
+  </tr>
+  [% END %]
+[% END %]
 <tr>
   <td> </td>
   <td><hr noshade size=1></td>
 
 </table>
 
+
+<br>
+
+[% L.button_tag('', LxERP.t8('Show chart list'), id="show_chartlist_button", class="hide") %]
+[% L.button_tag('', LxERP.t8('Hide chart list'), id="hide_chartlist_button", class="hide") %]
+
+<div id="chartlist">
+<div>[% 'Chart list' | $T8 %]</div>
+<div>
+<table>
+<tr>
+  <th>[% 'Chart'    | $T8 %]</th>
+  <th>[% 'Amount'   | $T8 %]</th>
+  <th>[% 'Category' | $T8 %]</th>
+</tr>
+[% FOREACH key = charts.keys.sort %]
+[% UNLESS charts.$key.pos_eur %]
+[% NEXT %]
+[% END %]
+<tr>
+ <td>[% charts.$key.accno %]</td>
+ <td class="numeric">[%  LxERP.format_amount( charts.$key.amount, 2 ) %]</td>
+ <td>[% HTML.escape(category_names.item(charts.$key.pos_eur)) %]</td>
+</tr>
+[% END %]
+</table>
+</div>
+</div>
 </body>
 </html>
 
+<script language="javascript">
+$( document ).ready(function() {
+  $( ".chartrow" ).hide();
+  $( "#hide_charts_button" ).hide();
+  $( "#hide_chartlist_button" ).hide();
+  $( "#chartlist" ).hide();
+  $( '.category:even' ).css('background-color','#f0f0f0');
+  $( '.category:odd' ).css('background-color','#f8f8f8');
+
+  $( "#show_chartlist_button" ).click(function() {
+    $( "#chartlist" ).toggle();
+    $('html, body').animate({
+        scrollTop: $(this).offset().top
+    }, 500);
+    $(this).hide();
+    $("#hide_chartlist_button").show();
+  });
+
+  $( "#hide_chartlist_button" ).click(function() {
+    $( "#chartlist" ).toggle();
+    $('html, body').animate({
+        scrollTop: $(this).offset().top
+    }, 500);
+    $(this).hide();
+    $("#show_chartlist_button").show();
+  });
+
+  $( "#hide_buttons_button" ).click(function() {
+    $( ".hide" ).hide();
+  });
+
+  $( "#show_buttons" ).click(function() {
+    $( ".hide" ).show();
+  });
+
+  $( "#show_charts_button" ).click(function() {
+    $( ".chartrow" ).show();
+    $(this).hide();
+    $("#hide_charts_button").show();
+  });
+
+  $( "#hide_charts_button" ).click(function() {
+    $( ".chartrow" ).hide();
+    $(this).hide();
+    $("#show_charts_button").show();
+  });
+
+  $( ".category" ).click(function() {
+    var chartrow_class = $(this).attr('data-catid');
+    $('.' + chartrow_class).toggle();
+  });
+})
+
+</script>