# -*- coding: utf-8 -*- from datetime import date from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') class TestServiceBooking(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() cls.Task = cls.env['fusion.technician.task'] # technician_id is required on a task (domain x_fc_is_field_staff=True). cls.tech = cls.env['res.users'].create({ 'name': 'Service Booking Tech', 'login': 'svcbook_tech', 'x_fc_is_field_staff': True, }) def test_task_without_order_is_allowed(self): # repair for a brand-new client: no SO/PO must NOT raise after the relax t = self.Task.create({ 'task_type': 'repair', 'technician_id': self.tech.id, 'scheduled_date': date(2026, 6, 3), }) self.assertTrue(t.id) def test_sale_order_has_service_repair_flag(self): so = self.env['sale.order'].new({}) self.assertIn('x_fc_is_service_repair', so._fields) def test_resolve_service_lines_standard_rush(self): Task = self.Task lines = Task._resolve_service_lines('standard', 'rush', in_shop=False, distance_km=10.0) # call-out $120 + per-km line qty 20 @ $0.70 callout = [l for l in lines if l['price_unit'] == 120.0] per_km = [l for l in lines if l['name_is_km']] self.assertTrue(callout) self.assertEqual(per_km[0]['product_uom_qty'], 20.0) self.assertEqual(per_km[0]['price_unit'], 0.70) def test_resolve_service_lines_in_shop_empty_callout(self): lines = self.Task._resolve_service_lines('standard', 'normal', in_shop=True, distance_km=5.0) self.assertEqual(lines, []) def test_build_service_so(self): partner = self.env['res.partner'].create({'name': 'Walk-in Wanda'}) so = self.Task._build_service_so(partner, 'standard', 'normal', False, 0.0) self.assertEqual(so.state, 'draft') self.assertTrue(so.x_fc_is_service_repair) self.assertEqual(so.partner_id, partner) self.assertEqual(so.order_line[0].price_unit, 95.0)