Merge branch 'master' of git@lx-office.linet-services.de:lx-office-erp
[kivitendo-erp.git] / SL / RP.pm
index 88f4ebe..d875fb1 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -49,12 +49,23 @@ use strict;
 # - 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();
@@ -233,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
              )
@@ -254,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
              )
@@ -296,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
              )
@@ -318,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
              )
@@ -328,12 +346,10 @@ sub get_accounts {
     }
 
   } else {                      # if ($form->{method} eq 'cash')
-    # 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 |;
-  #  }
+    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);
+    }
 
     $query = qq|
       SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
@@ -519,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
 */
@@ -531,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
 
@@ -559,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
 
@@ -572,17 +588,17 @@ 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
          |;
     }
 
   } else {                      # if ($form->{method} eq 'cash')
-    # s.o. jan 15.11.2009
-#    if ($department_id) {
-#      ($dpt_join, $dpt_where) = sql_department($department_id);
-#    }
+    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|) |;
+    }
 
     $query = qq|
         SELECT sum(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
@@ -1182,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,
@@ -1202,7 +1228,7 @@ sub aging {
       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);
@@ -1334,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)
         )