1 package SL::BackgroundJob::SetNumberRange;
5 use parent qw(SL::BackgroundJob::Base);
7 use SL::PrefixedNumber;
9 use DateTime::Format::Strptime;
12 $_[0]->create_standard_job('59 23 31 12 *'); # one minute before new year
17 my ($self, $db_obj) = @_;
18 my $data = $db_obj->data_as_hash;
20 if ($data->{digits_year} && !($data->{digits_year} == 2 || $data->{digits_year} == 4)) {
21 die "No valid input for digits_year should be 2 or 4.";
23 if ($data->{multiplier} && !($data->{multiplier} % 10 == 0)) {
24 die "No valid input for multiplier should be 10, 100, .., 1000000";
26 if ($data->{monthly} && $data->{monthly_strftime}) {
27 DateTime->today_local->strftime($data->{monthly_strftime}) // die "No valid input for montly_strftime";
31 my $running_year = $data->{current_year} ? DateTime->today_local->truncate(to => 'year')
32 : DateTime->today_local->truncate(to => 'year')->add(years => 1)->year();
34 $running_year = ($data->{digits_year} == 2) ? substr($running_year, 2, 2) : $running_year;
36 my $multiplier = $data->{multiplier} || 100;
39 my $today_dt = DateTime->today_local;
41 my $today = $data->{monthly_strftime} ? $today_dt->strftime($data->{monthly_strftime})
42 : $today_dt->strftime('%y-%m-');
44 $today = $data->{monthly_postfix} ? $today . $data->{monthly_postfix} : $today . '000';
46 my $defaults = SL::DB::Default->get;
49 foreach (qw(invnumber cnnumber soinumber pqinumber sonumber ponumber pocnumber
50 sqnumber rfqnumber sdonumber pdonumber sudonumber rdonumber
51 s_reclamation_record_number p_reclamation_record_number )) {
54 if ($data->{monthly}) {
55 $current_number = SL::PrefixedNumber->new(number => $today);
57 $current_number = SL::PrefixedNumber->new(number => $defaults->{$_});
58 $current_number->set_to($running_year * $multiplier);
60 $defaults->{$_} = $current_number->get_current;
62 $defaults->save() || die "Could not change number ranges";
64 return exists $data->{result} ? $data->{result} : 1;
75 SL::BackgroundJob::SetNumberRange —
76 Background job for setting all kivitendo number ranges for a new year or a new month
80 The job can either be run annually or monthly and defaults to annually.
82 The background job accepts the following optional json encoded parameters in the data for monthly mode:
84 C<monthly>: If set to true the job assumes it is the first of a new month
86 C<monthly_postfix>: A user postfix can be defined as a string for the new number.
87 If nothing is set three zeros are added as a postfix string ('000').
89 C<monthly_strftime>: Year, month and day can optional be defined as user input in the
90 same way as the C strftime method. If nothing is set 'y%-m%' is the default. More options at the
91 time of writing can be found here: https://metacpan.org/pod/DateTime#strftime-Patterns
93 The backgroud accepts the following optional json encoded parameters in the data for the annually mode (default):
95 C<multiplier>: Multiplier to set the number range (defaults to 100)
97 C<digits_year>: Handles the encoding of the year (can be 2 or 4, ie 24 or 2024). Defaults to 4
99 C<current_year>: If set to 1 the current year will be used and not the next year.
102 The latter option is useful if the jobs runs on the 1st of the new year.
104 The job is deactivated by default. Administrators of installations
105 where such a feature is wanted have to create a job entry manually.
109 Jan Büren E<lt>jan@kivitendo.deE<gt>