+}
+
+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) = @_;
+
+ # Calculate sales order advance
+ my $net = $params{config}->order->netamount * $params{config}->get_billing_period_length / $params{config}->get_order_value_period_length;
+ my $sord = $self->data->{sales_orders};
+
+ foreach my $date ($params{config}->calculate_invoice_dates(start_date => $params{start_date}, end_date => $params{end_date}, past_dates => 1)) {
+ $sord->{months }->[ $date->month - 1 ] += $net;
+ $sord->{quarters}->[ $date->quarter - 1 ] += $net;
+ $sord->{year} += $net;
+ }
+
+ # Calculate total sales order value
+ my $date = $params{config}->order->transdate;
+ return if $date->year != $params{start_date}->year;