Taskserver Debug default off
[kivitendo-erp.git] / SL / RP.pm
index e0ed0b4..c4a2eb5 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -211,6 +211,13 @@ sub get_accounts {
 
   $sth->finish;
 
+  # if l_ob is selected l_cb is always ignored
+  if ( $form->{l_ob} ) {
+    $where .= ' AND ac.ob_transaction is true  '
+  } elsif ( not $form->{l_cb} ) {
+    $where .= ' AND ac.cb_transaction is false ';
+  };
+
   if ($fromdate) {
     $fromdate = conv_dateq($fromdate);
     if ($form->{method} eq 'cash') {
@@ -464,6 +471,8 @@ sub get_accounts_g {
   my $inwhere = "";
   my $item;
 
+  $where .= ' AND ac.cb_transaction is false ' unless $form->{l_cb};
+
   if ($fromdate) {
     $fromdate = conv_dateq($fromdate);
     if ($form->{method} eq 'cash') {
@@ -507,13 +516,17 @@ sub get_accounts_g {
   if ($form->{method} eq 'cash') {
     $query =
       qq|
-       SELECT SUM( ac.amount *
+       SELECT SUM( ac.amount * CASE WHEN COALESCE((SELECT amount FROM ar WHERE id = ac.trans_id), 0) != 0 THEN
+            /* ar amount is not zero, so we can divide by 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
+            ELSE 0
+            /* ar amount is zero, or we are checking with a non-ar-transaction, so we return 0 in both cases as multiplicator of ac.amount */
+            END
+                ) AS amount, c.$category
        FROM acc_trans ac
        LEFT JOIN chart c ON (c.id  = ac.chart_id)
        LEFT JOIN ar      ON (ar.id = ac.trans_id)
@@ -526,7 +539,7 @@ sub get_accounts_g {
                                 )
       WHERE ac.trans_id IN (SELECT DISTINCT trans_id FROM acc_trans WHERE 1=1 $subwhere)
 
-      GROUP BY c.pos_eur
+      GROUP BY c.$category
 
 /*
        SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
@@ -1162,6 +1175,8 @@ sub aging {
 
   my ($invoice, $arap, $buysell, $ct, $ct_id, $ml);
 
+  # falls customer ziehen wir die offene forderungsliste
+  # anderfalls für die lieferanten die offenen verbindlichkeitne
   if ($form->{ct} eq "customer") {
     $invoice = "is";
     $arap = "ar";
@@ -1177,12 +1192,42 @@ sub aging {
   }
   $ct_id = "${ct}_id";
 
-  $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
-  my $todate = conv_dateq($form->{todate});
-  my $fromdate = conv_dateq($form->{fromdate});
+  # erweiterung um einen freien zeitraum oder einen stichtag
+  # mit entsprechender altersstrukturliste (s.a. Bug 1842)
+  # eine neue variable an der oberfläche eingeführt, somit ist
+  # todate == freier zeitrau und fordate == stichtag
+
+  my ($review_of_aging_list, $todate, $fromdate, $fromwhere, $fordate);
 
-  my $fromwhere = ($form->{fromdate} ne "") ? " AND (transdate >= (date $fromdate)) " : "";
+  if ($form->{reporttype} eq 'custom') {  # altersstrukturliste
 
+    # explizit rausschmeissen was man für diesen bericht nicht braucht
+    delete $form->{fromdate};
+    delete $form->{todate};
+
+    # an der oberfläche ist das tagesaktuelle datum vorausgewählt
+    # falls es dennoch per Benutzereingabe gelöscht wird, lieber wieder vorbelegen
+    # ferner muss für die spätere DB-Abfrage muss todate gesetzt sein.
+    $form->{fordate}  = $form->current_date($myconfig) unless ($form->{fordate});
+    $fordate          = conv_dateq($form->{fordate});
+    $todate           = $fordate;
+
+    if ($form->{review_of_aging_list}) { # falls die liste leer ist, alles anzeigen
+      if ($form->{review_of_aging_list} =~ m "-") {             # ..  periode von bis
+        my @period = split(/-/, $form->{review_of_aging_list}); # ... von periode bis periode
+        $review_of_aging_list = " AND $period[0] <  (date $fordate) - duedate
+                                  AND (date $fordate) - duedate  < $period[1]";
+      } else {
+        $form->{review_of_aging_list} =~ s/[^0-9]//g;   # größer 120 das substitute ist nur für das '>' zeichen
+        $review_of_aging_list = " AND $form->{review_of_aging_list} < (date $fordate) - duedate";
+      }
+    }
+  } else {  # freier zeitraum OHNE review_of_aging_list
+    $form->{todate}  = $form->current_date($myconfig) unless ($form->{todate});
+    $todate = conv_dateq($form->{todate});
+    $fromdate = conv_dateq($form->{fromdate});
+    $fromwhere = ($form->{fromdate} ne "") ? " AND (transdate >= (date $fromdate)) " : "";
+  }
   my $where = " 1 = 1 ";
   my ($name, $null);
 
@@ -1200,19 +1245,7 @@ sub aging {
     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
     $where_dpt = qq| AND (${arap}.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
   }
-  my $review_of_aging_list;
-  if ($form->{review_of_aging_list}) {
-    if ($form->{review_of_aging_list} =~ m "-"){
-      my @period = split(/-/, $form->{review_of_aging_list});
-      $review_of_aging_list = " AND $period[0] < date_part('days', now() - duedate)
-                                AND date_part('days', now() - duedate)  < $period[1]";
-    } else {
-      $form->{review_of_aging_list} =~ s/[^0-9]//g;
-      $review_of_aging_list = " AND $form->{review_of_aging_list} < date_part('days', now() - duedate)";
-    }
-  }
-
-  my $q_details = qq|
+ my $q_details = qq|
 
     SELECT ${ct}.id AS ctid, ${ct}.name,
       street, zipcode, city, country, contact, email,
@@ -1228,7 +1261,7 @@ sub aging {
     WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
       AND NOT COALESCE (${arap}.storno, 'f')
       AND (${arap}.${ct}_id = ${ct}.id)
-      $where_dpt 
+      $where_dpt
       AND (${ct}.id = ?)
       AND (transdate <= (date $todate) $fromwhere )
       $review_of_aging_list
@@ -1293,27 +1326,6 @@ sub get_customer {
   $main::lxdebug->leave_sub();
 }
 
-sub get_taxaccounts {
-  $main::lxdebug->enter_sub();
-
-  my ($self, $myconfig, $form) = @_;
-
-  # connect to database
-  my $dbh = $form->dbconnect($myconfig);
-
-  # get tax accounts
-  my $query =
-    qq|SELECT c.accno, c.description, t.rate
-       FROM chart c, tax t
-       WHERE (c.link LIKE '%CT_tax%') AND (c.id = t.chart_id)
-       ORDER BY c.accno|;
-  $form->{taxaccounts} = selectall_hashref_query($form, $dbh, $query);
-
-  $dbh->disconnect;
-
-  $main::lxdebug->leave_sub();
-}
-
 sub tax_report {
   $main::lxdebug->enter_sub();
 
@@ -1380,9 +1392,7 @@ sub tax_report {
   my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name));
   $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(id transdate invnumber name netamount tax)));
 
-  my $query = '';
-  if ($form->{report} !~ /nontaxable/) {
-    $query =
+  my $query =
       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount,
           ac.amount * $ml AS tax
          FROM acc_trans ac
@@ -1404,42 +1414,11 @@ sub tax_report {
          JOIN $table n ON (n.id = a.${table}_id)
          JOIN ${table}tax t ON (t.${table}_id = n.id)
          JOIN invoice i ON (i.trans_id = a.id)
-         JOIN partstax p ON (p.parts_id = i.parts_id)
          WHERE
            $where
            $accno
            AND (a.invoice = '1')
          ORDER BY $sortorder|;
-  } else {
-    # only gather up non-taxable transactions
-    $query =
-      qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount
-         FROM acc_trans ac
-         JOIN ${arap} a ON (a.id = ac.trans_id)
-         JOIN $table n ON (n.id = a.${table}_id)
-         WHERE
-           $where
-           AND (a.invoice = '0')
-           AND (a.netamount = a.amount)
-
-         UNION
-
-         SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount
-         FROM acc_trans ac
-         JOIN ${arap} a ON (a.id = ac.trans_id)
-         JOIN $table n ON (n.id = a.${table}_id)
-         JOIN invoice i ON (i.trans_id = a.id)
-         WHERE
-           $where
-           AND (a.invoice = '1')
-           AND (
-             a.${table}_id NOT IN (SELECT ${table}_id FROM ${table}tax t (${table}_id))
-             OR
-             i.parts_id NOT IN (SELECT parts_id FROM partstax p (parts_id))
-           )
-         GROUP BY a.id, a.invnumber, $transdate, n.name, i.sellprice, i.qty
-         ORDER by $sortorder|;
-  }
 
   $form->{TR} = selectall_hashref_query($form, $dbh, $query);
 
@@ -1641,7 +1620,7 @@ sub bwa {
 
   my @periods        = qw(jetzt kumm);
   my @gesamtleistung = qw(1 3);
-  my @gesamtkosten   = qw (10 11 12 13 14 15 16 17 18 19 20);
+  my @gesamtkosten   = qw (10 11 12 13 14 15 16 17 18 20);
   my @ergebnisse     =
     qw (rohertrag betriebrohertrag betriebsergebnis neutraleraufwand neutralerertrag ergebnisvorsteuern ergebnis gesamtleistung gesamtkosten);
 
@@ -1676,13 +1655,13 @@ sub bwa {
       $form->{ "$key" . "betriebrohertrag" } -
       $form->{ "$key" . "gesamtkosten" };
     $form->{ "$key" . "neutraleraufwand" } =
-      $form->{30}{$key} + $form->{31}{$key};
-    $form->{ "$key" . "neutralertrag" } =
+      $form->{19}{$key} + $form->{30}{$key} + $form->{31}{$key};
+    $form->{ "$key" . "neutralerertrag" } =
       $form->{32}{$key} + $form->{33}{$key} + $form->{34}{$key};
     $form->{ "$key" . "ergebnisvorsteuern" } =
       $form->{ "$key" . "betriebsergebnis" } -
       $form->{ "$key" . "neutraleraufwand" } +
-      $form->{ "$key" . "neutralertrag" };
+      $form->{ "$key" . "neutralerertrag" };
     $form->{ "$key" . "ergebnis" } =
       $form->{ "$key" . "ergebnisvorsteuern" } - $form->{35}{$key};