]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/FinancialControllingReport.pm
Finanzcontrolling: Auftragswertperiodizität berücksichtigen
[mfinanz.git] / SL / Controller / FinancialControllingReport.pm
index 123be85737475451cfdebc9b89bcb4f4849b9386..ea11e863ec77f32d4ac6b5daa1e3b39c65e4244e 100644 (file)
@@ -3,7 +3,7 @@ package SL::Controller::FinancialControllingReport;
 use strict;
 use parent qw(SL::Controller::Base);
 
-use List::Util qw(sum);
+use List::Util qw(max min sum);
 
 use SL::DB::Order;
 use SL::DB::ProjectType;
@@ -76,8 +76,8 @@ sub prepare_report {
                                  sub      => sub { $_[0]->globalproject_id ? $_[0]->globalproject->project_type->description : '' }  },
   );
 
-  map { $column_defs{$_}->{text} ||= $::locale->text( $self->models->get_sort_spec->{$_}->{title} ) } keys %column_defs;
-  map { $column_defs{$_}->{align} = 'right' } @{ $self->{number_columns} };
+  $column_defs{$_}->{text} ||= $::locale->text( $self->models->get_sort_spec->{$_}->{title} ) for keys %column_defs;
+  $column_defs{$_}->{align}  = 'right'                                                        for @{ $self->{number_columns} };
 
   $report->set_options(
     std_column_visibility => 1,
@@ -121,8 +121,7 @@ sub calculate_data {
     $order->{billable_amount}   = $order->{delivered_amount} - $order->{billed_amount};
 
     if ($order->periodic_invoices_config) {
-      my @dates = $order->periodic_invoices_config->calculate_invoice_dates(past_dates => 1, end_date => DateTime->today_local);
-      $order->{net_amount} = $order->netamount * scalar(@dates);
+      $order->{net_amount} = $self->calculate_periodic_invoices_order_netamount($order);
 
     } else {
       $order->{net_amount} = $order->netamount;
@@ -134,6 +133,29 @@ sub calculate_data {
   }
 }
 
+sub calculate_periodic_invoices_order_netamount {
+  my ($self, $order) = @_;
+
+  my $year       = DateTime->today_local->year;
+  my $year_start = DateTime->new_local(day =>  1, month =>  1, year => $year);
+  my $year_end   = DateTime->new_local(day => 31, month => 12, year => $year);
+
+  my $cfg        = $order->periodic_invoices_config;
+  my $period_len = $cfg->get_billing_period_length;
+  my $num_months = 0;
+  my $cur_date   = $cfg->start_date->clone;
+  my $end_date   = $cfg->terminated ? $cfg->end_date : undef;
+  $end_date    //= $year_end;
+  $end_date      = min $end_date, $year_end;
+
+  while ($cur_date <= $end_date) {
+    $num_months += $period_len if $cur_date >= $year_start;
+    $cur_date->add(months => $period_len);
+  }
+
+  return $num_months * $order->netamount / $order->periodic_invoices_config->get_order_value_period_length;
+}
+
 sub sum_items {
   my ($self, %params) = @_;
 
@@ -181,8 +203,8 @@ sub list_objects {
   my ($self)      = @_;
   my $modify_data = sub {
     my ($data) = @_;
-    map { $data->{$_}->{data} = defined $data->{$_}->{data} ? int($data->{$_}->{data}) : ''  } grep {  m/_p$/ } @{ $self->{number_columns} };
-    map { $data->{$_}->{data} = $::form->format_amount(\%::myconfig, $data->{$_}->{data}, 2) } grep { !m/_p$/ } @{ $self->{number_columns} };
+    $data->{$_}->{data} = defined $data->{$_}->{data} ? int($data->{$_}->{data}) : ''  for grep {  m/_p$/ } @{ $self->{number_columns} };
+    $data->{$_}->{data} = $::form->format_amount(\%::myconfig, $data->{$_}->{data}, 2) for grep { !m/_p$/ } @{ $self->{number_columns} };
   };
 
   return $self->report_generator_list_objects(report => $self->{report}, objects => $self->{orders}, data_callback => $modify_data);