1 package SL::BackgroundJob::ConvertTimeRecordings;
5 use parent qw(SL::BackgroundJob::Base);
7 use SL::DB::DeliveryOrder;
8 use SL::DB::TimeRecording;
10 use SL::Locale::String qw(t8);
16 $_[0]->create_standard_job('7 3 1 * *'); # every first day of month at 03:07
21 # If job does not throw an error,
22 # success in background_job_histories is 'success'.
23 # It is 'failure' otherwise.
25 # Return value goes to result in background_job_histories.
28 my ($self, $db_obj) = @_;
31 $data = $db_obj->data_as_hash if $db_obj;
33 $self->{$_} = [] for qw(job_errors);
34 # from/to date from data. Defaults to begining and end of last month.
37 # handle errors with a catch handler
39 $from_date = DateTime->from_kivitendo($data->{from_date}) if $data->{from_date};
40 $to_date = DateTime->from_kivitendo($data->{to_date}) if $data->{to_date};
42 die "Cannot convert date from string $data->{from_date} $data->{to_date}\n Details :\n $_"; # not $@
44 $from_date ||= DateTime->new( day => 1, month => DateTime->today_local->month, year => DateTime->today_local->year)->subtract(months => 1);
45 $to_date ||= DateTime->last_day_of_month(month => DateTime->today_local->month, year => DateTime->today_local->year)->subtract(months => 1);
47 $to_date->add(days => 1); # to get all from the to_date, because of the time part (15.12.2020 23.59 > 15.12.2020)
50 %customer_where = ('customer.customernumber' => $data->{customernumbers}) if 'ARRAY' eq ref $data->{customernumbers};
52 my $time_recordings = SL::DB::Manager::TimeRecording->get_all(where => [end_time => { ge_lt => [ $from_date, $to_date ]},
53 or => [booked => 0, booked => undef],
55 with_objects => ['customer']);
56 my %time_recordings_by_customer_id;
57 push @{ $time_recordings_by_customer_id{$_->customer_id} }, $_ for @$time_recordings;
60 foreach my $customer_id (keys %time_recordings_by_customer_id) {
63 $do = SL::DB::DeliveryOrder->new_from_time_recordings($time_recordings_by_customer_id{$customer_id});
66 $::lxdebug->message(LXDebug->WARN(),
67 "ConvertTimeRecordings: creating delivery order failed ($@) for time recording ids " . join ', ', map { $_->id } @{$time_recordings_by_customer_id{$customer_id}});
68 push @{ $self->{job_errors} }, "ConvertTimeRecordings: creating delivery order failed ($@) for time recording ids " . join ', ', map { $_->id } @{$time_recordings_by_customer_id{$customer_id}};
73 if (!SL::DB->client->with_transaction(sub {
75 $_->update_attributes(booked => 1) for @{$time_recordings_by_customer_id{$customer_id}};
78 $::lxdebug->message(LXDebug->WARN(),
79 "ConvertTimeRecordings: saving delivery order failed for time recording ids " . join ', ', map { $_->id } @{$time_recordings_by_customer_id{$customer_id}});
80 push @{ $self->{job_errors} }, "ConvertTimeRecordings: saving delivery order failed for time recording ids " . join ', ', map { $_->id } @{$time_recordings_by_customer_id{$customer_id}};
82 push @donumbers, $do->donumber;
87 my $msg = t8('Number of delivery orders created:');
89 $msg .= scalar @donumbers;
91 $msg .= join ', ', @donumbers;
93 # die if errors exists
94 if (@{ $self->{job_errors} }) {
95 $msg .= ' ' . t8('The following errors occurred:');
96 $msg .= join "\n", @{ $self->{job_errors} };
105 # from_date: 01.12.2020
106 # to_date: 15.12.2020
107 # customernumbers: [1,2,3]
116 SL::BackgroundJob::ConvertTimeRecordings - Convert time recording
117 entries into delivery orders
121 Get all time recording entries for the given period and customer numbers
122 and create delivery ordes out of that (using
123 C<SL::DB::DeliveryOrder-E<gt>new_from_time_recordings>).
127 Some data can be provided to configure this backgroung job.
133 The date from which on time recordings should be collected. It defaults
134 to the first day of the previous month.
136 Example (format depends on your settings):
138 from_date: 01.12.2020
142 The date till which time recordings should be collected. It defaults
143 to the last day of the previous month.
145 Example (format depends on your settings):
149 =item C<customernumbers>
151 An array with the customer numbers for which time recordings should
152 be collected. If not given, time recordings for customers are
153 collected. This is the default.
155 Example (format depends on your settings):
157 customernumbers: [c1,22332,334343]
163 Bernd Bleßmann E<lt>bernd@kivitendo-premium.deE<gt>