X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FFinancialControllingReport.pm;h=f4f09ff0999af143a853193ab759c40a2c53662a;hb=5474d397bbc42ffaea0b51ebb4bb9a4c7afaa881;hp=8ac84642827e9e5530acf3e2d7d6eadcbd8d184c;hpb=82ff5451c8babb72b4963f8d3bbb4b604a3b4675;p=kivitendo-erp.git diff --git a/SL/Controller/FinancialControllingReport.pm b/SL/Controller/FinancialControllingReport.pm index 8ac846428..f4f09ff09 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(min sum); +use List::Util qw(max min sum); use SL::DB::Order; use SL::DB::ProjectType; @@ -12,8 +12,8 @@ use SL::Controller::Helper::ReportGenerator; use SL::Locale::String; use Rose::Object::MakeMethods::Generic ( - scalar => [ qw(project_types) ], - 'scalar --get_set_init' => [ qw(models) ], + scalar => [ qw(orders) ], + 'scalar --get_set_init' => [ qw(project_types models) ], ); __PACKAGE__->run_before(sub { $::auth->assert('sales_order_edit'); }); @@ -29,16 +29,15 @@ my %sort_columns = ( sub action_list { my ($self) = @_; - $self->project_types(SL::DB::Manager::ProjectType->get_all_sorted); - $self->make_filter_summary; $self->prepare_report; - $self->{orders} = $self->models->get; + $self->orders($self->models->get); $self->calculate_data; + $self->setup_list_action_bar; $self->list_objects; } @@ -104,7 +103,7 @@ sub prepare_report { sub calculate_data { my ($self) = @_; - foreach my $order (@{ $self->{orders} }) { + foreach my $order (@{ $self->orders }) { my @delivery_orders = @{ $order->linked_records(direction => 'to', to => 'DeliveryOrder', via => 'Order', query => [ '!customer_id' => undef ]) }; my @invoices = @{ $order->linked_records(direction => 'to', to => 'Invoice', via => [ 'Order', 'DeliveryOrder' ]) }; @@ -113,10 +112,10 @@ sub calculate_data { map({ @{ $_->storno_invoices } } grep { $_->storno && !$_->storno_id } @invoices), ); - $order->{delivered_amount} = sum map { $self->sum_relevant_items(order => $order, other => $_, by_order => 1) } @delivery_orders; - $order->{billed_amount} = sum map { $self->sum_relevant_items(order => $order, other => $_) } @invoices; - $order->{paid_amount} = sum map { $_->paid * $_->netamount / (($_->amount * 1) || ($_->netamount * 1) || 1) } @invoices; - my $billed_amount = sum map { $_->netamount } @invoices; + $order->{delivered_amount} = sum(map { $self->sum_relevant_items(order => $order, other => $_, by_order => 1) } @delivery_orders) // 0; + $order->{billed_amount} = sum(map { $self->sum_relevant_items(order => $order, other => $_) } @invoices) // 0; + $order->{paid_amount} = sum(map { $_->paid * $_->netamount / (($_->amount * 1) || ($_->netamount * 1) || 1) } @invoices) // 0; + my $billed_amount = sum(map { $_->netamount } @invoices) // 0; $order->{other_amount} = $billed_amount - $order->{billed_amount}; $order->{billable_amount} = $order->{delivered_amount} - $order->{billed_amount}; @@ -136,19 +135,24 @@ 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 $num_years = 0; + my $period_len = $cfg->get_billing_period_length; + my $num_months = 0; my $cur_date = $cfg->start_date->clone; - my $end_date = $cfg->terminated ? $self->end_date : undef; - $end_date //= DateTime->today_local; - $end_date = min($end_date, DateTime->today_local); + 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_years++; - $cur_date->add(years => 1); + $num_months += $period_len if $cur_date >= $year_start; + $cur_date->add(months => $period_len); } - return $num_years * $order->netamount * (12 / $order->periodic_invoices_config->get_billing_period_length); + return $num_months * $order->netamount / $order->periodic_invoices_config->get_order_value_period_length; } sub sum_items { @@ -202,7 +206,7 @@ sub list_objects { $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); + return $self->report_generator_list_objects(report => $self->{report}, objects => $self->orders, data_callback => $modify_data); } sub make_filter_summary { @@ -222,6 +226,8 @@ sub make_filter_summary { $self->{filter_summary} = join ', ', @filter_strings; } +sub init_project_types { SL::DB::Manager::ProjectType->get_all_sorted } + sub init_models { my ($self) = @_; @@ -238,6 +244,7 @@ sub init_models { query => [ SL::DB::Manager::Order->type_filter('sales_order'), '!closed' => 1, + (salesman_id => SL::DB::Manager::Employee->current->id) x !$::auth->assert('sales_all_edit', 1), or => [ globalproject_id => undef, and => [ @@ -271,7 +278,11 @@ sub link_to { my $type = $object->type; my $id = $object->id; - return "oe.pl?action=$action&type=$type&vc=customer&id=$id"; + if ($::instance_conf->get_feature_experimental_order) { + return "controller.pl?action=Order/$action&type=$type&id=$id"; + } else { + return "oe.pl?action=$action&type=$type&vc=customer&id=$id"; + } } if ($object->isa('SL::DB::Customer')) { my $id = $object->id; @@ -283,4 +294,18 @@ sub link_to { } } +sub setup_list_action_bar { + my ($self, %params) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + action => [ + t8('Update'), + submit => [ '#filter_form', { action => 'FinancialControllingReport/list' } ], + accesskey => 'enter', + ], + ); + } +} + 1;