diff --git a/bemade_fsm/__manifest__.py b/bemade_fsm/__manifest__.py index 39b3ed7..a05976f 100644 --- a/bemade_fsm/__manifest__.py +++ b/bemade_fsm/__manifest__.py @@ -50,6 +50,7 @@ 'web.assets_tests': [ 'bemade_fsm/static/tests/tours/task_template_tour.js', 'bemade_fsm/static/tests/tours/equipment_tour.js', + 'bemade_fsm/static/tests/tours/sale_order_tour.js', ], }, 'installable': True, diff --git a/bemade_fsm/static/tests/tours/sale_order_tour.js b/bemade_fsm/static/tests/tours/sale_order_tour.js new file mode 100644 index 0000000..d2ab49b --- /dev/null +++ b/bemade_fsm/static/tests/tours/sale_order_tour.js @@ -0,0 +1,40 @@ +/** @odoo-module **/ + +import tour from 'web_tour.tour'; + +const SO_NAME = "TEST ORDER 2" +const PRODUCT_NAME = "Test Product 3" +tour.register('sale_order_tour', { + test: true, + url: '/web', + }, + [tour.stepUtils.showAppsMenuItem(), { + content: 'Navigate to the Service menu', + trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]', + }, { + content: 'Search for the sales order', + trigger: 'input.o_searchview_input', + run: `text ${SO_NAME}`, + }, { + content: 'Validate Search', + trigger: '.o_menu_item.o_selection_focus', + run: 'click', + }, { + content: 'Open the test order', + trigger: `.o_data_cell[name="client_order_ref"]:contains(${SO_NAME})`, + }, { + content: 'Click the view tasks button', + trigger: 'button[name="action_view_task"]', + }, { + content: 'Click the first task', + trigger: `div.o_kanban_record:has(span:contains(${PRODUCT_NAME}))`, + }, { + content: 'Click on the ready to invoice button', + trigger: 'button[name="action_fsm_validate"]', + extra_trigger: `li.breadcrumb-item.active:has(span:contains(${PRODUCT_NAME}))` + }, { + content: 'View the SO', + trigger: 'button[name="action_view_so"]', + extra_trigger: 'button[title="Current state"]:contains(Done)', + } + ]); diff --git a/bemade_fsm/tests/test_bemade_fsm_common.py b/bemade_fsm/tests/test_bemade_fsm_common.py index 4fcfe35..313dcf9 100644 --- a/bemade_fsm/tests/test_bemade_fsm_common.py +++ b/bemade_fsm/tests/test_bemade_fsm_common.py @@ -37,3 +37,13 @@ class FSMManagerUserTransactionCase(TransactionCase): 'signature': 'Mr. PM', 'groups_id': [Command.set(group_ids)], }) + group_ids.remove(user_group_fsm_manager.id) + group_ids.remove(user_group_project_manager.id) + cls.user_limited = Users.create({ + 'name': 'Project User', + 'login': 'mruser', + 'password': 'mruser', + 'email': 'mruser@testco.com', + 'signature': 'Mr. User', + 'groups_id': [Command.set(group_ids)] + }) diff --git a/bemade_fsm/tests/test_sale_order.py b/bemade_fsm/tests/test_sale_order.py index 7db9e33..3565ef0 100644 --- a/bemade_fsm/tests/test_sale_order.py +++ b/bemade_fsm/tests/test_sale_order.py @@ -1,6 +1,5 @@ from .test_task_template import TestTaskTemplateCommon -from .test_equipment import TestEquipmentCommon -from odoo.tests.common import tagged +from odoo.tests.common import tagged, HttpCase @tagged("-at_install", "post_install") @@ -13,7 +12,7 @@ class TestSalesOrder(TestTaskTemplateCommon): }) cls.sale_order1 = cls.env['sale.order'].create({ 'partner_id': cls.partner.id, - 'client_order_ref': 'TEST ORDER', + 'client_order_ref': 'TEST ORDER 1', 'state': 'draft', }) cls.sol_serv_order = cls.env['sale.order.line'].create({ @@ -36,7 +35,7 @@ class TestSalesOrder(TestTaskTemplateCommon): }) cls.sale_order2 = cls.env['sale.order'].create({ 'partner_id': cls.partner.id, - 'client_order_ref': 'TEST ORDER', + 'client_order_ref': 'TEST ORDER 2', 'state': 'draft', }) cls.sol_tree_order = cls.env['sale.order.line'].create({ @@ -103,11 +102,31 @@ class TestSalesOrder(TestTaskTemplateCommon): so.action_confirm() sol = so.order_line[0] parent_task = sol.task_id - child_task = parent_task.child_ids[0] + child_task = parent_task.child_ids[0] # Marking the top-level tasks done should set the delivered quantity to some non-zero value based on the UOM parent_task.action_fsm_validate() - sol._compute_qty_delivered() + # sol._compute_qty_delivered() self.assertTrue(sol.qty_delivered != 0) # Marking a child task done should not create a sale order child_task.action_fsm_validate() - self.assertFalse(child_task.sale_order_id) \ No newline at end of file + self.assertFalse(child_task.sale_order_id) + + +@tagged("-at_install", "post_install", 'focus') +class TestSaleOrderTour(HttpCase, TestSalesOrder): + def test_sale_order_tour_no_invoice_button_for_non_manager(self): + # Make sure a non-manager cannot mark a task as ready to invoice + so = self.sale_order2 + so.action_confirm() + with self.assertRaises(AssertionError) as e: + self.start_tour('/web', 'sale_order_tour', + login='mruser', ) + self.assertTrue("Click on the ready to invoice button" in str(e.exception)) + + def test_task_mark_to_invoice(self): + # Make sure that when a manager clicks the ready to invoice button, the qty delivered is updated on the SO + so = self.sale_order2 + so.action_confirm() + sol = so.order_line.filtered(lambda l: 'Test Product 3' in l.name) + self.start_tour('/web', 'sale_order_tour', login='misterpm') + self.assertTrue(sol.qty_delivered != 0) \ No newline at end of file diff --git a/bemade_fsm/tests/test_so_task_contacts.py b/bemade_fsm/tests/test_so_task_contacts.py index f0def24..d0f1453 100644 --- a/bemade_fsm/tests/test_so_task_contacts.py +++ b/bemade_fsm/tests/test_so_task_contacts.py @@ -1,8 +1,9 @@ from .test_sale_order import TestSalesOrder from odoo import Command -from odoo.tests.common import Form +from odoo.tests.common import Form, tagged +@tagged("-at_install", "post_install") class TestSaleOrderTaskContacts(TestSalesOrder): @classmethod def setUpClass(cls): diff --git a/bemade_fsm/tests/test_task_template.py b/bemade_fsm/tests/test_task_template.py index ba5a25c..511e2de 100644 --- a/bemade_fsm/tests/test_task_template.py +++ b/bemade_fsm/tests/test_task_template.py @@ -18,15 +18,9 @@ class TestTaskTemplateCommon(FSMManagerUserTransactionCase): 'name': 'Template 1', }) - cls.project = cls.env['project.project'].create({ - 'name': 'Test Project', - 'allow_material': True, - 'allow_timesheets': True, - 'allow_subtasks': True, - 'allow_quotations': True, - 'allow_worksheets': True, - 'is_fsm': True, - }) + cls.project = cls.env.ref('industry_fsm.fsm_project') + cls.project.write({'allow_subtasks': True,}) + cls.product_task_global_project = cls.env['product.product'].create({ 'name': 'Test Product 1', 'type': 'service', diff --git a/bemade_fsm/views/task_views.xml b/bemade_fsm/views/task_views.xml index d94ad8b..75af60a 100644 --- a/bemade_fsm/views/task_views.xml +++ b/bemade_fsm/views/task_views.xml @@ -4,7 +4,7 @@ bemade_fsm.project_task.form project.task - + @@ -20,6 +20,14 @@ + +