X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FPeriodicInvoicesConfig.pm;h=26ce3363169b558acef67d4c780b846760542744;hb=2bb452ee62e74c2a42113171eeb53de8d09bbbf5;hp=53ac1c679449d0093276f989d6621c35598e576c;hpb=82ff5451c8babb72b4963f8d3bbb4b604a3b4675;p=kivitendo-erp.git diff --git a/SL/DB/PeriodicInvoicesConfig.pm b/SL/DB/PeriodicInvoicesConfig.pm index 53ac1c679..26ce33631 100644 --- a/SL/DB/PeriodicInvoicesConfig.pm +++ b/SL/DB/PeriodicInvoicesConfig.pm @@ -11,7 +11,7 @@ __PACKAGE__->meta->initialize; # Creates get_all, get_all_count, get_all_iterator, delete_all and update_all. __PACKAGE__->meta->make_manager_class; -our %PERIOD_LENGTHS = ( m => 1, q => 3, b => 6, y => 12 ); +our %PERIOD_LENGTHS = ( o => 0, m => 1, q => 3, b => 6, y => 12 ); our %ORDER_VALUE_PERIOD_LENGTHS = ( %PERIOD_LENGTHS, 2 => 24, 3 => 36, 4 => 48, 5 => 60 ); our @PERIODICITIES = keys %PERIOD_LENGTHS; our @ORDER_VALUE_PERIODICITIES = keys %ORDER_VALUE_PERIOD_LENGTHS; @@ -28,7 +28,7 @@ sub get_order_value_period_length { } sub _log_msg { - $::lxdebug->message(LXDebug->DEBUG1(), join('', @_)); + $::lxdebug->message(LXDebug->DEBUG1(), join('', 'SL::DB::PeriodicInvoicesConfig: ', @_)); } sub handle_automatic_extension { @@ -87,11 +87,11 @@ sub calculate_invoice_dates { my ($self, %params) = @_; my $period_len = $self->get_billing_period_length; - my $cur_date = $self->first_billing_date || $self->start_date; + my $cur_date = ($self->first_billing_date || $self->start_date)->clone; my $end_date = $self->terminated ? $self->end_date : undef; $end_date //= DateTime->today_local->add(years => 100); - my $start_date = $params{past_dates} ? undef : $self->get_previous_billed_period_start_date; - $start_date = $start_date ? $start_date->add(days => 1) : $cur_date->clone; + my $start_date = $params{past_dates} ? undef : $self->get_previous_billed_period_start_date; + $start_date = $start_date ? $start_date->clone->add(days => 1) : $cur_date->clone; $start_date = max($start_date, $params{start_date}) if $params{start_date}; $end_date = min($end_date, $params{end_date}) if $params{end_date}; @@ -107,6 +107,41 @@ sub calculate_invoice_dates { return @dates; } +sub is_last_bill_date_in_order_value_cycle { + my ($self, %params) = @_; + + my $months_billing = $self->get_billing_period_length; + my $months_order_value = $self->get_order_value_period_length; + + return 1 if $months_billing >= $months_order_value; + + my $next_billing_date = $params{date}->clone->add(months => $months_billing); + my $date_itr = max($self->start_date, $self->first_billing_date || $self->start_date)->clone; + + _log_msg("is_last_billing_date_in_order_value_cycle start: id " . $self->id . " date_itr $date_itr start " . $self->start_date); + + $date_itr->add(months => $months_order_value) while $date_itr < $next_billing_date; + + _log_msg("is_last_billing_date_in_order_value_cycle end: refdate $params{date} next_billing_date $next_billing_date date_itr $date_itr months_billing $months_billing months_order_value $months_order_value result " + . ($date_itr == $next_billing_date)); + + return $date_itr == $next_billing_date; +} + +sub disable_one_time_config { + my $self = shift; + + _log_msg("check one time for " . $self->id . "\n"); + + # A periodicity of one time was set. Deactivate this config now. + if ($self->periodicity eq 'o') { + _log_msg("setting inactive\n"); + $self->active(0); + $self->save; + return $self->order->ordnumber; + } + return undef; +} 1; __END__ @@ -192,6 +227,35 @@ Otherwise (if C is 0) the property C will be set to 1, and the configuration will be saved. In this case C will be returned. +=item C + +Determines whether or not the mandatory parameter C, an instance +of L, is the last billing date within the cycle given by the +order value periodicity. Returns a truish value if this is the case +and a falsish value otherwise. + +This check is always true if the billing periodicity is longer than or +equal to the order value periodicity. For example, if you have an +order whose value is given for three months and you bill every six +months and you have twice the order value on each invoice, meaning +each invoice is itself the last invoice for not only one but two order +value cycles. + +Otherwise (if the order value periodicity is longer than the billing +periodicity) this function iterates over all eligible dates starting +with C (or C if C +is unset) and adding the order value length with each step. If the +date given by the C parameter plus the billing period length +equals one of those dates then the given date is indeed the date of +the last invoice in that particular order value cycle. + +=item C + +Sets the state of the periodic_invoices_configs to inactive +(active => false) if the periodicity is (one time). +Returns undef if the periodicity is not 'one time' otherwise the +order number of the deactivated periodic order. + =back =head1 BUGS