from .test_task_template import BemadeFSMBaseTest from odoo.tests.common import tagged, HttpCase, Form from odoo import Command @tagged("-at_install", "post_install") class TestSalesOrder(BemadeFSMBaseTest): @tagged('-at_install', 'post_install') def test_order_confirmation_simple_template(self): """ Confirming the order should create a task in the global project based on the task template. """ partner = self._generate_partner() so = self._generate_sale_order(partner=partner) task_template = self._generate_task_template(planned_hours=8) product = self._generate_product(task_template=task_template) sol = self._generate_sale_order_line(so, product=product) so.action_confirm() task = sol.task_id self.assertTrue(task) self.assertTrue(task_template.name in task.name) self.assertTrue(task_template.planned_hours == task.planned_hours) def test_order_confirmation_tree_template(self): partner = self._generate_partner() so = self._generate_sale_order(partner=partner) parent_task = self._generate_task_template(structure=[2, 1], names=['Parent Template', 'Child Template', 'Grandchild Template']) child_task_1 = parent_task.subtasks[0] child_task_2 = parent_task.subtasks[1] grandchild_task = parent_task.subtasks[0].subtasks[0] product = self._generate_product(task_template=parent_task) sol = self._generate_sale_order_line(so, product=product) so.action_confirm() self.assertTrue(sol.task_id.child_ids and len(sol.task_id.child_ids) == 2) self.assertTrue(parent_task.name in sol.task_id.name) self.assertTrue(child_task_1.name in sol.task_id.child_ids[0].name) self.assertTrue(child_task_2.name in sol.task_id.child_ids[1].name) self.assertTrue(sol.task_id.child_ids[0].child_ids and len(sol.task_id.child_ids[0].child_ids) == 1) self.assertTrue(grandchild_task.name in sol.task_id.child_ids.child_ids[0].name) def test_order_confirmation_single_equipment(self): """ The equipment selected on the SO should transfer to the task.""" partner = self._generate_partner() equipment = self._generate_equipment(partner=partner) so = self._generate_sale_order(partner=partner, equipment=equipment) task_template = self._generate_task_template(planned_hours=8) product1 = self._generate_product(task_template=task_template) product2 = self._generate_product() sol1 = self._generate_sale_order_line(so, product=product1) sol2 = self._generate_sale_order_line(so, product=product2) so.action_confirm() task1 = sol1.task_id task2 = sol2.task_id self.assertEqual(task1.equipment_ids[0], equipment) self.assertEqual(task2.equipment_ids[0], equipment) def test_order_confirmation_multiple_equipment(self): """ All equipment items should flow from the sale order line to the final task """ partner = self._generate_partner() for i in range(5): self._generate_equipment(partner=partner) sale_order = self._generate_sale_order(partner=partner) # No default equipment since more than 3 on partner sol1, sol2, sol3 = [self._generate_sale_order_line(sale_order=sale_order) for i in range(3)] sol1.equipment_ids = [Command.set([partner.equipment_ids[i].id for i in range(2)])] sol3.equipment_ids = [Command.set([partner.equipment_ids[i].id for i in range(2, 5)])] sale_order.action_confirm() self.assertEqual(sol1.equipment_ids, sol1.task_id.equipment_ids) self.assertEqual(sol2.equipment_ids, sol2.task_id.equipment_ids) self.assertEqual(sol3.equipment_ids, sol3.task_id.equipment_ids) def test_task_template_with_equipment_flow(self): """ The equipment selected on a task template should flow down to the task created on SO confirmation.""" partner = self._generate_partner() equipment = self._generate_equipment(partner=partner) so = self._generate_sale_order(partner=partner) task_template = self._generate_task_template(equipment=equipment) product = self._generate_product(task_template=task_template) sol = self._generate_sale_order_line(so, product=product) so.action_confirm() self.assertEqual(sol.task_id.equipment_ids[0], equipment) def test_sale_order_line_gets_default_equipment(self): """ Sale order lines created on an SO with default equipment set should inherit that default equipment. """ partner = self._generate_partner() self._generate_equipment(partner=partner) sale_order = self._generate_sale_order(partner=partner) sol = self._generate_sale_order_line(sale_order=sale_order) self.assertEqual(sol.equipment_ids, partner.equipment_ids) def test_sale_order_gets_correct_default_equipment_from_partner(self): """ Should pick up equipment from the partner.""" partner = self._generate_partner() self._generate_equipment(partner=partner) sale_order = self._generate_sale_order(partner=partner) self.assertEqual(sale_order.default_equipment_ids, partner.owned_equipment_ids) def test_sale_order_default_equipment_maximum_number(self): parent = self._generate_partner() child = self._generate_partner(parent=parent) for i in range(3): self._generate_equipment(child) sale_order = self._generate_sale_order(partner=parent) self.assertEqual(sale_order.default_equipment_ids, parent.owned_equipment_ids) def test_sale_order_no_default_equipment_with_more_than_three_owned_on_partner(self): parent = self._generate_partner() child = self._generate_partner(parent=parent) for i in range(4): self._generate_equipment(child) sale_order = self._generate_sale_order(partner=parent) self.assertEqual(sale_order.default_equipment_ids, parent.owned_equipment_ids) def test_sale_order_resets_default_equipment_on_partner_change(self): partner_1 = self._generate_partner() partner_2 = self._generate_partner() self._generate_equipment(partner=partner_1) sale_order = self._generate_sale_order(partner_1) form = Form(sale_order) form.partner_id = partner_2 form.save() self.assertFalse(sale_order.default_equipment_ids) def test_sale_order_prioritize_shipping_location_equipments(self): parent = self._generate_partner() child = self._generate_partner(parent=parent, location_type='delivery') self._generate_equipment(partner=parent) self._generate_equipment(partner=child) sale_order = self._generate_sale_order(partner=parent, shipping_location=child) self.assertEqual(sale_order.default_equipment_ids, child.equipment_ids) def test_default_equipment_transfers_to_sale_order_line(self): partner = self._generate_partner() for i in range(3): self._generate_equipment(partner=partner) sale_order = self._generate_sale_order(partner=partner) for i in range(3): self._generate_sale_order_line(sale_order=sale_order) for line in sale_order.order_line: self.assertEqual(line.equipment_ids, partner.equipment_ids) def test_task_mark_done(self): """ Marking the task linked to an SO line should mark the line delivered. Marking sub-tasks done should not.""" partner = self._generate_partner() so = self._generate_sale_order(partner=partner) task_template = self._generate_task_template(structure=[2], names=["Parent Task", "Subtask"]) product = self._generate_product(task_template=task_template) sol = self._generate_sale_order_line(so, product=product) so.action_confirm() parent_task = sol.task_id subtasks = parent_task._get_all_subtasks() # Marking the subtasks done should not increment delivered quantity subtasks.action_fsm_validate() self.assertEqual(sol.qty_delivered, 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() self.assertTrue(sol.qty_delivered != 0) def test_task_contacts_through_sale_order(self): """ Make sure the site contacts and work order contacts transfer correctly from the SO to the task.""" partner = self._generate_partner() contact1 = self._generate_partner('Site contact', 'person', partner) contact2 = self._generate_partner('Work order contact', 'person', partner) partner.write({ 'site_contacts': [Command.set([contact1.id])], 'work_order_contacts': [Command.set([contact2.id])], }) so = self._generate_sale_order(partner) product = self._generate_product() sol = self._generate_sale_order_line(sale_order=so, product=product) so.action_confirm() self.assertEqual(so.work_order_contacts, partner.work_order_contacts) self.assertEqual(so.site_contacts, partner.site_contacts) self.assertEqual(sol.task_id.work_order_contacts, partner.work_order_contacts) self.assertEqual(sol.task_id.site_contacts, partner.site_contacts) def test_changing_task_contacts_mirrors_with_sale_order(self): partner = self._generate_partner() contact = self._generate_partner("Contact", "person", partner) so = self._generate_sale_order(partner) product = self._generate_product() sol = self._generate_sale_order_line(so, product) so.action_confirm() task = sol.task_id task_form = Form(task) # Now change the site/work order contact on the task and make sure it feeds back to the sales order task_form.site_contacts.add(contact) task_form.work_order_contacts.add(contact) task_form.save() self.assertEqual(task.site_contacts, so.site_contacts) self.assertEqual(task.work_order_contacts, so.work_order_contacts) # Test changing it on the SO feeds back to the task as well f = Form(so) f.work_order_contacts.remove(contact.id) f.site_contacts.remove(contact.id) f.save() self.assertEqual(task.site_contacts, so.site_contacts) self.assertEqual(task.work_order_contacts, so.work_order_contacts) @tagged("-at_install", "post_install", "slow") class TestSaleOrderTour(HttpCase, TestSalesOrder): def test_sale_order_tour_no_invoice_button_for_non_manager(self): so = self._generate_sale_order(client_order_ref='TEST ORDER 2') self._generate_sale_order_line(so, self._generate_product(name='Test Product 3')) self._generate_project_user('Mr. User', 'mruser') so.action_confirm() # Make sure a non-manager cannot mark a task as ready to invoice 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._generate_sale_order(client_order_ref='TEST ORDER 2') sol = self._generate_sale_order_line(so, self._generate_product(name='Test Product 3')) so.action_confirm() user = self._generate_project_manager_user('Mr. User', 'mruser') self.start_tour('/web', 'sale_order_tour', login=user.login) self.assertTrue(sol.qty_delivered != 0)