X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/fee5532a132c44dcfc1743393cba00c8e3397176..b2becee7e28c289b5edf51083a01a73b35396227:/SL/Controller/FinancialControllingReport.pm diff --git a/SL/Controller/FinancialControllingReport.pm b/SL/Controller/FinancialControllingReport.pm index 123be8573..ea11e863e 100644 --- a/SL/Controller/FinancialControllingReport.pm +++ b/SL/Controller/FinancialControllingReport.pm @@ -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);