diff --git a/hr_timesheet_work_entry/__manifest__.py b/hr_timesheet_work_entry/__manifest__.py index 9edc5be3..4c2ffc92 100755 --- a/hr_timesheet_work_entry/__manifest__.py +++ b/hr_timesheet_work_entry/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Timesheet Work Entry Type', 'description': 'Set work types on timesheet records.', - 'version': '14.0.1.0.0', + 'version': '14.0.1.0.1', 'website': 'https://hibou.io/', 'author': 'Hibou Corp. ', 'license': 'AGPL-3', @@ -11,6 +11,7 @@ 'hr_work_entry', ], 'data': [ + 'security/ir.model.access.csv', 'data/hr_timesheet_work_entry_data.xml', 'views/timesheet_views.xml', 'views/work_entry_views.xml', diff --git a/hr_timesheet_work_entry/security/ir.model.access.csv b/hr_timesheet_work_entry/security/ir.model.access.csv new file mode 100644 index 00000000..840437fa --- /dev/null +++ b/hr_timesheet_work_entry/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_hr_work_entry_type_employee,access_hr_work_entry_type_employee,model_hr_work_entry_type,base.group_user,1,0,0,0 diff --git a/sale_timesheet_work_entry_rate/__manifest__.py b/sale_timesheet_work_entry_rate/__manifest__.py index 6e789dd5..dad1c3e1 100644 --- a/sale_timesheet_work_entry_rate/__manifest__.py +++ b/sale_timesheet_work_entry_rate/__manifest__.py @@ -2,7 +2,7 @@ { 'name': 'Timesheet Billing Rate', - 'version': '14.0.1.0.0', + 'version': '14.0.1.0.1', 'category': 'Sale', 'author': 'Hibou Corp.', 'license': 'OPL-1', diff --git a/sale_timesheet_work_entry_rate/data/hr_timesheet_work_entry_demo.xml b/sale_timesheet_work_entry_rate/data/hr_timesheet_work_entry_demo.xml index 2ad38d6a..49f72be2 100644 --- a/sale_timesheet_work_entry_rate/data/hr_timesheet_work_entry_demo.xml +++ b/sale_timesheet_work_entry_rate/data/hr_timesheet_work_entry_demo.xml @@ -12,4 +12,11 @@ + + Non-Productive Time + TS_NON_PRODUCTIVE + + + + \ No newline at end of file diff --git a/sale_timesheet_work_entry_rate/models/sale.py b/sale_timesheet_work_entry_rate/models/sale.py index f98ad71f..75963dab 100644 --- a/sale_timesheet_work_entry_rate/models/sale.py +++ b/sale_timesheet_work_entry_rate/models/sale.py @@ -41,8 +41,13 @@ class SaleOrderLine(models.Model): for item in data: if not item['product_uom_id']: continue - if not item['work_type_id']: - continue + work_type_rate = False + if item['work_type_id']: + work_type_rate = work_type_map.get(item['work_type_id'][0]).timesheet_billing_rate + if work_type_rate is False: + # unset field should be 1.0 by default, you CAN set it to 0.0 if you'd like. + work_type_rate = 1.0 + so_line_id = item['so_line'][0] so_line = lines_map[so_line_id] result.setdefault(so_line_id, 0.0) @@ -52,8 +57,7 @@ class SaleOrderLine(models.Model): else: qty = item['unit_amount'] - work = work_type_map.get(item['work_type_id'][0]) - qty *= work.timesheet_billing_rate or 0.0 + qty *= work_type_rate result[so_line_id] += qty return result diff --git a/sale_timesheet_work_entry_rate/tests/test_sale_flow.py b/sale_timesheet_work_entry_rate/tests/test_sale_flow.py index 302c12c6..21d00490 100644 --- a/sale_timesheet_work_entry_rate/tests/test_sale_flow.py +++ b/sale_timesheet_work_entry_rate/tests/test_sale_flow.py @@ -94,3 +94,19 @@ class TestSaleFlow(TestProjectBilling): 'work_type_id': double_rate_work_entry_type.id, }) self.assertEqual(task.sale_line_id.qty_delivered, 150.0) + + # Ensure that a created timesheet WITHOUT a work entry type behaves + # the same as it would have before this module (e.g. for historic reasons) + timesheet2.write({ + 'work_type_id': False, + }) + self.assertEqual(task.sale_line_id.qty_delivered, 150.0) + + # Ensure we can bill zero even with above default. + zero_rate_work_entry_type = self.env.ref('sale_timesheet_work_entry_rate.work_input_timesheet_free') + self.assertEqual(zero_rate_work_entry_type.timesheet_billing_rate, 0.0) + + timesheet2.write({ + 'work_type_id': zero_rate_work_entry_type.id, + }) + self.assertEqual(task.sale_line_id.qty_delivered, 100.0)