Merge branch 'master' of git@lx-office.linet-services.de:lx-office-erp
[kivitendo-erp.git] / SL / RP.pm
index e4fb848..d875fb1 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!
@@ -49,12 +49,23 @@ use List::Util qw(sum);
 # - subdescription
 # - proper testing for heading charts
 # - transmission from $form to TMPL realm is not as clear as i'd like
+
+sub get_openbalance_date {
+  my ($closedto, $target) = map { $::locale->parse_date_to_object(\%::myconfig, $_) } @_;
+
+  return unless $closedto;
+
+  $closedto->subtract(years => 1) while ($target - $closedto)->is_negative;
+  $closedto->add(days => 1);
+  return $::locale->format_date(\%::myconfig, $closedto);
+}
+
 sub balance_sheet {
   $main::lxdebug->enter_sub();
 
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
-  my $dbh      = $form->get_standard_dbh($myconfig);
+  my $dbh      = $::form->get_standard_dbh;
 
   my $last_period = 0;
   my @categories  = qw(A C L Q);
@@ -64,12 +75,21 @@ sub balance_sheet {
     $form->{period} = $form->{this_period} = conv_dateq($form->{asofdate});
   }
 
-  get_accounts($dbh, $last_period, "", $form->{asofdate}, $form, \@categories);
+  # get end of financial year and convert to Date format
+  my ($closedto) = selectfirst_array_query($form, $dbh, 'SELECT closedto FROM defaults');
+
+  # get date of last opening balance
+  my $startdate = get_openbalance_date($closedto, $form->{asofdate});
+
+  get_accounts($dbh, $last_period, $startdate, $form->{asofdate}, $form, \@categories);
 
   # if there are any compare dates
   if ($form->{compareasofdate}) {
     $last_period = 1;
-    get_accounts($dbh, $last_period, "", $form->{compareasofdate}, $form, \@categories);
+
+    $startdate = get_openbalance_date($closedto, $form->{compareasofdate});
+
+    get_accounts($dbh, $last_period, $startdate, $form->{compareasofdate}, $form, \@categories);
     $form->{last_period} = conv_dateq($form->{compareasofdate});
   }
 
@@ -118,7 +138,6 @@ sub balance_sheet {
         next if ($period eq 'last' && !$last_period);
         # only add assets
         $row->{$period}                    *= $ml;
-        $form->{total}{$category}{$period} += $row->{$period};      #      if ($row->{charttype} eq 'A') {   # why??
       }
 
       push @{ $TMPL_DATA->{$category} }, $row;
@@ -138,12 +157,11 @@ sub balance_sheet {
   for my $period (qw(this last)) {
     next if ($period eq 'last' && !$last_period);
 
-    $form->{E}{$period}             = $form->{total}{A}{$period} - $form->{total}{L}{$period} - $form->{total}{Q}{$period};
-    $form->{total}{Q}{$period}     += $form->{E}{$period};
-    $TMPL_DATA->{total}{Q}{$period} = $form->{total}{Q}{$period};
-    $TMPL_DATA->{total}{$period}    = $form->{total}{L}{$period} + $form->{total}{Q}{$period};
+    $form->{E}{$period}             = $TMPL_DATA->{total}{A}{$period} - $TMPL_DATA->{total}{L}{$period} - $TMPL_DATA->{total}{Q}{$period};
+    $TMPL_DATA->{total}{Q}{$period}     += $form->{E}{$period};
+    $TMPL_DATA->{total}{$period}    = $TMPL_DATA->{total}{L}{$period} + $TMPL_DATA->{total}{Q}{$period};
   }
-
+    $form->{E}{description}='nicht verbuchter Gewinn/Verlust';
   push @{ $TMPL_DATA->{Q} }, $form->{E};
 
   $main::lxdebug->leave_sub();
@@ -215,6 +233,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|) |;
   }
 
@@ -231,8 +251,8 @@ sub get_accounts {
            AND ac.trans_id IN
              (
                SELECT trans_id
-               FROM acc_trans
-               JOIN chart ON (chart_id = id)
+               FROM acc_trans a
+               JOIN chart c ON (a.chart_id = c.id)
                WHERE (link LIKE '%AR_paid%')
                $subwhere
              )
@@ -252,8 +272,8 @@ sub get_accounts {
            AND ac.trans_id IN
              (
                SELECT trans_id
-               FROM acc_trans
-               JOIN chart ON (chart_id = id)
+               FROM acc_trans a
+               JOIN chart c ON (a.chart_id = c.id)
                WHERE (link LIKE '%AP_paid%')
                $subwhere
              )
@@ -276,6 +296,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
@@ -293,8 +314,8 @@ sub get_accounts {
            AND ac.trans_id IN
              (
                SELECT trans_id
-               FROM acc_trans
-               JOIN chart ON (chart_id = id)
+               FROM acc_trans a
+               JOIN chart c ON (a.chart_id = c.id)
                WHERE (link LIKE '%AR_paid%')
                $subwhere
              )
@@ -315,8 +336,8 @@ sub get_accounts {
            AND ac.trans_id IN
              (
                SELECT trans_id
-               FROM acc_trans
-               JOIN chart ON (chart_id = id)
+               FROM acc_trans a
+               JOIN chart c ON (a.chart_id = c.id)
                WHERE link LIKE '%AP_paid%'
                $subwhere
              )
@@ -327,7 +348,7 @@ 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 |;
+      $dpt_where = qq| AND t.department_id = | . conv_i($department_id);
     }
 
     $query = qq|
@@ -342,6 +363,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 +461,7 @@ sub get_accounts_g {
   my $glwhere  = "";
   my $prwhere  = "";
   my $subwhere = "";
+  my $inwhere = "";
   my $item;
 
   if ($fromdate) {
@@ -512,7 +535,7 @@ sub get_accounts_g {
          JOIN ar a ON (a.id = ac.trans_id)
          $dpt_join
          WHERE $where $dpt_where
-           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
+           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans a JOIN chart c ON (a.chart_id = c.id) WHERE (link LIKE '%AR_paid%') $subwhere)
            $project
          GROUP BY c.$category
 */
@@ -524,7 +547,7 @@ sub get_accounts_g {
          JOIN ap a ON (a.id = ac.trans_id)
          $dpt_join
          WHERE $where $dpt_where
-           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
+           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans a JOIN chart c ON (a.chart_id = c.id) WHERE (link LIKE '%AP_paid%') $subwhere)
            $project
          GROUP BY c.$category
 
@@ -552,7 +575,7 @@ sub get_accounts_g {
          JOIN chart c on (p.income_accno_id = c.id)
          $dpt_join
          WHERE (c.category = 'I') $prwhere $dpt_where
-           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
+           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans a JOIN chart c ON (a.chart_id = c.id) WHERE (link LIKE '%AR_paid%') $subwhere)
            $project
          GROUP BY c.$category
 
@@ -565,7 +588,7 @@ sub get_accounts_g {
          JOIN chart c on (p.expense_accno_id = c.id)
          $dpt_join
          WHERE (c.category = 'E') $prwhere $dpt_where
-           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
+           AND ac.trans_id IN ( SELECT trans_id FROM acc_trans a JOIN chart c ON (a.chart_id = c.id) WHERE (link LIKE '%AP_paid%') $subwhere)
          $project
          GROUP BY c.$category
          |;
@@ -776,6 +799,7 @@ sub trial_balance {
   my $glwhere       = '';
   my $glsumwhere    = '';
   my $tofrom;
+  my ($fromdate, $todate);
 
   if ($form->{fromdate} || $form->{todate}) {
     if ($form->{fromdate}) {
@@ -1174,9 +1198,19 @@ sub aging {
     $dpt_join = qq| JOIN department d ON (a.department_id = d.id) |;
     $where .= qq| AND (a.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|
-    -- between 0-30 days
 
     SELECT ${ct}.id AS ctid, ${ct}.name,
       street, zipcode, city, country, contact, email,
@@ -1190,11 +1224,11 @@ 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 )
-
+      $review_of_aging_list
     ORDER BY ctid, transdate, invnumber |;
 
   my $sth_details = prepare_query($form, $dbh, $q_details);
@@ -1326,8 +1360,8 @@ sub tax_report {
       AND ac.trans_id IN
         (
           SELECT trans_id
-          FROM acc_trans
-          JOIN chart ON (chart_id = id)
+          FROM acc_trans a
+          JOIN chart c ON (a.chart_id = c.id)
           WHERE (link LIKE '%${ARAP}_paid%')
           AND (transdate <= $todate)
         )
@@ -1804,26 +1838,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"};
+  #     }
   #   }
   #
   #    }