mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[IMP] contract: black, isort, prettier
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
"category": "Contract Management",
|
"category": "Contract Management",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"author": "Tecnativa, ACSONE SA/NV, Odoo Community Association (OCA)",
|
"author": "Tecnativa, ACSONE SA/NV, Odoo Community Association (OCA)",
|
||||||
"website": "https://github.com/oca/contract",
|
"website": "https://github.com/OCA/contract",
|
||||||
"depends": ["base", "account", "product", "portal"],
|
"depends": ["base", "account", "product", "portal"],
|
||||||
"external_dependencies": {"python": ["dateutil"]},
|
"external_dependencies": {"python": ["dateutil"]},
|
||||||
"data": [
|
"data": [
|
||||||
|
|||||||
@@ -34,7 +34,9 @@ class ContractAbstractContractLine(models.AbstractModel):
|
|||||||
inverse="_inverse_price_unit",
|
inverse="_inverse_price_unit",
|
||||||
)
|
)
|
||||||
price_subtotal = fields.Float(
|
price_subtotal = fields.Float(
|
||||||
compute="_compute_price_subtotal", digits="Account", string="Sub Total",
|
compute="_compute_price_subtotal",
|
||||||
|
digits="Account",
|
||||||
|
string="Sub Total",
|
||||||
)
|
)
|
||||||
discount = fields.Float(
|
discount = fields.Float(
|
||||||
string="Discount (%)",
|
string="Discount (%)",
|
||||||
@@ -69,13 +71,18 @@ class ContractAbstractContractLine(models.AbstractModel):
|
|||||||
copy=True,
|
copy=True,
|
||||||
)
|
)
|
||||||
date_start = fields.Date(
|
date_start = fields.Date(
|
||||||
compute="_compute_date_start", store=True, readonly=False, copy=True,
|
compute="_compute_date_start",
|
||||||
|
store=True,
|
||||||
|
readonly=False,
|
||||||
|
copy=True,
|
||||||
)
|
)
|
||||||
last_date_invoiced = fields.Date(string="Last Date Invoiced")
|
last_date_invoiced = fields.Date(string="Last Date Invoiced")
|
||||||
is_canceled = fields.Boolean(string="Canceled", default=False)
|
is_canceled = fields.Boolean(string="Canceled", default=False)
|
||||||
is_auto_renew = fields.Boolean(string="Auto Renew", default=False)
|
is_auto_renew = fields.Boolean(string="Auto Renew", default=False)
|
||||||
auto_renew_interval = fields.Integer(
|
auto_renew_interval = fields.Integer(
|
||||||
default=1, string="Renew Every", help="Renew every (Days/Week/Month/Year)",
|
default=1,
|
||||||
|
string="Renew Every",
|
||||||
|
help="Renew every (Days/Week/Month/Year)",
|
||||||
)
|
)
|
||||||
auto_renew_rule_type = fields.Selection(
|
auto_renew_rule_type = fields.Selection(
|
||||||
[
|
[
|
||||||
@@ -184,7 +191,10 @@ class ContractAbstractContractLine(models.AbstractModel):
|
|||||||
).property_product_pricelist
|
).property_product_pricelist
|
||||||
)
|
)
|
||||||
product = line.product_id.with_context(
|
product = line.product_id.with_context(
|
||||||
quantity=line.env.context.get("contract_line_qty", line.quantity,),
|
quantity=line.env.context.get(
|
||||||
|
"contract_line_qty",
|
||||||
|
line.quantity,
|
||||||
|
),
|
||||||
pricelist=pricelist.id,
|
pricelist=pricelist.id,
|
||||||
partner=line.contract_id.partner_id.id,
|
partner=line.contract_id.partner_id.id,
|
||||||
date=line.env.context.get(
|
date=line.env.context.get(
|
||||||
|
|||||||
@@ -25,10 +25,16 @@ class ContractContract(models.Model):
|
|||||||
"portal.mixin",
|
"portal.mixin",
|
||||||
]
|
]
|
||||||
|
|
||||||
active = fields.Boolean(default=True,)
|
active = fields.Boolean(
|
||||||
code = fields.Char(string="Reference",)
|
default=True,
|
||||||
|
)
|
||||||
|
code = fields.Char(
|
||||||
|
string="Reference",
|
||||||
|
)
|
||||||
group_id = fields.Many2one(
|
group_id = fields.Many2one(
|
||||||
string="Group", comodel_name="account.analytic.account", ondelete="restrict",
|
string="Group",
|
||||||
|
comodel_name="account.analytic.account",
|
||||||
|
ondelete="restrict",
|
||||||
)
|
)
|
||||||
currency_id = fields.Many2one(
|
currency_id = fields.Many2one(
|
||||||
compute="_compute_currency_id",
|
compute="_compute_currency_id",
|
||||||
@@ -36,7 +42,10 @@ class ContractContract(models.Model):
|
|||||||
comodel_name="res.currency",
|
comodel_name="res.currency",
|
||||||
string="Currency",
|
string="Currency",
|
||||||
)
|
)
|
||||||
manual_currency_id = fields.Many2one(comodel_name="res.currency", readonly=True,)
|
manual_currency_id = fields.Many2one(
|
||||||
|
comodel_name="res.currency",
|
||||||
|
readonly=True,
|
||||||
|
)
|
||||||
contract_template_id = fields.Many2one(
|
contract_template_id = fields.Many2one(
|
||||||
string="Contract Template", comodel_name="contract.template"
|
string="Contract Template", comodel_name="contract.template"
|
||||||
)
|
)
|
||||||
@@ -77,7 +86,9 @@ class ContractContract(models.Model):
|
|||||||
ondelete="restrict",
|
ondelete="restrict",
|
||||||
)
|
)
|
||||||
invoice_partner_id = fields.Many2one(
|
invoice_partner_id = fields.Many2one(
|
||||||
string="Invoicing contact", comodel_name="res.partner", ondelete="restrict",
|
string="Invoicing contact",
|
||||||
|
comodel_name="res.partner",
|
||||||
|
ondelete="restrict",
|
||||||
)
|
)
|
||||||
partner_id = fields.Many2one(
|
partner_id = fields.Many2one(
|
||||||
comodel_name="res.partner", inverse="_inverse_partner_id", required=True
|
comodel_name="res.partner", inverse="_inverse_partner_id", required=True
|
||||||
@@ -103,10 +114,16 @@ class ContractContract(models.Model):
|
|||||||
tracking=True,
|
tracking=True,
|
||||||
)
|
)
|
||||||
terminate_comment = fields.Text(
|
terminate_comment = fields.Text(
|
||||||
string="Termination Comment", readonly=True, copy=False, tracking=True,
|
string="Termination Comment",
|
||||||
|
readonly=True,
|
||||||
|
copy=False,
|
||||||
|
tracking=True,
|
||||||
)
|
)
|
||||||
terminate_date = fields.Date(
|
terminate_date = fields.Date(
|
||||||
string="Termination Date", readonly=True, copy=False, tracking=True,
|
string="Termination Date",
|
||||||
|
readonly=True,
|
||||||
|
copy=False,
|
||||||
|
tracking=True,
|
||||||
)
|
)
|
||||||
modification_ids = fields.One2many(
|
modification_ids = fields.One2many(
|
||||||
comodel_name="contract.modification",
|
comodel_name="contract.modification",
|
||||||
@@ -198,7 +215,15 @@ class ContractContract(models.Model):
|
|||||||
|
|
||||||
invoices = (
|
invoices = (
|
||||||
self.env["account.move.line"]
|
self.env["account.move.line"]
|
||||||
.search([("contract_line_id", "in", self.contract_line_ids.ids,)])
|
.search(
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"contract_line_id",
|
||||||
|
"in",
|
||||||
|
self.contract_line_ids.ids,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
.mapped("move_id")
|
.mapped("move_id")
|
||||||
)
|
)
|
||||||
# we are forced to always search for this for not losing possible <=v11
|
# we are forced to always search for this for not losing possible <=v11
|
||||||
@@ -221,7 +246,11 @@ class ContractContract(models.Model):
|
|||||||
return currency or self.journal_id.currency_id or self.company_id.currency_id
|
return currency or self.journal_id.currency_id or self.company_id.currency_id
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
"manual_currency_id", "pricelist_id", "partner_id", "journal_id", "company_id",
|
"manual_currency_id",
|
||||||
|
"pricelist_id",
|
||||||
|
"partner_id",
|
||||||
|
"journal_id",
|
||||||
|
"company_id",
|
||||||
)
|
)
|
||||||
def _compute_currency_id(self):
|
def _compute_currency_id(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
@@ -268,7 +297,8 @@ class ContractContract(models.Model):
|
|||||||
contract.date_end = max(date_end)
|
contract.date_end = max(date_end)
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
"contract_line_ids.recurring_next_date", "contract_line_ids.is_canceled",
|
"contract_line_ids.recurring_next_date",
|
||||||
|
"contract_line_ids.is_canceled",
|
||||||
)
|
)
|
||||||
def _compute_recurring_next_date(self):
|
def _compute_recurring_next_date(self):
|
||||||
for contract in self:
|
for contract in self:
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ class ContractLine(models.Model):
|
|||||||
]
|
]
|
||||||
_order = "sequence,id"
|
_order = "sequence,id"
|
||||||
|
|
||||||
sequence = fields.Integer(string="Sequence",)
|
sequence = fields.Integer(
|
||||||
|
string="Sequence",
|
||||||
|
)
|
||||||
contract_id = fields.Many2one(
|
contract_id = fields.Many2one(
|
||||||
comodel_name="contract.contract",
|
comodel_name="contract.contract",
|
||||||
string="Contract",
|
string="Contract",
|
||||||
@@ -32,10 +34,12 @@ class ContractLine(models.Model):
|
|||||||
ondelete="cascade",
|
ondelete="cascade",
|
||||||
)
|
)
|
||||||
analytic_account_id = fields.Many2one(
|
analytic_account_id = fields.Many2one(
|
||||||
string="Analytic account", comodel_name="account.analytic.account",
|
string="Analytic account",
|
||||||
|
comodel_name="account.analytic.account",
|
||||||
)
|
)
|
||||||
analytic_tag_ids = fields.Many2many(
|
analytic_tag_ids = fields.Many2many(
|
||||||
comodel_name="account.analytic.tag", string="Analytic Tags",
|
comodel_name="account.analytic.tag",
|
||||||
|
string="Analytic Tags",
|
||||||
)
|
)
|
||||||
date_start = fields.Date(required=True)
|
date_start = fields.Date(required=True)
|
||||||
date_end = fields.Date(compute="_compute_date_end", store=True, readonly=False)
|
date_end = fields.Date(compute="_compute_date_end", store=True, readonly=False)
|
||||||
@@ -132,13 +136,16 @@ class ContractLine(models.Model):
|
|||||||
self._set_recurrence_field("date_end")
|
self._set_recurrence_field("date_end")
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
"date_end", "termination_notice_rule_type", "termination_notice_interval",
|
"date_end",
|
||||||
|
"termination_notice_rule_type",
|
||||||
|
"termination_notice_interval",
|
||||||
)
|
)
|
||||||
def _compute_termination_notice_date(self):
|
def _compute_termination_notice_date(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
if rec.date_end:
|
if rec.date_end:
|
||||||
rec.termination_notice_date = rec.date_end - self.get_relative_delta(
|
rec.termination_notice_date = rec.date_end - self.get_relative_delta(
|
||||||
rec.termination_notice_rule_type, rec.termination_notice_interval,
|
rec.termination_notice_rule_type,
|
||||||
|
rec.termination_notice_interval,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
rec.termination_notice_date = False
|
rec.termination_notice_date = False
|
||||||
@@ -340,10 +347,10 @@ class ContractLine(models.Model):
|
|||||||
@api.constrains("is_auto_renew", "successor_contract_line_id", "date_end")
|
@api.constrains("is_auto_renew", "successor_contract_line_id", "date_end")
|
||||||
def _check_allowed(self):
|
def _check_allowed(self):
|
||||||
"""
|
"""
|
||||||
logical impossible combination:
|
logical impossible combination:
|
||||||
* a line with is_auto_renew True should have date_end and
|
* a line with is_auto_renew True should have date_end and
|
||||||
couldn't have successor_contract_line_id
|
couldn't have successor_contract_line_id
|
||||||
* a line without date_end can't have successor_contract_line_id
|
* a line without date_end can't have successor_contract_line_id
|
||||||
|
|
||||||
"""
|
"""
|
||||||
for rec in self:
|
for rec in self:
|
||||||
@@ -412,7 +419,10 @@ class ContractLine(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@api.onchange(
|
@api.onchange(
|
||||||
"date_start", "is_auto_renew", "auto_renew_rule_type", "auto_renew_interval",
|
"date_start",
|
||||||
|
"is_auto_renew",
|
||||||
|
"auto_renew_rule_type",
|
||||||
|
"auto_renew_interval",
|
||||||
)
|
)
|
||||||
def _onchange_is_auto_renew(self):
|
def _onchange_is_auto_renew(self):
|
||||||
"""Date end should be auto-computed if a contract line is set to
|
"""Date end should be auto-computed if a contract line is set to
|
||||||
@@ -420,7 +430,9 @@ class ContractLine(models.Model):
|
|||||||
for rec in self.filtered("is_auto_renew"):
|
for rec in self.filtered("is_auto_renew"):
|
||||||
if rec.date_start:
|
if rec.date_start:
|
||||||
rec.date_end = self._get_first_date_end(
|
rec.date_end = self._get_first_date_end(
|
||||||
rec.date_start, rec.auto_renew_rule_type, rec.auto_renew_interval,
|
rec.date_start,
|
||||||
|
rec.auto_renew_rule_type,
|
||||||
|
rec.auto_renew_interval,
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.constrains("is_canceled", "is_auto_renew")
|
@api.constrains("is_canceled", "is_auto_renew")
|
||||||
@@ -828,7 +840,10 @@ class ContractLine(models.Model):
|
|||||||
post_message=False,
|
post_message=False,
|
||||||
)
|
)
|
||||||
contract_line |= rec.plan_successor(
|
contract_line |= rec.plan_successor(
|
||||||
new_date_start, new_date_end, is_auto_renew, post_message=False,
|
new_date_start,
|
||||||
|
new_date_end,
|
||||||
|
is_auto_renew,
|
||||||
|
post_message=False,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
new_date_start = date_end + relativedelta(days=1)
|
new_date_start = date_end + relativedelta(days=1)
|
||||||
@@ -847,7 +862,10 @@ class ContractLine(models.Model):
|
|||||||
post_message=False,
|
post_message=False,
|
||||||
)
|
)
|
||||||
contract_line |= rec.plan_successor(
|
contract_line |= rec.plan_successor(
|
||||||
new_date_start, new_date_end, is_auto_renew, post_message=False,
|
new_date_start,
|
||||||
|
new_date_end,
|
||||||
|
is_auto_renew,
|
||||||
|
post_message=False,
|
||||||
)
|
)
|
||||||
msg = _(
|
msg = _(
|
||||||
"""Contract line for <strong>{product}</strong>
|
"""Contract line for <strong>{product}</strong>
|
||||||
@@ -856,7 +874,9 @@ class ContractLine(models.Model):
|
|||||||
<br/>
|
<br/>
|
||||||
- <strong>Suspension End</strong>: {new_date_end}
|
- <strong>Suspension End</strong>: {new_date_end}
|
||||||
""".format(
|
""".format(
|
||||||
product=rec.name, new_date_start=date_start, new_date_end=date_end,
|
product=rec.name,
|
||||||
|
new_date_start=date_start,
|
||||||
|
new_date_end=date_end,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
rec.contract_id.message_post(body=msg)
|
rec.contract_id.message_post(body=msg)
|
||||||
@@ -1017,7 +1037,9 @@ class ContractLine(models.Model):
|
|||||||
<br/>
|
<br/>
|
||||||
- <strong>End</strong>: {new_date_end}
|
- <strong>End</strong>: {new_date_end}
|
||||||
""".format(
|
""".format(
|
||||||
product=rec.name, new_date_start=date_start, new_date_end=date_end,
|
product=rec.name,
|
||||||
|
new_date_start=date_start,
|
||||||
|
new_date_end=date_end,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
rec.contract_id.message_post(body=msg)
|
rec.contract_id.message_post(body=msg)
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ Criteria = namedtuple(
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
Allowed = namedtuple(
|
Allowed = namedtuple(
|
||||||
"Allowed", ["plan_successor", "stop_plan_successor", "stop", "cancel", "uncancel"],
|
"Allowed",
|
||||||
|
["plan_successor", "stop_plan_successor", "stop", "cancel", "uncancel"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ class ContractModification(models.Model):
|
|||||||
ondelete="cascade",
|
ondelete="cascade",
|
||||||
index=True,
|
index=True,
|
||||||
)
|
)
|
||||||
sent = fields.Boolean(string="Sent", default=False,)
|
sent = fields.Boolean(
|
||||||
|
string="Sent",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
def create(self, vals_list):
|
def create(self, vals_list):
|
||||||
|
|||||||
@@ -43,7 +43,9 @@ class ContractRecurrencyBasicMixin(models.AbstractModel):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
recurring_interval = fields.Integer(
|
recurring_interval = fields.Integer(
|
||||||
default=1, string="Invoice Every", help="Invoice every (Days/Week/Month/Year)",
|
default=1,
|
||||||
|
string="Invoice Every",
|
||||||
|
help="Invoice every (Days/Week/Month/Year)",
|
||||||
)
|
)
|
||||||
date_start = fields.Date(string="Date Start")
|
date_start = fields.Date(string="Date Start")
|
||||||
recurring_next_date = fields.Date(string="Date of Next Invoice")
|
recurring_next_date = fields.Date(string="Date of Next Invoice")
|
||||||
@@ -80,10 +82,12 @@ class ContractRecurrencyMixin(models.AbstractModel):
|
|||||||
)
|
)
|
||||||
date_end = fields.Date(string="Date End", index=True)
|
date_end = fields.Date(string="Date End", index=True)
|
||||||
next_period_date_start = fields.Date(
|
next_period_date_start = fields.Date(
|
||||||
string="Next Period Start", compute="_compute_next_period_date_start",
|
string="Next Period Start",
|
||||||
|
compute="_compute_next_period_date_start",
|
||||||
)
|
)
|
||||||
next_period_date_end = fields.Date(
|
next_period_date_end = fields.Date(
|
||||||
string="Next Period End", compute="_compute_next_period_date_end",
|
string="Next Period End",
|
||||||
|
compute="_compute_next_period_date_end",
|
||||||
)
|
)
|
||||||
last_date_invoiced = fields.Date(
|
last_date_invoiced = fields.Date(
|
||||||
string="Last Date Invoiced", readonly=True, copy=False
|
string="Last Date Invoiced", readonly=True, copy=False
|
||||||
|
|||||||
@@ -11,5 +11,7 @@ class ContractTag(models.Model):
|
|||||||
|
|
||||||
name = fields.Char(required=True)
|
name = fields.Char(required=True)
|
||||||
company_id = fields.Many2one(
|
company_id = fields.Many2one(
|
||||||
"res.company", string="Company", default=lambda self: self.env.company.id,
|
"res.company",
|
||||||
|
string="Company",
|
||||||
|
default=lambda self: self.env.company.id,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,13 +10,17 @@ class ResPartner(models.Model):
|
|||||||
_inherit = "res.partner"
|
_inherit = "res.partner"
|
||||||
|
|
||||||
sale_contract_count = fields.Integer(
|
sale_contract_count = fields.Integer(
|
||||||
string="Sale Contracts", compute="_compute_contract_count",
|
string="Sale Contracts",
|
||||||
|
compute="_compute_contract_count",
|
||||||
)
|
)
|
||||||
purchase_contract_count = fields.Integer(
|
purchase_contract_count = fields.Integer(
|
||||||
string="Purchase Contracts", compute="_compute_contract_count",
|
string="Purchase Contracts",
|
||||||
|
compute="_compute_contract_count",
|
||||||
)
|
)
|
||||||
contract_ids = fields.One2many(
|
contract_ids = fields.One2many(
|
||||||
comodel_name="contract.contract", inverse_name="partner_id", string="Contracts",
|
comodel_name="contract.contract",
|
||||||
|
inverse_name="partner_id",
|
||||||
|
string="Contracts",
|
||||||
)
|
)
|
||||||
|
|
||||||
def _get_partner_contract_domain(self):
|
def _get_partner_contract_domain(self):
|
||||||
@@ -49,8 +53,8 @@ class ResPartner(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def act_show_contract(self):
|
def act_show_contract(self):
|
||||||
""" This opens contract view
|
"""This opens contract view
|
||||||
@return: the contract view
|
@return: the contract view
|
||||||
"""
|
"""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
contract_type = self._context.get("contract_type")
|
contract_type = self._context.get("contract_type")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
odoo.define("contract.tour", function(require) {
|
odoo.define("contract.tour", function (require) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var tour = require("web_tour.tour");
|
var tour = require("web_tour.tour");
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ and this condition is met, then an extra space appears in the rows
|
|||||||
corresponding to the sections and lines.
|
corresponding to the sections and lines.
|
||||||
This js was written to deal with that problem, but a solution based on
|
This js was written to deal with that problem, but a solution based on
|
||||||
this can be applied directly to Odoo*/
|
this can be applied directly to Odoo*/
|
||||||
odoo.define("contract.section_and_note_backend", function(require) {
|
odoo.define("contract.section_and_note_backend", function (require) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
require("account.section_and_note_backend");
|
require("account.section_and_note_backend");
|
||||||
@@ -16,11 +16,11 @@ odoo.define("contract.section_and_note_backend", function(require) {
|
|||||||
var section_and_note_one2many = fieldRegistry.get("section_and_note_one2many");
|
var section_and_note_one2many = fieldRegistry.get("section_and_note_one2many");
|
||||||
|
|
||||||
section_and_note_one2many.include({
|
section_and_note_one2many.include({
|
||||||
_getRenderer: function() {
|
_getRenderer: function () {
|
||||||
var result = this._super.apply(this, arguments);
|
var result = this._super.apply(this, arguments);
|
||||||
if (this.view.arch.tag === "tree") {
|
if (this.view.arch.tag === "tree") {
|
||||||
result.include({
|
result.include({
|
||||||
_renderBodyCell: function(record) {
|
_renderBodyCell: function (record) {
|
||||||
var $cell = this._super.apply(this, arguments);
|
var $cell = this._super.apply(this, arguments);
|
||||||
|
|
||||||
var isSection = record.data.display_type === "line_section";
|
var isSection = record.data.display_type === "line_section";
|
||||||
|
|||||||
@@ -539,7 +539,8 @@ class TestContract(TestContractBase):
|
|||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
|
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
self.contract.contract_line_ids, "Recurring lines were not removed.",
|
self.contract.contract_line_ids,
|
||||||
|
"Recurring lines were not removed.",
|
||||||
)
|
)
|
||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
self.contract._onchange_contract_template_id()
|
self.contract._onchange_contract_template_id()
|
||||||
@@ -1627,7 +1628,8 @@ class TestContract(TestContractBase):
|
|||||||
self.assertFalse(new_line.is_canceled)
|
self.assertFalse(new_line.is_canceled)
|
||||||
self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
|
self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
new_line.recurring_next_date, suspension_end + relativedelta(days=1),
|
new_line.recurring_next_date,
|
||||||
|
suspension_end + relativedelta(days=1),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_cancel_uncancel_with_predecessor_has_successor(self):
|
def test_cancel_uncancel_with_predecessor_has_successor(self):
|
||||||
@@ -1737,7 +1739,8 @@ class TestContract(TestContractBase):
|
|||||||
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(contracts.mapped("contract_line_ids")), len(invoice_lines),
|
len(contracts.mapped("contract_line_ids")),
|
||||||
|
len(invoice_lines),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_contract_manually_create_invoice(self):
|
def test_contract_manually_create_invoice(self):
|
||||||
@@ -1764,7 +1767,8 @@ class TestContract(TestContractBase):
|
|||||||
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(contracts.mapped("contract_line_ids")), len(invoice_lines),
|
len(contracts.mapped("contract_line_ids")),
|
||||||
|
len(invoice_lines),
|
||||||
)
|
)
|
||||||
invoices = self.env["account.move"].search(action["domain"])
|
invoices = self.env["account.move"].search(action["domain"])
|
||||||
self.assertFalse(invoice_lines.mapped("move_id") - invoices)
|
self.assertFalse(invoice_lines.mapped("move_id") - invoices)
|
||||||
@@ -1776,19 +1780,22 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "monthlylastday"
|
self.acct_line.recurring_rule_type = "monthlylastday"
|
||||||
self.acct_line.date_end = "2018-03-15"
|
self.acct_line.date_end = "2018-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2018-01-31"))
|
self.assertEqual(last, to_date("2018-01-31"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-01"))
|
self.assertEqual(first, to_date("2018-02-01"))
|
||||||
self.assertEqual(last, to_date("2018-02-28"))
|
self.assertEqual(last, to_date("2018-02-28"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-03-01"))
|
self.assertEqual(first, to_date("2018-03-01"))
|
||||||
self.assertEqual(last, to_date("2018-03-15"))
|
self.assertEqual(last, to_date("2018-03-15"))
|
||||||
@@ -1800,7 +1807,8 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "monthlylastday"
|
self.acct_line.recurring_rule_type = "monthlylastday"
|
||||||
self.acct_line.date_end = "2018-03-15"
|
self.acct_line.date_end = "2018-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2018-01-31"))
|
self.assertEqual(last, to_date("2018-01-31"))
|
||||||
@@ -1808,7 +1816,8 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-01-05"))
|
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-01-05"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-01"))
|
self.assertEqual(first, to_date("2018-02-01"))
|
||||||
self.assertEqual(last, to_date("2018-02-28"))
|
self.assertEqual(last, to_date("2018-02-28"))
|
||||||
@@ -1817,7 +1826,8 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-01-31"))
|
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-01-31"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-03-01"))
|
self.assertEqual(first, to_date("2018-03-01"))
|
||||||
self.assertEqual(last, to_date("2018-03-15"))
|
self.assertEqual(last, to_date("2018-03-15"))
|
||||||
@@ -1826,7 +1836,8 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-28"))
|
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-28"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertFalse(first)
|
self.assertFalse(first)
|
||||||
self.assertFalse(last)
|
self.assertFalse(last)
|
||||||
@@ -1841,13 +1852,15 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end = "2018-08-15"
|
self.acct_line.date_end = "2018-08-15"
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-04"))
|
self.assertEqual(last, to_date("2018-03-04"))
|
||||||
self.acct_line.recurring_next_date = "2018-06-05"
|
self.acct_line.recurring_next_date = "2018-06-05"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-07-04"))
|
self.assertEqual(last, to_date("2018-07-04"))
|
||||||
@@ -1859,13 +1872,15 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end = "2018-08-15"
|
self.acct_line.date_end = "2018-08-15"
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-04"))
|
self.assertEqual(last, to_date("2018-03-04"))
|
||||||
self.acct_line.recurring_next_date = "2018-06-05"
|
self.acct_line.recurring_next_date = "2018-06-05"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-06-04"))
|
self.assertEqual(last, to_date("2018-06-04"))
|
||||||
@@ -1876,19 +1891,22 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "monthly"
|
self.acct_line.recurring_rule_type = "monthly"
|
||||||
self.acct_line.date_end = "2018-03-15"
|
self.acct_line.date_end = "2018-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2018-02-04"))
|
self.assertEqual(last, to_date("2018-02-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-04"))
|
self.assertEqual(last, to_date("2018-03-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-03-05"))
|
self.assertEqual(first, to_date("2018-03-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-15"))
|
self.assertEqual(last, to_date("2018-03-15"))
|
||||||
@@ -1899,19 +1917,22 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "monthly"
|
self.acct_line.recurring_rule_type = "monthly"
|
||||||
self.acct_line.date_end = "2018-03-15"
|
self.acct_line.date_end = "2018-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2018-02-04"))
|
self.assertEqual(last, to_date("2018-02-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-02-05"))
|
self.assertEqual(first, to_date("2018-02-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-04"))
|
self.assertEqual(last, to_date("2018-03-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-03-05"))
|
self.assertEqual(first, to_date("2018-03-05"))
|
||||||
self.assertEqual(last, to_date("2018-03-15"))
|
self.assertEqual(last, to_date("2018-03-15"))
|
||||||
@@ -1922,19 +1943,22 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "yearly"
|
self.acct_line.recurring_rule_type = "yearly"
|
||||||
self.acct_line.date_end = "2020-03-15"
|
self.acct_line.date_end = "2020-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2019-01-04"))
|
self.assertEqual(last, to_date("2019-01-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2019-01-05"))
|
self.assertEqual(first, to_date("2019-01-05"))
|
||||||
self.assertEqual(last, to_date("2020-01-04"))
|
self.assertEqual(last, to_date("2020-01-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2020-01-05"))
|
self.assertEqual(first, to_date("2020-01-05"))
|
||||||
self.assertEqual(last, to_date("2020-03-15"))
|
self.assertEqual(last, to_date("2020-03-15"))
|
||||||
@@ -1945,19 +1969,22 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = "yearly"
|
self.acct_line.recurring_rule_type = "yearly"
|
||||||
self.acct_line.date_end = "2020-03-15"
|
self.acct_line.date_end = "2020-03-15"
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2018-01-05"))
|
self.assertEqual(first, to_date("2018-01-05"))
|
||||||
self.assertEqual(last, to_date("2019-01-04"))
|
self.assertEqual(last, to_date("2019-01-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2019-01-05"))
|
self.assertEqual(first, to_date("2019-01-05"))
|
||||||
self.assertEqual(last, to_date("2020-01-04"))
|
self.assertEqual(last, to_date("2020-01-04"))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
|
self.acct_line.last_date_invoiced,
|
||||||
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date("2020-01-05"))
|
self.assertEqual(first, to_date("2020-01-05"))
|
||||||
self.assertEqual(last, to_date("2020-03-15"))
|
self.assertEqual(last, to_date("2020-03-15"))
|
||||||
@@ -2302,7 +2329,9 @@ class TestContract(TestContractBase):
|
|||||||
group_can_terminate_contract.users |= self.env.user
|
group_can_terminate_contract.users |= self.env.user
|
||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
self.contract._terminate_contract(
|
self.contract._terminate_contract(
|
||||||
self.terminate_reason, "terminate_comment", to_date("2018-02-13"),
|
self.terminate_reason,
|
||||||
|
"terminate_comment",
|
||||||
|
to_date("2018-02-13"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_recurrency_propagation(self):
|
def test_recurrency_propagation(self):
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ class TestContractPortal(odoo.tests.HttpCase):
|
|||||||
self.authenticate("portal", "portal")
|
self.authenticate("portal", "portal")
|
||||||
http.root.session_store.save(self.session)
|
http.root.session_store.save(self.session)
|
||||||
url_contract = "/my/contracts/{}?access_token={}".format(
|
url_contract = "/my/contracts/{}?access_token={}".format(
|
||||||
contract.id, contract.access_token,
|
contract.id,
|
||||||
|
contract.access_token,
|
||||||
)
|
)
|
||||||
self.assertEqual(self.url_open(url=url_contract).status_code, 200)
|
self.assertEqual(self.url_open(url=url_contract).status_code, 200)
|
||||||
contract.message_unsubscribe(partner_ids=user_portal.partner_id.ids)
|
contract.message_unsubscribe(partner_ids=user_portal.partner_id.ids)
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ class ContractManuallyCreateInvoice(models.TransientModel):
|
|||||||
compute="_compute_contract_to_invoice_ids"
|
compute="_compute_contract_to_invoice_ids"
|
||||||
)
|
)
|
||||||
contract_to_invoice_ids = fields.Many2many(
|
contract_to_invoice_ids = fields.Many2many(
|
||||||
comodel_name="contract.contract", compute="_compute_contract_to_invoice_ids",
|
comodel_name="contract.contract",
|
||||||
|
compute="_compute_contract_to_invoice_ids",
|
||||||
)
|
)
|
||||||
contract_type = fields.Selection(
|
contract_type = fields.Selection(
|
||||||
selection=[("sale", "Customer"), ("purchase", "Supplier")],
|
selection=[("sale", "Customer"), ("purchase", "Supplier")],
|
||||||
|
|||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# generated from manifests external_dependencies
|
||||||
|
python-dateutil
|
||||||
1
setup/contract/odoo/addons/contract
Symbolic link
1
setup/contract/odoo/addons/contract
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../contract
|
||||||
6
setup/contract/setup.py
Normal file
6
setup/contract/setup.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import setuptools
|
||||||
|
|
||||||
|
setuptools.setup(
|
||||||
|
setup_requires=['setuptools-odoo'],
|
||||||
|
odoo_addon=True,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user