odoo-addon-contract 17.0.1.4.3.2__py3-none-any.whl → 18.0.2.0.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. odoo/addons/contract/README.rst +14 -10
  2. odoo/addons/contract/__manifest__.py +3 -10
  3. odoo/addons/contract/controllers/main.py +1 -8
  4. odoo/addons/contract/data/contract_cron.xml +0 -2
  5. odoo/addons/contract/data/mail_template.xml +18 -17
  6. odoo/addons/contract/data/template_mail_notification.xml +1 -1
  7. odoo/addons/contract/i18n/am.po +146 -821
  8. odoo/addons/contract/i18n/ar.po +146 -821
  9. odoo/addons/contract/i18n/bg.po +146 -821
  10. odoo/addons/contract/i18n/bs.po +146 -821
  11. odoo/addons/contract/i18n/ca.po +835 -900
  12. odoo/addons/contract/i18n/ca_ES.po +146 -821
  13. odoo/addons/contract/i18n/contract.pot +145 -818
  14. odoo/addons/contract/i18n/cs.po +146 -821
  15. odoo/addons/contract/i18n/da.po +146 -821
  16. odoo/addons/contract/i18n/de.po +712 -953
  17. odoo/addons/contract/i18n/el_GR.po +146 -821
  18. odoo/addons/contract/i18n/en_GB.po +146 -821
  19. odoo/addons/contract/i18n/es.po +714 -947
  20. odoo/addons/contract/i18n/es_AR.po +550 -877
  21. odoo/addons/contract/i18n/es_CL.po +146 -821
  22. odoo/addons/contract/i18n/es_CO.po +146 -821
  23. odoo/addons/contract/i18n/es_CR.po +146 -821
  24. odoo/addons/contract/i18n/es_DO.po +146 -821
  25. odoo/addons/contract/i18n/es_EC.po +146 -821
  26. odoo/addons/contract/i18n/es_MX.po +146 -821
  27. odoo/addons/contract/i18n/es_PY.po +146 -821
  28. odoo/addons/contract/i18n/es_VE.po +146 -821
  29. odoo/addons/contract/i18n/et.po +146 -821
  30. odoo/addons/contract/i18n/eu.po +146 -821
  31. odoo/addons/contract/i18n/fa.po +146 -821
  32. odoo/addons/contract/i18n/fi.po +422 -848
  33. odoo/addons/contract/i18n/fr.po +713 -953
  34. odoo/addons/contract/i18n/fr_CA.po +146 -821
  35. odoo/addons/contract/i18n/fr_CH.po +146 -821
  36. odoo/addons/contract/i18n/fr_FR.po +454 -850
  37. odoo/addons/contract/i18n/gl.po +257 -846
  38. odoo/addons/contract/i18n/gl_ES.po +146 -821
  39. odoo/addons/contract/i18n/he.po +146 -821
  40. odoo/addons/contract/i18n/hi_IN.po +191 -831
  41. odoo/addons/contract/i18n/hr.po +211 -837
  42. odoo/addons/contract/i18n/hr_HR.po +223 -839
  43. odoo/addons/contract/i18n/hu.po +146 -821
  44. odoo/addons/contract/i18n/id.po +146 -821
  45. odoo/addons/contract/i18n/it.po +753 -902
  46. odoo/addons/contract/i18n/ja.po +146 -821
  47. odoo/addons/contract/i18n/ko.po +146 -821
  48. odoo/addons/contract/i18n/lt.po +146 -821
  49. odoo/addons/contract/i18n/lt_LT.po +146 -821
  50. odoo/addons/contract/i18n/lv.po +146 -821
  51. odoo/addons/contract/i18n/mk.po +146 -821
  52. odoo/addons/contract/i18n/mn.po +146 -821
  53. odoo/addons/contract/i18n/nb.po +146 -821
  54. odoo/addons/contract/i18n/nb_NO.po +146 -821
  55. odoo/addons/contract/i18n/nl.po +699 -953
  56. odoo/addons/contract/i18n/nl_BE.po +146 -821
  57. odoo/addons/contract/i18n/nl_NL.po +191 -831
  58. odoo/addons/contract/i18n/pl.po +146 -821
  59. odoo/addons/contract/i18n/pt.po +415 -839
  60. odoo/addons/contract/i18n/pt_BR.po +704 -947
  61. odoo/addons/contract/i18n/pt_PT.po +146 -821
  62. odoo/addons/contract/i18n/ro.po +146 -821
  63. odoo/addons/contract/i18n/ru.po +191 -831
  64. odoo/addons/contract/i18n/sk.po +146 -821
  65. odoo/addons/contract/i18n/sk_SK.po +146 -821
  66. odoo/addons/contract/i18n/sl.po +146 -821
  67. odoo/addons/contract/i18n/sr.po +146 -821
  68. odoo/addons/contract/i18n/sr@latin.po +146 -821
  69. odoo/addons/contract/i18n/sv.po +784 -933
  70. odoo/addons/contract/i18n/th.po +146 -821
  71. odoo/addons/contract/i18n/tr.po +611 -879
  72. odoo/addons/contract/i18n/tr_TR.po +221 -838
  73. odoo/addons/contract/i18n/uk.po +146 -821
  74. odoo/addons/contract/i18n/vi.po +146 -821
  75. odoo/addons/contract/i18n/vi_VN.po +146 -821
  76. odoo/addons/contract/i18n/zh_CN.po +407 -840
  77. odoo/addons/contract/i18n/zh_TW.po +150 -822
  78. odoo/addons/contract/migrations/18.0.2.0.0/end-migrate.py +27 -0
  79. odoo/addons/contract/migrations/18.0.2.0.0/pre-migrate.py +94 -0
  80. odoo/addons/contract/models/__init__.py +2 -6
  81. odoo/addons/contract/models/account_move.py +0 -8
  82. odoo/addons/contract/models/account_move_line.py +14 -0
  83. odoo/addons/contract/models/contract.py +272 -308
  84. odoo/addons/contract/models/contract_line.py +37 -859
  85. odoo/addons/contract/models/{contract_recurrency_mixin.py → contract_recurring_mixin.py} +101 -82
  86. odoo/addons/contract/models/contract_tag.py +1 -3
  87. odoo/addons/contract/models/contract_template.py +81 -2
  88. odoo/addons/contract/models/contract_template_line.py +250 -3
  89. odoo/addons/contract/report/contract_views.xml +0 -2
  90. odoo/addons/contract/report/report_contract.xml +13 -13
  91. odoo/addons/contract/security/contract_security.xml +6 -15
  92. odoo/addons/contract/security/contract_tag.xml +1 -3
  93. odoo/addons/contract/security/ir.model.access.csv +0 -2
  94. odoo/addons/contract/static/description/index.html +24 -18
  95. odoo/addons/contract/static/src/img/contract_icon.svg +4 -0
  96. odoo/addons/contract/static/src/js/contract_portal_tour.esm.js +6 -4
  97. odoo/addons/contract/tests/test_contract.py +82 -928
  98. odoo/addons/contract/tests/test_multicompany.py +5 -4
  99. odoo/addons/contract/tests/test_portal.py +6 -3
  100. odoo/addons/contract/views/contract.xml +92 -235
  101. odoo/addons/contract/views/contract_line.xml +48 -117
  102. odoo/addons/contract/views/contract_portal_templates.xml +187 -224
  103. odoo/addons/contract/views/contract_tag.xml +3 -3
  104. odoo/addons/contract/views/contract_template.xml +100 -72
  105. odoo/addons/contract/views/contract_template_line.xml +76 -5
  106. odoo/addons/contract/views/res_config_settings.xml +5 -6
  107. odoo/addons/contract/views/res_partner_view.xml +0 -5
  108. odoo/addons/contract/wizards/__init__.py +0 -2
  109. odoo/addons/contract/wizards/contract_manually_create_invoice.py +6 -6
  110. odoo/addons/contract/wizards/contract_manually_create_invoice.xml +2 -3
  111. {odoo_addon_contract-17.0.1.4.3.2.dist-info → odoo_addon_contract-18.0.2.0.8.dist-info}/METADATA +18 -13
  112. odoo_addon_contract-18.0.2.0.8.dist-info/RECORD +132 -0
  113. {odoo_addon_contract-17.0.1.4.3.2.dist-info → odoo_addon_contract-18.0.2.0.8.dist-info}/WHEEL +1 -1
  114. odoo/addons/contract/data/contract_renew_cron.xml +0 -14
  115. odoo/addons/contract/models/abstract_contract.py +0 -82
  116. odoo/addons/contract/models/abstract_contract_line.py +0 -271
  117. odoo/addons/contract/models/contract_line_constraints.py +0 -429
  118. odoo/addons/contract/models/contract_terminate_reason.py +0 -14
  119. odoo/addons/contract/models/res_company.py +0 -15
  120. odoo/addons/contract/models/res_config_settings.py +0 -18
  121. odoo/addons/contract/security/contract_terminate_reason.xml +0 -23
  122. odoo/addons/contract/security/groups.xml +0 -9
  123. odoo/addons/contract/views/abstract_contract_line.xml +0 -117
  124. odoo/addons/contract/views/contract_terminate_reason.xml +0 -38
  125. odoo/addons/contract/wizards/contract_contract_terminate.py +0 -42
  126. odoo/addons/contract/wizards/contract_contract_terminate.xml +0 -33
  127. odoo/addons/contract/wizards/contract_line_wizard.py +0 -53
  128. odoo/addons/contract/wizards/contract_line_wizard.xml +0 -111
  129. odoo_addon_contract-17.0.1.4.3.2.dist-info/RECORD +0 -143
  130. {odoo_addon_contract-17.0.1.4.3.2.dist-info → odoo_addon_contract-18.0.2.0.8.dist-info}/top_level.txt +0 -0
@@ -5,13 +5,12 @@
5
5
 
6
6
  import logging
7
7
  from collections import namedtuple
8
- from datetime import timedelta
9
8
 
10
9
  from dateutil.relativedelta import relativedelta
11
10
  from freezegun import freeze_time
12
11
 
13
- from odoo import fields
14
- from odoo.exceptions import UserError, ValidationError
12
+ from odoo import Command, fields
13
+ from odoo.exceptions import ValidationError
15
14
  from odoo.tests import Form, common
16
15
 
17
16
 
@@ -37,7 +36,11 @@ class TestContractBase(common.TransactionCase):
37
36
  cls.product_1 = cls.env.ref("product.product_product_1")
38
37
  cls.product_2 = cls.env.ref("product.product_product_2")
39
38
  cls.product_1.taxes_id += cls.env["account.tax"].search(
40
- [("type_tax_use", "=", "sale")], limit=1
39
+ [
40
+ ("type_tax_use", "=", "sale"),
41
+ ("company_id", "=", cls.env.company.id),
42
+ ],
43
+ limit=1,
41
44
  )
42
45
  cls.product_1.description_sale = "Test description sale"
43
46
  cls.line_template_vals = {
@@ -57,8 +60,8 @@ class TestContractBase(common.TransactionCase):
57
60
  cls.template_vals = {
58
61
  "name": "Test Contract Template",
59
62
  "contract_line_ids": [
60
- (0, 0, cls.section_template_vals),
61
- (0, 0, cls.line_template_vals),
63
+ Command.create(cls.section_template_vals),
64
+ Command.create(cls.line_template_vals),
62
65
  ],
63
66
  }
64
67
  cls.template = cls.env["contract.template"].create(cls.template_vals)
@@ -71,6 +74,24 @@ class TestContractBase(common.TransactionCase):
71
74
  "base": "list_price",
72
75
  }
73
76
  )
77
+ cls.env["product.pricelist.item"].create(
78
+ {
79
+ "pricelist_id": cls.partner.property_product_pricelist.id,
80
+ "product_id": cls.product_2.id,
81
+ "compute_price": "fixed",
82
+ "fixed_price": 100,
83
+ "min_quantity": 1,
84
+ }
85
+ )
86
+ cls.env["product.pricelist.item"].create(
87
+ {
88
+ "pricelist_id": cls.partner.property_product_pricelist.id,
89
+ "product_id": cls.product_2.id,
90
+ "compute_price": "fixed",
91
+ "fixed_price": 50,
92
+ "min_quantity": 10,
93
+ }
94
+ )
74
95
  cls.contract = cls.env["contract.contract"].create(
75
96
  {
76
97
  "name": "Test Contract",
@@ -87,9 +108,7 @@ class TestContractBase(common.TransactionCase):
87
108
  "line_recurrence": True,
88
109
  "contract_type": "purchase",
89
110
  "contract_line_ids": [
90
- (
91
- 0,
92
- 0,
111
+ Command.create(
93
112
  {
94
113
  "product_id": cls.product_1.id,
95
114
  "name": "Services from #START# to #END#",
@@ -118,14 +137,8 @@ class TestContractBase(common.TransactionCase):
118
137
  "recurring_interval": 1,
119
138
  "date_start": "2018-01-01",
120
139
  "recurring_next_date": "2018-01-15",
121
- "is_auto_renew": False,
122
140
  }
123
141
  cls.acct_line = cls.env["contract.line"].create(cls.line_vals)
124
- cls.contract.company_id.create_new_line_at_contract_line_renew = True
125
- cls.terminate_reason = cls.env["contract.terminate.reason"].create(
126
- {"name": "terminate_reason"}
127
- )
128
-
129
142
  cls.contract3 = cls.env["contract.contract"].create(
130
143
  {
131
144
  "name": "Test Contract 3",
@@ -137,18 +150,14 @@ class TestContractBase(common.TransactionCase):
137
150
  "recurring_rule_type": "monthly",
138
151
  "date_start": "2018-02-15",
139
152
  "contract_line_ids": [
140
- (
141
- 0,
142
- 0,
153
+ Command.create(
143
154
  {
144
155
  "product_id": False,
145
156
  "name": "Header for #INVOICEMONTHNAME# Services",
146
157
  "display_type": "line_section",
147
158
  },
148
159
  ),
149
- (
150
- 0,
151
- 0,
160
+ Command.create(
152
161
  {
153
162
  "product_id": False,
154
163
  "name": "Services from #START# to #END#",
@@ -156,9 +165,7 @@ class TestContractBase(common.TransactionCase):
156
165
  "price_unit": 100,
157
166
  },
158
167
  ),
159
- (
160
- 0,
161
- 0,
168
+ Command.create(
162
169
  {
163
170
  "product_id": False,
164
171
  "name": "Line",
@@ -221,8 +228,12 @@ class TestContract(TestContractBase):
221
228
  self.contract.write(
222
229
  {
223
230
  "modification_ids": [
224
- (0, 0, {"date": "2020-01-01", "description": "Modification 1"}),
225
- (0, 0, {"date": "2020-02-01", "description": "Modification 2"}),
231
+ Command.create(
232
+ {"date": "2020-01-01", "description": "Modification 1"}
233
+ ),
234
+ Command.create(
235
+ {"date": "2020-02-01", "description": "Modification 2"}
236
+ ),
226
237
  ]
227
238
  }
228
239
  )
@@ -251,6 +262,31 @@ class TestContract(TestContractBase):
251
262
  self.acct_line.invalidate_model()
252
263
  self.assertEqual(self.acct_line.price_unit, 10)
253
264
 
265
+ def test_automatic_price_min_quantity(self):
266
+ """Test that automatic pricing respects pricelist quantity-based rules."""
267
+ self.acct_line.product_id = self.product_2.id
268
+ self.acct_line.automatic_price = True
269
+ self.acct_line.quantity = 1
270
+ self.assertEqual(
271
+ self.acct_line.price_unit,
272
+ 100,
273
+ "Price should be 100 for quantity 1 based on pricelist rule",
274
+ )
275
+ self.acct_line.quantity = 10
276
+ self.assertEqual(
277
+ self.acct_line.price_unit,
278
+ 50,
279
+ "Price should be 50 for quantity 10 based on pricelist rule",
280
+ )
281
+
282
+ def test_automatic_price_change(self):
283
+ self.acct_line.automatic_price = True
284
+ self.product_1.list_price = 1100
285
+ self.assertEqual(self.acct_line.price_unit, 1100)
286
+ # Change contract type
287
+ self.acct_line.contract_id.contract_type = "purchase"
288
+ self.assertFalse(self.acct_line.automatic_price)
289
+
254
290
  def test_contract(self):
255
291
  self.assertEqual(self.contract.recurring_next_date, to_date("2018-01-15"))
256
292
  self.assertAlmostEqual(self.acct_line.price_subtotal, 50.0)
@@ -272,9 +308,9 @@ class TestContract(TestContractBase):
272
308
  def test_contract_daily(self):
273
309
  recurring_next_date = to_date("2018-02-23")
274
310
  last_date_invoiced = to_date("2018-02-22")
275
- self.acct_line.recurring_next_date = "2018-02-22"
276
311
  self.acct_line.recurring_rule_type = "daily"
277
312
  self.contract.pricelist_id = False
313
+ self.acct_line.recurring_next_date = "2018-02-22"
278
314
  self.contract.recurring_create_invoice()
279
315
  invoice_daily = self.contract._get_related_invoices()
280
316
  self.assertTrue(invoice_daily)
@@ -315,9 +351,9 @@ class TestContract(TestContractBase):
315
351
  def test_contract_weekly_post_paid(self):
316
352
  recurring_next_date = to_date("2018-03-01")
317
353
  last_date_invoiced = to_date("2018-02-21")
318
- self.acct_line.recurring_next_date = "2018-02-22"
319
354
  self.acct_line.recurring_rule_type = "weekly"
320
355
  self.acct_line.recurring_invoicing_type = "post-paid"
356
+ self.acct_line.recurring_next_date = "2018-02-22"
321
357
  self.contract.recurring_create_invoice()
322
358
  invoices_weekly = self.contract._get_related_invoices()
323
359
  self.assertTrue(invoices_weekly)
@@ -327,9 +363,9 @@ class TestContract(TestContractBase):
327
363
  def test_contract_weekly_pre_paid(self):
328
364
  recurring_next_date = to_date("2018-03-01")
329
365
  last_date_invoiced = to_date("2018-02-28")
330
- self.acct_line.recurring_next_date = "2018-02-22"
331
366
  self.acct_line.recurring_rule_type = "weekly"
332
367
  self.acct_line.recurring_invoicing_type = "pre-paid"
368
+ self.acct_line.recurring_next_date = "2018-02-22"
333
369
  self.contract.recurring_create_invoice()
334
370
  invoices_weekly = self.contract._get_related_invoices()
335
371
  self.assertTrue(invoices_weekly)
@@ -339,9 +375,9 @@ class TestContract(TestContractBase):
339
375
  def test_contract_yearly_post_paid(self):
340
376
  recurring_next_date = to_date("2019-02-22")
341
377
  last_date_invoiced = to_date("2018-02-21")
342
- self.acct_line.recurring_next_date = "2018-02-22"
343
378
  self.acct_line.recurring_rule_type = "yearly"
344
379
  self.acct_line.recurring_invoicing_type = "post-paid"
380
+ self.acct_line.recurring_next_date = "2018-02-22"
345
381
  self.contract.recurring_create_invoice()
346
382
  invoices_weekly = self.contract._get_related_invoices()
347
383
  self.assertTrue(invoices_weekly)
@@ -352,9 +388,9 @@ class TestContract(TestContractBase):
352
388
  recurring_next_date = to_date("2019-02-22")
353
389
  last_date_invoiced = to_date("2019-02-21")
354
390
  self.acct_line.date_end = "2020-02-22"
355
- self.acct_line.recurring_next_date = "2018-02-22"
356
391
  self.acct_line.recurring_rule_type = "yearly"
357
392
  self.acct_line.recurring_invoicing_type = "pre-paid"
393
+ self.acct_line.recurring_next_date = "2018-02-22"
358
394
  self.contract.recurring_create_invoice()
359
395
  invoices_weekly = self.contract._get_related_invoices()
360
396
  self.assertTrue(invoices_weekly)
@@ -364,9 +400,9 @@ class TestContract(TestContractBase):
364
400
  def test_contract_monthly_lastday(self):
365
401
  recurring_next_date = to_date("2018-02-28")
366
402
  last_date_invoiced = to_date("2018-02-22")
367
- self.acct_line.recurring_next_date = "2018-02-22"
368
403
  self.acct_line.recurring_invoicing_type = "post-paid"
369
404
  self.acct_line.recurring_rule_type = "monthlylastday"
405
+ self.acct_line.recurring_next_date = "2018-02-22"
370
406
  self.contract.recurring_create_invoice()
371
407
  invoices_monthly_lastday = self.contract._get_related_invoices()
372
408
  self.assertTrue(invoices_monthly_lastday)
@@ -377,9 +413,9 @@ class TestContract(TestContractBase):
377
413
  recurring_next_date = to_date("2018-05-22")
378
414
  last_date_invoiced = to_date("2018-05-21")
379
415
  self.acct_line.date_end = "2020-02-22"
380
- self.acct_line.recurring_next_date = "2018-02-22"
381
416
  self.acct_line.recurring_rule_type = "quarterly"
382
417
  self.acct_line.recurring_invoicing_type = "pre-paid"
418
+ self.acct_line.recurring_next_date = "2018-02-22"
383
419
  self.contract.recurring_create_invoice()
384
420
  invoices_weekly = self.contract._get_related_invoices()
385
421
  self.assertTrue(invoices_weekly)
@@ -390,9 +426,9 @@ class TestContract(TestContractBase):
390
426
  recurring_next_date = to_date("2018-05-22")
391
427
  last_date_invoiced = to_date("2018-02-21")
392
428
  self.acct_line.date_end = "2020-02-22"
393
- self.acct_line.recurring_next_date = "2018-02-22"
394
429
  self.acct_line.recurring_rule_type = "quarterly"
395
430
  self.acct_line.recurring_invoicing_type = "post-paid"
431
+ self.acct_line.recurring_next_date = "2018-02-22"
396
432
  self.contract.recurring_create_invoice()
397
433
  invoices_weekly = self.contract._get_related_invoices()
398
434
  self.assertTrue(invoices_weekly)
@@ -403,9 +439,9 @@ class TestContract(TestContractBase):
403
439
  recurring_next_date = to_date("2018-08-22")
404
440
  last_date_invoiced = to_date("2018-08-21")
405
441
  self.acct_line.date_end = "2020-02-22"
406
- self.acct_line.recurring_next_date = "2018-02-22"
407
442
  self.acct_line.recurring_rule_type = "semesterly"
408
443
  self.acct_line.recurring_invoicing_type = "pre-paid"
444
+ self.acct_line.recurring_next_date = "2018-02-22"
409
445
  self.contract.recurring_create_invoice()
410
446
  invoices_weekly = self.contract._get_related_invoices()
411
447
  self.assertTrue(invoices_weekly)
@@ -416,9 +452,9 @@ class TestContract(TestContractBase):
416
452
  recurring_next_date = to_date("2018-08-22")
417
453
  last_date_invoiced = to_date("2018-02-21")
418
454
  self.acct_line.date_end = "2020-02-22"
419
- self.acct_line.recurring_next_date = "2018-02-22"
420
455
  self.acct_line.recurring_rule_type = "semesterly"
421
456
  self.acct_line.recurring_invoicing_type = "post-paid"
457
+ self.acct_line.recurring_next_date = "2018-02-22"
422
458
  self.contract.recurring_create_invoice()
423
459
  invoices_weekly = self.contract._get_related_invoices()
424
460
  self.assertTrue(invoices_weekly)
@@ -487,7 +523,9 @@ class TestContract(TestContractBase):
487
523
  def test_uom(self):
488
524
  uom_litre = self.env.ref("uom.product_uom_litre")
489
525
  self.acct_line.uom_id = uom_litre.id
490
- self.acct_line._onchange_product_id()
526
+ product = self.acct_line.product_id
527
+ self.acct_line.product_id = False
528
+ self.acct_line.product_id = product
491
529
  self.assertEqual(self.acct_line.uom_id, self.acct_line.product_id.uom_id)
492
530
 
493
531
  def test_no_pricelist(self):
@@ -519,10 +557,10 @@ class TestContract(TestContractBase):
519
557
  self.contract._onchange_contract_template_id()
520
558
  res = {
521
559
  "contract_line_ids": [
522
- (0, 0, {"display_type": "line_section", "name": "Test section"}),
523
- (
524
- 0,
525
- 0,
560
+ Command.create(
561
+ {"display_type": "line_section", "name": "Test section"}
562
+ ),
563
+ Command.create(
526
564
  {
527
565
  "product_id": self.product_1.id,
528
566
  "name": "Services from #START# to #END#",
@@ -541,7 +579,6 @@ class TestContract(TestContractBase):
541
579
 
542
580
  def test_onchange_contract_template_id_lines(self):
543
581
  """It should create invoice lines for the contract lines."""
544
- self.acct_line.cancel()
545
582
  self.acct_line.unlink()
546
583
  self.contract.contract_template_id = self.template
547
584
 
@@ -576,28 +613,11 @@ class TestContract(TestContractBase):
576
613
  result = self.contract.action_contract_send()
577
614
  self.assertEqual(result["res_model"], "mail.compose.message")
578
615
 
579
- def test_onchange_contract_type(self):
580
- self.contract._onchange_contract_type()
581
- self.assertEqual(self.contract.journal_id.type, "sale")
582
- self.assertEqual(self.contract.journal_id.company_id, self.contract.company_id)
583
- self.contract.contract_type = "purchase"
584
- self.contract._onchange_contract_type()
585
- self.assertFalse(any(self.contract.contract_line_ids.mapped("automatic_price")))
586
-
587
- def test_contract_onchange_product_id_uom(self):
588
- """It should update the UoM for the line."""
589
- line = self._add_template_line(
590
- {"uom_id": self.env.ref("uom.product_uom_litre").id}
591
- )
592
- line.product_id.uom_id = self.env.ref("uom.product_uom_day").id
593
- line._onchange_product_id()
594
- self.assertEqual(line.uom_id, line.product_id.uom_id)
595
-
596
616
  def test_contract_onchange_product_id_name(self):
597
617
  """It should update the name for the line."""
598
618
  line = self._add_template_line()
599
- line.product_id.description_sale = "Test"
600
- line._onchange_product_id()
619
+ self.product_2.description_sale = "Test Name Change"
620
+ line.product_id = self.product_2
601
621
  self.assertEqual(
602
622
  line.name, line.product_id.get_product_multiline_description_sale()
603
623
  )
@@ -1096,629 +1116,6 @@ class TestContract(TestContractBase):
1096
1116
  min(self.contract.contract_line_ids.mapped("recurring_next_date")),
1097
1117
  )
1098
1118
 
1099
- def test_date_end(self):
1100
- """recurring next date for a contract is the min for all lines"""
1101
- self.acct_line.date_end = "2018-01-01"
1102
- self.acct_line.copy()
1103
- self.acct_line.write({"date_end": False, "is_auto_renew": False})
1104
- self.assertFalse(self.contract.date_end)
1105
-
1106
- def test_cancel_contract_line(self):
1107
- """It should raise a validation error"""
1108
- self.acct_line.cancel()
1109
- with self.assertRaises(ValidationError):
1110
- self.acct_line.stop(self.today)
1111
-
1112
- def test_stop_contract_line(self):
1113
- """It should put end to the contract line"""
1114
- self.acct_line.write(
1115
- {
1116
- "date_start": self.today,
1117
- "recurring_next_date": self.today,
1118
- "date_end": self.today + relativedelta(months=7),
1119
- "is_auto_renew": True,
1120
- }
1121
- )
1122
- self.acct_line.stop(self.today + relativedelta(months=5))
1123
- self.assertEqual(self.acct_line.date_end, self.today + relativedelta(months=5))
1124
-
1125
- def test_stop_upcoming_contract_line(self):
1126
- """It should put end to the contract line"""
1127
- self.acct_line.write(
1128
- {
1129
- "date_start": self.today + relativedelta(months=3),
1130
- "recurring_next_date": self.today + relativedelta(months=3),
1131
- "date_end": self.today + relativedelta(months=7),
1132
- "is_auto_renew": True,
1133
- }
1134
- )
1135
- self.acct_line.stop(self.today)
1136
- self.assertEqual(self.acct_line.date_end, self.today + relativedelta(months=7))
1137
- self.assertTrue(self.acct_line.is_canceled)
1138
-
1139
- def test_stop_past_contract_line(self):
1140
- """Past contract line are ignored on stop"""
1141
- self.acct_line.write(
1142
- {"date_end": self.today + relativedelta(months=5), "is_auto_renew": True}
1143
- )
1144
- self.acct_line.stop(self.today + relativedelta(months=7))
1145
- self.assertEqual(self.acct_line.date_end, self.today + relativedelta(months=5))
1146
-
1147
- def test_stop_contract_line_without_date_end(self):
1148
- """Past contract line are ignored on stop"""
1149
- self.acct_line.write({"date_end": False, "is_auto_renew": False})
1150
- self.acct_line.stop(self.today + relativedelta(months=7))
1151
- self.assertEqual(self.acct_line.date_end, self.today + relativedelta(months=7))
1152
-
1153
- def test_stop_wizard(self):
1154
- self.acct_line.write(
1155
- {
1156
- "date_start": self.today,
1157
- "recurring_next_date": self.today,
1158
- "date_end": self.today + relativedelta(months=5),
1159
- "is_auto_renew": True,
1160
- }
1161
- )
1162
- wizard = self.env["contract.line.wizard"].create(
1163
- {
1164
- "date_end": self.today + relativedelta(months=3),
1165
- "contract_line_id": self.acct_line.id,
1166
- }
1167
- )
1168
- wizard.stop()
1169
- self.assertEqual(self.acct_line.date_end, self.today + relativedelta(months=3))
1170
- self.assertFalse(self.acct_line.is_auto_renew)
1171
-
1172
- def test_stop_plan_successor_contract_line_0(self):
1173
- successor_contract_line = self.acct_line.copy(
1174
- {
1175
- "date_start": self.today + relativedelta(months=5),
1176
- "recurring_next_date": self.today + relativedelta(months=5),
1177
- }
1178
- )
1179
- self.acct_line.write(
1180
- {
1181
- "successor_contract_line_id": successor_contract_line.id,
1182
- "is_auto_renew": False,
1183
- "date_end": self.today,
1184
- }
1185
- )
1186
- suspension_start = self.today + relativedelta(months=5)
1187
- suspension_end = self.today + relativedelta(months=6)
1188
- with self.assertRaises(ValidationError):
1189
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1190
-
1191
- def test_stop_plan_successor_contract_line_1(self):
1192
- """
1193
- * contract line end's before the suspension period:
1194
- -> apply stop
1195
- """
1196
- suspension_start = self.today + relativedelta(months=5)
1197
- suspension_end = self.today + relativedelta(months=6)
1198
- start_date = self.today
1199
- end_date = self.today + relativedelta(months=4)
1200
- self.acct_line.write(
1201
- {
1202
- "date_start": start_date,
1203
- "recurring_next_date": start_date,
1204
- "date_end": end_date,
1205
- }
1206
- )
1207
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1208
- self.assertEqual(self.acct_line.date_end, end_date)
1209
- new_line = self.env["contract.line"].search(
1210
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1211
- )
1212
- self.assertFalse(new_line)
1213
-
1214
- def test_stop_plan_successor_contract_line_2(self):
1215
- """
1216
- * contract line start before the suspension period and end in it
1217
- -> apply stop at suspension start date
1218
- -> apply plan successor:
1219
- - date_start: suspension.date_end
1220
- - date_end: suspension.date_end + (contract_line.date_end
1221
- - suspension.date_start)
1222
- """
1223
- suspension_start = self.today + relativedelta(months=3)
1224
- suspension_end = self.today + relativedelta(months=5)
1225
- start_date = self.today
1226
- end_date = self.today + relativedelta(months=4)
1227
- self.acct_line.write(
1228
- {
1229
- "date_start": start_date,
1230
- "recurring_next_date": start_date,
1231
- "date_end": end_date,
1232
- }
1233
- )
1234
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1235
- self.assertEqual(
1236
- self.acct_line.date_end, suspension_start - relativedelta(days=1)
1237
- )
1238
- new_line = self.env["contract.line"].search(
1239
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1240
- )
1241
- self.assertTrue(new_line)
1242
- new_date_end = (
1243
- suspension_end + (end_date - suspension_start) + relativedelta(days=1)
1244
- )
1245
- self.assertEqual(new_line.date_start, suspension_end + relativedelta(days=1))
1246
- self.assertEqual(new_line.date_end, new_date_end)
1247
- self.assertTrue(self.acct_line.manual_renew_needed)
1248
-
1249
- def test_stop_plan_successor_contract_line_3(self):
1250
- """
1251
- * contract line start before the suspension period and end after it
1252
- -> apply stop at suspension start date
1253
- -> apply plan successor:
1254
- - date_start: suspension.date_end
1255
- - date_end: suspension.date_end + (suspension.date_end
1256
- - suspension.date_start)
1257
- """
1258
- suspension_start = self.today + relativedelta(months=3)
1259
- suspension_end = self.today + relativedelta(months=5)
1260
- start_date = self.today
1261
- end_date = self.today + relativedelta(months=6)
1262
- self.acct_line.write(
1263
- {
1264
- "date_start": start_date,
1265
- "recurring_next_date": start_date,
1266
- "date_end": end_date,
1267
- }
1268
- )
1269
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1270
- self.assertEqual(
1271
- self.acct_line.date_end, suspension_start - relativedelta(days=1)
1272
- )
1273
- new_line = self.env["contract.line"].search(
1274
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1275
- )
1276
- self.assertTrue(new_line)
1277
- new_date_end = (
1278
- end_date + (suspension_end - suspension_start) + relativedelta(days=1)
1279
- )
1280
- self.assertEqual(new_line.date_start, suspension_end + relativedelta(days=1))
1281
- self.assertEqual(new_line.date_end, new_date_end)
1282
- self.assertTrue(self.acct_line.manual_renew_needed)
1283
-
1284
- def test_stop_plan_successor_contract_line_3_without_end_date(self):
1285
- """
1286
- * contract line start before the suspension period and end after it
1287
- -> apply stop at suspension start date
1288
- -> apply plan successor:
1289
- - date_start: suspension.date_end
1290
- - date_end: suspension.date_end + (suspension.date_end
1291
- - suspension.date_start)
1292
- """
1293
- suspension_start = self.today + relativedelta(months=3)
1294
- suspension_end = self.today + relativedelta(months=5)
1295
- start_date = self.today
1296
- end_date = False
1297
- self.acct_line.write(
1298
- {
1299
- "date_start": start_date,
1300
- "recurring_next_date": start_date,
1301
- "date_end": end_date,
1302
- "is_auto_renew": False,
1303
- }
1304
- )
1305
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, False)
1306
- self.assertEqual(
1307
- self.acct_line.date_end, suspension_start - relativedelta(days=1)
1308
- )
1309
- new_line = self.env["contract.line"].search(
1310
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1311
- )
1312
- self.assertTrue(new_line)
1313
- self.assertEqual(new_line.date_start, suspension_end + relativedelta(days=1))
1314
- self.assertFalse(new_line.date_end)
1315
- self.assertTrue(self.acct_line.manual_renew_needed)
1316
-
1317
- def test_stop_plan_successor_contract_line_4(self):
1318
- """
1319
- * contract line start and end's in the suspension period
1320
- -> apply delay
1321
- - delay: suspension.date_end - contract_line.end_date
1322
- """
1323
- suspension_start = self.today + relativedelta(months=2)
1324
- suspension_end = self.today + relativedelta(months=5)
1325
- start_date = self.today + relativedelta(months=3)
1326
- end_date = self.today + relativedelta(months=4)
1327
- self.acct_line.write(
1328
- {
1329
- "date_start": start_date,
1330
- "recurring_next_date": start_date,
1331
- "date_end": end_date,
1332
- }
1333
- )
1334
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1335
- self.assertEqual(
1336
- self.acct_line.date_start,
1337
- start_date + (suspension_end - start_date) + timedelta(days=1),
1338
- )
1339
- self.assertEqual(
1340
- self.acct_line.date_end,
1341
- end_date + (suspension_end - start_date) + timedelta(days=1),
1342
- )
1343
- new_line = self.env["contract.line"].search(
1344
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1345
- )
1346
- self.assertFalse(new_line)
1347
-
1348
- def test_stop_plan_successor_contract_line_5(self):
1349
- """
1350
- * contract line start in the suspension period and end after it
1351
- -> apply delay
1352
- - delay: suspension.date_end - contract_line.date_start
1353
- """
1354
- suspension_start = self.today + relativedelta(months=2)
1355
- suspension_end = self.today + relativedelta(months=5)
1356
- start_date = self.today + relativedelta(months=3)
1357
- end_date = self.today + relativedelta(months=6)
1358
- self.acct_line.write(
1359
- {
1360
- "date_start": start_date,
1361
- "recurring_next_date": start_date,
1362
- "date_end": end_date,
1363
- }
1364
- )
1365
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1366
- self.assertEqual(
1367
- self.acct_line.date_start,
1368
- start_date + (suspension_end - start_date) + timedelta(days=1),
1369
- )
1370
- self.assertEqual(
1371
- self.acct_line.date_end,
1372
- end_date + (suspension_end - start_date) + timedelta(days=1),
1373
- )
1374
- new_line = self.env["contract.line"].search(
1375
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1376
- )
1377
- self.assertFalse(new_line)
1378
-
1379
- def test_stop_plan_successor_contract_line_5_without_date_end(self):
1380
- """
1381
- * contract line start in the suspension period and end after it
1382
- -> apply delay
1383
- - delay: suspension.date_end - contract_line.date_start
1384
- """
1385
- suspension_start = self.today + relativedelta(months=2)
1386
- suspension_end = self.today + relativedelta(months=5)
1387
- start_date = self.today + relativedelta(months=3)
1388
- end_date = False
1389
- self.acct_line.write(
1390
- {
1391
- "date_start": start_date,
1392
- "recurring_next_date": start_date,
1393
- "date_end": end_date,
1394
- "is_auto_renew": False,
1395
- }
1396
- )
1397
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1398
- self.assertEqual(
1399
- self.acct_line.date_start,
1400
- start_date + (suspension_end - start_date) + timedelta(days=1),
1401
- )
1402
- self.assertFalse(self.acct_line.date_end)
1403
- new_line = self.env["contract.line"].search(
1404
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1405
- )
1406
- self.assertFalse(new_line)
1407
-
1408
- def test_stop_plan_successor_contract_line_6(self):
1409
- """
1410
- * contract line start and end after the suspension period
1411
- -> apply delay
1412
- - delay: suspension.date_end - suspension.start_date
1413
- """
1414
- suspension_start = self.today + relativedelta(months=2)
1415
- suspension_end = self.today + relativedelta(months=3)
1416
- start_date = self.today + relativedelta(months=4)
1417
- end_date = self.today + relativedelta(months=6)
1418
- self.acct_line.write(
1419
- {
1420
- "date_start": start_date,
1421
- "recurring_next_date": start_date,
1422
- "date_end": end_date,
1423
- }
1424
- )
1425
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1426
- self.assertEqual(
1427
- self.acct_line.date_start,
1428
- start_date + (suspension_end - suspension_start) + timedelta(days=1),
1429
- )
1430
- self.assertEqual(
1431
- self.acct_line.date_end,
1432
- end_date + (suspension_end - suspension_start) + timedelta(days=1),
1433
- )
1434
- new_line = self.env["contract.line"].search(
1435
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1436
- )
1437
- self.assertFalse(new_line)
1438
-
1439
- def test_stop_plan_successor_contract_line_6_without_date_end(self):
1440
- """
1441
- * contract line start and end after the suspension period
1442
- -> apply delay
1443
- - delay: suspension.date_end - suspension.start_date
1444
- """
1445
- suspension_start = self.today + relativedelta(months=2)
1446
- suspension_end = self.today + relativedelta(months=3)
1447
- start_date = self.today + relativedelta(months=4)
1448
- end_date = False
1449
- self.acct_line.write(
1450
- {
1451
- "date_start": start_date,
1452
- "recurring_next_date": start_date,
1453
- "date_end": end_date,
1454
- "is_auto_renew": False,
1455
- }
1456
- )
1457
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1458
- self.assertEqual(
1459
- self.acct_line.date_start,
1460
- start_date + (suspension_end - suspension_start) + timedelta(days=1),
1461
- )
1462
- self.assertFalse(self.acct_line.date_end)
1463
- new_line = self.env["contract.line"].search(
1464
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1465
- )
1466
- self.assertFalse(new_line)
1467
-
1468
- def test_stop_plan_successor_wizard(self):
1469
- suspension_start = self.today + relativedelta(months=2)
1470
- suspension_end = self.today + relativedelta(months=3)
1471
- start_date = self.today + relativedelta(months=4)
1472
- end_date = self.today + relativedelta(months=6)
1473
- self.acct_line.write(
1474
- {
1475
- "date_start": start_date,
1476
- "recurring_next_date": start_date,
1477
- "date_end": end_date,
1478
- }
1479
- )
1480
- wizard = self.env["contract.line.wizard"].create(
1481
- {
1482
- "date_start": suspension_start,
1483
- "date_end": suspension_end,
1484
- "is_auto_renew": False,
1485
- "contract_line_id": self.acct_line.id,
1486
- }
1487
- )
1488
- wizard.stop_plan_successor()
1489
- self.assertEqual(
1490
- self.acct_line.date_start,
1491
- start_date + (suspension_end - suspension_start) + timedelta(days=1),
1492
- )
1493
- self.assertEqual(
1494
- self.acct_line.date_end,
1495
- end_date + (suspension_end - suspension_start) + timedelta(days=1),
1496
- )
1497
- new_line = self.env["contract.line"].search(
1498
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1499
- )
1500
- self.assertFalse(new_line)
1501
-
1502
- def test_plan_successor_contract_line(self):
1503
- self.acct_line.write(
1504
- {
1505
- "date_start": self.today,
1506
- "recurring_next_date": self.today,
1507
- "date_end": self.today + relativedelta(months=3),
1508
- "is_auto_renew": False,
1509
- }
1510
- )
1511
- self.acct_line.plan_successor(
1512
- self.today + relativedelta(months=5),
1513
- self.today + relativedelta(months=7),
1514
- True,
1515
- )
1516
- new_line = self.env["contract.line"].search(
1517
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1518
- )
1519
- self.assertFalse(self.acct_line.is_auto_renew)
1520
- self.assertTrue(new_line.is_auto_renew)
1521
- self.assertTrue(new_line, "should create a new contract line")
1522
- self.assertEqual(new_line.date_start, self.today + relativedelta(months=5))
1523
- self.assertEqual(new_line.date_end, self.today + relativedelta(months=7))
1524
-
1525
- def test_overlap(self):
1526
- self.acct_line.write(
1527
- {
1528
- "date_start": self.today,
1529
- "recurring_next_date": self.today,
1530
- "date_end": self.today + relativedelta(months=3),
1531
- "is_auto_renew": False,
1532
- }
1533
- )
1534
- self.acct_line.plan_successor(
1535
- self.today + relativedelta(months=5),
1536
- self.today + relativedelta(months=7),
1537
- True,
1538
- )
1539
- new_line = self.env["contract.line"].search(
1540
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1541
- )
1542
- with self.assertRaises(ValidationError):
1543
- new_line.date_start = self.today + relativedelta(months=2)
1544
- with self.assertRaises(ValidationError):
1545
- self.acct_line.date_end = self.today + relativedelta(months=6)
1546
-
1547
- def test_plan_successor_wizard(self):
1548
- self.acct_line.write(
1549
- {
1550
- "date_start": self.today,
1551
- "recurring_next_date": self.today,
1552
- "date_end": self.today + relativedelta(months=2),
1553
- "is_auto_renew": False,
1554
- }
1555
- )
1556
- wizard = self.env["contract.line.wizard"].create(
1557
- {
1558
- "date_start": self.today + relativedelta(months=3),
1559
- "date_end": self.today + relativedelta(months=5),
1560
- "is_auto_renew": True,
1561
- "contract_line_id": self.acct_line.id,
1562
- }
1563
- )
1564
- wizard.plan_successor()
1565
- new_line = self.env["contract.line"].search(
1566
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1567
- )
1568
- self.assertFalse(self.acct_line.is_auto_renew)
1569
- self.assertTrue(new_line.is_auto_renew)
1570
- self.assertTrue(new_line, "should create a new contract line")
1571
- self.assertEqual(new_line.date_start, self.today + relativedelta(months=3))
1572
- self.assertEqual(new_line.date_end, self.today + relativedelta(months=5))
1573
-
1574
- def test_cancel(self):
1575
- self.acct_line.write(
1576
- {"date_end": self.today + relativedelta(months=5), "is_auto_renew": True}
1577
- )
1578
- self.acct_line.cancel()
1579
- self.assertTrue(self.acct_line.is_canceled)
1580
- self.assertFalse(self.acct_line.is_auto_renew)
1581
- with self.assertRaises(ValidationError):
1582
- self.acct_line.is_auto_renew = True
1583
- self.acct_line.uncancel(self.today)
1584
- self.assertFalse(self.acct_line.is_canceled)
1585
-
1586
- def test_uncancel_wizard(self):
1587
- self.acct_line.cancel()
1588
- self.assertTrue(self.acct_line.is_canceled)
1589
- wizard = self.env["contract.line.wizard"].create(
1590
- {"recurring_next_date": self.today, "contract_line_id": self.acct_line.id}
1591
- )
1592
- wizard.uncancel()
1593
- self.assertFalse(self.acct_line.is_canceled)
1594
-
1595
- def test_cancel_uncancel_with_predecessor(self):
1596
- suspension_start = self.today + relativedelta(months=3)
1597
- suspension_end = self.today + relativedelta(months=5)
1598
- start_date = self.today
1599
- end_date = self.today + relativedelta(months=4)
1600
- self.acct_line.write(
1601
- {
1602
- "date_start": start_date,
1603
- "recurring_next_date": start_date,
1604
- "date_end": end_date,
1605
- }
1606
- )
1607
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1608
- self.assertEqual(
1609
- self.acct_line.date_end, suspension_start - relativedelta(days=1)
1610
- )
1611
- new_line = self.env["contract.line"].search(
1612
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1613
- )
1614
- self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
1615
- new_line.cancel()
1616
- self.assertTrue(new_line.is_canceled)
1617
- self.assertFalse(self.acct_line.successor_contract_line_id)
1618
- self.assertEqual(new_line.predecessor_contract_line_id, self.acct_line)
1619
- new_line.uncancel(suspension_end + relativedelta(days=1))
1620
- self.assertFalse(new_line.is_canceled)
1621
- self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
1622
- self.assertEqual(
1623
- new_line.recurring_next_date,
1624
- suspension_end + relativedelta(days=1),
1625
- )
1626
-
1627
- def test_cancel_uncancel_with_predecessor_has_successor(self):
1628
- suspension_start = self.today + relativedelta(months=6)
1629
- suspension_end = self.today + relativedelta(months=7)
1630
- start_date = self.today
1631
- end_date = self.today + relativedelta(months=8)
1632
- self.acct_line.write(
1633
- {
1634
- "date_start": start_date,
1635
- "recurring_next_date": start_date,
1636
- "date_end": end_date,
1637
- }
1638
- )
1639
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1640
- new_line = self.env["contract.line"].search(
1641
- [("predecessor_contract_line_id", "=", self.acct_line.id)]
1642
- )
1643
- new_line.cancel()
1644
- suspension_start = self.today + relativedelta(months=4)
1645
- suspension_end = self.today + relativedelta(months=5)
1646
- self.acct_line.stop_plan_successor(suspension_start, suspension_end, True)
1647
- with self.assertRaises(ValidationError):
1648
- new_line.uncancel(suspension_end)
1649
-
1650
- def test_check_has_not_date_end_has_successor(self):
1651
- self.acct_line.write({"date_end": False, "is_auto_renew": False})
1652
- with self.assertRaises(ValidationError):
1653
- self.acct_line.plan_successor(
1654
- to_date("2016-03-01"), to_date("2016-09-01"), False
1655
- )
1656
-
1657
- def test_check_has_not_date_end_is_auto_renew(self):
1658
- with self.assertRaises(ValidationError):
1659
- self.acct_line.write({"date_end": False, "is_auto_renew": True})
1660
-
1661
- def test_check_has_successor_is_auto_renew(self):
1662
- with self.assertRaises(ValidationError):
1663
- self.acct_line.plan_successor(
1664
- to_date("2016-03-01"), to_date("2018-09-01"), False
1665
- )
1666
-
1667
- def test_search_contract_line_to_renew(self):
1668
- self.acct_line.write({"date_end": self.today, "is_auto_renew": True})
1669
- line_1 = self.acct_line.copy({"date_end": self.today + relativedelta(months=1)})
1670
- line_2 = self.acct_line.copy({"date_end": self.today - relativedelta(months=1)})
1671
- line_3 = self.acct_line.copy({"date_end": self.today - relativedelta(months=2)})
1672
- line_4 = self.acct_line.copy({"date_end": self.today + relativedelta(months=2)})
1673
- to_renew = self.acct_line.search(
1674
- self.acct_line._contract_line_to_renew_domain()
1675
- )
1676
- self.assertEqual(set(to_renew), {self.acct_line, line_1, line_2, line_3})
1677
- self.acct_line.cron_renew_contract_line()
1678
- self.assertTrue(self.acct_line.successor_contract_line_id)
1679
- self.assertTrue(line_1.successor_contract_line_id)
1680
- self.assertTrue(line_2.successor_contract_line_id)
1681
- self.assertTrue(line_3.successor_contract_line_id)
1682
- self.assertFalse(line_4.successor_contract_line_id)
1683
-
1684
- def test_renew_create_new_line(self):
1685
- date_start = self.today - relativedelta(months=9)
1686
- date_end = date_start + relativedelta(months=12) - relativedelta(days=1)
1687
- self.acct_line.write(
1688
- {
1689
- "is_auto_renew": True,
1690
- "date_start": date_start,
1691
- "recurring_next_date": date_start,
1692
- "date_end": self.today,
1693
- }
1694
- )
1695
- self.acct_line._onchange_is_auto_renew()
1696
- self.assertEqual(self.acct_line.date_end, date_end)
1697
- new_line = self.acct_line.renew()
1698
- self.assertFalse(self.acct_line.is_auto_renew)
1699
- self.assertTrue(new_line.is_auto_renew)
1700
- self.assertEqual(new_line.date_start, date_start + relativedelta(months=12))
1701
- self.assertEqual(new_line.date_end, date_end + relativedelta(months=12))
1702
-
1703
- def test_renew_extend_original_line(self):
1704
- self.contract.company_id.create_new_line_at_contract_line_renew = False
1705
- date_start = self.today - relativedelta(months=9)
1706
- date_end = date_start + relativedelta(months=12) - relativedelta(days=1)
1707
- self.acct_line.write(
1708
- {
1709
- "is_auto_renew": True,
1710
- "date_start": date_start,
1711
- "recurring_next_date": date_start,
1712
- "date_end": self.today,
1713
- }
1714
- )
1715
- self.acct_line._onchange_is_auto_renew()
1716
- self.assertEqual(self.acct_line.date_end, date_end)
1717
- self.acct_line.renew()
1718
- self.assertTrue(self.acct_line.is_auto_renew)
1719
- self.assertEqual(self.acct_line.date_start, date_start)
1720
- self.assertEqual(self.acct_line.date_end, date_end + relativedelta(months=12))
1721
-
1722
1119
  def test_cron_recurring_create_invoice(self):
1723
1120
  self.acct_line.date_start = "2018-01-01"
1724
1121
  self.acct_line.recurring_invoicing_type = "post-paid"
@@ -1760,7 +1157,6 @@ class TestContract(TestContractBase):
1760
1157
  )
1761
1158
  self.assertEqual(first, to_date("2018-03-01"))
1762
1159
  self.assertEqual(last, to_date("2018-03-15"))
1763
- self.acct_line.manual_renew_needed = True
1764
1160
 
1765
1161
  def test_get_period_to_invoice_monthlylastday_prepaid(self):
1766
1162
  self.acct_line.date_start = "2018-01-05"
@@ -1950,140 +1346,6 @@ class TestContract(TestContractBase):
1950
1346
  self.assertEqual(first, to_date("2020-01-05"))
1951
1347
  self.assertEqual(last, to_date("2020-03-15"))
1952
1348
 
1953
- def test_unlink(self):
1954
- with self.assertRaises(ValidationError):
1955
- self.acct_line.unlink()
1956
-
1957
- def test_contract_line_state(self):
1958
- lines = self.env["contract.line"]
1959
- # upcoming
1960
- lines |= self.acct_line.copy(
1961
- {
1962
- "date_start": self.today + relativedelta(months=3),
1963
- "recurring_next_date": self.today + relativedelta(months=3),
1964
- "date_end": self.today + relativedelta(months=5),
1965
- }
1966
- )
1967
- # in-progress
1968
- lines |= self.acct_line.copy(
1969
- {
1970
- "date_start": self.today,
1971
- "recurring_next_date": self.today,
1972
- "date_end": self.today + relativedelta(months=5),
1973
- }
1974
- )
1975
- # in-progress
1976
- lines |= self.acct_line.copy(
1977
- {
1978
- "date_start": self.today,
1979
- "recurring_next_date": self.today,
1980
- "date_end": self.today + relativedelta(months=5),
1981
- "manual_renew_needed": True,
1982
- }
1983
- )
1984
- # to-renew
1985
- lines |= self.acct_line.copy(
1986
- {
1987
- "date_start": self.today - relativedelta(months=5),
1988
- "recurring_next_date": self.today - relativedelta(months=5),
1989
- "date_end": self.today - relativedelta(months=2),
1990
- "manual_renew_needed": True,
1991
- }
1992
- )
1993
- # upcoming-close
1994
- lines |= self.acct_line.copy(
1995
- {
1996
- "date_start": self.today - relativedelta(months=5),
1997
- "recurring_next_date": self.today - relativedelta(months=5),
1998
- "date_end": self.today + relativedelta(days=20),
1999
- "is_auto_renew": False,
2000
- }
2001
- )
2002
- # closed
2003
- lines |= self.acct_line.copy(
2004
- {
2005
- "date_start": self.today - relativedelta(months=5),
2006
- "recurring_next_date": self.today - relativedelta(months=5),
2007
- "date_end": self.today - relativedelta(months=2),
2008
- "is_auto_renew": False,
2009
- }
2010
- )
2011
- # canceled
2012
- lines |= self.acct_line.copy(
2013
- {
2014
- "date_start": self.today - relativedelta(months=5),
2015
- "recurring_next_date": self.today - relativedelta(months=5),
2016
- "date_end": self.today - relativedelta(months=2),
2017
- "is_canceled": True,
2018
- }
2019
- )
2020
- # section
2021
- lines |= self.env["contract.line"].create(
2022
- {
2023
- "contract_id": self.contract.id,
2024
- "display_type": "line_section",
2025
- "name": "Test section",
2026
- }
2027
- )
2028
- states = [
2029
- "upcoming",
2030
- "in-progress",
2031
- "to-renew",
2032
- "upcoming-close",
2033
- "closed",
2034
- "canceled",
2035
- False,
2036
- ]
2037
- self.assertEqual(set(lines.mapped("state")), set(states))
2038
- # Test search method
2039
- lines.flush_recordset() # Needed for computed stored fields
2040
- # like termination_notice_date
2041
- for state in states:
2042
- lines = self.env["contract.line"].search([("state", "=", state)])
2043
- self.assertTrue(lines, state)
2044
- self.assertTrue(state in lines.mapped("state"), state)
2045
- lines = self.env["contract.line"].search([("state", "!=", state)])
2046
- self.assertFalse(state in lines.mapped("state"), state)
2047
- lines = self.env["contract.line"].search([("state", "in", states)])
2048
- self.assertEqual(set(lines.mapped("state")), set(states))
2049
- lines = self.env["contract.line"].search([("state", "in", [])])
2050
- self.assertFalse(lines.mapped("state"))
2051
- with self.assertRaises(TypeError):
2052
- self.env["contract.line"].search([("state", "in", "upcoming")])
2053
- lines = self.env["contract.line"].search([("state", "not in", [])])
2054
- self.assertEqual(set(lines.mapped("state")), set(states))
2055
- lines = self.env["contract.line"].search([("state", "not in", states)])
2056
- self.assertFalse(lines.mapped("state"))
2057
- state2 = ["upcoming", "in-progress"]
2058
- lines = self.env["contract.line"].search([("state", "not in", state2)])
2059
- self.assertEqual(set(lines.mapped("state")), set(states) - set(state2))
2060
-
2061
- def test_check_auto_renew_contract_line_with_successor(self):
2062
- """
2063
- A contract line with a successor can't be set to auto-renew
2064
- """
2065
- successor_contract_line = self.acct_line.copy()
2066
- with self.assertRaises(ValidationError):
2067
- self.acct_line.write(
2068
- {
2069
- "is_auto_renew": True,
2070
- "successor_contract_line_id": successor_contract_line.id,
2071
- }
2072
- )
2073
-
2074
- def test_check_no_date_end_contract_line_with_successor(self):
2075
- """
2076
- A contract line with a successor must have a end date
2077
- """
2078
- successor_contract_line = self.acct_line.copy()
2079
- with self.assertRaises(ValidationError):
2080
- self.acct_line.write(
2081
- {
2082
- "date_end": False,
2083
- "successor_contract_line_id": successor_contract_line.id,
2084
- }
2085
- )
2086
-
2087
1349
  def test_check_last_date_invoiced_1(self):
2088
1350
  """
2089
1351
  start end can't be before the date of last invoice
@@ -2106,49 +1368,11 @@ class TestContract(TestContractBase):
2106
1368
  {"last_date_invoiced": self.acct_line.date_end + relativedelta(days=1)}
2107
1369
  )
2108
1370
 
2109
- def test_delay_invoiced_contract_line(self):
2110
- self.acct_line.write(
2111
- {"last_date_invoiced": self.acct_line.date_start + relativedelta(days=1)}
2112
- )
2113
- with self.assertRaises(ValidationError):
2114
- self.acct_line._delay(relativedelta(months=1))
2115
-
2116
- def test_cancel_invoiced_contract_line(self):
2117
- self.acct_line.write(
2118
- {"last_date_invoiced": self.acct_line.date_start + relativedelta(days=1)}
2119
- )
2120
- with self.assertRaises(ValidationError):
2121
- self.acct_line.cancel()
2122
-
2123
- def test_action_uncancel(self):
2124
- action = self.acct_line.action_uncancel()
2125
- self.assertEqual(
2126
- action["context"]["default_contract_line_id"], self.acct_line.id
2127
- )
2128
-
2129
- def test_action_plan_successor(self):
2130
- action = self.acct_line.action_plan_successor()
2131
- self.assertEqual(
2132
- action["context"]["default_contract_line_id"], self.acct_line.id
2133
- )
2134
-
2135
- def test_action_stop(self):
2136
- action = self.acct_line.action_stop()
2137
- self.assertEqual(
2138
- action["context"]["default_contract_line_id"], self.acct_line.id
2139
- )
2140
-
2141
- def test_action_stop_plan_successor(self):
2142
- action = self.acct_line.action_stop_plan_successor()
2143
- self.assertEqual(
2144
- action["context"]["default_contract_line_id"], self.acct_line.id
2145
- )
2146
-
2147
1371
  def test_purchase_get_view(self):
2148
1372
  purchase_tree_view = self.env.ref("contract.contract_line_supplier_tree_view")
2149
1373
  purchase_form_view = self.env.ref("contract.contract_line_supplier_form_view")
2150
1374
  view = self.acct_line.with_context(default_contract_type="purchase").get_view(
2151
- view_type="tree"
1375
+ view_type="list"
2152
1376
  )
2153
1377
  self.assertEqual(view["id"], purchase_tree_view.id)
2154
1378
  view = self.acct_line.with_context(default_contract_type="purchase").get_view(
@@ -2221,16 +1445,9 @@ class TestContract(TestContractBase):
2221
1445
  self.assertFalse(section.create_invoice_visibility)
2222
1446
 
2223
1447
  def test_invoice_contract_without_lines(self):
2224
- self.contract.contract_line_ids.cancel()
2225
1448
  self.contract.contract_line_ids.unlink()
2226
1449
  self.assertFalse(self.contract.recurring_create_invoice())
2227
1450
 
2228
- def test_stop_at_last_date_invoiced(self):
2229
- self.contract.recurring_create_invoice()
2230
- self.assertTrue(self.acct_line.recurring_next_date)
2231
- self.acct_line.stop(self.acct_line.last_date_invoiced)
2232
- self.assertFalse(self.acct_line.recurring_next_date)
2233
-
2234
1451
  def test_check_last_date_invoiced_before_next_invoice_date(self):
2235
1452
  with self.assertRaises(ValidationError):
2236
1453
  self.acct_line.write(
@@ -2242,69 +1459,6 @@ class TestContract(TestContractBase):
2242
1459
  }
2243
1460
  )
2244
1461
 
2245
- def test_stop_and_update_recurring_invoice_date(self):
2246
- self.acct_line.write(
2247
- {
2248
- "date_start": "2019-01-01",
2249
- "date_end": "2019-12-31",
2250
- "recurring_next_date": "2020-01-01",
2251
- "recurring_invoicing_type": "post-paid",
2252
- "recurring_rule_type": "yearly",
2253
- }
2254
- )
2255
- self.acct_line.stop(to_date("2019-05-31"))
2256
- self.assertEqual(self.acct_line.date_end, to_date("2019-05-31"))
2257
- self.assertEqual(self.acct_line.recurring_next_date, to_date("2019-06-01"))
2258
-
2259
- def test_action_terminate_contract(self):
2260
- action = self.contract.action_terminate_contract()
2261
- wizard = (
2262
- self.env[action["res_model"]]
2263
- .with_context(**action["context"])
2264
- .create(
2265
- {
2266
- "terminate_date": "2018-03-01",
2267
- "terminate_reason_id": self.terminate_reason.id,
2268
- "terminate_comment": "terminate_comment",
2269
- }
2270
- )
2271
- )
2272
- self.assertEqual(wizard.contract_id, self.contract)
2273
- with self.assertRaises(UserError):
2274
- wizard.terminate_contract()
2275
- group_can_terminate_contract = self.env.ref("contract.can_terminate_contract")
2276
- group_can_terminate_contract.users |= self.env.user
2277
- wizard.terminate_contract()
2278
- self.assertTrue(self.contract.is_terminated)
2279
- self.assertEqual(self.contract.terminate_date, to_date("2018-03-01"))
2280
- self.assertEqual(self.contract.terminate_reason_id.id, self.terminate_reason.id)
2281
- self.assertEqual(self.contract.terminate_comment, "terminate_comment")
2282
- self.contract.action_cancel_contract_termination()
2283
- self.assertFalse(self.contract.is_terminated)
2284
- self.assertFalse(self.contract.terminate_reason_id)
2285
- self.assertFalse(self.contract.terminate_comment)
2286
-
2287
- def test_terminate_date_before_last_date_invoiced(self):
2288
- self.contract.recurring_create_invoice()
2289
- self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-14"))
2290
- group_can_terminate_contract = self.env.ref("contract.can_terminate_contract")
2291
- group_can_terminate_contract.users |= self.env.user
2292
- with self.assertRaises(ValidationError):
2293
- self.contract._terminate_contract(
2294
- self.terminate_reason,
2295
- "terminate_comment",
2296
- to_date("2018-02-13"),
2297
- )
2298
- # Try terminate contract line with last_date_invoiced allowed
2299
- self.contract._terminate_contract(
2300
- self.terminate_reason,
2301
- "terminate_comment",
2302
- to_date("2018-02-13"),
2303
- terminate_lines_with_last_date_invoiced=True,
2304
- )
2305
- self.assertTrue(self.contract.is_terminated)
2306
- self.assertEqual(self.acct_line.date_end, to_date("2018-02-14"))
2307
-
2308
1462
  def test_recurrency_propagation(self):
2309
1463
  # Existing contract
2310
1464
  vals = {