-use Test::More tests => 40;
+use Test::More tests => 52;
use strict;
clear_up();
########################################
-# two time recordings, one order linked with project_id
+# two time recordings, one order linked with project_id in time recording entry
########################################
my $part = new_service(partnumber => 'Serv1', unit => 'Std')->save;
my $project = create_project(projectnumber => 'p1', description => 'Project 1');
my $customer = new_customer()->save;
+$::form->{type} = 'sales_order';
# sales order with globalproject_id
my $sales_order = create_sales_order(
my %data = (
link_order => 1,
- project_id => $project->id,
from_date => '01.01.2021',
to_date => '30.04.2021',
);
########################################
-# two time recordings, one order linked with project_id
+# two time recordings, one order linked with project_id in time recording entry
# unit in order is 'min', but part is 'Std'
########################################
$part = new_service(partnumber => 'Serv1', unit => 'Std')->save;
part => $part,
)->save;
-# two time recordings, one order linked with project_id
%data = (
link_order => 1,
- project_id => $project->id,
from_date => '01.04.2021',
to_date => '30.04.2021',
);
########################################
-# two time recordings, one order linked with project_id
+# two time recordings, one order linked with project_id in time recording entry
# unit in order is 'Std', but part is 'min'
########################################
$part = new_service(partnumber => 'Serv1', unit => 'min')->save;
part => $part,
)->save;
-# two time recordings, one order linked with project_id
%data = (
link_order => 1,
- project_id => $project->id,
from_date => '01.04.2021',
to_date => '30.04.2021',
);
clear_up();
+########################################
+# override project and part
+########################################
+$part = new_service(partnumber => 'Serv1', unit => 'Std')->save;
+my $part2 = new_service(partnumber => 'Serv2', unit => 'min')->save;
+$project = create_project(projectnumber => 'p1', description => 'Project 1');
+my $project2 = create_project(projectnumber => 'p2', description => 'Project 2');
+$customer = new_customer()->save;
+
+$sales_order = create_sales_order(
+ save => 1,
+ customer => $customer,
+ globalproject => $project,
+ taxincluded => 0,
+ orderitems => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
+);
+my $sales_order2 = create_sales_order(
+ save => 1,
+ customer => $customer,
+ globalproject => $project,
+ taxincluded => 0,
+ orderitems => [ create_order_item(part => $part2, qty => 180, unit => 'min', sellprice => 70), ]
+);
+
+new_time_recording(
+ start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 10, minute => 10),
+ end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 11, minute => 10),
+ customer => $customer,
+ project => $project,
+ part => $part,
+)->save;
+new_time_recording(
+ start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 11, minute => 10),
+ end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 12, minute => 10),
+ customer => $customer,
+ project => $project2,
+ part => $part2,
+)->save;
+new_time_recording(
+ start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 12, minute => 10),
+ end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 13, minute => 10),
+ customer => $customer,
+)->save;
+
+%data = (
+ link_order => 1,
+ from_date => '01.04.2021',
+ to_date => '30.04.2021',
+ override_part_id => $part->id,
+ override_project_id => $project->id,
+);
+$db_obj = SL::DB::BackgroundJob->new();
+$db_obj->set_data(%data);
+$job = SL::BackgroundJob::ConvertTimeRecordings->new;
+$ret = $job->run($db_obj);
+
+$linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
+is($linked_dos->[0]->globalproject_id, $project->id, 'overriden part and project: project in delivery order');
+
+$linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
+is($linked_items->[0]->qty*1, 3, 'overriden part and project: qty in delivery order');
+is($linked_items->[0]->base_qty*1, 3, 'overriden part and project: base_qty in delivery order');
+is($linked_items->[0]->parts_id, $part->id, 'overriden part and project: part id');
+
+my $linked_dos2 = $sales_order2->linked_records(to => 'DeliveryOrder');
+is(scalar @$linked_dos2, 0, 'overriden part and project: no delivery order for unused order');
+
+# reload order and orderitems to get changes to deliverd and ship
+Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
+$sales_order->load;
+Rose::DB::Object::Helpers::forget_related($sales_order2, 'orderitems');
+$sales_order2->load;
+
+is($sales_order ->items->[0]->ship||0, 180, 'overriden part and project: ship in related order');
+is($sales_order2->items->[0]->ship||0, 0, 'overriden part and project: ship in not related order');
+
+clear_up();
+
+
+########################################
+# default project and part
+########################################
+$part = new_service(partnumber => 'Serv1', unit => 'Std')->save;
+$project = create_project(projectnumber => 'p1', description => 'Project 1');
+$customer = new_customer()->save;
+
+$sales_order = create_sales_order(
+ save => 1,
+ customer => $customer,
+ globalproject => $project,
+ taxincluded => 0,
+ orderitems => [ create_order_item(part => $part, qty => 180, unit => 'min', sellprice => 70), ]
+);
+
+new_time_recording(
+ start_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 10, minute => 10),
+ end_time => DateTime->new(year => 2021, month => 4, day => 19, hour => 11, minute => 40),
+ customer => $customer,
+)->save;
+
+%data = (
+ link_order => 1,
+ from_date => '01.04.2021',
+ to_date => '30.04.2021',
+ default_part_id => $part->id,
+ default_project_id => $project->id,
+);
+$db_obj = SL::DB::BackgroundJob->new();
+$db_obj->set_data(%data);
+$job = SL::BackgroundJob::ConvertTimeRecordings->new;
+$ret = $job->run($db_obj);
+
+$linked_dos = $sales_order->linked_records(to => 'DeliveryOrder');
+is($linked_dos->[0]->globalproject_id, $project->id, 'default and project: project in delivery order');
+
+$linked_items = $sales_order->items->[0]->linked_records(to => 'DeliveryOrderItem');
+is($linked_items->[0]->qty*1, 1.5, 'default part and project: qty in delivery order');
+is($linked_items->[0]->base_qty*1, 1.5, 'default part and project: base_qty in delivery order');
+is($linked_items->[0]->parts_id, $part->id, 'default part and project: part id');
+
+# reload order and orderitems to get changes to deliverd and ship
+Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems');
+$sales_order->load;
+
+is($sales_order->items->[0]->ship*1, 90, 'default part and project: ship in related order');
+
+clear_up();
+
+
########################################
# check rounding
########################################
my $err_msg = '';
eval { $ret = $job->run($db_obj); 1; } or do {$err_msg = $@};
-ok($err_msg =~ '^Cannot convert date from string', 'wrong date string detected');
+ok($err_msg =~ '^Cannot convert date.', 'wrong date string detected');
#####
#####
%data = (
- part_id => '123',
+ override_part_id => '123',
);
$db_obj = SL::DB::BackgroundJob->new();
$err_msg = '';
eval { $ret = $job->run($db_obj); 1; } or do {$err_msg = $@};
-ok($err_msg =~ '^No valid part found by given part id', 'invalid part id detected');
+ok($err_msg =~ '^No valid part found by given override part id', 'invalid part id detected');
#####
$part = new_service(partnumber => 'Serv1', unit => 'Std', obsolete => 1)->save;
%data = (
- part_id => $part->id,
+ override_part_id => $part->id,
);
$db_obj = SL::DB::BackgroundJob->new();
$err_msg = '';
eval { $ret = $job->run($db_obj); 1; } or do {$err_msg = $@};
-ok($err_msg =~ '^No valid part found by given part id', 'obsolete part detected');
+ok($err_msg =~ '^No valid part found by given override part id', 'obsolete part detected');
#####
%data = (
- project_id => 123,
+ override_project_id => 123,
);
$db_obj = SL::DB::BackgroundJob->new();
$err_msg = '';
eval { $ret = $job->run($db_obj); 1; } or do {$err_msg = $@};
-ok($err_msg =~ '^No valid project found by given project id', 'invalid project id detected');
+ok($err_msg =~ '^No valid project found by given override project id', 'invalid project id detected');
#####
$project = create_project(projectnumber => 'p1', description => 'Project 1', valid => 0)->save;
%data = (
- project_id => $project->id,
+ override_project_id => $project->id,
);
$db_obj = SL::DB::BackgroundJob->new();
$err_msg = '';
eval { $ret = $job->run($db_obj); 1; } or do {$err_msg = $@};
-ok($err_msg =~ '^No valid project found by given project id', 'invalid project detected');
+ok($err_msg =~ '^No valid project found by given override project id', 'invalid project detected');
#####