From 1734e1ad21eea72ffe4f3ac606cc4a33f97bd5f5 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Tue, 15 Oct 2013 17:56:58 +0200 Subject: [PATCH] =?utf8?q?Finanz=C3=BCbersichtsbericht:=20wiederkehrende?= =?utf8?q?=20Rechnungen=20ber=C3=BCcksichtigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Die im ausgewählten Jahr zu erzeugenden Rechnungen werden in Summe der Kategorie »Aufträge« für das erste zu erzeugende Rechnungsdatum zugeschlagen. --- SL/Controller/FinancialOverview.pm | 54 ++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/SL/Controller/FinancialOverview.pm b/SL/Controller/FinancialOverview.pm index fec091572..25717d3e8 100644 --- a/SL/Controller/FinancialOverview.pm +++ b/SL/Controller/FinancialOverview.pm @@ -8,13 +8,14 @@ use List::MoreUtils qw(none); use SL::DB::Employee; use SL::DB::Invoice; use SL::DB::Order; +use SL::DB::PeriodicInvoicesConfig; use SL::DB::PurchaseInvoice; use SL::Controller::Helper::ReportGenerator; use SL::Locale::String; use Rose::Object::MakeMethods::Generic ( - scalar => [ qw(report number_columns year current_year types objects data subtotals_per_quarter salesman_id) ], - 'scalar --get_set_init' => [ qw(employees) ], + scalar => [ qw(report number_columns year current_year objects data subtotals_per_quarter salesman_id) ], + 'scalar --get_set_init' => [ qw(employees types) ], ); __PACKAGE__->run_before(sub { $::auth->assert('report'); }); @@ -25,7 +26,8 @@ sub action_list { $self->$_($::form->{$_}) for qw(subtotals_per_quarter salesman_id); $self->get_objects; - $self->calculate_data; + $self->calculate_one_time_data; + $self->calculate_periodic_invoices; $self->prepare_report; $self->list_data; } @@ -84,18 +86,21 @@ sub get_objects { $self->objects({ sales_quotations => SL::DB::Manager::Order->get_all( where => [ and => [ @f_date, @f_salesman, SL::DB::Manager::Order->type_filter('sales_quotation') ]]), - sales_orders => SL::DB::Manager::Order->get_all( where => [ and => [ @f_date, @f_salesman, SL::DB::Manager::Order->type_filter('sales_order') ]]), + sales_orders => SL::DB::Manager::Order->get_all( where => [ and => [ @f_date, @f_salesman, SL::DB::Manager::Order->type_filter('sales_order') ]], with_objects => [ qw(periodic_invoices_config) ]), requests_for_quotation => SL::DB::Manager::Order->get_all( where => [ and => [ @f_date, @f_salesman, SL::DB::Manager::Order->type_filter('request_quotation') ]]), purchase_orders => SL::DB::Manager::Order->get_all( where => [ and => [ @f_date, @f_salesman, SL::DB::Manager::Order->type_filter('purchase_order') ]]), sales_invoices => SL::DB::Manager::Invoice->get_all( where => [ and => [ @f_date, @f_salesman, ]]), purchase_invoices => SL::DB::Manager::PurchaseInvoice->get_all(where => [ and => \@f_date ]), + periodic_invoices_cfg => SL::DB::Manager::PeriodicInvoicesConfig->get_all(where => [ active => 1 ]), }); + + $self->objects->{sales_orders} = [ grep { !$_->periodic_invoices_config || !$_->periodic_invoices_config->active } @{ $self->objects->{sales_orders} } ]; } -sub calculate_data { - my ($self) = @_; +sub init_types { [ qw(sales_quotations sales_orders sales_invoices requests_for_quotation purchase_orders purchase_invoices) ] } - $self->types([ qw(sales_quotations sales_orders sales_invoices requests_for_quotation purchase_orders purchase_invoices) ]); +sub init_data { + my ($self) = @_; my %data = ( year => [ ($self->year) x 12 ], @@ -110,18 +115,47 @@ sub calculate_data { } @{ $self->types }, ); - foreach my $type (keys %{ $self->objects }) { + return \%data; +} + +sub calculate_one_time_data { + my ($self) = @_; + + foreach my $type (@{ $self->types }) { foreach my $object (@{ $self->objects->{ $type } }) { my $month = $object->transdate->month - 1; - my $tdata = $data{$type}; + my $tdata = $self->data->{$type}; $tdata->{months}->[$month] += $object->netamount; $tdata->{quarters}->[int($month / 3)] += $object->netamount; $tdata->{year} += $object->netamount; } } +} + +sub calculate_periodic_invoices { + my ($self) = @_; + + my $start_date = DateTime->new(year => $self->year, month => 1, day => 1, time_zone => $::locale->get_local_time_zone); + my $end_date = DateTime->new(year => $self->year, month => 12, day => 31, time_zone => $::locale->get_local_time_zone); + + $self->calculate_one_periodic_invoice(config => $_, start_date => $start_date, end_date => $end_date) for @{ $self->objects->{periodic_invoices_cfg} }; +} + +sub calculate_one_periodic_invoice { + my ($self, %params) = @_; + + my @dates = $params{config}->calculate_invoice_dates(start_date => $params{start_date}, end_date => $params{end_date}); + my $first_date = $dates[0]; + + return if !$first_date; + + my $net = $params{config}->order->netamount * scalar(@dates); + my $sord = $self->data->{sales_orders}; - $self->data(\%data); + $sord->{months }->[ $first_date->month - 1 ] += $net; + $sord->{quarters}->[ $first_date->quarter - 1 ] += $net; + $sord->{year} += $net; } sub list_data { -- 2.20.1