mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[14.0][ENH] agreement_legal
This commit is contained in:
@@ -2,3 +2,4 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from . import models
|
from . import models
|
||||||
|
from . import wizards
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
"depends": ["contacts", "agreement", "product"],
|
"depends": ["contacts", "agreement", "product"],
|
||||||
"data": [
|
"data": [
|
||||||
"data/ir_sequence.xml",
|
"data/ir_sequence.xml",
|
||||||
"data/module_category.xml",
|
|
||||||
"data/agreement_stage.xml",
|
"data/agreement_stage.xml",
|
||||||
"data/agreement_type.xml",
|
"data/agreement_type.xml",
|
||||||
"security/res_groups.xml",
|
"security/res_groups.xml",
|
||||||
@@ -29,13 +28,14 @@
|
|||||||
"views/agreement_stages.xml",
|
"views/agreement_stages.xml",
|
||||||
"views/agreement_type.xml",
|
"views/agreement_type.xml",
|
||||||
"views/agreement_subtype.xml",
|
"views/agreement_subtype.xml",
|
||||||
"views/agreement_renewaltype.xml",
|
|
||||||
"views/agreement_increasetype.xml",
|
|
||||||
"views/res_partner.xml",
|
"views/res_partner.xml",
|
||||||
"views/agreement.xml",
|
"views/agreement.xml",
|
||||||
"views/menu.xml",
|
"views/menu.xml",
|
||||||
|
"views/assets.xml",
|
||||||
|
"wizards/create_agreement_wizard.xml",
|
||||||
],
|
],
|
||||||
"demo": ["demo/demo.xml"],
|
"demo": ["demo/demo.xml"],
|
||||||
|
"qweb": ["static/src/xml/agreement.xml"],
|
||||||
"application": True,
|
"application": True,
|
||||||
"development_status": "Beta",
|
"development_status": "Beta",
|
||||||
"maintainers": ["max3903", "ygol"],
|
"maintainers": ["max3903", "ygol"],
|
||||||
|
|||||||
@@ -48,6 +48,13 @@
|
|||||||
<field name="stage_type">agreement</field>
|
<field name="stage_type">agreement</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="agreement_stage_terminated" model="agreement.stage">
|
||||||
|
<field name="name">Terminated</field>
|
||||||
|
<field name="sequence">90</field>
|
||||||
|
<field name="fold">True</field>
|
||||||
|
<field name="stage_type">agreement</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record id="agreement_stage_cancelled" model="agreement.stage">
|
<record id="agreement_stage_cancelled" model="agreement.stage">
|
||||||
<field name="name">Cancelled</field>
|
<field name="name">Cancelled</field>
|
||||||
<field name="sequence">100</field>
|
<field name="sequence">100</field>
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
|
|
||||||
<record id="agreement" model="ir.module.category">
|
|
||||||
<field name="name">Agreement</field>
|
|
||||||
<field name="sequence">80</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -12,7 +12,4 @@ from . import (
|
|||||||
agreement_type,
|
agreement_type,
|
||||||
agreement_subtype,
|
agreement_subtype,
|
||||||
res_partner,
|
res_partner,
|
||||||
product_template,
|
|
||||||
agreement_renewaltype,
|
|
||||||
agreement_increasetype,
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
# Copyright (C) 2018 - TODAY, Pavlov Media
|
# Copyright (C) 2018 - TODAY, Pavlov Media
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import json as simplejson
|
||||||
|
|
||||||
|
from lxml import etree
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import _, api, fields, models
|
||||||
|
|
||||||
|
|
||||||
@@ -52,12 +57,6 @@ class Agreement(models.Model):
|
|||||||
tracking=True,
|
tracking=True,
|
||||||
help="Date the contract was signed by the Partner.",
|
help="Date the contract was signed by the Partner.",
|
||||||
)
|
)
|
||||||
term = fields.Integer(
|
|
||||||
string="Term (Months)",
|
|
||||||
tracking=True,
|
|
||||||
help="Number of months this agreement/contract is in effect with the "
|
|
||||||
"partner.",
|
|
||||||
)
|
|
||||||
expiration_notice = fields.Integer(
|
expiration_notice = fields.Integer(
|
||||||
string="Exp. Notice (Days)",
|
string="Exp. Notice (Days)",
|
||||||
tracking=True,
|
tracking=True,
|
||||||
@@ -87,12 +86,6 @@ class Agreement(models.Model):
|
|||||||
copy=False,
|
copy=False,
|
||||||
help="ID used for internal contract tracking.",
|
help="ID used for internal contract tracking.",
|
||||||
)
|
)
|
||||||
increase_type_id = fields.Many2one(
|
|
||||||
"agreement.increasetype",
|
|
||||||
string="Increase Type",
|
|
||||||
tracking=True,
|
|
||||||
help="The amount that certain rates may increase.",
|
|
||||||
)
|
|
||||||
termination_requested = fields.Date(
|
termination_requested = fields.Date(
|
||||||
string="Termination Requested Date",
|
string="Termination Requested Date",
|
||||||
tracking=True,
|
tracking=True,
|
||||||
@@ -107,7 +100,6 @@ class Agreement(models.Model):
|
|||||||
reviewed_user_id = fields.Many2one("res.users", string="Reviewed By", tracking=True)
|
reviewed_user_id = fields.Many2one("res.users", string="Reviewed By", tracking=True)
|
||||||
approved_date = fields.Date(string="Approved Date", tracking=True)
|
approved_date = fields.Date(string="Approved Date", tracking=True)
|
||||||
approved_user_id = fields.Many2one("res.users", string="Approved By", tracking=True)
|
approved_user_id = fields.Many2one("res.users", string="Approved By", tracking=True)
|
||||||
currency_id = fields.Many2one("res.currency", string="Currency")
|
|
||||||
partner_id = fields.Many2one(
|
partner_id = fields.Many2one(
|
||||||
"res.partner",
|
"res.partner",
|
||||||
string="Partner",
|
string="Partner",
|
||||||
@@ -192,7 +184,6 @@ class Agreement(models.Model):
|
|||||||
help="Select the sub-type of this agreement. Sub-Types are related to "
|
help="Select the sub-type of this agreement. Sub-Types are related to "
|
||||||
"agreement types.",
|
"agreement types.",
|
||||||
)
|
)
|
||||||
product_ids = fields.Many2many("product.template", string="Products & Services")
|
|
||||||
assigned_user_id = fields.Many2one(
|
assigned_user_id = fields.Many2one(
|
||||||
"res.users",
|
"res.users",
|
||||||
string="Assigned To",
|
string="Assigned To",
|
||||||
@@ -219,12 +210,6 @@ class Agreement(models.Model):
|
|||||||
"agreement is an amendment to another agreement. This list will "
|
"agreement is an amendment to another agreement. This list will "
|
||||||
"only show other agreements related to the same account.",
|
"only show other agreements related to the same account.",
|
||||||
)
|
)
|
||||||
renewal_type_id = fields.Many2one(
|
|
||||||
"agreement.renewaltype",
|
|
||||||
string="Renewal Type",
|
|
||||||
tracking=True,
|
|
||||||
help="Describes what happens after the contract expires.",
|
|
||||||
)
|
|
||||||
recital_ids = fields.One2many(
|
recital_ids = fields.One2many(
|
||||||
"agreement.recital", "agreement_id", string="Recitals", copy=True
|
"agreement.recital", "agreement_id", string="Recitals", copy=True
|
||||||
)
|
)
|
||||||
@@ -241,6 +226,7 @@ class Agreement(models.Model):
|
|||||||
string="Previous Versions",
|
string="Previous Versions",
|
||||||
copy=False,
|
copy=False,
|
||||||
domain=[("active", "=", False)],
|
domain=[("active", "=", False)],
|
||||||
|
context={"active_test": False},
|
||||||
)
|
)
|
||||||
child_agreements_ids = fields.One2many(
|
child_agreements_ids = fields.One2many(
|
||||||
"agreement",
|
"agreement",
|
||||||
@@ -294,19 +280,37 @@ class Agreement(models.Model):
|
|||||||
help="""Final placeholder expression, to be copy-pasted in the desired
|
help="""Final placeholder expression, to be copy-pasted in the desired
|
||||||
template field.""",
|
template field.""",
|
||||||
)
|
)
|
||||||
|
created_by = fields.Many2one(
|
||||||
|
"res.users",
|
||||||
|
string="Created By",
|
||||||
|
copy=False,
|
||||||
|
default=lambda self: self.env.user,
|
||||||
|
help="User which create the agreement.",
|
||||||
|
)
|
||||||
|
date_created = fields.Datetime(
|
||||||
|
string="Created On",
|
||||||
|
copy=False,
|
||||||
|
default=lambda self: fields.Datetime.now(),
|
||||||
|
help="Date which create the agreement.",
|
||||||
|
)
|
||||||
|
template_id = fields.Many2one(
|
||||||
|
"agreement",
|
||||||
|
string="Template",
|
||||||
|
domain=[("is_template", "=", True)],
|
||||||
|
)
|
||||||
|
readonly = fields.Boolean(
|
||||||
|
related="stage_id.readonly",
|
||||||
|
)
|
||||||
|
|
||||||
# compute the dynamic content for mako expression
|
# compute the dynamic content for jinja expression
|
||||||
def _compute_dynamic_description(self):
|
def _compute_dynamic_description(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
for agreement in self:
|
for agreement in self:
|
||||||
lang = agreement.partner_id.lang or "en_US"
|
lang = agreement.partner_id.lang or "en_US"
|
||||||
description = MailTemplates.with_context(lang=lang)._render_template(
|
description = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
agreement.description, "agreement", [agreement.id]
|
agreement.description, "agreement", [agreement.id]
|
||||||
)
|
)[agreement.id]
|
||||||
des = ""
|
agreement.dynamic_description = description
|
||||||
for i in description:
|
|
||||||
des += description[i]
|
|
||||||
agreement.dynamic_description = des
|
|
||||||
|
|
||||||
def _compute_dynamic_parties(self):
|
def _compute_dynamic_parties(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
@@ -314,7 +318,7 @@ class Agreement(models.Model):
|
|||||||
lang = agreement.partner_id.lang or "en_US"
|
lang = agreement.partner_id.lang or "en_US"
|
||||||
parties = MailTemplates.with_context(lang=lang)._render_template(
|
parties = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
agreement.parties, "agreement", [agreement.id]
|
agreement.parties, "agreement", [agreement.id]
|
||||||
)
|
)[agreement.id]
|
||||||
agreement.dynamic_parties = parties
|
agreement.dynamic_parties = parties
|
||||||
|
|
||||||
def _compute_dynamic_special_terms(self):
|
def _compute_dynamic_special_terms(self):
|
||||||
@@ -323,14 +327,13 @@ class Agreement(models.Model):
|
|||||||
lang = agreement.partner_id.lang or "en_US"
|
lang = agreement.partner_id.lang or "en_US"
|
||||||
special_terms = MailTemplates.with_context(lang=lang)._render_template(
|
special_terms = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
agreement.special_terms, "agreement", [agreement.id]
|
agreement.special_terms, "agreement", [agreement.id]
|
||||||
)
|
)[agreement.id]
|
||||||
agreement.dynamic_special_terms = special_terms
|
agreement.dynamic_special_terms = special_terms
|
||||||
|
|
||||||
@api.onchange("field_id", "sub_model_object_field_id", "default_value")
|
@api.onchange("field_id", "sub_model_object_field_id", "default_value")
|
||||||
def onchange_copyvalue(self):
|
def onchange_copyvalue(self):
|
||||||
self.sub_object_id = False
|
self.sub_object_id = False
|
||||||
self.copyvalue = False
|
self.copyvalue = False
|
||||||
self.sub_object_id = False
|
|
||||||
if self.field_id and not self.field_id.relation:
|
if self.field_id and not self.field_id.relation:
|
||||||
self.copyvalue = "${{object.{} or {}}}".format(
|
self.copyvalue = "${{object.{} or {}}}".format(
|
||||||
self.field_id.name, self.default_value or "''"
|
self.field_id.name, self.default_value or "''"
|
||||||
@@ -360,29 +363,55 @@ class Agreement(models.Model):
|
|||||||
string="Stage",
|
string="Stage",
|
||||||
group_expand="_read_group_stage_ids",
|
group_expand="_read_group_stage_ids",
|
||||||
help="Select the current stage of the agreement.",
|
help="Select the current stage of the agreement.",
|
||||||
|
default=lambda self: self._get_default_stage_id(),
|
||||||
tracking=True,
|
tracking=True,
|
||||||
index=True,
|
index=True,
|
||||||
|
copy=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_default_stage_id(self):
|
||||||
|
try:
|
||||||
|
stage_id = self.env.ref("agreement_legal.agreement_stage_new").id
|
||||||
|
except ValueError:
|
||||||
|
stage_id = False
|
||||||
|
return stage_id
|
||||||
|
|
||||||
|
def _get_old_version_default_vals(self):
|
||||||
|
self.ensure_one()
|
||||||
|
default_vals = {
|
||||||
|
"name": "{} - OLD VERSION".format(self.name),
|
||||||
|
"active": False,
|
||||||
|
"parent_agreement_id": self.id,
|
||||||
|
"version": self.version,
|
||||||
|
"revision": self.revision,
|
||||||
|
"created_by": self.created_by.id,
|
||||||
|
"date_created": self.date_created,
|
||||||
|
"code": "{}-V{}".format(self.code, str(self.version)),
|
||||||
|
"stage_id": self.stage_id.id,
|
||||||
|
}
|
||||||
|
return default_vals
|
||||||
|
|
||||||
# Create New Version Button
|
# Create New Version Button
|
||||||
def create_new_version(self):
|
def create_new_version(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
if not rec.state == "draft":
|
if not rec.state == "draft":
|
||||||
# Make sure status is draft
|
# Make sure status is draft
|
||||||
rec.state = "draft"
|
rec.state = "draft"
|
||||||
default_vals = {
|
|
||||||
"name": "{} - OLD VERSION".format(rec.name),
|
|
||||||
"active": False,
|
|
||||||
"parent_agreement_id": rec.id,
|
|
||||||
"version": rec.version,
|
|
||||||
"code": rec.code + "-V" + str(rec.version),
|
|
||||||
}
|
|
||||||
# Make a current copy and mark it as old
|
# Make a current copy and mark it as old
|
||||||
rec.copy(default=default_vals)
|
rec.copy(default=rec._get_old_version_default_vals())
|
||||||
# Increment the Version
|
# Update version, created by and created on
|
||||||
rec.version = rec.version + 1
|
rec.update(
|
||||||
|
{
|
||||||
|
"version": rec.version + 1,
|
||||||
|
"created_by": self.env.user.id,
|
||||||
|
"date_created": fields.Datetime.now(),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Reset revision to 0 since it's a new version
|
||||||
|
rec.revision = 0
|
||||||
|
|
||||||
def create_new_agreement(self):
|
def _get_new_agreement_default_vals(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
default_vals = {
|
default_vals = {
|
||||||
"name": "New",
|
"name": "New",
|
||||||
@@ -390,10 +419,13 @@ class Agreement(models.Model):
|
|||||||
"version": 1,
|
"version": 1,
|
||||||
"revision": 0,
|
"revision": 0,
|
||||||
"state": "draft",
|
"state": "draft",
|
||||||
"stage_id": self.env.ref("agreement_legal.agreement_stage_new").id,
|
"is_template": False,
|
||||||
}
|
}
|
||||||
res = self.copy(default=default_vals)
|
return default_vals
|
||||||
res.sections_ids.mapped("clauses_ids").write({"agreement_id": res.id})
|
|
||||||
|
def create_new_agreement(self):
|
||||||
|
self.ensure_one()
|
||||||
|
res = self.copy(default=self._get_new_agreement_default_vals())
|
||||||
return {
|
return {
|
||||||
"res_model": "agreement",
|
"res_model": "agreement",
|
||||||
"type": "ir.actions.act_window",
|
"type": "ir.actions.act_window",
|
||||||
@@ -407,10 +439,72 @@ class Agreement(models.Model):
|
|||||||
if vals.get("code", _("New")) == _("New"):
|
if vals.get("code", _("New")) == _("New"):
|
||||||
vals["code"] = self.env["ir.sequence"].next_by_code("agreement") or _("New")
|
vals["code"] = self.env["ir.sequence"].next_by_code("agreement") or _("New")
|
||||||
if not vals.get("stage_id"):
|
if not vals.get("stage_id"):
|
||||||
vals["stage_id"] = self.env.ref("agreement_legal.agreement_stage_new").id
|
vals["stage_id"] = self._get_default_stage_id()
|
||||||
return super().create(vals)
|
return super().create(vals)
|
||||||
|
|
||||||
# Increments the revision on each save action
|
# Increments the revision on each save action
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
vals["revision"] = self.revision + 1
|
res = True
|
||||||
return super().write(vals)
|
for rec in self:
|
||||||
|
has_revision = False
|
||||||
|
if "revision" not in vals:
|
||||||
|
vals["revision"] = rec.revision + 1
|
||||||
|
has_revision = True
|
||||||
|
res = super(Agreement, rec).write(vals)
|
||||||
|
if has_revision:
|
||||||
|
vals.pop("revision")
|
||||||
|
return res
|
||||||
|
|
||||||
|
def copy(self, default=None):
|
||||||
|
"""Assign a value for code is New"""
|
||||||
|
default = dict(default or {})
|
||||||
|
if not default.get("code", False):
|
||||||
|
default.setdefault("code", _("New"))
|
||||||
|
res = super().copy(default)
|
||||||
|
res.sections_ids.mapped("clauses_ids").write({"agreement_id": res.id})
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _exclude_readonly_field(self):
|
||||||
|
return ["stage_id"]
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def fields_view_get(
|
||||||
|
self, view_id=None, view_type=False, toolbar=False, submenu=False
|
||||||
|
):
|
||||||
|
res = super().fields_view_get(
|
||||||
|
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
|
||||||
|
)
|
||||||
|
# Readonly fields
|
||||||
|
doc = etree.XML(res["arch"])
|
||||||
|
if view_type == "form":
|
||||||
|
for node in doc.xpath("//field"):
|
||||||
|
if node.attrib.get("name") in self._exclude_readonly_field():
|
||||||
|
continue
|
||||||
|
attrs = ast.literal_eval(node.attrib.get("attrs", "{}"))
|
||||||
|
if attrs:
|
||||||
|
if attrs.get("readonly"):
|
||||||
|
attrs["readonly"] = ["|", ("readonly", "=", True)] + attrs[
|
||||||
|
"readonly"
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
attrs["readonly"] = [("readonly", "=", True)]
|
||||||
|
else:
|
||||||
|
attrs["readonly"] = [("readonly", "=", True)]
|
||||||
|
node.set("attrs", simplejson.dumps(attrs))
|
||||||
|
modifiers = ast.literal_eval(
|
||||||
|
node.attrib.get("modifiers", "{}")
|
||||||
|
.replace("true", "True")
|
||||||
|
.replace("false", "False")
|
||||||
|
)
|
||||||
|
readonly = modifiers.get("readonly")
|
||||||
|
invisible = modifiers.get("invisible")
|
||||||
|
required = modifiers.get("required")
|
||||||
|
if isinstance(readonly, bool) and readonly:
|
||||||
|
attrs["readonly"] = readonly
|
||||||
|
if isinstance(invisible, bool) and invisible:
|
||||||
|
attrs["invisible"] = invisible
|
||||||
|
if isinstance(required, bool) and required:
|
||||||
|
attrs["required"] = required
|
||||||
|
node.set("modifiers", simplejson.dumps(attrs))
|
||||||
|
res["arch"] = etree.tostring(doc)
|
||||||
|
return res
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ class AgreementAppendix(models.Model):
|
|||||||
def onchange_copyvalue(self):
|
def onchange_copyvalue(self):
|
||||||
self.sub_object_id = False
|
self.sub_object_id = False
|
||||||
self.copyvalue = False
|
self.copyvalue = False
|
||||||
self.sub_object_id = False
|
|
||||||
if self.field_id and not self.field_id.relation:
|
if self.field_id and not self.field_id.relation:
|
||||||
self.copyvalue = "${{object.{} or {}}}".format(
|
self.copyvalue = "${{object.{} or {}}}".format(
|
||||||
self.field_id.name,
|
self.field_id.name,
|
||||||
@@ -83,7 +82,7 @@ class AgreementAppendix(models.Model):
|
|||||||
self.default_value or "''",
|
self.default_value or "''",
|
||||||
)
|
)
|
||||||
|
|
||||||
# compute the dynamic content for mako expression
|
# compute the dynamic content for jinja expression
|
||||||
def _compute_dynamic_content(self):
|
def _compute_dynamic_content(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
for appendix in self:
|
for appendix in self:
|
||||||
@@ -94,5 +93,5 @@ class AgreementAppendix(models.Model):
|
|||||||
)
|
)
|
||||||
content = MailTemplates.with_context(lang=lang)._render_template(
|
content = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
appendix.content, "agreement.appendix", [appendix.id]
|
appendix.content, "agreement.appendix", [appendix.id]
|
||||||
)
|
)[appendix.id]
|
||||||
appendix.dynamic_content = content
|
appendix.dynamic_content = content
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ class AgreementClause(models.Model):
|
|||||||
)
|
)
|
||||||
sequence = fields.Integer(string="Sequence")
|
sequence = fields.Integer(string="Sequence")
|
||||||
agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade")
|
agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade")
|
||||||
|
temp_agreement_id = fields.Many2one(
|
||||||
|
"agreement", string="Temp Agreement", help="This field help to filter section."
|
||||||
|
)
|
||||||
section_id = fields.Many2one(
|
section_id = fields.Many2one(
|
||||||
"agreement.section", string="Section", ondelete="cascade"
|
"agreement.section", string="Section", ondelete="cascade"
|
||||||
)
|
)
|
||||||
@@ -66,7 +69,6 @@ class AgreementClause(models.Model):
|
|||||||
def onchange_copyvalue(self):
|
def onchange_copyvalue(self):
|
||||||
self.sub_object_id = False
|
self.sub_object_id = False
|
||||||
self.copyvalue = False
|
self.copyvalue = False
|
||||||
self.sub_object_id = False
|
|
||||||
if self.field_id and not self.field_id.relation:
|
if self.field_id and not self.field_id.relation:
|
||||||
self.copyvalue = "${{object.{} or {}}}".format(
|
self.copyvalue = "${{object.{} or {}}}".format(
|
||||||
self.field_id.name,
|
self.field_id.name,
|
||||||
@@ -84,7 +86,7 @@ class AgreementClause(models.Model):
|
|||||||
self.default_value or "''",
|
self.default_value or "''",
|
||||||
)
|
)
|
||||||
|
|
||||||
# compute the dynamic content for mako expression
|
# compute the dynamic content for jinja expression
|
||||||
def _compute_dynamic_content(self):
|
def _compute_dynamic_content(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
for clause in self:
|
for clause in self:
|
||||||
@@ -93,5 +95,5 @@ class AgreementClause(models.Model):
|
|||||||
)
|
)
|
||||||
content = MailTemplates.with_context(lang=lang)._render_template(
|
content = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
clause.content, "agreement.clause", [clause.id]
|
clause.content, "agreement.clause", [clause.id]
|
||||||
)
|
)[clause.id]
|
||||||
clause.dynamic_content = content
|
clause.dynamic_content = content
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
# Copyright (C) 2018 - TODAY, Pavlov Media
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo import fields, models
|
|
||||||
|
|
||||||
|
|
||||||
# Main Agreement Increase Type Records Model
|
|
||||||
class AgreementIncreaseType(models.Model):
|
|
||||||
_name = "agreement.increasetype"
|
|
||||||
_description = "Agreement Increase Type"
|
|
||||||
|
|
||||||
# General
|
|
||||||
name = fields.Char(
|
|
||||||
string="Title",
|
|
||||||
required=True,
|
|
||||||
help="Increase types describe any increases that may happen during "
|
|
||||||
"the contract.",
|
|
||||||
)
|
|
||||||
description = fields.Text(
|
|
||||||
string="Description", required=True, help="Description of the renewal type."
|
|
||||||
)
|
|
||||||
increase_percent = fields.Integer(
|
|
||||||
string="Increase Percentage", help="Percentage that the amount will increase."
|
|
||||||
)
|
|
||||||
@@ -12,7 +12,7 @@ class AgreementRecital(models.Model):
|
|||||||
name = fields.Char(string="Name", required=True)
|
name = fields.Char(string="Name", required=True)
|
||||||
title = fields.Char(
|
title = fields.Char(
|
||||||
string="Title",
|
string="Title",
|
||||||
help="The title is displayed on the PDF." "The name is not.",
|
help="The title is displayed on the PDF. The name is not.",
|
||||||
)
|
)
|
||||||
sequence = fields.Integer(string="Sequence", default=10)
|
sequence = fields.Integer(string="Sequence", default=10)
|
||||||
content = fields.Html(string="Content")
|
content = fields.Html(string="Content")
|
||||||
@@ -64,7 +64,6 @@ class AgreementRecital(models.Model):
|
|||||||
def onchange_copyvalue(self):
|
def onchange_copyvalue(self):
|
||||||
self.sub_object_id = False
|
self.sub_object_id = False
|
||||||
self.copyvalue = False
|
self.copyvalue = False
|
||||||
self.sub_object_id = False
|
|
||||||
if self.field_id and not self.field_id.relation:
|
if self.field_id and not self.field_id.relation:
|
||||||
self.copyvalue = "${{object.{} or {}}}".format(
|
self.copyvalue = "${{object.{} or {}}}".format(
|
||||||
self.field_id.name, self.default_value or "''"
|
self.field_id.name, self.default_value or "''"
|
||||||
@@ -81,7 +80,7 @@ class AgreementRecital(models.Model):
|
|||||||
self.default_value or "''",
|
self.default_value or "''",
|
||||||
)
|
)
|
||||||
|
|
||||||
# compute the dynamic content for mako expression
|
# compute the dynamic content for jinja expression
|
||||||
def _compute_dynamic_content(self):
|
def _compute_dynamic_content(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
for recital in self:
|
for recital in self:
|
||||||
@@ -90,5 +89,5 @@ class AgreementRecital(models.Model):
|
|||||||
)
|
)
|
||||||
content = MailTemplates.with_context(lang=lang)._render_template(
|
content = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
recital.content, "agreement.recital", [recital.id]
|
recital.content, "agreement.recital", [recital.id]
|
||||||
)
|
)[recital.id]
|
||||||
recital.dynamic_content = content
|
recital.dynamic_content = content
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
# Copyright (C) 2018 - TODAY, Pavlov Media
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo import fields, models
|
|
||||||
|
|
||||||
|
|
||||||
# Main Agreement Section Records Model
|
|
||||||
class AgreementRenewalType(models.Model):
|
|
||||||
_name = "agreement.renewaltype"
|
|
||||||
_description = "Agreement Renewal Type"
|
|
||||||
|
|
||||||
# General
|
|
||||||
name = fields.Char(
|
|
||||||
string="Title",
|
|
||||||
required=True,
|
|
||||||
help="Renewal types describe what happens after the "
|
|
||||||
"agreement/contract expires.",
|
|
||||||
)
|
|
||||||
description = fields.Text(
|
|
||||||
string="Description", required=True, help="Description of the renewal type."
|
|
||||||
)
|
|
||||||
@@ -66,7 +66,6 @@ class AgreementSection(models.Model):
|
|||||||
def onchange_copyvalue(self):
|
def onchange_copyvalue(self):
|
||||||
self.sub_object_id = False
|
self.sub_object_id = False
|
||||||
self.copyvalue = False
|
self.copyvalue = False
|
||||||
self.sub_object_id = False
|
|
||||||
if self.field_id and not self.field_id.relation:
|
if self.field_id and not self.field_id.relation:
|
||||||
self.copyvalue = "${{object.{} or {}}}".format(
|
self.copyvalue = "${{object.{} or {}}}".format(
|
||||||
self.field_id.name, self.default_value or "''"
|
self.field_id.name, self.default_value or "''"
|
||||||
@@ -83,7 +82,7 @@ class AgreementSection(models.Model):
|
|||||||
self.default_value or "''",
|
self.default_value or "''",
|
||||||
)
|
)
|
||||||
|
|
||||||
# compute the dynamic content for mako expression
|
# compute the dynamic content for jinja expression
|
||||||
def _compute_dynamic_content(self):
|
def _compute_dynamic_content(self):
|
||||||
MailTemplates = self.env["mail.template"]
|
MailTemplates = self.env["mail.template"]
|
||||||
for section in self:
|
for section in self:
|
||||||
@@ -92,5 +91,5 @@ class AgreementSection(models.Model):
|
|||||||
)
|
)
|
||||||
content = MailTemplates.with_context(lang=lang)._render_template(
|
content = MailTemplates.with_context(lang=lang)._render_template(
|
||||||
section.content, "agreement.section", [section.id]
|
section.content, "agreement.section", [section.id]
|
||||||
)
|
)[section.id]
|
||||||
section.dynamic_content = content
|
section.dynamic_content = content
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
from odoo import fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
# Main Agreement Section Records Model
|
# Main Stage on the Agreement
|
||||||
class AgreementStage(models.Model):
|
class AgreementStage(models.Model):
|
||||||
_name = "agreement.stage"
|
_name = "agreement.stage"
|
||||||
_description = "Agreement Stages"
|
_description = "Agreement Stages"
|
||||||
@@ -12,7 +12,6 @@ class AgreementStage(models.Model):
|
|||||||
|
|
||||||
# General
|
# General
|
||||||
name = fields.Char(string="Stage Name", required=True)
|
name = fields.Char(string="Stage Name", required=True)
|
||||||
description = fields.Text(string="Description", required=False)
|
|
||||||
sequence = fields.Integer(string="Sequence", default="1", required=False)
|
sequence = fields.Integer(string="Sequence", default="1", required=False)
|
||||||
fold = fields.Boolean(
|
fold = fields.Boolean(
|
||||||
string="Is Folded",
|
string="Is Folded",
|
||||||
@@ -22,3 +21,9 @@ class AgreementStage(models.Model):
|
|||||||
stage_type = fields.Selection(
|
stage_type = fields.Selection(
|
||||||
[("agreement", "Agreement")], string="Type", required=True
|
[("agreement", "Agreement")], string="Type", required=True
|
||||||
)
|
)
|
||||||
|
active = fields.Boolean(string="Active", default=True)
|
||||||
|
readonly = fields.Boolean(
|
||||||
|
string="Readonly",
|
||||||
|
default=False,
|
||||||
|
help="The agreement can not edit if set Readonly = True.",
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
# Copyright (C) 2018 - TODAY, Pavlov Media
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo import fields, models
|
|
||||||
|
|
||||||
|
|
||||||
# Main Agreement Status Records Model
|
|
||||||
class AgreementStatus(models.Model):
|
|
||||||
_name = "agreement.type"
|
|
||||||
|
|
||||||
# General
|
|
||||||
name = fields.Char(string="Title", required=True)
|
|
||||||
@@ -8,5 +8,6 @@ class AgreementSubtype(models.Model):
|
|||||||
_name = "agreement.subtype"
|
_name = "agreement.subtype"
|
||||||
_description = "Agreement Subtypes"
|
_description = "Agreement Subtypes"
|
||||||
|
|
||||||
name = fields.Char(string="Name", required=True)
|
name = fields.Char(string="Sub-Type Name", required=True)
|
||||||
agreement_type_id = fields.Many2one("agreement.type", string="Agreement Type")
|
agreement_type_id = fields.Many2one("agreement.type", string="Agreement Type")
|
||||||
|
active = fields.Boolean(string="Active", default=True)
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ class AgreementType(models.Model):
|
|||||||
_description = "Agreement Types"
|
_description = "Agreement Types"
|
||||||
|
|
||||||
agreement_subtypes_ids = fields.One2many(
|
agreement_subtypes_ids = fields.One2many(
|
||||||
"agreement.subtype", "agreement_type_id", string="Subtypes"
|
"agreement.subtype", "agreement_type_id", string="Sub-Types"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
# Copyright (C) 2018 - TODAY, Pavlov Media
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo import fields, models
|
|
||||||
|
|
||||||
|
|
||||||
class Product(models.Model):
|
|
||||||
_inherit = "product.template"
|
|
||||||
|
|
||||||
agreements_ids = fields.Many2many("agreement", string="Agreements")
|
|
||||||
@@ -4,3 +4,4 @@
|
|||||||
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
|
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
|
||||||
* Sandip Mangukiya <smangukiya@opensourceintegrators.com>
|
* Sandip Mangukiya <smangukiya@opensourceintegrators.com>
|
||||||
* Yves Goldberg <yves@ygol.com>
|
* Yves Goldberg <yves@ygol.com>
|
||||||
|
* Tharathip Chaweewongphan <tharathipc@ecosoft.co.th>
|
||||||
|
|||||||
@@ -3,17 +3,21 @@
|
|||||||
<record id="partner_agreement_contract_document" model="ir.actions.report">
|
<record id="partner_agreement_contract_document" model="ir.actions.report">
|
||||||
<field name="name">Agreement</field>
|
<field name="name">Agreement</field>
|
||||||
<field name="model">agreement</field>
|
<field name="model">agreement</field>
|
||||||
|
<field name="binding_model_id" ref="model_agreement" />
|
||||||
<field name="report_type">qweb-pdf</field>
|
<field name="report_type">qweb-pdf</field>
|
||||||
<field name="report_name">agreement_legal.report_agreement_document</field>
|
<field name="report_name">agreement_legal.report_agreement_document</field>
|
||||||
<field name="report_file">agreement_legal.report_agreement_document</field>
|
<field name="report_file">agreement_legal.report_agreement_document</field>
|
||||||
|
<field name="binding_view_types">list,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="partner_agreement_contract_document_preview" model="ir.actions.report">
|
<record id="partner_agreement_contract_document_preview" model="ir.actions.report">
|
||||||
<field name="name">Agreement Preview</field>
|
<field name="name">Agreement Preview</field>
|
||||||
<field name="model">agreement</field>
|
<field name="model">agreement</field>
|
||||||
|
<field name="binding_model_id" ref="model_agreement" />
|
||||||
<field name="report_type">qweb-html</field>
|
<field name="report_type">qweb-html</field>
|
||||||
<field name="report_name">agreement_legal.report_agreement_document</field>
|
<field name="report_name">agreement_legal.report_agreement_document</field>
|
||||||
<field name="report_file">agreement_legal.report_agreement_document</field>
|
<field name="report_file">agreement_legal.report_agreement_document</field>
|
||||||
|
<field name="binding_view_types">list,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<template id="report_agreement_document">
|
<template id="report_agreement_document">
|
||||||
|
|||||||
@@ -3,19 +3,19 @@ access_agreement_readonly,agreement readonly,model_agreement,group_agreement_rea
|
|||||||
access_agreement_allusers,agreement all users,model_agreement,group_agreement_user,1,1,1,0
|
access_agreement_allusers,agreement all users,model_agreement,group_agreement_user,1,1,1,0
|
||||||
access_agreement_manager,agreement manager,model_agreement,group_agreement_manager,1,1,1,1
|
access_agreement_manager,agreement manager,model_agreement,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_recital_readonly,recital readonly,model_agreement_recital,group_agreement_readonly,1,0,0,0
|
access_agreement_recital_readonly,recital readonly,model_agreement_recital,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_recital_allusers,recital all users,model_agreement_recital,group_agreement_user,1,1,1,0
|
access_agreement_recital_allusers,recital all users,model_agreement_recital,group_agreement_user,1,1,1,1
|
||||||
access_agreement_recital_manager,recital manager,model_agreement_recital,group_agreement_manager,1,1,1,1
|
access_agreement_recital_manager,recital manager,model_agreement_recital,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_section_readonly,section readonly,model_agreement_section,group_agreement_readonly,1,0,0,0
|
access_agreement_section_readonly,section readonly,model_agreement_section,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_section_allusers,section all users,model_agreement_section,group_agreement_user,1,1,1,0
|
access_agreement_section_allusers,section all users,model_agreement_section,group_agreement_user,1,1,1,1
|
||||||
access_agreement_section_manager,section manager,model_agreement_section,group_agreement_manager,1,1,1,1
|
access_agreement_section_manager,section manager,model_agreement_section,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_clause_readonly,clause readonly,model_agreement_clause,group_agreement_readonly,1,0,0,0
|
access_agreement_clause_readonly,clause readonly,model_agreement_clause,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_clause_allusers,clause all users,model_agreement_clause,group_agreement_user,1,1,1,0
|
access_agreement_clause_allusers,clause all users,model_agreement_clause,group_agreement_user,1,1,1,1
|
||||||
access_agreement_clause_manager,clause manager,model_agreement_clause,group_agreement_manager,1,1,1,1
|
access_agreement_clause_manager,clause manager,model_agreement_clause,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_appendix_readonly,appendix readonly,model_agreement_appendix,group_agreement_readonly,1,0,0,0
|
access_agreement_appendix_readonly,appendix readonly,model_agreement_appendix,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_appendix_allusers,appendix all users,model_agreement_appendix,group_agreement_user,1,1,1,0
|
access_agreement_appendix_allusers,appendix all users,model_agreement_appendix,group_agreement_user,1,1,1,1
|
||||||
access_agreement_appendix_manager,appendix manager,model_agreement_appendix,group_agreement_manager,1,1,1,1
|
access_agreement_appendix_manager,appendix manager,model_agreement_appendix,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_line_readonly,agreement line readonly,model_agreement_line,group_agreement_readonly,1,0,0,0
|
access_agreement_line_readonly,agreement line readonly,model_agreement_line,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_line_allusers,agreement line all users,model_agreement_line,group_agreement_user,1,1,1,0
|
access_agreement_line_allusers,agreement line all users,model_agreement_line,group_agreement_user,1,1,1,1
|
||||||
access_agreement_line_manager,agreement line manager,model_agreement_line,group_agreement_manager,1,1,1,1
|
access_agreement_line_manager,agreement line manager,model_agreement_line,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_stage_readonly,stage readonly,model_agreement_stage,group_agreement_readonly,1,0,0,0
|
access_agreement_stage_readonly,stage readonly,model_agreement_stage,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_stage_manager,stage manager,model_agreement_stage,group_agreement_manager,1,1,1,1
|
access_agreement_stage_manager,stage manager,model_agreement_stage,group_agreement_manager,1,1,1,1
|
||||||
@@ -23,7 +23,4 @@ access_agreement_type_readonly,type readonly,model_agreement_type,group_agreemen
|
|||||||
access_agreement_type_manager,type manager,model_agreement_type,group_agreement_manager,1,1,1,1
|
access_agreement_type_manager,type manager,model_agreement_type,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_subtype_readonly,subtype readonly,model_agreement_subtype,group_agreement_readonly,1,0,0,0
|
access_agreement_subtype_readonly,subtype readonly,model_agreement_subtype,group_agreement_readonly,1,0,0,0
|
||||||
access_agreement_subtype_manager,subtype manager,model_agreement_subtype,group_agreement_manager,1,1,1,1
|
access_agreement_subtype_manager,subtype manager,model_agreement_subtype,group_agreement_manager,1,1,1,1
|
||||||
access_agreement_renewaltype_readonly,renewaltype readonly,model_agreement_renewaltype,group_agreement_readonly,1,0,0,0
|
access_create_agreement_wizard_allusers,create agreement wizard users,model_create_agreement_wizard,group_agreement_user,1,1,1,1
|
||||||
access_agreement_renewaltype_manager,renewaltype manager,model_agreement_renewaltype,group_agreement_manager,1,1,1,1
|
|
||||||
access_agreement_increasetype_readonly,increasetype readonly,model_agreement_increasetype,group_agreement_readonly,1,0,0,0
|
|
||||||
access_agreement_increasetype_manager,increasetype manager,model_agreement_increasetype,group_agreement_manager,1,1,1,1
|
|
||||||
|
|||||||
|
@@ -1,4 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<odoo>
|
<odoo>
|
||||||
<record id="module_agreement_legal_category" model="ir.module.category">
|
<record id="module_agreement_legal_category" model="ir.module.category">
|
||||||
<field name="name">Agreement</field>
|
<field name="name">Agreement</field>
|
||||||
@@ -32,5 +31,4 @@
|
|||||||
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"
|
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"
|
||||||
/>
|
/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
40
agreement_legal/static/src/js/agreement.js
Normal file
40
agreement_legal/static/src/js/agreement.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
odoo.define("agreement_legal.agreement", function (require) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var KanbanController = require("web.KanbanController");
|
||||||
|
var ListController = require("web.ListController");
|
||||||
|
var FormController = require("web.FormController");
|
||||||
|
|
||||||
|
var includeDict = {
|
||||||
|
renderButtons: function () {
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
if (this.modelName === "agreement" && this.$buttons) {
|
||||||
|
var self = this;
|
||||||
|
var data = this.model.get(this.handle);
|
||||||
|
if (data.context.default_is_template === true) {
|
||||||
|
// Hide create from template
|
||||||
|
this.$buttons.find(".create_agreement_from_template").hide();
|
||||||
|
} else {
|
||||||
|
// Hide create button
|
||||||
|
this.$buttons.find(".o-kanban-button-new").hide();
|
||||||
|
this.$buttons.find(".o_list_button_add").hide();
|
||||||
|
this.$buttons.find(".o_form_button_create").hide();
|
||||||
|
}
|
||||||
|
this.$buttons
|
||||||
|
.find(".create_agreement_from_template")
|
||||||
|
.on("click", function () {
|
||||||
|
self.do_action(
|
||||||
|
"agreement_legal.create_agreement_from_template_action",
|
||||||
|
{
|
||||||
|
additional_context: {},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
KanbanController.include(includeDict);
|
||||||
|
ListController.include(includeDict);
|
||||||
|
FormController.include(includeDict);
|
||||||
|
});
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
odoo.define("agreement_legal.domain_widget_ext", function (require) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var basic_fields = require("web.basic_fields");
|
|
||||||
var DomainSelector = require("web.DomainSelector");
|
|
||||||
var session = require("web.session");
|
|
||||||
var core = require("web.core");
|
|
||||||
var qweb = core.qweb;
|
|
||||||
|
|
||||||
basic_fields.FieldDomain.include({
|
|
||||||
/**
|
|
||||||
* Init
|
|
||||||
*/
|
|
||||||
init: function () {
|
|
||||||
this._super.apply(this, arguments);
|
|
||||||
// Add Additional options
|
|
||||||
this.partialUse = this.nodeOptions.partial_use || false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// Private
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @override _render from AbstractField
|
|
||||||
* @returns {Deferred}
|
|
||||||
*/
|
|
||||||
_render: function () {
|
|
||||||
// If there is no model, only change the non-domain-selector content
|
|
||||||
if (!this._domainModel) {
|
|
||||||
this._replaceContent();
|
|
||||||
return $.when();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert char value to array value
|
|
||||||
var value = this.value || "[]";
|
|
||||||
|
|
||||||
// Create the domain selector or change the value of the current
|
|
||||||
// one...
|
|
||||||
var def = null;
|
|
||||||
if (this.domainSelector) {
|
|
||||||
def = this.domainSelector.setDomain(value);
|
|
||||||
} else {
|
|
||||||
this.domainSelector = new DomainSelector(
|
|
||||||
this,
|
|
||||||
this._domainModel,
|
|
||||||
value,
|
|
||||||
{
|
|
||||||
readonly: this.mode === "readonly" || this.inDialog,
|
|
||||||
filters: this.fsFilters,
|
|
||||||
debugMode: session.debug,
|
|
||||||
partialUse: this.partialUse || false,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
def = this.domainSelector.prependTo(this.$el);
|
|
||||||
}
|
|
||||||
// ... then replace the other content (matched records, etc)
|
|
||||||
return def.then(this._replaceContent.bind(this));
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Render the field DOM except for the domain selector part. The full
|
|
||||||
* field DOM is composed of a DIV which contains the domain selector
|
|
||||||
* widget, followed by other content. This other content is handled by
|
|
||||||
* this method.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_replaceContent: function () {
|
|
||||||
if (this._$content) {
|
|
||||||
this._$content.remove();
|
|
||||||
}
|
|
||||||
this._$content = $(
|
|
||||||
qweb.render("FieldDomain.content", {
|
|
||||||
hasModel: Boolean(this._domainModel),
|
|
||||||
isValid: Boolean(this._isValidForModel),
|
|
||||||
nbRecords: this.record.specialData[this.name].nbRecords || 0,
|
|
||||||
inDialogEdit: this.inDialog && this.mode === "edit",
|
|
||||||
partialUse: this.partialUse || false,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
this._$content.appendTo(this.$el);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
22
agreement_legal/static/src/xml/agreement.xml
Normal file
22
agreement_legal/static/src/xml/agreement.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<templates>
|
||||||
|
<t t-extend="ListView.buttons">
|
||||||
|
<t t-jquery="button.o_list_button_add" t-operation="after">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
t-if="widget and widget.modelName and widget.modelName == 'agreement'"
|
||||||
|
class="create_agreement_from_template btn btn-primary"
|
||||||
|
>Create From Template
|
||||||
|
</button>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
<t t-extend="KanbanView.buttons">
|
||||||
|
<t t-jquery="button" t-operation="after">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
t-if="widget and widget.modelName and widget.modelName == 'agreement'"
|
||||||
|
class="create_agreement_from_template btn btn-primary"
|
||||||
|
>Create From Template
|
||||||
|
</button>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</templates>
|
||||||
@@ -1,298 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<templates id="template" xml:space="preserve">
|
|
||||||
<t t-name="FieldDomain.content">
|
|
||||||
<t t-if="partialUse">
|
|
||||||
<div t-if="hasModel" class="o_field_domain_panel">
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
<t t-if="!partialUse">
|
|
||||||
<div t-if="hasModel" class="o_field_domain_panel">
|
|
||||||
<i
|
|
||||||
class="fa fa-arrow-right"
|
|
||||||
role="img"
|
|
||||||
aria-label="Domain"
|
|
||||||
title="Domain"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<button
|
|
||||||
t-if="isValid"
|
|
||||||
class="btn btn-sm btn-secondary o_domain_show_selection_button"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<t t-esc="nbRecords" /> record(s)
|
|
||||||
</button>
|
|
||||||
<span t-else="" class="text-warning" role="alert"><i
|
|
||||||
class="fa fa-exclamation-triangle"
|
|
||||||
role="img"
|
|
||||||
aria-label="Warning"
|
|
||||||
title="Warning"
|
|
||||||
/> Invalid domain</span>
|
|
||||||
|
|
||||||
<button
|
|
||||||
t-if="inDialogEdit"
|
|
||||||
class="btn btn-sm btn-primary o_field_domain_dialog_button"
|
|
||||||
>Edit Domain</button>
|
|
||||||
</div>
|
|
||||||
<div t-else="">Select a model to add a filter.</div>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
|
|
||||||
<div
|
|
||||||
aria-atomic="true"
|
|
||||||
t-name="DomainSelector"
|
|
||||||
t-attf-class="o_domain_node o_domain_tree o_domain_selector #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}"
|
|
||||||
>
|
|
||||||
<t t-if="widget.options.partialUse">
|
|
||||||
<t t-if="widget.children.length === 0">
|
|
||||||
<span>SMatch <strong>all records</strong></span>
|
|
||||||
<button
|
|
||||||
t-if="!widget.readonly"
|
|
||||||
class="btn btn-sm btn-primary o_domain_add_first_node_button"
|
|
||||||
><i class="fa fa-plus" /> Add filter</button>
|
|
||||||
</t>
|
|
||||||
<t t-else="">
|
|
||||||
<div class="o_domain_tree_header">
|
|
||||||
<t
|
|
||||||
t-if="widget.children.length === 1"
|
|
||||||
>Please navigate below and select field:</t>
|
|
||||||
<t t-else="">
|
|
||||||
<span>SSMatch records with</span>
|
|
||||||
<t t-call="DomainTree.OperatorSelector" />
|
|
||||||
<span>of the following rules:</span>
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="o_domain_node_children_container" />
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
<t t-if="!widget.options.partialUse">
|
|
||||||
<t t-if="widget.children.length === 0">
|
|
||||||
<span>Match <strong>all records</strong></span>
|
|
||||||
<button
|
|
||||||
t-if="!widget.readonly"
|
|
||||||
class="btn btn-sm btn-primary o_domain_add_first_node_button"
|
|
||||||
><i class="fa fa-plus" /> Add filter</button>
|
|
||||||
</t>
|
|
||||||
<t t-else="">
|
|
||||||
<div class="o_domain_tree_header">
|
|
||||||
<t
|
|
||||||
t-if="widget.children.length === 1"
|
|
||||||
>Match records with the following rule:</t>
|
|
||||||
<t t-else="">
|
|
||||||
<span>Match records with</span>
|
|
||||||
<t t-call="DomainTree.OperatorSelector" />
|
|
||||||
<span>of the following rules:</span>
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="o_domain_node_children_container" />
|
|
||||||
</t>
|
|
||||||
|
|
||||||
<label
|
|
||||||
t-if="widget.debug && !widget.readonly"
|
|
||||||
class="o_domain_debug_container"
|
|
||||||
>
|
|
||||||
<span class="small"># Code editor</span>
|
|
||||||
<input type="text" class="o_domain_debug_input" />
|
|
||||||
</label>
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
<t t-name="DomainNode.ControlPanel">
|
|
||||||
<t t-if="widget.options.partialUse">
|
|
||||||
<div
|
|
||||||
t-if="!widget.readonly && !widget.noControlPanel"
|
|
||||||
class="o_domain_node_control_panel"
|
|
||||||
role="toolbar"
|
|
||||||
aria-label="Domain node"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
<t t-if="!widget.options.partialUse">
|
|
||||||
<div
|
|
||||||
t-if="!widget.readonly && !widget.noControlPanel"
|
|
||||||
class="o_domain_node_control_panel"
|
|
||||||
role="toolbar"
|
|
||||||
aria-label="Domain node"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
class="btn o_domain_delete_node_button"
|
|
||||||
title="Delete node"
|
|
||||||
aria-label="Delete node"
|
|
||||||
><i class="fa fa-times" /></button>
|
|
||||||
<button
|
|
||||||
class="btn o_domain_add_node_button"
|
|
||||||
title="Add node"
|
|
||||||
aria-label="Add node"
|
|
||||||
><i class="fa fa-plus-circle" /></button>
|
|
||||||
<button
|
|
||||||
class="btn o_domain_add_node_button"
|
|
||||||
title="Add branch"
|
|
||||||
aria-label="Add branch"
|
|
||||||
data-branch="1"
|
|
||||||
><i class="fa fa-ellipsis-h" /></button>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
<div
|
|
||||||
t-name="DomainLeaf"
|
|
||||||
t-attf-class="o_domain_node o_domain_leaf o_domain_selector_row #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}"
|
|
||||||
>
|
|
||||||
<t t-call="DomainNode.ControlPanel" />
|
|
||||||
|
|
||||||
<div t-if="!widget.readonly" class="o_domain_leaf_edition">
|
|
||||||
<!-- field selector will be instantiated here -->
|
|
||||||
<t t-if="!widget.options.partialUse">
|
|
||||||
<div> <!-- used for flex stretching -->
|
|
||||||
<select class="o_domain_leaf_operator_select o_input">
|
|
||||||
<option
|
|
||||||
t-foreach="widget.operators"
|
|
||||||
t-as="key"
|
|
||||||
t-att-value="key"
|
|
||||||
t-att-selected="widget.displayOperator === key ? 'selected' : None"
|
|
||||||
>
|
|
||||||
<t t-esc="key_value" />
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
t-attf-class="o_ds_value_cell#{_.contains(['set', 'not set'], widget.displayOperator) ? ' d-none' : ''}"
|
|
||||||
>
|
|
||||||
<t t-if="widget.selectionChoices !== null">
|
|
||||||
<select class="o_domain_leaf_value_input o_input">
|
|
||||||
<option
|
|
||||||
t-foreach="widget.selectionChoices"
|
|
||||||
t-as="val"
|
|
||||||
t-att-value="val[0]"
|
|
||||||
t-att-selected="_.contains(val, widget.displayValue) ? 'selected' : None"
|
|
||||||
>
|
|
||||||
<t t-esc="val[1]" />
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</t>
|
|
||||||
<t t-else="">
|
|
||||||
<t t-if="_.contains(['in', 'not in'], widget.operator)">
|
|
||||||
<div class="o_domain_leaf_value_input">
|
|
||||||
<span
|
|
||||||
class="badge badge-pill"
|
|
||||||
t-foreach="widget.displayValue"
|
|
||||||
t-as="val"
|
|
||||||
>
|
|
||||||
<t t-esc="val" /> <i
|
|
||||||
class="o_domain_leaf_value_remove_tag_button fa fa-times"
|
|
||||||
t-att-data-value="val"
|
|
||||||
role="img"
|
|
||||||
aria-label="Remove tag"
|
|
||||||
title="Remove tag"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="o_domain_leaf_value_tags">
|
|
||||||
<input
|
|
||||||
placeholder="Add new value"
|
|
||||||
type="text"
|
|
||||||
class="o_input"
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
class="btn btn-sm btn-primary fa fa-plus o_domain_leaf_value_add_tag_button"
|
|
||||||
aria-label="Add tag"
|
|
||||||
title="Add tag"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
<t t-else="">
|
|
||||||
<input
|
|
||||||
class="o_domain_leaf_value_input o_input"
|
|
||||||
type="text"
|
|
||||||
t-att-value="widget.displayValue"
|
|
||||||
/>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
<div t-else="" class="o_domain_leaf_info">
|
|
||||||
<!-- field selector will be instantiated here -->
|
|
||||||
<t t-if="_.isString(widget.value)">
|
|
||||||
<span class="o_domain_leaf_operator"><t
|
|
||||||
t-esc="widget.operator_mapping[widget.operator]"
|
|
||||||
/></span>
|
|
||||||
<span class="o_domain_leaf_value text-primary">"<t
|
|
||||||
t-esc="widget.value"
|
|
||||||
/>"</span>
|
|
||||||
</t>
|
|
||||||
<t t-if="_.isArray(widget.value)">
|
|
||||||
<span class="o_domain_leaf_operator"><t
|
|
||||||
t-esc="widget.operator_mapping[widget.operator]"
|
|
||||||
/></span>
|
|
||||||
<t t-foreach="widget.value" t-as="v">
|
|
||||||
<span class="o_domain_leaf_value text-primary">"<t
|
|
||||||
t-esc="v"
|
|
||||||
/>"</span>
|
|
||||||
<t t-if="!v_last"> or </t>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
<t t-if="_.isNumber(widget.value)">
|
|
||||||
<span class="o_domain_leaf_operator"><t
|
|
||||||
t-esc="widget.operator_mapping[widget.operator]"
|
|
||||||
/></span>
|
|
||||||
<span class="o_domain_leaf_value text-primary"><t
|
|
||||||
t-esc="widget.value"
|
|
||||||
/></span>
|
|
||||||
</t>
|
|
||||||
<t t-if="_.isBoolean(widget.value)">
|
|
||||||
is
|
|
||||||
<t
|
|
||||||
t-if="widget.operator === '=' && widget.value === false || widget.operator === '!=' && widget.value === true"
|
|
||||||
>not</t>
|
|
||||||
set
|
|
||||||
</t>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
aria-atomic="true"
|
|
||||||
t-name="ModelFieldSelector"
|
|
||||||
t-attf-class="o_field_selector#{!widget.options.readonly ? ' o_edit_mode o_input' : ''}"
|
|
||||||
>
|
|
||||||
<div class="o_field_selector_value" tabindex="0" />
|
|
||||||
<t t-if="!widget.options.partialUse">
|
|
||||||
<div class="o_field_selector_controls" tabindex="0">
|
|
||||||
<i
|
|
||||||
role="alert"
|
|
||||||
class="fa fa-exclamation-triangle o_field_selector_warning d-none"
|
|
||||||
title="Invalid field chain"
|
|
||||||
aria-label="Invalid field chain"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
<div
|
|
||||||
t-if="!widget.options.readonly"
|
|
||||||
class="o_field_selector_popover d-none"
|
|
||||||
tabindex="0"
|
|
||||||
>
|
|
||||||
<div class="o_field_selector_popover_header text-center">
|
|
||||||
<i
|
|
||||||
class="fa fa-arrow-left o_field_selector_popover_option o_field_selector_prev_page"
|
|
||||||
title="Previous"
|
|
||||||
role="img"
|
|
||||||
aria-label="Previous"
|
|
||||||
/>
|
|
||||||
<div class="o_field_selector_title" />
|
|
||||||
<i
|
|
||||||
class="fa fa-times o_field_selector_popover_option o_field_selector_close"
|
|
||||||
title="Close"
|
|
||||||
role="img"
|
|
||||||
aria-label="Close"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="o_field_selector_popover_body">
|
|
||||||
<ul class="o_field_selector_page" />
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
t-if="widget.options.debugMode"
|
|
||||||
class="o_field_selector_popover_footer"
|
|
||||||
>
|
|
||||||
<input type="text" class="o_input" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</templates>
|
|
||||||
@@ -6,3 +6,4 @@ from . import test_agreement_clause
|
|||||||
from . import test_agreement_line
|
from . import test_agreement_line
|
||||||
from . import test_agreement_recital
|
from . import test_agreement_recital
|
||||||
from . import test_agreement_section
|
from . import test_agreement_section
|
||||||
|
from . import test_create_agreement_wizard
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from lxml import etree
|
||||||
|
|
||||||
from odoo import fields
|
from odoo import fields
|
||||||
from odoo.tests.common import TransactionCase
|
from odoo.tests.common import TransactionCase
|
||||||
|
|
||||||
@@ -107,7 +109,7 @@ class TestAgreement(TransactionCase):
|
|||||||
agreement_01.parties = "${object.name}"
|
agreement_01.parties = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
agreement_01.dynamic_parties,
|
agreement_01.dynamic_parties,
|
||||||
"<p>{" + str(agreement_01.id) + ": '</p><p>TestAgreement</p>'}",
|
"<p>TestAgreement</p>",
|
||||||
)
|
)
|
||||||
|
|
||||||
# TEST 07: Test Special Terms Dynamic Field
|
# TEST 07: Test Special Terms Dynamic Field
|
||||||
@@ -116,7 +118,7 @@ class TestAgreement(TransactionCase):
|
|||||||
agreement_01.special_terms = "${object.name}"
|
agreement_01.special_terms = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
agreement_01.dynamic_special_terms,
|
agreement_01.dynamic_special_terms,
|
||||||
"{" + str(agreement_01.id) + ": 'TestAgreement'}",
|
"TestAgreement",
|
||||||
)
|
)
|
||||||
|
|
||||||
# TEST 02: Check Read Stages
|
# TEST 02: Check Read Stages
|
||||||
@@ -129,3 +131,15 @@ class TestAgreement(TransactionCase):
|
|||||||
order="id",
|
order="id",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Test fields_view_get
|
||||||
|
def test_agreement_fields_view_get(self):
|
||||||
|
res = self.env["agreement"].fields_view_get(
|
||||||
|
view_id=self.ref("agreement_legal.partner_agreement_form_view"),
|
||||||
|
view_type="form",
|
||||||
|
)
|
||||||
|
doc = etree.XML(res["arch"])
|
||||||
|
field = doc.xpath("//field[@name='partner_contact_id']")
|
||||||
|
self.assertEqual(
|
||||||
|
field[0].get("modifiers", ""), '{"readonly": [["readonly", "=", true]]}'
|
||||||
|
)
|
||||||
|
|||||||
@@ -77,5 +77,5 @@ class TestAgreementAppendices(TransactionCase):
|
|||||||
appendix_01.content = "${object.name}"
|
appendix_01.content = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
appendix_01.dynamic_content,
|
appendix_01.dynamic_content,
|
||||||
"<p>{" + str(appendix_01.id) + ": '</p><p>TestAppendices</p>'}",
|
"<p>TestAppendices</p>",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -77,5 +77,5 @@ class TestAgreementClauses(TransactionCase):
|
|||||||
clause_01.content = "${object.name}"
|
clause_01.content = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
clause_01.dynamic_content,
|
clause_01.dynamic_content,
|
||||||
"<p>{" + str(clause_01.id) + ": '</p><p>TestClause</p>'}",
|
"<p>TestClause</p>",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -77,5 +77,5 @@ class TestAgreementRectical(TransactionCase):
|
|||||||
recital_01.content = "${object.name}"
|
recital_01.content = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
recital_01.dynamic_content,
|
recital_01.dynamic_content,
|
||||||
"<p>{" + str(recital_01.id) + ": '</p><p>TestRecital</p>'}",
|
"<p>TestRecital</p>",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -77,5 +77,5 @@ class TestAgreementSection(TransactionCase):
|
|||||||
section_01.content = "${object.name}"
|
section_01.content = "${object.name}"
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
section_01.dynamic_content,
|
section_01.dynamic_content,
|
||||||
"<p>{" + str(section_01.id) + ": '</p><p>TestSection</p>'}",
|
"<p>TestSection</p>",
|
||||||
)
|
)
|
||||||
|
|||||||
80
agreement_legal/tests/test_create_agreement_wizard.py
Normal file
80
agreement_legal/tests/test_create_agreement_wizard.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestCreateAgreementWizard(TransactionCase):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.agreement_type = self.env["agreement.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Agreement Type",
|
||||||
|
"domain": "sale",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Create Agreement Template
|
||||||
|
self.agreement_template = self.env["agreement"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Agreement Template",
|
||||||
|
"description": "Test",
|
||||||
|
"state": "active",
|
||||||
|
"agreement_type_id": self.agreement_type.id,
|
||||||
|
"is_template": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Create Recital
|
||||||
|
self.env["agreement.recital"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Recital",
|
||||||
|
"title": "Test",
|
||||||
|
"content": "Test",
|
||||||
|
"agreement_id": self.agreement_template.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Create Section
|
||||||
|
self.section = self.env["agreement.section"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Section",
|
||||||
|
"title": "Test",
|
||||||
|
"content": "Test",
|
||||||
|
"agreement_id": self.agreement_template.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Create Clause
|
||||||
|
self.env["agreement.clause"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Clause",
|
||||||
|
"title": "Test",
|
||||||
|
"content": "Test",
|
||||||
|
"agreement_id": self.agreement_template.id,
|
||||||
|
"section_id": self.section.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Create Appendix
|
||||||
|
self.env["agreement.appendix"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Appendices",
|
||||||
|
"title": "Test",
|
||||||
|
"content": "Test",
|
||||||
|
"agreement_id": self.agreement_template.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test create agreement from template
|
||||||
|
def test_create_agreement(self):
|
||||||
|
template = self.agreement_template
|
||||||
|
wizard = self.env["create.agreement.wizard"].create(
|
||||||
|
{
|
||||||
|
"template_id": self.agreement_template.id,
|
||||||
|
"name": "Test Agreement",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
res = wizard.create_agreement()
|
||||||
|
agreement = self.env[res["res_model"]].browse(res["res_id"])
|
||||||
|
self.assertEqual(agreement.template_id, template)
|
||||||
|
self.assertEqual(agreement.is_template, False)
|
||||||
|
self.assertEqual(agreement.recital_ids.name, template.recital_ids.name)
|
||||||
|
self.assertEqual(agreement.sections_ids.name, template.sections_ids.name)
|
||||||
|
self.assertEqual(agreement.clauses_ids.name, template.clauses_ids.name)
|
||||||
|
self.assertEqual(agreement.clauses_ids.section_id, agreement.sections_ids)
|
||||||
|
self.assertEqual(agreement.appendix_ids.name, template.appendix_ids.name)
|
||||||
@@ -5,13 +5,15 @@
|
|||||||
<field name="name">Agreement List</field>
|
<field name="name">Agreement List</field>
|
||||||
<field name="model">agreement</field>
|
<field name="model">agreement</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Agreements" default_order='name'>
|
<tree string="Agreements" default_order="code desc, name">
|
||||||
|
<field name="code" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="partner_id" />
|
<field name="partner_id" />
|
||||||
<field name="company_id" />
|
<field name="company_id" />
|
||||||
<field name="parent_agreement_id" />
|
<field name="parent_agreement_id" />
|
||||||
<field name="agreement_type_id" />
|
<field name="agreement_type_id" />
|
||||||
<field name="agreement_subtype_id" />
|
<field name="agreement_subtype_id" />
|
||||||
|
<field name="stage_id" />
|
||||||
<field name="active" invisible="1" />
|
<field name="active" invisible="1" />
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -43,12 +45,18 @@
|
|||||||
name="stage_id"
|
name="stage_id"
|
||||||
widget="statusbar"
|
widget="statusbar"
|
||||||
clickable="True"
|
clickable="True"
|
||||||
options="{'fold_field': 'fold'}"
|
options="{'clickable': 1, 'fold_field': 'fold'}"
|
||||||
domain="[('stage_type', '=', 'agreement')]"
|
domain="[('stage_type', '=', 'agreement')]"
|
||||||
/>
|
/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
<div class="oe_button_box" name="button_box" />
|
<div class="oe_button_box" name="button_box" />
|
||||||
|
<widget
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Template"
|
||||||
|
bg_color="bg-info"
|
||||||
|
attrs="{'invisible': [('is_template', '=', False)]}"
|
||||||
|
/>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label
|
<label
|
||||||
for="name"
|
for="name"
|
||||||
@@ -66,7 +74,11 @@
|
|||||||
name="parent_agreement_id"
|
name="parent_agreement_id"
|
||||||
domain="[('partner_id', '=', partner_id)]"
|
domain="[('partner_id', '=', partner_id)]"
|
||||||
/>
|
/>
|
||||||
<field name="is_template" />
|
<field name="is_template" invisible="1" />
|
||||||
|
<field
|
||||||
|
name="template_id"
|
||||||
|
attrs="{'invisible': [('is_template', '=', True)]}"
|
||||||
|
/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field
|
<field
|
||||||
@@ -85,6 +97,7 @@
|
|||||||
/>
|
/>
|
||||||
<field name="active" invisible="1" />
|
<field name="active" invisible="1" />
|
||||||
<field name="state" invisible="1" />
|
<field name="state" invisible="1" />
|
||||||
|
<field name="readonly" invisible="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string="Description">
|
<group string="Description">
|
||||||
@@ -138,7 +151,7 @@
|
|||||||
<field
|
<field
|
||||||
name="partner_id"
|
name="partner_id"
|
||||||
context="{'show_address': 1}"
|
context="{'show_address': 1}"
|
||||||
options="{"always_reload": True}"
|
options="{'always_reload': True}"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</group>
|
</group>
|
||||||
@@ -148,7 +161,7 @@
|
|||||||
name="company_id"
|
name="company_id"
|
||||||
readonly="1"
|
readonly="1"
|
||||||
context="{'show_address': 1}"
|
context="{'show_address': 1}"
|
||||||
options="{"always_reload": True}"
|
options="{'always_reload': True}"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<field name="company_partner_id" invisible="1" />
|
<field name="company_partner_id" invisible="1" />
|
||||||
@@ -201,6 +214,10 @@
|
|||||||
</group>
|
</group>
|
||||||
<group name="term_information">
|
<group name="term_information">
|
||||||
<group name="termdates_left" string="Term Dates">
|
<group name="termdates_left" string="Term Dates">
|
||||||
|
<field
|
||||||
|
name="signature_date"
|
||||||
|
attrs="{'invisible': [('is_template', '=', True)]}"
|
||||||
|
/>
|
||||||
<field
|
<field
|
||||||
name="start_date"
|
name="start_date"
|
||||||
attrs="{'required': [('is_template', '=', False)], 'invisible': [('is_template', '=', True)]}"
|
attrs="{'required': [('is_template', '=', False)], 'invisible': [('is_template', '=', True)]}"
|
||||||
@@ -241,30 +258,26 @@
|
|||||||
<separator string="Recitals" />
|
<separator string="Recitals" />
|
||||||
<field
|
<field
|
||||||
name="recital_ids"
|
name="recital_ids"
|
||||||
default_order="sequence"
|
|
||||||
nolabel="1"
|
nolabel="1"
|
||||||
context="{'default_agreement': active_id}"
|
context="{'tree_view_ref': 'agreement_legal.agreement_recital_tree2', 'form_view_ref': 'agreement_legal.agreement_recital_form2'}"
|
||||||
/>
|
/>
|
||||||
<separator string="Sections" />
|
<separator string="Sections" />
|
||||||
<field
|
<field
|
||||||
name="sections_ids"
|
name="sections_ids"
|
||||||
default_order='sequence'
|
|
||||||
nolabel="1"
|
nolabel="1"
|
||||||
context="{'default_agreement': active_id}"
|
context="{'tree_view_ref': 'agreement_legal.partner_agreement_section_list_view2', 'form_view_ref': 'agreement_legal.partner_agreement_section_form_view2'}"
|
||||||
/>
|
/>
|
||||||
<separator string="Clauses" />
|
<separator string="Clauses" />
|
||||||
<field
|
<field
|
||||||
name="clauses_ids"
|
name="clauses_ids"
|
||||||
default_order='clause_id, sequence'
|
|
||||||
nolabel="1"
|
nolabel="1"
|
||||||
context="{'default_agreement': active_id}"
|
context="{'tree_view_ref': 'agreement_legal.partner_agreement_clause_list_view2', 'form_view_ref': 'agreement_legal.partner_agreement_clause_form_view2', 'default_temp_agreement_id': active_id}"
|
||||||
/>
|
/>
|
||||||
<separator string="Appendices" />
|
<separator string="Appendices" />
|
||||||
<field
|
<field
|
||||||
name="appendix_ids"
|
name="appendix_ids"
|
||||||
default_order='sequence'
|
|
||||||
nolabel="1"
|
nolabel="1"
|
||||||
context="{'default_agreement': active_id}"
|
context="{'tree_view_ref': 'agreement_legal.agreement_appendix_tree2', 'form_view_ref': 'agreement_legal.agreement_appendix_form2'}"
|
||||||
/>
|
/>
|
||||||
</page>
|
</page>
|
||||||
<page name="signature" string="Signatures">
|
<page name="signature" string="Signatures">
|
||||||
@@ -302,7 +315,7 @@
|
|||||||
</page>
|
</page>
|
||||||
<page name="child_agreements" string="Child Agreements">
|
<page name="child_agreements" string="Child Agreements">
|
||||||
<field name="child_agreements_ids">
|
<field name="child_agreements_ids">
|
||||||
<tree default_order='version desc'>
|
<tree default_order="version desc">
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="version" />
|
<field name="version" />
|
||||||
<field name="revision" />
|
<field name="revision" />
|
||||||
@@ -313,8 +326,9 @@
|
|||||||
<field
|
<field
|
||||||
name="previous_version_agreements_ids"
|
name="previous_version_agreements_ids"
|
||||||
string="Previouse Versions"
|
string="Previouse Versions"
|
||||||
|
readonly="1"
|
||||||
>
|
>
|
||||||
<tree default_order='version desc'>
|
<tree default_order="version desc">
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="version" />
|
<field name="version" />
|
||||||
<field name="revision" />
|
<field name="revision" />
|
||||||
@@ -345,14 +359,14 @@
|
|||||||
/>.</p>
|
/>.</p>
|
||||||
</div>
|
</div>
|
||||||
</group>
|
</group>
|
||||||
<footer>
|
<p name="footer">
|
||||||
Version: <field name="version" readonly="True" />.<field
|
Version: <field name="version" readonly="True" />.<field
|
||||||
name="revision"
|
name="revision"
|
||||||
readonly="True"
|
readonly="True"
|
||||||
/>
|
/>
|
||||||
| Created By: <field name="create_uid" readonly="True" />
|
| Created By: <field name="created_by" readonly="True" />
|
||||||
| Created On: <field name="create_date" readonly="True" />
|
| Created On: <field name="date_created" readonly="True" />
|
||||||
</footer>
|
</p>
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<div class="oe_chatter">
|
||||||
<field name="message_follower_ids" widget="mail_followers" />
|
<field name="message_follower_ids" widget="mail_followers" />
|
||||||
@@ -467,6 +481,7 @@
|
|||||||
<field name="model">agreement</field>
|
<field name="model">agreement</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Agreement Search">
|
<search string="Agreement Search">
|
||||||
|
<field name="code" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="partner_id" />
|
<field name="partner_id" />
|
||||||
<field name="agreement_type_id" />
|
<field name="agreement_type_id" />
|
||||||
@@ -492,11 +507,23 @@
|
|||||||
icon="terp-partner"
|
icon="terp-partner"
|
||||||
context="{'group_by':'partner_id'}"
|
context="{'group_by':'partner_id'}"
|
||||||
/>
|
/>
|
||||||
|
<filter
|
||||||
|
name="group_agreement_type_id"
|
||||||
|
string="Agreement Type"
|
||||||
|
icon="terp-partner"
|
||||||
|
context="{'group_by':'agreement_type_id'}"
|
||||||
|
/>
|
||||||
|
<filter
|
||||||
|
name="group_agreement_subtype_id"
|
||||||
|
string="Agreement Sub-type"
|
||||||
|
icon="terp-partner"
|
||||||
|
context="{'group_by':'agreement_subtype_id'}"
|
||||||
|
/>
|
||||||
<filter
|
<filter
|
||||||
name="group_status"
|
name="group_status"
|
||||||
string="Status"
|
string="Status"
|
||||||
icon="terp-partner"
|
icon="terp-partner"
|
||||||
context="{'group_by':'state'}"
|
context="{'group_by':'stage_id'}"
|
||||||
/>
|
/>
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
@@ -535,6 +562,7 @@
|
|||||||
<field name="name">Agreements</field>
|
<field name="name">Agreements</field>
|
||||||
<field name="res_model">agreement</field>
|
<field name="res_model">agreement</field>
|
||||||
<field name="domain">[('is_template', '=', False)]</field>
|
<field name="domain">[('is_template', '=', False)]</field>
|
||||||
|
<field name="context">{'default_is_template': False}</field>
|
||||||
<field name="view_mode">kanban,tree,form</field>
|
<field name="view_mode">kanban,tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -542,6 +570,7 @@
|
|||||||
<field name="name">Agreements</field>
|
<field name="name">Agreements</field>
|
||||||
<field name="res_model">agreement</field>
|
<field name="res_model">agreement</field>
|
||||||
<field name="domain">[('is_template', '=', False)]</field>
|
<field name="domain">[('is_template', '=', False)]</field>
|
||||||
|
<field name="context">{'default_is_template': False}</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -549,7 +578,7 @@
|
|||||||
<field name="name">Templates</field>
|
<field name="name">Templates</field>
|
||||||
<field name="res_model">agreement</field>
|
<field name="res_model">agreement</field>
|
||||||
<field name="domain">[('is_template', '=', True)]</field>
|
<field name="domain">[('is_template', '=', True)]</field>
|
||||||
<!-- <field name="context">[('is_template', '=', True)]</field> -->
|
<field name="context">{'default_is_template': True}</field>
|
||||||
<field name="view_mode">tree,kanban,form</field>
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<field name="name">Agreement Appendix Tree</field>
|
<field name="name">Agreement Appendix Tree</field>
|
||||||
<field name="model">agreement.appendix</field>
|
<field name="model">agreement.appendix</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Appendices" default_order='agreement_id, sequence'>
|
<tree string="Appendices" default_order="agreement_id, sequence">
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="title" />
|
<field name="title" />
|
||||||
@@ -103,4 +103,35 @@
|
|||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Appendix List View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="agreement_appendix_tree2">
|
||||||
|
<field name="name">Agreement Appendix Tree2</field>
|
||||||
|
<field name="model">agreement.appendix</field>
|
||||||
|
<field name="inherit_id" ref="agreement_appendix_tree" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<attribute name="default_order">sequence</attribute>
|
||||||
|
</tree>
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Appendix Form View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="agreement_appendix_form2">
|
||||||
|
<field name="name">Agreement Appendix Form2</field>
|
||||||
|
<field name="model">agreement.appendix</field>
|
||||||
|
<field name="inherit_id" ref="agreement_appendix_form" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<field name="name">Agreement Clause List</field>
|
<field name="name">Agreement Clause List</field>
|
||||||
<field name="model">agreement.clause</field>
|
<field name="model">agreement.clause</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Clauses" default_order='agreement_id, sequence'>
|
<tree string="Clauses" default_order="agreement_id, sequence">
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="title" />
|
<field name="title" />
|
||||||
@@ -113,4 +113,43 @@
|
|||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Clause List View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_clause_list_view2">
|
||||||
|
<field name="name">Agreement Clause List2</field>
|
||||||
|
<field name="model">agreement.clause</field>
|
||||||
|
<field name="inherit_id" ref="partner_agreement_clause_list_view" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<attribute name="default_order">sequence</attribute>
|
||||||
|
</tree>
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Clause Form View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_clause_form_view2">
|
||||||
|
<field name="name">Agreement Clause Form2</field>
|
||||||
|
<field name="model">agreement.clause</field>
|
||||||
|
<field name="inherit_id" ref="partner_agreement_clause_form_view" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="agreement_id" position="after">
|
||||||
|
<field name="temp_agreement_id" invisible="1" />
|
||||||
|
</field>
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
<field name="section_id" position="attributes">
|
||||||
|
<attribute
|
||||||
|
name="domain"
|
||||||
|
>[('agreement_id', '=', temp_agreement_id)]</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
|
|
||||||
<!-- Agreement Increase Type List View-->
|
|
||||||
<record model="ir.ui.view" id="partner_agreement_increasetype_list_view">
|
|
||||||
<field name="name">Agreement Increase Type List</field>
|
|
||||||
<field name="model">agreement.increasetype</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree default_order='name'>
|
|
||||||
<field name="name" />
|
|
||||||
<field name="description" />
|
|
||||||
<field name="increase_percent" />
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Agreement Increase Type Form View -->
|
|
||||||
<record model="ir.ui.view" id="partner_agreement_increasetype_form_view">
|
|
||||||
<field name="name">Agreement Increase Type Form</field>
|
|
||||||
<field name="model">agreement.increasetype</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="Agreements Type Form">
|
|
||||||
<sheet>
|
|
||||||
<group>
|
|
||||||
<field name="name" />
|
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="increase_percent" />
|
|
||||||
</group>
|
|
||||||
<group string="Description">
|
|
||||||
<field name="description" nolabel="1" />
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Actions opening views on models -->
|
|
||||||
<record model="ir.actions.act_window" id="partner_agreement_action_increasetype">
|
|
||||||
<field name="name">Agreement Increase Type</field>
|
|
||||||
<field name="res_model">agreement.increasetype</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<field name="name">Agreement Recital Tree</field>
|
<field name="name">Agreement Recital Tree</field>
|
||||||
<field name="model">agreement.recital</field>
|
<field name="model">agreement.recital</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Recitals" default_order='agreement_id, sequence'>
|
<tree string="Recitals" default_order="agreement_id, sequence">
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="title" />
|
<field name="title" />
|
||||||
@@ -103,4 +103,35 @@
|
|||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Recital List View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="agreement_recital_tree2">
|
||||||
|
<field name="name">Agreement Recital Tree2</field>
|
||||||
|
<field name="model">agreement.recital</field>
|
||||||
|
<field name="inherit_id" ref="agreement_recital_tree" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<attribute name="default_order">sequence</attribute>
|
||||||
|
</tree>
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Recital Form View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="agreement_recital_form2">
|
||||||
|
<field name="name">Agreement Recital Form2</field>
|
||||||
|
<field name="model">agreement.recital</field>
|
||||||
|
<field name="inherit_id" ref="agreement_recital_form" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
|
|
||||||
<!-- Agreement Renewal Type List View-->
|
|
||||||
<record model="ir.ui.view" id="partner_agreement_renewaltype_list_view">
|
|
||||||
<field name="name">Agreement Renewal Type List</field>
|
|
||||||
<field name="model">agreement.renewaltype</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree default_order='name'>
|
|
||||||
<field name="name" />
|
|
||||||
<field name="description" />
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Agreement Renewal Type Form View -->
|
|
||||||
<record model="ir.ui.view" id="partner_agreement_renewaltype_form_view">
|
|
||||||
<field name="name">Agreement Renewal Type Form</field>
|
|
||||||
<field name="model">agreement.renewaltype</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="Agreements Type Form">
|
|
||||||
<sheet>
|
|
||||||
<group>
|
|
||||||
<field name="name" />
|
|
||||||
</group>
|
|
||||||
<group string="Description">
|
|
||||||
<field name="description" nolabel="1" />
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Actions opening views on models -->
|
|
||||||
<record model="ir.actions.act_window" id="partner_agreement_action_renewaltype">
|
|
||||||
<field name="name">Agreement Renewal Type</field>
|
|
||||||
<field name="res_model">agreement.renewaltype</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<field name="name">Agreement Section List</field>
|
<field name="name">Agreement Section List</field>
|
||||||
<field name="model">agreement.section</field>
|
<field name="model">agreement.section</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Sections" default_order='agreement_id, sequence'>
|
<tree string="Sections" default_order="agreement_id, sequence">
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="title" />
|
<field name="title" />
|
||||||
@@ -122,4 +122,35 @@
|
|||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Sections List View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_section_list_view2">
|
||||||
|
<field name="name">Agreement Section List2</field>
|
||||||
|
<field name="model">agreement.section</field>
|
||||||
|
<field name="inherit_id" ref="partner_agreement_section_list_view" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<attribute name="default_order">sequence</attribute>
|
||||||
|
</tree>
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Sections Form View 2 (Call this view from agreement)-->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_section_form_view2">
|
||||||
|
<field name="name">Agreement Section Form2</field>
|
||||||
|
<field name="model">agreement.section</field>
|
||||||
|
<field name="inherit_id" ref="partner_agreement_section_form_view" />
|
||||||
|
<field name="mode">primary</field>
|
||||||
|
<field name="priority">999</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="agreement_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -5,10 +5,11 @@
|
|||||||
<field name="name">Agreement Stage List</field>
|
<field name="name">Agreement Stage List</field>
|
||||||
<field name="model">agreement.stage</field>
|
<field name="model">agreement.stage</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree default_order='sequence, name'>
|
<tree default_order="sequence, name">
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" string="Stage Name" />
|
<field name="name" />
|
||||||
<field name="stage_type" />
|
<field name="stage_type" />
|
||||||
|
<field name="active" widget="boolean_toggle" />
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -20,20 +21,52 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Agreements Stage Form">
|
<form string="Agreements Stage Form">
|
||||||
<sheet>
|
<sheet>
|
||||||
|
<widget
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Archived"
|
||||||
|
bg_color="bg-danger"
|
||||||
|
attrs="{'invisible': [('active', '=', True)]}"
|
||||||
|
/>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label for="name" class="oe_edit_only" string="Stage Name" />
|
<label for="name" class="oe_edit_only" />
|
||||||
<h1><field name="name" string="Stage Name" /></h1>
|
<h1><field name="name" /></h1>
|
||||||
</div>
|
</div>
|
||||||
<group>
|
<group>
|
||||||
<field name="sequence" />
|
<field name="sequence" />
|
||||||
<field name="stage_type" />
|
<field name="stage_type" />
|
||||||
<field name="fold" />
|
<field name="fold" />
|
||||||
|
<field name="readonly" />
|
||||||
|
<field name="active" invisible="1" />
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Stage Search View -->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_stage_search_view">
|
||||||
|
<field name="name">Agreement Stage Search</field>
|
||||||
|
<field name="model">agreement.stage</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="Agreements Stage Search">
|
||||||
|
<field name="name" />
|
||||||
|
<separator />
|
||||||
|
<filter
|
||||||
|
name="archived"
|
||||||
|
string="Archived"
|
||||||
|
domain="[('active', '=', False)]"
|
||||||
|
/>
|
||||||
|
<group name="groupby">
|
||||||
|
<filter
|
||||||
|
name="type_groupby"
|
||||||
|
string="Type"
|
||||||
|
context="{'group_by': 'stage_type'}"
|
||||||
|
/>
|
||||||
|
</group>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- Actions opening views on models -->
|
<!-- Actions opening views on models -->
|
||||||
<record model="ir.actions.act_window" id="partner_agreement_action_stage">
|
<record model="ir.actions.act_window" id="partner_agreement_action_stage">
|
||||||
<field name="name">Agreement Stage</field>
|
<field name="name">Agreement Stage</field>
|
||||||
|
|||||||
@@ -5,9 +5,10 @@
|
|||||||
<field name="name">Agreement Subtype List</field>
|
<field name="name">Agreement Subtype List</field>
|
||||||
<field name="model">agreement.subtype</field>
|
<field name="model">agreement.subtype</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree default_order='name'>
|
<tree default_order="name">
|
||||||
<field name="name" string="Sub-Type Name" />
|
<field name="name" />
|
||||||
<field name="agreement_type_id" string="Agreement Type" />
|
<field name="agreement_type_id" />
|
||||||
|
<field name="active" widget="boolean_toggle" />
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -19,6 +20,12 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Agreement Sub-Types">
|
<form string="Agreement Sub-Types">
|
||||||
<sheet>
|
<sheet>
|
||||||
|
<widget
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Archived"
|
||||||
|
bg_color="bg-danger"
|
||||||
|
attrs="{'invisible': [('active', '=', True)]}"
|
||||||
|
/>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label for="name" class="oe_edit_only" />
|
<label for="name" class="oe_edit_only" />
|
||||||
<h1><field name="name" /></h1>
|
<h1><field name="name" /></h1>
|
||||||
@@ -26,6 +33,7 @@
|
|||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="agreement_type_id" />
|
<field name="agreement_type_id" />
|
||||||
|
<field name="active" invisible="1" />
|
||||||
</group>
|
</group>
|
||||||
<group />
|
<group />
|
||||||
</group>
|
</group>
|
||||||
@@ -34,6 +42,31 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Agreement Sub Type Search View -->
|
||||||
|
<record model="ir.ui.view" id="partner_agreement_subtype_search_view">
|
||||||
|
<field name="name">Agreement Sub Type Search</field>
|
||||||
|
<field name="model">agreement.subtype</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="Agreements Sub-Types Search">
|
||||||
|
<field name="name" />
|
||||||
|
<field name="agreement_type_id" />
|
||||||
|
<separator />
|
||||||
|
<filter
|
||||||
|
name="archived"
|
||||||
|
string="Archived"
|
||||||
|
domain="[('active', '=', False)]"
|
||||||
|
/>
|
||||||
|
<group name="groupby">
|
||||||
|
<filter
|
||||||
|
name="agreement_type_groupby"
|
||||||
|
string="Agreement Type"
|
||||||
|
context="{'group_by': 'agreement_type_id'}"
|
||||||
|
/>
|
||||||
|
</group>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- Actions opening views on models -->
|
<!-- Actions opening views on models -->
|
||||||
<record model="ir.actions.act_window" id="partner_agreement_action_subtype">
|
<record model="ir.actions.act_window" id="partner_agreement_action_subtype">
|
||||||
<field name="name">Agreement Sub-Types</field>
|
<field name="name">Agreement Sub-Types</field>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<field name="inherit_id" ref="agreement.agreement_type_list_view" />
|
<field name="inherit_id" ref="agreement.agreement_type_list_view" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="name" position="after">
|
<field name="name" position="after">
|
||||||
<field name="agreement_subtypes_ids" string="Sub-Types" />
|
<field name="agreement_subtypes_ids" widget="many2many_tags" />
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
14
agreement_legal/views/assets.xml
Normal file
14
agreement_legal/views/assets.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<odoo>
|
||||||
|
<template
|
||||||
|
id="assets_backend"
|
||||||
|
name="agreement_legal assets"
|
||||||
|
inherit_id="web.assets_backend"
|
||||||
|
>
|
||||||
|
<xpath expr="." position="inside">
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/agreement_legal/static/src/js/agreement.js"
|
||||||
|
/>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
</odoo>
|
||||||
@@ -129,39 +129,25 @@
|
|||||||
sequence="20"
|
sequence="20"
|
||||||
action="partner_agreement_agreement_templates"
|
action="partner_agreement_agreement_templates"
|
||||||
/>
|
/>
|
||||||
<menuitem
|
|
||||||
name="Renewal Types"
|
|
||||||
id="agreement_renewaltype"
|
|
||||||
parent="agreement_configuration"
|
|
||||||
sequence="30"
|
|
||||||
action="partner_agreement_action_renewaltype"
|
|
||||||
/>
|
|
||||||
<menuitem
|
|
||||||
name="Increase Types"
|
|
||||||
id="agreement_increamenttypes"
|
|
||||||
parent="agreement_configuration"
|
|
||||||
sequence="31"
|
|
||||||
action="partner_agreement_action_increasetype"
|
|
||||||
/>
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Stages"
|
name="Stages"
|
||||||
id="agreement_stages"
|
id="agreement_stages"
|
||||||
parent="agreement_configuration"
|
parent="agreement_configuration"
|
||||||
sequence="40"
|
sequence="30"
|
||||||
action="partner_agreement_action_stage"
|
action="partner_agreement_action_stage"
|
||||||
/>
|
/>
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Types"
|
name="Types"
|
||||||
id="agreement_types"
|
id="agreement_types"
|
||||||
parent="agreement_configuration"
|
parent="agreement_configuration"
|
||||||
sequence="50"
|
sequence="40"
|
||||||
action="partner_agreement_action_type"
|
action="partner_agreement_action_type"
|
||||||
/>
|
/>
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Sub-Types"
|
name="Sub-Types"
|
||||||
id="agreement_subtypes"
|
id="agreement_subtypes"
|
||||||
parent="agreement_configuration"
|
parent="agreement_configuration"
|
||||||
sequence="60"
|
sequence="50"
|
||||||
action="partner_agreement_action_subtype"
|
action="partner_agreement_action_subtype"
|
||||||
/>
|
/>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
3
agreement_legal/wizards/__init__.py
Normal file
3
agreement_legal/wizards/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from . import create_agreement_wizard
|
||||||
31
agreement_legal/wizards/create_agreement_wizard.py
Normal file
31
agreement_legal/wizards/create_agreement_wizard.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Copyright 2021 Ecosoft Co., Ltd (http://ecosoft.co.th)
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class CreateAgreementWizard(models.TransientModel):
|
||||||
|
_name = "create.agreement.wizard"
|
||||||
|
_description = "Create Agreement Wizard"
|
||||||
|
|
||||||
|
template_id = fields.Many2one(
|
||||||
|
"agreement",
|
||||||
|
string="Template",
|
||||||
|
required=True,
|
||||||
|
domain=[("is_template", "=", True)],
|
||||||
|
)
|
||||||
|
name = fields.Char(string="Title", required=True)
|
||||||
|
|
||||||
|
def create_agreement(self):
|
||||||
|
self.ensure_one()
|
||||||
|
res = self.template_id.create_new_agreement()
|
||||||
|
agreement = self.env[res["res_model"]].browse(res["res_id"])
|
||||||
|
agreement.write(
|
||||||
|
{
|
||||||
|
"name": self.name,
|
||||||
|
"description": self.name,
|
||||||
|
"template_id": self.template_id.id,
|
||||||
|
"revision": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return res
|
||||||
34
agreement_legal/wizards/create_agreement_wizard.xml
Normal file
34
agreement_legal/wizards/create_agreement_wizard.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<odoo>
|
||||||
|
<record id="create_agreement_from_template_form_view" model="ir.ui.view">
|
||||||
|
<field name="name">Create Agreement From Template</field>
|
||||||
|
<field name="model">create.agreement.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="template_id" />
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="name" />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button
|
||||||
|
name="create_agreement"
|
||||||
|
string="Create Agreement"
|
||||||
|
class="btn-primary"
|
||||||
|
type="object"
|
||||||
|
/>
|
||||||
|
<button string="Cancel" class="btn-default" special="cancel" />
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="create_agreement_from_template_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Create From Template</field>
|
||||||
|
<field name="res_model">create.agreement.wizard</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user