1624cc1b8714c2f0cb8616b661762403ebac9043
[kivitendo-erp.git] / t / background_job / convert_time_recordings.t
1 use Test::More tests => 52;
2
3 use strict;
4
5 use lib 't';
6 use utf8;
7
8 use Support::TestSetup;
9 use Test::Exception;
10 use DateTime;
11 use Rose::DB::Object::Helpers qw(forget_related);
12
13 use SL::DB::BackgroundJob;
14 use SL::DB::DeliveryOrder;
15
16 use_ok 'SL::BackgroundJob::ConvertTimeRecordings';
17
18 use SL::Dev::ALL qw(:ALL);
19
20 Support::TestSetup::login();
21
22 sub clear_up {
23   foreach (qw(TimeRecording OrderItem Order DeliveryOrder Project Part Customer RecordLink)) {
24     "SL::DB::Manager::${_}"->delete_all(all => 1);
25   }
26   SL::DB::Manager::Employee->delete_all(where => [ '!login' => 'unittests' ]);
27 };
28
29 ########################################
30
31 $::myconfig{numberformat} = '1000.00';
32 my $old_locale = $::locale;
33 # set locale to en so we can match errors
34 $::locale = Locale->new('en');
35
36
37 clear_up();
38
39 ########################################
40 # two time recordings, one order linked with project_id in time recording entry
41 ########################################
42 my $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
43 my $project  = create_project(projectnumber => 'p1', description => 'Project 1');
44 my $customer = new_customer()->save;
45 $::form->{type} = 'sales_order';
46
47 # sales order with globalproject_id
48 my $sales_order = create_sales_order(
49   save             => 1,
50   customer         => $customer,
51   globalproject    => $project,
52   taxincluded      => 0,
53   orderitems       => [ create_order_item(part => $part, qty => 3, sellprice => 70), ]
54 );
55
56 my @time_recordings;
57 push @time_recordings, new_time_recording(
58   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  5),
59   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute =>  5),
60   customer   => $customer,
61   project    => $project,
62   part       => $part,
63 )->save;
64 push @time_recordings, new_time_recording(
65   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 12, minute =>  5),
66   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 14, minute =>  5),
67   customer   => $customer,
68   project    => $project,
69   part       => $part,
70 )->save;
71
72 my %data   = (
73   link_order => 1,
74   from_date  => '01.01.2021',
75   to_date    => '30.04.2021',
76 );
77 my $db_obj = SL::DB::BackgroundJob->new();
78 $db_obj->set_data(%data);
79 my $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
80 my $ret    = $job->run($db_obj);
81
82 is_deeply($job->{job_errors}, [], 'no errros');
83 like($ret, qr{^Number of delivery orders created: 1}, 'one delivery order created');
84
85 my $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
86 is(scalar @$linked_dos, 1, 'one delivery order linked to order');
87 is($linked_dos->[0]->globalproject_id, $sales_order->globalproject_id, 'project ids match');
88
89 my $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
90 is(scalar @$linked_items, 1, 'one delivery order item linked to order item');
91 is($linked_items->[0]->qty*1, 3, 'qty in delivery order');
92 is($linked_items->[0]->base_qty*1, 3, 'base_qty in delivery order');
93
94 # reload order and orderitems to get changes to deliverd and ship
95 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
96 $sales_order->load;
97
98 ok($sales_order->delivered, 'related order is delivered');
99 is($sales_order->items->[0]->ship*1, 3, 'ship in related order');
100
101 clear_up();
102
103
104 ########################################
105 # two time recordings, one order linked with project_id in time recording entry
106 # unit in order is 'min', but part is 'Std'
107 ########################################
108 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
109 $project  = create_project(projectnumber => 'p1', description => 'Project 1');
110 $customer = new_customer()->save;
111
112 $sales_order = create_sales_order(
113   save             => 1,
114   customer         => $customer,
115   globalproject    => $project,
116   taxincluded      => 0,
117   orderitems       => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
118 );
119
120 @time_recordings = ();
121 push @time_recordings, new_time_recording(
122   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute => 10),
123   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 10),
124   customer   => $customer,
125   project    => $project,
126   part       => $part,
127 )->save;
128 push @time_recordings, new_time_recording(
129   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 12, minute => 10),
130   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 14, minute => 10),
131   customer   => $customer,
132   project    => $project,
133   part       => $part,
134 )->save;
135
136 %data = (
137   link_order => 1,
138   from_date  => '01.04.2021',
139   to_date    => '30.04.2021',
140 );
141 $db_obj = SL::DB::BackgroundJob->new();
142 $db_obj->set_data(%data);
143 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
144 $ret    = $job->run($db_obj);
145
146 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
147 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
148 is($linked_items->[0]->qty*1, 3, 'different units: qty in delivery order');
149 is($linked_items->[0]->base_qty*1, 3, 'different units: base_qty in delivery order');
150
151 # reload order and orderitems to get changes to deliverd and ship
152 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
153 $sales_order->load;
154
155 ok($sales_order->delivered, 'different units: related order is delivered');
156 is($sales_order->items->[0]->ship*1, 180, 'different units: ship in related order');
157
158 clear_up();
159
160
161 ########################################
162 # two time recordings, one order linked with project_id in time recording entry
163 # unit in order is 'Std', but part is 'min'
164 ########################################
165 $part     = new_service(partnumber => 'Serv1', unit => 'min')->save;
166 $project  = create_project(projectnumber => 'p1', description => 'Project 1');
167 $customer = new_customer()->save;
168
169 $sales_order = create_sales_order(
170   save             => 1,
171   customer         => $customer,
172   globalproject    => $project,
173   taxincluded      => 0,
174   orderitems       => [ create_order_item(part => $part, qty => 2, unit => 'Std', sellprice => 70), ]
175 );
176
177 @time_recordings = ();
178 push @time_recordings, new_time_recording(
179   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute => 10),
180   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 10),
181   customer   => $customer,
182   project    => $project,
183   part       => $part,
184 )->save;
185 push @time_recordings, new_time_recording(
186   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 12, minute => 10),
187   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 13, minute => 10),
188   customer   => $customer,
189   project    => $project,
190   part       => $part,
191 )->save;
192
193 %data = (
194   link_order => 1,
195   from_date  => '01.04.2021',
196   to_date    => '30.04.2021',
197 );
198 $db_obj = SL::DB::BackgroundJob->new();
199 $db_obj->set_data(%data);
200 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
201 $ret    = $job->run($db_obj);
202
203 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
204 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
205 is($linked_items->[0]->qty*1, 2, 'different units 2: qty in delivery order');
206 is($linked_items->[0]->base_qty*1, 120, 'different units 2: base_qty in delivery order');
207
208 # reload order and orderitems to get changes to deliverd and ship
209 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
210 $sales_order->load;
211
212 ok($sales_order->delivered, 'different units 2: related order is delivered');
213 is($sales_order->items->[0]->ship*1, 2, 'different units 2: ship in related order');
214
215 clear_up();
216
217
218 ########################################
219 # two time recordings, one with start/end one with date/duration
220 ########################################
221 $part     = new_service(partnumber => 'Serv1', unit => 'min')->save;
222 $customer = new_customer()->save;
223
224 @time_recordings = ();
225 push @time_recordings, new_time_recording(
226   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute => 10),
227   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 10),
228   customer   => $customer,
229   part       => $part,
230 )->save;
231
232 push @time_recordings, new_time_recording(
233   date       => DateTime->new(year => 2021, month =>  4, day => 19),
234   duration   => 120,
235   start_time => undef,
236   end_time   => undef,
237   customer   => $customer,
238   part       => $part,
239 )->save;
240
241 %data = (
242   link_order => 0,
243   from_date  => '01.04.2021',
244   to_date    => '30.04.2021',
245 );
246 $db_obj = SL::DB::BackgroundJob->new();
247 $db_obj->set_data(%data);
248 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
249 $ret    = $job->run($db_obj);
250
251 my $dos = SL::DB::Manager::DeliveryOrder->get_all(where => [customer_id => $customer->id]);
252 is($dos->[0]->items->[0]->qty*1, 180/60, 'date/duration and start/end: qty in delivery order');
253 is($dos->[0]->items->[0]->base_qty*1, 180, 'date/duration and start/end2: base_qty in delivery order');
254
255 clear_up();
256
257
258 ########################################
259 # time recording, linked with order_id
260 ########################################
261 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
262 $customer = new_customer()->save;
263
264 # sales order with globalproject_id
265 $sales_order = create_sales_order(
266   save             => 1,
267   customer         => $customer,
268   taxincluded      => 0,
269   orderitems       => [ create_order_item(part => $part, qty => 3, sellprice => 70), ]
270 );
271
272 @time_recordings = ();
273 push @time_recordings, new_time_recording(
274   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  5),
275   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute =>  5),
276   customer   => $customer,
277   order      => $sales_order,
278   part       => $part,
279 )->save;
280
281 %data = (
282   link_order      => 1,
283   from_date       => '01.04.2021',
284   to_date         => '30.04.2021',
285   customernumbers => [$customer->number],
286 );
287 $db_obj = SL::DB::BackgroundJob->new();
288 $db_obj->set_data(%data);
289 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
290 $ret    = $job->run($db_obj);
291
292 is_deeply($job->{job_errors}, [], 'no errros');
293 like($ret, qr{^Number of delivery orders created: 1}, 'linked by order_id: one delivery order created');
294
295 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
296 is(scalar @$linked_dos, 1, 'linked by order_id: one delivery order linked to order');
297
298 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
299 is(scalar @$linked_items, 1, 'linked by order_id: one delivery order item linked to order item');
300 is($linked_items->[0]->qty*1, 1, 'linked by order_id: qty in delivery order');
301 is($linked_items->[0]->base_qty*1, 1, 'linked by order_id: base_qty in delivery order');
302
303 # reload order and orderitems to get changes to deliverd and ship
304 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
305 $sales_order->load;
306
307 is($sales_order->items->[0]->ship*1, 1, 'linked by order_id: ship in related order');
308
309 clear_up();
310
311
312 ########################################
313 # override project and part
314 ########################################
315 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
316 my $part2    = new_service(partnumber => 'Serv2', unit => 'min')->save;
317 $project  = create_project(projectnumber => 'p1', description => 'Project 1');
318 my $project2 = create_project(projectnumber => 'p2', description => 'Project 2');
319 $customer = new_customer()->save;
320
321 $sales_order = create_sales_order(
322   save             => 1,
323   customer         => $customer,
324   globalproject    => $project,
325   taxincluded      => 0,
326   orderitems       => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
327 );
328 my $sales_order2 = create_sales_order(
329   save             => 1,
330   customer         => $customer,
331   globalproject    => $project,
332   taxincluded      => 0,
333   orderitems       => [ create_order_item(part => $part2, qty => 180, unit => 'min', sellprice => 70), ]
334 );
335
336 new_time_recording(
337   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute => 10),
338   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 10),
339   customer   => $customer,
340   project    => $project,
341   part       => $part,
342 )->save;
343 new_time_recording(
344   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 10),
345   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 12, minute => 10),
346   customer   => $customer,
347   project    => $project2,
348   part       => $part2,
349 )->save;
350 new_time_recording(
351   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 12, minute => 10),
352   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 13, minute => 10),
353   customer   => $customer,
354 )->save;
355
356 %data = (
357   link_order          => 1,
358   from_date           => '01.04.2021',
359   to_date             => '30.04.2021',
360   override_part_id    => $part->id,
361   override_project_id => $project->id,
362 );
363 $db_obj = SL::DB::BackgroundJob->new();
364 $db_obj->set_data(%data);
365 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
366 $ret    = $job->run($db_obj);
367
368 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
369 is($linked_dos->[0]->globalproject_id, $project->id, 'overriden part and project: project in delivery order');
370
371 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
372 is($linked_items->[0]->qty*1, 3, 'overriden part and project: qty in delivery order');
373 is($linked_items->[0]->base_qty*1, 3, 'overriden part and project: base_qty in delivery order');
374 is($linked_items->[0]->parts_id, $part->id, 'overriden part and project: part id');
375
376 my $linked_dos2 = $sales_order2->linked_records(to => 'DeliveryOrder');
377 is(scalar @$linked_dos2, 0, 'overriden part and project: no delivery order for unused order');
378
379 # reload order and orderitems to get changes to deliverd and ship
380 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
381 $sales_order->load;
382 Rose::DB::Object::Helpers::forget_related($sales_order2, 'orderitems');
383 $sales_order2->load;
384
385 is($sales_order ->items->[0]->ship||0, 180, 'overriden part and project: ship in related order');
386 is($sales_order2->items->[0]->ship||0,   0, 'overriden part and project: ship in not related order');
387
388 clear_up();
389
390
391 ########################################
392 # default project and part
393 ########################################
394 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
395 $project  = create_project(projectnumber => 'p1', description => 'Project 1');
396 $customer = new_customer()->save;
397
398 $sales_order = create_sales_order(
399   save             => 1,
400   customer         => $customer,
401   globalproject    => $project,
402   taxincluded      => 0,
403   orderitems       => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
404 );
405
406 new_time_recording(
407   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute => 10),
408   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 11, minute => 40),
409   customer   => $customer,
410 )->save;
411
412 %data = (
413   link_order         => 1,
414   from_date          => '01.04.2021',
415   to_date            => '30.04.2021',
416   default_part_id    => $part->id,
417   default_project_id => $project->id,
418 );
419 $db_obj = SL::DB::BackgroundJob->new();
420 $db_obj->set_data(%data);
421 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
422 $ret    = $job->run($db_obj);
423
424 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
425 is($linked_dos->[0]->globalproject_id, $project->id, 'default and project: project in delivery order');
426
427 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
428 is($linked_items->[0]->qty*1, 1.5, 'default part and project: qty in delivery order');
429 is($linked_items->[0]->base_qty*1, 1.5, 'default part and project: base_qty in delivery order');
430 is($linked_items->[0]->parts_id, $part->id, 'default part and project: part id');
431
432 # reload order and orderitems to get changes to deliverd and ship
433 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
434 $sales_order->load;
435
436 is($sales_order->items->[0]->ship*1, 90, 'default part and project: ship in related order');
437
438 clear_up();
439
440
441 ########################################
442 # check rounding
443 ########################################
444 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
445 $customer = new_customer()->save;
446
447 $sales_order = create_sales_order(
448   save             => 1,
449   customer         => $customer,
450   taxincluded      => 0,
451   orderitems       => [ create_order_item(part => $part, qty => 3, sellprice => 70), ]
452 );
453
454 @time_recordings = ();
455 push @time_recordings, new_time_recording(
456   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  0),
457   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  6),
458   customer   => $customer,
459   order      => $sales_order,
460   part       => $part,
461 )->save;
462
463 %data   = (
464   from_date  => '01.01.2021',
465   to_date    => '30.04.2021',
466   link_order => 1,
467   rounding   => 1,
468 );
469 $db_obj = SL::DB::BackgroundJob->new();
470 $db_obj->set_data(%data);
471 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
472 $ret    = $job->run($db_obj);
473
474 $linked_dos   = $sales_order->linked_records(to => 'DeliveryOrder');
475 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
476 is($linked_items->[0]->qty*1, 0.25, 'rounding to quarter hour: qty in delivery order');
477 is($linked_items->[0]->base_qty*1, 0.25, 'rounding to quarter hour: base_qty in delivery order');
478
479 # reload order and orderitems to get changes to deliverd and ship
480 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
481 $sales_order->load;
482
483 is($sales_order->items->[0]->ship*1, 0.25, 'rounding to quarter hour: ship in related order');
484
485 clear_up();
486
487
488 ########################################
489 # check rounding
490 ########################################
491 $part     = new_service(partnumber => 'Serv1', unit => 'Std')->save;
492 $customer = new_customer()->save;
493
494 $sales_order = create_sales_order(
495   save             => 1,
496   customer         => $customer,
497   taxincluded      => 0,
498   orderitems       => [ create_order_item(part => $part, qty => 3, sellprice => 70), ]
499 );
500
501 @time_recordings = ();
502 push @time_recordings, new_time_recording(
503   start_time => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  0),
504   end_time   => DateTime->new(year => 2021, month =>  4, day => 19, hour => 10, minute =>  6),
505   customer   => $customer,
506   order      => $sales_order,
507   part       => $part,
508 )->save;
509
510 %data   = (
511   from_date  => '01.01.2021',
512   to_date    => '30.04.2021',
513   link_order => 1,
514   rounding   => 0,
515 );
516 $db_obj = SL::DB::BackgroundJob->new();
517 $db_obj->set_data(%data);
518 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
519 $ret    = $job->run($db_obj);
520
521 $linked_dos   = $sales_order->linked_records(to => 'DeliveryOrder');
522 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
523 is($linked_items->[0]->qty*1, 0.1, 'no rounding: qty in delivery order');
524 is($linked_items->[0]->base_qty*1, 0.1, 'no rounding: base_qty in delivery order');
525
526 # reload order and orderitems to get changes to deliverd and ship
527 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
528 $sales_order->load;
529
530 is($sales_order->items->[0]->ship*1, 0.1, 'no rounding: ship in related order');
531
532 clear_up();
533
534
535 ########################################
536 # are wrong params detected?
537 ########################################
538 %data = (
539   from_date       => 'x01.04.2021',
540 );
541 $db_obj = SL::DB::BackgroundJob->new();
542 $db_obj->set_data(%data);
543 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
544
545 my $err_msg = '';
546 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
547 ok($err_msg =~ '^Cannot convert date.', 'wrong date string detected');
548
549 #####
550
551 $customer = new_customer()->save;
552 %data = (
553   customernumbers => ['a fantasy', $customer->number],
554 );
555
556 $db_obj = SL::DB::BackgroundJob->new();
557 $db_obj->set_data(%data);
558 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
559
560 $err_msg = '';
561 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
562 ok($err_msg =~ '^Not all customer numbers are valid', 'wrong customer number detected');
563
564 #####
565
566 %data = (
567   customernumbers => '123',
568 );
569
570 $db_obj = SL::DB::BackgroundJob->new();
571 $db_obj->set_data(%data);
572 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
573
574 $err_msg = '';
575 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
576 ok($err_msg =~ '^Customer numbers must be given in an array', 'wrong customer number data type detected');
577
578 #####
579
580 %data = (
581   override_part_id => '123',
582 );
583
584 $db_obj = SL::DB::BackgroundJob->new();
585 $db_obj->set_data(%data);
586 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
587
588 $err_msg = '';
589 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
590 ok($err_msg =~ '^No valid part found by given override part id', 'invalid part id detected');
591
592 #####
593
594 $part = new_service(partnumber => 'Serv1', unit => 'Std', obsolete => 1)->save;
595 %data = (
596   override_part_id => $part->id,
597 );
598
599 $db_obj = SL::DB::BackgroundJob->new();
600 $db_obj->set_data(%data);
601 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
602
603 $err_msg = '';
604 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
605 ok($err_msg =~ '^No valid part found by given override part id', 'obsolete part detected');
606
607 #####
608
609 %data = (
610   override_project_id => 123,
611 );
612
613 $db_obj = SL::DB::BackgroundJob->new();
614 $db_obj->set_data(%data);
615 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
616
617 $err_msg = '';
618 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
619 ok($err_msg =~ '^No valid project found by given override project id', 'invalid project id detected');
620
621 #####
622
623 $project = create_project(projectnumber => 'p1', description => 'Project 1', valid => 0)->save;
624 %data = (
625   override_project_id => $project->id,
626 );
627
628 $db_obj = SL::DB::BackgroundJob->new();
629 $db_obj->set_data(%data);
630 $job    = SL::BackgroundJob::ConvertTimeRecordings->new;
631
632 $err_msg = '';
633 eval { $ret = $job->run($db_obj);  1; } or do {$err_msg = $@};
634 ok($err_msg =~ '^No valid project found by given override project id', 'invalid project detected');
635
636 #####
637
638 clear_up();
639
640
641 ########################################
642
643 $::locale = $old_locale;
644
645 1;
646
647 #####
648 # vim: ft=perl
649 # set emacs to perl mode
650 # Local Variables:
651 # mode: perl
652 # End: