1 use Test::More tests => 18;
8 use Support::TestSetup;
11 use Rose::DB::Object::Helpers qw(forget_related);
13 use SL::DB::BackgroundJob;
15 use_ok 'SL::BackgroundJob::ConvertTimeRecordings';
17 use SL::Dev::ALL qw(:ALL);
19 Support::TestSetup::login();
22 foreach (qw(OrderItem Order DeliveryOrder TimeRecording Project Part Customer RecordLink)) {
23 "SL::DB::Manager::${_}"->delete_all(all => 1);
25 SL::DB::Manager::Employee->delete_all(where => [ '!login' => 'unittests' ]);
28 ########################################
30 $::myconfig{numberformat} = '1000.00';
31 my $old_locale = $::locale;
32 # set locale to en so we can match errors
33 $::locale = Locale->new('en');
38 ########################################
39 # two time recordings, one order linked with project_id
40 ########################################
41 my $part = new_service(partnumber => 'Serv1', unit => 'Std')->save;
42 my $project = create_project(projectnumber => 'p1', description => 'Project 1');
43 my $customer = new_customer()->save;
45 # sales order with globalproject_id
46 my $sales_order = create_sales_order(
48 customer => $customer,
49 globalproject => $project,
51 orderitems => [ create_order_item(part => $part, qty => 3, sellprice => 70), ]
55 push @time_recordings, new_time_recording(
56 start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 10, minute => 5),
57 end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 11, minute => 5),
58 customer => $customer,
62 push @time_recordings, new_time_recording(
63 start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 12, minute => 5),
64 end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 14, minute => 5),
65 customer => $customer,
72 project_id => $project->id,
73 from_date => '01.04.2021',
74 to_date => '30.04.2021',
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);
81 is_deeply($job->{job_errors}, [], 'no errros');
82 like($ret, qr{^Number of delivery orders created: 1}, 'one delivery order created');
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');
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');
93 # reload order and orderitems to get changes to deliverd and ship
94 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
97 ok($sales_order->delivered, 'related order is delivered');
98 is($sales_order->items->[0]->ship*1, 3, 'ship in related order');
103 ########################################
104 # two time recordings, one order linked with project_id
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;
111 $sales_order = create_sales_order(
113 customer => $customer,
114 globalproject => $project,
116 orderitems => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
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,
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,
135 # two time recordings, one order linked with project_id
138 project_id => $project->id,
139 from_date => '01.04.2021',
140 to_date => '30.04.2021',
142 $db_obj = SL::DB::BackgroundJob->new();
143 $db_obj->set_data(%data);
144 $job = SL::BackgroundJob::ConvertTimeRecordings->new;
145 $ret = $job->run($db_obj);
147 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
148 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
149 is($linked_items->[0]->qty*1, 3, 'different units: qty in delivery order');
150 is($linked_items->[0]->base_qty*1, 3, 'different units: base_qty in delivery order');
152 # reload order and orderitems to get changes to deliverd and ship
153 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
156 ok($sales_order->delivered, 'different units: related order is delivered');
157 is($sales_order->items->[0]->ship*1, 180, 'different units: ship in related order');
162 ########################################
163 # two time recordings, one order linked with project_id
164 # unit in order is 'Std', but part is 'min'
165 ########################################
166 $part = new_service(partnumber => 'Serv1', unit => 'min')->save;
167 $project = create_project(projectnumber => 'p1', description => 'Project 1');
168 $customer = new_customer()->save;
170 $sales_order = create_sales_order(
172 customer => $customer,
173 globalproject => $project,
175 orderitems => [ create_order_item(part => $part, qty => 2, unit => 'Std', sellprice => 70), ]
178 @time_recordings = ();
179 push @time_recordings, new_time_recording(
180 start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 10, minute => 10),
181 end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 11, minute => 10),
182 customer => $customer,
186 push @time_recordings, new_time_recording(
187 start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 12, minute => 10),
188 end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 13, minute => 10),
189 customer => $customer,
194 # two time recordings, one order linked with project_id
197 project_id => $project->id,
198 from_date => '01.04.2021',
199 to_date => '30.04.2021',
201 $db_obj = SL::DB::BackgroundJob->new();
202 $db_obj->set_data(%data);
203 $job = SL::BackgroundJob::ConvertTimeRecordings->new;
204 $ret = $job->run($db_obj);
206 $linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
207 $linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
208 is($linked_items->[0]->qty*1, 2, 'different units 2: qty in delivery order');
209 is($linked_items->[0]->base_qty*1, 120, 'different units 2: base_qty in delivery order');
211 # reload order and orderitems to get changes to deliverd and ship
212 Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
215 ok($sales_order->delivered, 'different units 2: related order is delivered');
216 is($sales_order->items->[0]->ship*1, 2, 'different units 2: ship in related order');
221 ########################################
223 $::locale = $old_locale;
229 # set emacs to perl mode