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