Filtert Steuern bei Dialogbuchungen
authorNiclas Zimmermann <niclas@kivitendo-premium.de>
Mon, 22 Apr 2013 16:45:56 +0000 (18:45 +0200)
committerNiclas Zimmermann <niclas@kivitendo-premium.de>
Thu, 2 May 2013 08:25:37 +0000 (10:25 +0200)
Bei Dialogbuchungen kam es in der Vergangenheit zu Verwechslungen
von Umsatz- und Vorsteuer. Für jedes Konto werden daher nun Steuern
nur noch angezeigt, wenn die Steuer so eingestellt ist, dass sie
für die Kontoart des ausgewählten Kontos angezeigt wird.

Implementiert #2249.

SL/AM.pm
SL/GL.pm
bin/mozilla/am.pl
bin/mozilla/gl.pl
locale/de/all
templates/webpages/am/edit_tax.html
templates/webpages/gl/form_header.html
templates/webpages/gl/update_tax_accounts.html [new file with mode: 0644]

index 502ebd9..0c3c835 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -1777,6 +1777,7 @@ sub get_tax {
                    taxdescription,
                    round(rate * 100, 2) AS rate,
                    chart_id,
+                   chart_categories,
                    (id IN (SELECT tax_id
                            FROM acc_trans)) AS tax_already_used
                  FROM tax
@@ -1834,14 +1835,23 @@ sub save_tax {
 
   $form->{rate} = $form->{rate} / 100;
 
-  my @values = ($form->{taxkey}, $form->{taxdescription}, $form->{rate}, $form->{chart_id}, $form->{chart_id} );
+  my $chart_categories = '';
+  $chart_categories .= 'A' if $form->{asset};
+  $chart_categories .= 'L' if $form->{liability};
+  $chart_categories .= 'Q' if $form->{equity};
+  $chart_categories .= 'I' if $form->{revenue};
+  $chart_categories .= 'E' if $form->{expense};
+  $chart_categories .= 'C' if $form->{costs};
+
+  my @values = ($form->{taxkey}, $form->{taxdescription}, $form->{rate}, $form->{chart_id}, $form->{chart_id}, $chart_categories);
   if ($form->{id} ne "") {
     $query = qq|UPDATE tax SET
                   taxkey         = ?,
                   taxdescription = ?,
                   rate           = ?,
                   chart_id       = ?,
-                  taxnumber      = (SELECT accno FROM chart WHERE id= ? )
+                  taxnumber      = (SELECT accno FROM chart WHERE id= ? ),
+                  chart_categories = ?
                 WHERE id = ?|;
     push(@values, $form->{id});
 
@@ -1852,9 +1862,10 @@ sub save_tax {
                   taxdescription,
                   rate,
                   chart_id,
-                  taxnumber
+                  taxnumber,
+                  chart_categories
                 )
-                VALUES (?, ?, ?, ?, (SELECT accno FROM chart WHERE id = ?) )|;
+                VALUES (?, ?, ?, ?, (SELECT accno FROM chart WHERE id = ?), ? )|;
   }
   do_query($form, $dbh, $query, @values);
 
index 1fc1f3a..a422877 100644 (file)
--- a/SL/GL.pm
+++ b/SL/GL.pm
@@ -801,5 +801,24 @@ sub get_chart_balances {
   $main::lxdebug->leave_sub();
 }
 
+sub get_tax_dropdown {
+  my $myconfig = \%main::myconfig;
+  my $form = $main::form;
+
+  my $dbh = $form->get_standard_dbh($myconfig);
+
+  my $query = qq|SELECT category FROM chart WHERE accno = ?|;
+  my ($category) = selectrow_query($form, $dbh, $query, $form->{accno});
+
+  $query = qq|SELECT * FROM tax WHERE chart_categories like '%$category%' order by taxkey, rate|;
+
+  my $sth = prepare_execute_query($form, $dbh, $query);
+
+  $form->{TAX_ACCOUNTS} = [];
+  while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+    push(@{ $form->{TAX_ACCOUNTS} }, $ref);
+  }
+
+}
 
 1;
index 68f8e16..ebe7ed1 100644 (file)
@@ -1461,6 +1461,13 @@ sub add_tax {
 
   _get_taxaccount_selection();
 
+  $form->{asset}      = 1;
+  $form->{liability}  = 1;
+  $form->{equity}     = 1;
+  $form->{revenue}    = 1;
+  $form->{expense}    = 1;
+  $form->{costs}      = 1;
+
   $form->header();
 
   my $parameters_ref = {
@@ -1485,8 +1492,16 @@ sub edit_tax {
   $form->{title} =  $locale->text('Edit');
 
   AM->get_tax(\%myconfig, \%$form);
+
   _get_taxaccount_selection();
 
+  $form->{asset}      = $form->{chart_categories} =~ 'A' ? 1 : 0;
+  $form->{liability}  = $form->{chart_categories} =~ 'L' ? 1 : 0;
+  $form->{equity}     = $form->{chart_categories} =~ 'Q' ? 1 : 0;
+  $form->{revenue}    = $form->{chart_categories} =~ 'I' ? 1 : 0;
+  $form->{expense}    = $form->{chart_categories} =~ 'E' ? 1 : 0;
+  $form->{costs}      = $form->{chart_categories} =~ 'C' ? 1 : 0;
+
   $form->{rate} = $form->format_amount(\%myconfig, $form->{rate}, 2);
 
   $form->header();
index 0d9a92b..4c97bd0 100644 (file)
@@ -686,7 +686,7 @@ sub display_rows {
   my %taxchart_labels = ();
   my @taxchart_values = ();
   my %taxcharts = ();
-  foreach my $item (@{ $form->{ALL_TAXCHARTS} }) {
+  foreach my $item (@{ $form->{TAX_ACCOUNTS} }) {
     my $key = $item->{id} . "--" . $item->{rate};
     $taxchart_init = $key if ($taxchart_init == $item->{id});
     push(@taxchart_values, $key);
@@ -730,7 +730,7 @@ sub display_rows {
     my $accno = qq|<td>| .
       NTI($cgi->popup_menu('-name' => "accno_$i",
                            '-id' => "accno_$i",
-                           '-onChange' => "setTaxkey($i)",
+                           '-onChange' => "updateTaxes($i);",
                            '-style' => 'width:200px',
                            '-values' => \@chart_values,
                            '-labels' => \%chart_labels,
@@ -862,8 +862,10 @@ sub form_header {
                                     "all"       => 0,
                                     "old_id"    => \@old_project_ids },
                    "charts"    => { "key"       => "ALL_CHARTS",
-                                    "transdate" => $::form->{transdate} },
-                   "taxcharts" => "ALL_TAXCHARTS");
+                                    "transdate" => $::form->{transdate} });
+
+  $::form->{accno} = $::form->{ALL_CHARTS}[0]->{accno};
+  GL->get_tax_dropdown();
 
   GL->get_chart_balances('charts' => $::form->{ALL_CHARTS});
 
@@ -1219,4 +1221,21 @@ sub continue {
   call_sub($main::form->{nextsub});
 }
 
+sub get_tax_dropdown {
+
+  my $form = $main::form;
+  $main::lxdebug->enter_sub();
+  GL->get_tax_dropdown();
+
+  foreach my $item (@{ $form->{TAX_ACCOUNTS} }) {
+    $item->{taxdescription} = $::locale->{iconv_utf8}->convert($item->{taxdescription});
+    $item->{taxdescription} .= ' ' . $form->round_amount($item->{rate} * 100);
+  }
+
+  print $form->ajax_response_header, $form->parse_html_template("gl/update_tax_accounts");
+
+  $main::lxdebug->leave_sub();
+
+}
+
 1;
index 823045a..9251877 100755 (executable)
@@ -97,6 +97,7 @@ $self->{texts} = {
   'Account Nummer'              => 'Kontonummer',
   'Account Type'                => 'Kontoart',
   'Account Type missing!'       => 'Kontoart fehlt!',
+  'Account categories'          => 'Kontoarten',
   'Account deleted!'            => 'Konto gelöscht!',
   'Account for fees'            => 'Konto f&uuml;r Geb&uuml;hren',
   'Account for interest'        => 'Konto f&uuml;r Zinsen',
index 69ac744..f7e7cf9 100644 (file)
@@ -1,5 +1,6 @@
 [%- USE T8 %]
 [%- USE HTML %]
+[%- USE L %]
  <form method="post" action="am.pl">
   <input type="hidden" name="id" value="[% HTML.escape(id) %]">
   <input type="hidden" name="type" value="tax">
     <td><select name="chart_id"><option value="0">[% 'None' | $T8 %]</option>[% FOREACH row = ACCOUNTS %]<option value="[% HTML.escape(row.id) %]" [% IF row.selected %]selected[% END %]>[% HTML.escape(row.taxaccount) %]</option>[% END %]</select></td>
    </tr>
 
+    <td>[% 'Account categories' | $T8 %]</td>
+    <td><table>
+          <colgroup>
+            <col width="10">
+            <col width="130">
+            <col width="10">
+            <col width="130">
+            <col width="10">
+            <col width="130">
+            <col width="10">
+            <col width="130">
+            <col width="10">
+            <col width="130">
+            <col width="10">
+            <col width="130">
+          </colgroup>
+          <tr>
+            <td align="right">[% IF asset %]
+                                [% L.checkbox_tag('asset', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('asset', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Asset' | $T8 %] (A)</td>
+            <td align="right">[% IF liability %]
+                                [% L.checkbox_tag('liability', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('liability', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Liability' | $T8 %] (L)</td>
+            <td align="right">[% IF equity %]
+                                [% L.checkbox_tag('equity', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('equity', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Equity' | $T8 %] (Q)</td>
+            <td align="right">[% IF revenue %]
+                                [% L.checkbox_tag('revenue', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('revenue', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Revenue' | $T8 %] (I)</td>
+            <td align="right">[% IF expense %]
+                                [% L.checkbox_tag('expense', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('expense', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Expense' | $T8 %] (E)</td>
+            <td align="right">[% IF costs %]
+                                [% L.checkbox_tag('costs', value => 1, checked => 1, class => 'checkbox') %]
+                              [% ELSE %]
+                                [% L.checkbox_tag('costs', value => 1, checked => 0, class => 'checkbox') %]
+                              [% END %]
+            </td>
+            <td align="left">[% 'Costs' | $T8 %] (C)</td>
+          </tr>
+        </table>
+     </td>
+   </tr>
+
+  </table>
   </table>
 
   [% UNLESS orphaned %]
index 728c80f..d73380e 100644 (file)
@@ -4,22 +4,38 @@
 [%- USE L %]
 <script type="text/javascript">
   <!--
-  function setTaxkey(row) {
-    var accno  = document.getElementById('accno_' + row);
-    var taxkey = accno.options[accno.selectedIndex].value;
-    var reg = /--([0-9]*)/;
-    var found = reg.exec(taxkey);
-    var index = found[1];
-    index = parseInt(index);
-    var tax = 'taxchart_' + row;
-    for (var i = 0; i < document.getElementById(tax).options.length; ++i) {
-      var reg2 = new RegExp("^"+ index, "");
-      if (reg2.exec(document.getElementById(tax).options[i].value)) {
-        document.getElementById(tax).options[i].selected = true;
-        break;
-      }
+function updateTaxes(row)
+{
+  var accno  = document.getElementById('accno_' + row);
+  var taxkey = accno.options[accno.selectedIndex].value;
+  var reg = /--([0-9]*)/;
+  var found = reg.exec(taxkey);
+  var index = found[1];
+  index = parseInt(index);
+  var tax = 'taxchart_' + row;
+  var taxkeyposition = taxkey.lastIndexOf(found[0]);
+  var account = taxkey.substr(0, taxkeyposition);
+
+  var xmlhttp;
+  if (window.XMLHttpRequest)
+  {// code for IE7+, Firefox, Chrome, Opera, Safari
+    xmlhttp=new XMLHttpRequest();
+  }
+  else
+  {// code for IE6, IE5
+    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
+  }
+  xmlhttp.onreadystatechange=function()
+  {
+    if (xmlhttp.readyState==4 && xmlhttp.status==200)
+    {
+      var element = document.getElementById("taxchart_" + row);
+      element.innerHTML = xmlhttp.responseText;
     }
-  };
+  }
+  xmlhttp.open("GET","gl.pl?action=get_tax_dropdown&accno=" + account + "&select_index=" + index,true);
+  xmlhttp.send();
+};
 
   function copy_debit_to_credit() {
     var txt = document.getElementsByName('debit_1')[0].value;
diff --git a/templates/webpages/gl/update_tax_accounts.html b/templates/webpages/gl/update_tax_accounts.html
new file mode 100644 (file)
index 0000000..940d34d
--- /dev/null
@@ -0,0 +1,3 @@
+[% FOR row = TAX_ACCOUNTS %]
+<option value='[% row.id %]--[% row.rate %]' [% IF row.id == select_index %]selected[% END %]>[% row.taxdescription %] %</option>
+[% END %]