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.
- odoo/addons/contract/README.rst +14 -10
- odoo/addons/contract/__manifest__.py +3 -10
- odoo/addons/contract/controllers/main.py +1 -8
- odoo/addons/contract/data/contract_cron.xml +0 -2
- odoo/addons/contract/data/mail_template.xml +18 -17
- odoo/addons/contract/data/template_mail_notification.xml +1 -1
- odoo/addons/contract/i18n/am.po +146 -821
- odoo/addons/contract/i18n/ar.po +146 -821
- odoo/addons/contract/i18n/bg.po +146 -821
- odoo/addons/contract/i18n/bs.po +146 -821
- odoo/addons/contract/i18n/ca.po +835 -900
- odoo/addons/contract/i18n/ca_ES.po +146 -821
- odoo/addons/contract/i18n/contract.pot +145 -818
- odoo/addons/contract/i18n/cs.po +146 -821
- odoo/addons/contract/i18n/da.po +146 -821
- odoo/addons/contract/i18n/de.po +712 -953
- odoo/addons/contract/i18n/el_GR.po +146 -821
- odoo/addons/contract/i18n/en_GB.po +146 -821
- odoo/addons/contract/i18n/es.po +714 -947
- odoo/addons/contract/i18n/es_AR.po +550 -877
- odoo/addons/contract/i18n/es_CL.po +146 -821
- odoo/addons/contract/i18n/es_CO.po +146 -821
- odoo/addons/contract/i18n/es_CR.po +146 -821
- odoo/addons/contract/i18n/es_DO.po +146 -821
- odoo/addons/contract/i18n/es_EC.po +146 -821
- odoo/addons/contract/i18n/es_MX.po +146 -821
- odoo/addons/contract/i18n/es_PY.po +146 -821
- odoo/addons/contract/i18n/es_VE.po +146 -821
- odoo/addons/contract/i18n/et.po +146 -821
- odoo/addons/contract/i18n/eu.po +146 -821
- odoo/addons/contract/i18n/fa.po +146 -821
- odoo/addons/contract/i18n/fi.po +422 -848
- odoo/addons/contract/i18n/fr.po +713 -953
- odoo/addons/contract/i18n/fr_CA.po +146 -821
- odoo/addons/contract/i18n/fr_CH.po +146 -821
- odoo/addons/contract/i18n/fr_FR.po +454 -850
- odoo/addons/contract/i18n/gl.po +257 -846
- odoo/addons/contract/i18n/gl_ES.po +146 -821
- odoo/addons/contract/i18n/he.po +146 -821
- odoo/addons/contract/i18n/hi_IN.po +191 -831
- odoo/addons/contract/i18n/hr.po +211 -837
- odoo/addons/contract/i18n/hr_HR.po +223 -839
- odoo/addons/contract/i18n/hu.po +146 -821
- odoo/addons/contract/i18n/id.po +146 -821
- odoo/addons/contract/i18n/it.po +753 -902
- odoo/addons/contract/i18n/ja.po +146 -821
- odoo/addons/contract/i18n/ko.po +146 -821
- odoo/addons/contract/i18n/lt.po +146 -821
- odoo/addons/contract/i18n/lt_LT.po +146 -821
- odoo/addons/contract/i18n/lv.po +146 -821
- odoo/addons/contract/i18n/mk.po +146 -821
- odoo/addons/contract/i18n/mn.po +146 -821
- odoo/addons/contract/i18n/nb.po +146 -821
- odoo/addons/contract/i18n/nb_NO.po +146 -821
- odoo/addons/contract/i18n/nl.po +699 -953
- odoo/addons/contract/i18n/nl_BE.po +146 -821
- odoo/addons/contract/i18n/nl_NL.po +191 -831
- odoo/addons/contract/i18n/pl.po +146 -821
- odoo/addons/contract/i18n/pt.po +415 -839
- odoo/addons/contract/i18n/pt_BR.po +704 -947
- odoo/addons/contract/i18n/pt_PT.po +146 -821
- odoo/addons/contract/i18n/ro.po +146 -821
- odoo/addons/contract/i18n/ru.po +191 -831
- odoo/addons/contract/i18n/sk.po +146 -821
- odoo/addons/contract/i18n/sk_SK.po +146 -821
- odoo/addons/contract/i18n/sl.po +146 -821
- odoo/addons/contract/i18n/sr.po +146 -821
- odoo/addons/contract/i18n/sr@latin.po +146 -821
- odoo/addons/contract/i18n/sv.po +784 -933
- odoo/addons/contract/i18n/th.po +146 -821
- odoo/addons/contract/i18n/tr.po +611 -879
- odoo/addons/contract/i18n/tr_TR.po +221 -838
- odoo/addons/contract/i18n/uk.po +146 -821
- odoo/addons/contract/i18n/vi.po +146 -821
- odoo/addons/contract/i18n/vi_VN.po +146 -821
- odoo/addons/contract/i18n/zh_CN.po +407 -840
- odoo/addons/contract/i18n/zh_TW.po +150 -822
- odoo/addons/contract/migrations/18.0.2.0.0/end-migrate.py +27 -0
- odoo/addons/contract/migrations/18.0.2.0.0/pre-migrate.py +94 -0
- odoo/addons/contract/models/__init__.py +2 -6
- odoo/addons/contract/models/account_move.py +0 -8
- odoo/addons/contract/models/account_move_line.py +14 -0
- odoo/addons/contract/models/contract.py +272 -308
- odoo/addons/contract/models/contract_line.py +37 -859
- odoo/addons/contract/models/{contract_recurrency_mixin.py → contract_recurring_mixin.py} +101 -82
- odoo/addons/contract/models/contract_tag.py +1 -3
- odoo/addons/contract/models/contract_template.py +81 -2
- odoo/addons/contract/models/contract_template_line.py +250 -3
- odoo/addons/contract/report/contract_views.xml +0 -2
- odoo/addons/contract/report/report_contract.xml +13 -13
- odoo/addons/contract/security/contract_security.xml +6 -15
- odoo/addons/contract/security/contract_tag.xml +1 -3
- odoo/addons/contract/security/ir.model.access.csv +0 -2
- odoo/addons/contract/static/description/index.html +24 -18
- odoo/addons/contract/static/src/img/contract_icon.svg +4 -0
- odoo/addons/contract/static/src/js/contract_portal_tour.esm.js +6 -4
- odoo/addons/contract/tests/test_contract.py +82 -928
- odoo/addons/contract/tests/test_multicompany.py +5 -4
- odoo/addons/contract/tests/test_portal.py +6 -3
- odoo/addons/contract/views/contract.xml +92 -235
- odoo/addons/contract/views/contract_line.xml +48 -117
- odoo/addons/contract/views/contract_portal_templates.xml +187 -224
- odoo/addons/contract/views/contract_tag.xml +3 -3
- odoo/addons/contract/views/contract_template.xml +100 -72
- odoo/addons/contract/views/contract_template_line.xml +76 -5
- odoo/addons/contract/views/res_config_settings.xml +5 -6
- odoo/addons/contract/views/res_partner_view.xml +0 -5
- odoo/addons/contract/wizards/__init__.py +0 -2
- odoo/addons/contract/wizards/contract_manually_create_invoice.py +6 -6
- odoo/addons/contract/wizards/contract_manually_create_invoice.xml +2 -3
- {odoo_addon_contract-17.0.1.4.3.2.dist-info → odoo_addon_contract-18.0.2.0.8.dist-info}/METADATA +18 -13
- odoo_addon_contract-18.0.2.0.8.dist-info/RECORD +132 -0
- {odoo_addon_contract-17.0.1.4.3.2.dist-info → odoo_addon_contract-18.0.2.0.8.dist-info}/WHEEL +1 -1
- odoo/addons/contract/data/contract_renew_cron.xml +0 -14
- odoo/addons/contract/models/abstract_contract.py +0 -82
- odoo/addons/contract/models/abstract_contract_line.py +0 -271
- odoo/addons/contract/models/contract_line_constraints.py +0 -429
- odoo/addons/contract/models/contract_terminate_reason.py +0 -14
- odoo/addons/contract/models/res_company.py +0 -15
- odoo/addons/contract/models/res_config_settings.py +0 -18
- odoo/addons/contract/security/contract_terminate_reason.xml +0 -23
- odoo/addons/contract/security/groups.xml +0 -9
- odoo/addons/contract/views/abstract_contract_line.xml +0 -117
- odoo/addons/contract/views/contract_terminate_reason.xml +0 -38
- odoo/addons/contract/wizards/contract_contract_terminate.py +0 -42
- odoo/addons/contract/wizards/contract_contract_terminate.xml +0 -33
- odoo/addons/contract/wizards/contract_line_wizard.py +0 -53
- odoo/addons/contract/wizards/contract_line_wizard.xml +0 -111
- odoo_addon_contract-17.0.1.4.3.2.dist-info/RECORD +0 -143
- {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
|
|
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
|
-
[
|
|
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
|
-
(
|
|
61
|
-
(
|
|
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
|
-
(
|
|
225
|
-
|
|
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.
|
|
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
|
-
(
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
-
|
|
600
|
-
line.
|
|
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="
|
|
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 = {
|