X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/15b8d4bbc30aaed01468cc32044f6769130addd6..f217d072d76183bc07723dcc29503b732bd2022d:/SL/BackgroundJob/SetNumberRange.pm diff --git a/SL/BackgroundJob/SetNumberRange.pm b/SL/BackgroundJob/SetNumberRange.pm index e317730f3..ca25c9143 100644 --- a/SL/BackgroundJob/SetNumberRange.pm +++ b/SL/BackgroundJob/SetNumberRange.pm @@ -17,15 +17,46 @@ sub run { my ($self, $db_obj) = @_; my $data = $db_obj->data_as_hash; - my $next_year = DateTime->today_local->truncate(to => 'year')->add(years => 1)->year(); - $next_year = ($data->{digits_year} == 2) ? substr($next_year, 2, 2) : $next_year; - my $multiplier = $data->{multiplier} || 1; + if ($data->{digits_year} && !($data->{digits_year} == 2 || $data->{digits_year} == 4)) { + die "No valid input for digits_year should be 2 or 4."; + } + if ($data->{multiplier} && !($data->{multiplier} % 10 == 0)) { + die "No valid input for multiplier should be 10, 100, .., 1000000"; + } + if ($data->{monthly} && $data->{monthly_strftime}) { + DateTime->today_local->strftime($data->{monthly_strftime}) // die "No valid input for montly_strftime"; + } + + # new year + my $running_year = $data->{current_year} ? DateTime->today_local->truncate(to => 'year') + : DateTime->today_local->truncate(to => 'year')->add(years => 1)->year(); + + $running_year = ($data->{digits_year} == 2) ? substr($running_year, 2, 2) : $running_year; + + my $multiplier = $data->{multiplier} || 100; + + # or new month + my $today_dt = DateTime->today_local; + + my $today = $data->{monthly_strftime} ? $today_dt->strftime($data->{monthly_strftime}) + : $today_dt->strftime('%y-%m-'); + + $today = $data->{monthly_postfix} ? $today . $data->{monthly_postfix} : $today . '000'; my $defaults = SL::DB::Default->get; - foreach (qw(invnumber cnnumber sonumber ponumber sqnumber rfqnumber sdonumber pdonumber)) { - my $current_number = SL::PrefixedNumber->new(number => $defaults->{$_}); - $current_number->set_to($next_year * $multiplier); + my $current_number; + foreach (qw(invnumber cnnumber soinumber pqinumber sonumber ponumber pocnumber + sqnumber rfqnumber sdonumber pdonumber sudonumber rdonumber + s_reclamation_record_number p_reclamation_record_number )) { + + + if ($data->{monthly}) { + $current_number = SL::PrefixedNumber->new(number => $today); + } else { + $current_number = SL::PrefixedNumber->new(number => $defaults->{$_}); + $current_number->set_to($running_year * $multiplier); + } $defaults->{$_} = $current_number->get_current; } $defaults->save() || die "Could not change number ranges"; @@ -34,3 +65,47 @@ sub run { } 1; + +__END__ + +=encoding utf8 + +=head1 NAME + +SL::BackgroundJob::SetNumberRange — +Background job for setting all kivitendo number ranges for a new year or a new month + +=head1 SYNOPSIS + +The job can either be run annually or monthly and defaults to annually. + +The background job accepts the following optional json encoded parameters in the data for monthly mode: + +C: If set to true the job assumes it is the first of a new month + +C: A user postfix can be defined as a string for the new number. +If nothing is set three zeros are added as a postfix string ('000'). + +C: Year, month and day can optional be defined as user input in the +same way as the C strftime method. If nothing is set 'y%-m%' is the default. More options at the +time of writing can be found here: https://metacpan.org/pod/DateTime#strftime-Patterns + +The backgroud accepts the following optional json encoded parameters in the data for the annually mode (default): + +C: Multiplier to set the number range (defaults to 100) + +C: Handles the encoding of the year (can be 2 or 4, ie 24 or 2024). Defaults to 4 + +C: If set to 1 the current year will be used and not the next year. + + +The latter option is useful if the jobs runs on the 1st of the new year. + +The job is deactivated by default. Administrators of installations +where such a feature is wanted have to create a job entry manually. + +=head1 AUTHOR + +Jan Büren Ejan@kivitendo.deE + +=cut