RP->aging: storno kann auch NULL sein
[kivitendo-erp.git] / SL / RP.pm
index 5f04b99..88f4ebe 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -37,9 +37,9 @@ package RP;
 use SL::DBUtils;
 use Data::Dumper;
 use List::Util qw(sum);
-# use strict;
-# use warnings;
 
+# use warnings;
+use strict;
 
 # new implementation of balance sheet
 # readme!
@@ -215,6 +215,8 @@ sub get_accounts {
   }
 
   if ($form->{project_id}) {
+    # Diese Bedingung wird derzeit niemals wahr sein, da man in Bericht->Bilanz keine
+    # Projekte auswählen kann
     $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}, 'NULL') . qq|) |;
   }
 
@@ -276,6 +278,7 @@ sub get_accounts {
          GROUP BY c.accno, c.description, c.category |;
 
     if ($form->{project_id}) {
+      # s.o. keine Projektauswahl in Bilanz
       $query .=
         qq|
          UNION ALL
@@ -325,10 +328,12 @@ sub get_accounts {
     }
 
   } else {                      # if ($form->{method} eq 'cash')
-    if ($department_id) {
-      $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
-      $dpt_where = qq| AND t.department_id = $department_id |;
-    }
+    # ich sehe keinen sinn das nochmal explizit ohne conv_i aufzurufen
+    # bitte prüfen und löschen jan 15.11.2009
+  #  if ($department_id) {
+  #    $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
+  #    $dpt_where = qq| AND t.department_id = $department_id |;
+  #  }
 
     $query = qq|
       SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
@@ -342,6 +347,7 @@ sub get_accounts {
       GROUP BY c.accno, c.description, c.category |;
 
     if ($form->{project_id}) {
+      # s.o. keine Projektauswahl in Bilanz
       $query .= qq|
       UNION ALL
 
@@ -439,6 +445,7 @@ sub get_accounts_g {
   my $glwhere  = "";
   my $prwhere  = "";
   my $subwhere = "";
+  my $inwhere = "";
   my $item;
 
   if ($fromdate) {
@@ -447,6 +454,7 @@ sub get_accounts_g {
       $subwhere .= " AND (transdate    >= $fromdate)";
       $glwhere   = " AND (ac.transdate >= $fromdate)";
       $prwhere   = " AND (a.transdate  >= $fromdate)";
+      $inwhere   = " AND (acc.transdate >= $fromdate)";
     } else {
       $where    .= " AND (ac.transdate >= $fromdate)";
     }
@@ -457,6 +465,7 @@ sub get_accounts_g {
     $subwhere   .= " AND (transdate    <= $todate)";
     $where      .= " AND (ac.transdate <= $todate)";
     $prwhere    .= " AND (a.transdate  <= $todate)";
+    $inwhere    .= " AND (acc.transdate <= $todate)";
   }
 
   if ($department_id) {
@@ -468,9 +477,42 @@ sub get_accounts_g {
     $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}) . qq|) |;
   }
 
+#
+# GUV patch by Ronny Rentner (Bug 1190)
+#
+# GUV IST-Versteuerung
+#
+# Alle tatsaechlichen _Zahlungseingaenge_
+# im Zeitraum erfassen
+# (Teilzahlungen werden prozentual auf verschiedene Steuern aufgeteilt)
+#
+#
+
   if ($form->{method} eq 'cash') {
     $query =
       qq|
+       SELECT SUM( ac.amount *
+                    (SELECT SUM(acc.amount) * -1
+                     FROM acc_trans acc
+                     INNER JOIN chart c ON (acc.chart_id = c.id AND c.link LIKE '%AR_paid%')
+                     WHERE 1=1 $inwhere AND acc.trans_id = ac.trans_id)
+                  / (SELECT amount FROM ar WHERE id = ac.trans_id)
+                ) AS amount, c.pos_eur
+       FROM acc_trans ac
+       LEFT JOIN chart c ON (c.id  = ac.chart_id)
+       LEFT JOIN ar      ON (ar.id = ac.trans_id)
+       LEFT JOIN taxkeys tk ON (tk.id = (
+                                  SELECT id FROM taxkeys
+                                  WHERE chart_id = ac.chart_id
+                                  AND startdate <= COALESCE(ar.deliverydate,ar.transdate)
+                                  ORDER BY startdate DESC LIMIT 1
+                                  )
+                                )
+      WHERE ac.trans_id IN (SELECT DISTINCT trans_id FROM acc_trans WHERE 1=1 $subwhere)
+
+      GROUP BY c.pos_eur
+
+/*
        SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
          FROM acc_trans ac
          JOIN chart c ON (c.id = ac.chart_id)
@@ -480,7 +522,7 @@ sub get_accounts_g {
            AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
            $project
          GROUP BY c.$category
-
+*/
          UNION
 
          SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
@@ -537,10 +579,10 @@ sub get_accounts_g {
     }
 
   } else {                      # if ($form->{method} eq 'cash')
-    if ($department_id) {
-      $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
-      $dpt_where = qq| AND (t.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
-    }
+    # s.o. jan 15.11.2009
+#    if ($department_id) {
+#      ($dpt_join, $dpt_where) = sql_department($department_id);
+#    }
 
     $query = qq|
         SELECT sum(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
@@ -588,9 +630,7 @@ sub get_accounts_g {
   my $accno;
   my $ref;
 
-  my $sth = prepare_execute_query($form, $dbh, $query);
-
-  while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
+  foreach my $ref (selectall_hashref_query($form, $dbh, $query)) {
     if ($category eq "pos_bwa") {
       if ($last_period) {
         $form->{ $ref->{$category} }{kumm} += $ref->{amount};
@@ -601,7 +641,6 @@ sub get_accounts_g {
       $form->{ $ref->{$category} } += $ref->{amount};
     }
   }
-  $sth->finish;
 
   $main::lxdebug->leave_sub();
 }
@@ -744,6 +783,7 @@ sub trial_balance {
   my $glwhere       = '';
   my $glsumwhere    = '';
   my $tofrom;
+  my ($fromdate, $todate);
 
   if ($form->{fromdate} || $form->{todate}) {
     if ($form->{fromdate}) {
@@ -774,7 +814,7 @@ sub trial_balance {
     $where .=
       qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate)) AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
     $saldowhere .= qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate))  AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
-      
+
     $sumwhere .= qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate)) AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
   } else {
     $where .= $tofrom . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
@@ -1158,7 +1198,7 @@ sub aging {
          AND (exchangerate.transdate = ${arap}.transdate)) AS exchangerate
     FROM ${arap}, ${ct}
     WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
-      AND (${arap}.storno IS FALSE)
+      AND NOT COALESCE (${arap}.storno, 'f')
       AND (${arap}.${ct}_id = ${ct}.id)
       AND (${ct}.id = ?)
       AND (transdate <= (date $todate) $fromwhere )
@@ -1772,26 +1812,26 @@ sub ustva {
   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_ustva");
 
   #   foreach $item (@categories_cent) {
-  #    if ($form->{$item}{"jetzt"} > 0) {
-  #            $form->{$item} = $form->{$item}{"jetzt"};
-  #            delete $form->{$item}{"jetzt"};
-  #    }
+  #     if ($form->{$item}{"jetzt"} > 0) {
+  #       $form->{$item} = $form->{$item}{"jetzt"};
+  #       delete $form->{$item}{"jetzt"};
+  #     }
   #   }
   #   foreach $item (@categories_euro) {
-  #    if ($form->{$item}{"jetzt"} > 0) {
-  #            $form->{$item} = $form->{$item}{"jetzt"};
-  #            delete $form->{$item}{"jetzt"};
-  #    }  foreach $item (@categories_cent) {
-  #    if ($form->{$item}{"jetzt"} > 0) {
-  #            $form->{$item} = $form->{$item}{"jetzt"};
-  #            delete $form->{$item}{"jetzt"};
-  #    }
+  #     if ($form->{$item}{"jetzt"} > 0) {
+  #       $form->{$item} = $form->{$item}{"jetzt"};
+  #       delete $form->{$item}{"jetzt"};
+  #     }  foreach $item (@categories_cent) {
+  #     if ($form->{$item}{"jetzt"} > 0) {
+  #       $form->{$item} = $form->{$item}{"jetzt"};
+  #       delete $form->{$item}{"jetzt"};
+  #     }
   #   }
   #   foreach $item (@categories_euro) {
-  #    if ($form->{$item}{"jetzt"} > 0) {
-  #            $form->{$item} = $form->{$item}{"jetzt"};
-  #            delete $form->{$item}{"jetzt"};
-  #    }
+  #     if ($form->{$item}{"jetzt"} > 0) {
+  #       $form->{$item} = $form->{$item}{"jetzt"};
+  #       delete $form->{$item}{"jetzt"};
+  #     }
   #   }
   #
   #    }