You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
4.0 KiB

  1. # Copyright 2019 Tecnativa - Pedro M. Baeza
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
  3. from odoo import fields
  4. from odoo.tests import common
  5. class TestContractVariableQtyTimesheet(common.SavepointCase):
  6. @classmethod
  7. def setUpClass(cls):
  8. super().setUpClass()
  9. cls.partner = cls.env['res.partner'].create({'name': 'Test partner'})
  10. cls.analytic_account = cls.env['account.analytic.account'].create({
  11. 'name': 'Test analytic account'})
  12. cls.contract = cls.env['contract.contract'].create({
  13. 'name': 'Test contract',
  14. 'partner_id': cls.partner.id})
  15. cls.product = cls.env['product.product'].create({
  16. 'name': 'Test product'})
  17. contract_line_vals = {
  18. 'contract_id': cls.contract.id,
  19. 'analytic_account_id': cls.analytic_account.id,
  20. 'product_id': cls.product.id,
  21. 'uom_id': cls.product.uom_id.id,
  22. 'name': 'Test line contract',
  23. 'recurring_interval': 1,
  24. 'recurring_rule_type': 'monthly',
  25. 'recurring_invoicing_type': 'pre-paid',
  26. 'date_start': '2020-01-01',
  27. 'recurring_next_date': '2020-01-01',
  28. 'qty_type': 'variable',
  29. 'qty_formula_id': cls.env.ref(
  30. 'contract_variable_qty_timesheet.'
  31. 'contract_line_qty_formula_project_timesheet').id,
  32. }
  33. cls.contract_line = cls.env['contract.line'].create(
  34. contract_line_vals)
  35. cls.project = cls.env['project.project'].create({
  36. 'name': 'Test project',
  37. 'analytic_account_id': cls.analytic_account.id,
  38. })
  39. cls.task = cls.env['project.task'].create({
  40. 'project_id': cls.project.id,
  41. 'name': 'Test task',
  42. })
  43. def _contract_invoicing(self, contract):
  44. date_ref = fields.Date.from_string('2020-01-01')
  45. contract._recurring_create_invoice(date_ref)
  46. return contract._get_related_invoices()
  47. def _create_analytic_line(self, project, task, date, product, unit_amount):
  48. return self.env['account.analytic.line'].create({
  49. 'account_id': self.analytic_account.id,
  50. 'project_id': project and project.id,
  51. 'task_id': task and task.id,
  52. 'name': 'Test %s %s' % (date, unit_amount),
  53. 'date': date,
  54. 'product_id': product and product.id,
  55. 'unit_amount': unit_amount,
  56. })
  57. def test_project_timesheet(self):
  58. self._create_analytic_line(
  59. self.project, self.task, '2020-01-01', False, 3)
  60. self._create_analytic_line(
  61. False, False, '2020-01-01', False, 1)
  62. invoice = self._contract_invoicing(self.contract)
  63. self.assertEqual(len(invoice.invoice_line_ids), 1)
  64. self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
  65. def test_task_timesheet(self):
  66. self.contract_line.qty_formula_id = self.env.ref(
  67. 'contract_variable_qty_timesheet.'
  68. 'contract_line_qty_formula_task_timesheet'
  69. ).id
  70. self._create_analytic_line(
  71. self.project, self.task, '2020-01-01', False, 3)
  72. self._create_analytic_line(
  73. self.project, False, '2020-01-01', False, 1)
  74. invoice = self._contract_invoicing(self.contract)
  75. self.assertEqual(len(invoice.invoice_line_ids), 1)
  76. self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
  77. def test_same_product(self):
  78. self.contract_line.qty_formula_id = self.env.ref(
  79. 'contract_variable_qty_timesheet.'
  80. 'contract_line_qty_formula_analytic_same_product'
  81. ).id
  82. self._create_analytic_line(
  83. False, False, '2020-01-01', self.product, 3)
  84. self._create_analytic_line(
  85. self.project, False, '2020-01-01', False, 1)
  86. invoice = self._contract_invoicing(self.contract)
  87. self.assertEqual(len(invoice.invoice_line_ids), 1)
  88. self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)