From: Moritz Bunkus Date: Tue, 15 Oct 2013 15:56:58 +0000 (+0200) Subject: Finanzübersichtsbericht: wiederkehrende Rechnungen berücksichtigen X-Git-Tag: release-3.2.0beta~476^2~11 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=1734e1ad21eea72ffe4f3ac606cc4a33f97bd5f5;p=kivitendo-erp.git Finanzübersichtsbericht: wiederkehrende Rechnungen berücksichtigen Die im ausgewählten Jahr zu erzeugenden Rechnungen werden in Summe der Kategorie »Aufträge« für das erste zu erzeugende Rechnungsdatum zugeschlagen. --- 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 {