Agreements Legal

agreement_legal
REPOSITORY
REPOSITORYOCA/agreement
GIT
GIThttps://github.com/OCA/agreement.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/agreement/tree/18.0/agreement_legal
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSMaxime Chambreuil, Enric Tobella, Weblate, OCA-git-bot, tarteo, oca-ci, Vincent Van Rossem, Saran440, Bhavesh Heliconia, MohamedOsman7, TB-Ph35
WEBSITE
WEBSITEhttps://github.com/OCA/agreement
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/agreement:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows you to manage agreements, letter of intent and
contract content. The module is meant to be used by the legal team of a
company and to allow them to define sections, clauses and templates with
their respective content that can be dynamic.

Based on the template, an agreement can be created and the pdf document
generated.

The agreement would go through a workflow to finally become a contract
with the customer signature.

Code Analysis

Views touched (37)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix list New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix list Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital list New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital list Inherits agreement_recital_tree
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause list New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause list Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement xpath Inherits agreement.agreement_form
partner_agreement_list_view Agreement List agreement list New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section list New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section list Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage list New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype list New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (12)

New fields (56)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • description Text
    help='Description of the agreement' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms'
  • end_date Date
    help='When the agreement ends.' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notifications to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement'
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' tracking=True
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.'
Public methods (7)
  • action_view_agreement(self, agreement)
    @api.model
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals_list)
    @api.model_create_multi
  • create_new_agreement(self)
  • create_new_version(self)
  • get_view(self, view_id=None, view_type=False, **options)
    @api.model
  • write(self, vals)

New fields (7)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • name Char
    required=True
  • sequence Integer
    default=10
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • name Char
    required=True
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (0)

No public methods.

New fields (5)
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • name Char
    required=True
  • sequence Integer
    default=10
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (0)

No public methods.

New fields (8)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • name Char
    required=True
  • sequence Integer
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.'
  • sequence Integer
    default='1' required=False
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name'
Public methods (0)

No public methods.

New fields (3)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/agreement
GIT
GIThttps://github.com/OCA/agreement.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/agreement/tree/17.0/agreement_legal
VERSION
VERSION 3.0.1
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSEnric Tobella, Weblate, OCA-git-bot, oca-ci, Yves Goldberg, Luis Rodriguez, Antoni Marroig Campomar, paloma.gonzalez
WEBSITE
WEBSITEhttps://github.com/OCA/agreement
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/agreement:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows you to manage agreements, letter of intent and
contract content. The module is meant to be used by the legal team of a
company and to allow them to define sections, clauses and templates with
their respective content that can be dynamic.

Based on the template, an agreement can be created and the pdf document
generated.

The agreement would go through a workflow to finally become a contract
with the customer signature.

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix tree Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital tree Inherits agreement_recital_tree
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause tree Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section tree Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
recompute_agreement_from_template_form_view Recompute Agreement From Template recompute.agreement.from.template.wizard form New
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (13)

New fields (61)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • description Text
    help='Description of the agreement' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms'
  • end_date Date
    help='When the agreement ends.' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • field_id Many2one → ir.model.fields
    help='You can select a target field from the related document model.\n If it is a relationship field you will be able to select a target field\n at the destination of the relationship.' string='Field' args: 'ir.model.fields'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notifications to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement'
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document'
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.'
Public methods (10)
  • action_open_recompute_from_template_wizard(self)
  • action_view_agreement(self, agreement)
    @api.model
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals_list)
    @api.model_create_multi
  • create_new_agreement(self)
  • create_new_version(self)
  • get_view(self, view_id=None, view_type=False, **options)
    @api.model
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
  • recompute_from_template(self)
    @api.model
  • write(self, vals)

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    translate=True
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression' translate=True
  • default_value Char
    help='Optional value to use if the target field is empty.' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True translate=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True translate=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (14)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content' translate=True
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression' translate=True
  • default_value Char
    help='Optional value to use if the target field is empty.' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True translate=True
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.' translate=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    translate=True
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression' translate=True
  • default_value Char
    help='Optional value to use if the target field is empty.' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True translate=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' translate=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (13)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content' translate=True
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression' translate=True
  • default_value Char
    help='Optional value to use if the target field is empty.' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True translate=True
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' translate=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (6)
  • active Boolean
    default=True
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name' translate=True
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.'
  • sequence Integer
    default='1' required=False
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name' translate=True
Public methods (0)

No public methods.

New fields (3)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (2)
  • agreement_id Many2one → agreement
    readonly=True required=True args: 'agreement'
  • template_id Many2one → agreement
    readonly=True related='agreement_id.template_id' args: 'agreement'
Public methods (1)
  • action_recompute_from_template(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (2)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
  • agreements_count Integer
    compute='_compute_agreements_count'
Public methods (1)
  • action_open_agreement(self)
REPOSITORY
REPOSITORYOCA/agreement
GIT
GIThttps://github.com/OCA/agreement.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/agreement/tree/16.0/agreement_legal
VERSION
VERSION 2.0.4
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Kevin Luna, Antoni Marroig Campomar, len
WEBSITE
WEBSITEhttps://github.com/OCA/agreement
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:11:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/agreement:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (38)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix tree Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital tree Inherits agreement_recital_tree
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause tree Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section tree Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (12)

New fields (61)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • description Text
    help='Description of the agreement' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms'
  • end_date Date
    help='When the agreement ends.' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notifications to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement' tracking=True
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' tracking=True
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.'
Public methods (8)
  • action_view_agreement(self, agreement)
    @api.model
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals_list)
    @api.model_create_multi
  • create_new_agreement(self)
  • create_new_version(self)
  • get_view(self, view_id=None, view_type=False, **options)
    @api.model
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
  • write(self, vals)

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (14)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (13)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (6)
  • active Boolean
    default=True
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.'
  • sequence Integer
    default='1' required=False
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name'
Public methods (0)

No public methods.

New fields (3)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (2)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
  • agreements_count Integer
    compute='_compute_agreements_count'
Public methods (1)
  • action_open_agreement(self)
REPOSITORY
REPOSITORYOCA/agreement
GIT
GIThttps://github.com/OCA/agreement.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/agreement/tree/15.0/agreement_legal
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSCarlos Dauden, Enric Tobella, Weblate, OCA-git-bot, oca-ci, Núria Sancho
WEBSITE
WEBSITEhttps://github.com/OCA/agreement
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:33
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/agreement:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (38)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix tree Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital tree Inherits agreement_recital_tree
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause tree Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section tree Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (12)

New fields (62)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • description Text
    help='Description of the agreement' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms'
  • end_date Date
    help='When the agreement ends.' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notifications to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement' tracking=True
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' tracking=True
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.'
Public methods (7)
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals)
    @api.model
  • create_new_agreement(self)
  • create_new_version(self)
  • fields_view_get(self, view_id=None, view_type=False, toolbar=False, submenu=False)
    @api.model
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
  • write(self, vals)

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (14)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
    default=10
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (13)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True
  • sequence Integer
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (6)
  • active Boolean
    default=True
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.'
  • sequence Integer
    default='1' required=False
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name'
Public methods (0)

No public methods.

New fields (3)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (2)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
  • agreements_count Integer
    compute='_compute_agreements_count'
Public methods (1)
  • action_open_agreement(self)
REPOSITORY
REPOSITORYOCA/contract
GIT
GIThttps://github.com/OCA/contract.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/contract/tree/14.0/agreement_legal
VERSION
VERSION 2.4.3
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSPedro M. Baeza, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, oca-ci, newtratip, Patrick Wilson, ps-tubtim, Kevin Luna, Núria Sancho
WEBSITE
WEBSITEhttps://github.com/OCA/contract
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/contract:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix tree Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital tree Inherits agreement_recital_tree
assets_backend agreement_legal assets ir.ui.view qweb Inherits web.assets_backend
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause tree Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section tree Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (12)

New fields (62)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    string='Approved Date' tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
    string='Color'
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • description Text
    help='Description of the agreement' string='Description' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description' string='Dynamic Description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties' string='Dynamic Parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms' string='Dynamic Special Terms'
  • end_date Date
    help='When the agreement ends.' string='End Date' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notificaitons to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement' string='Parties' tracking=True
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    string='Reviewed Date' tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.' string='Revision'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' tracking=True
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' string='Special Terms' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' string='Start Date' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' string='Termination Date' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties' string='Use parties content'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.' string='Version'
Public methods (7)
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals)
    @api.model
  • create_new_agreement(self)
  • create_new_version(self)
  • fields_view_get(self, view_id=None, view_type=False, toolbar=False, submenu=False)
    @api.model
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
  • write(self, vals)

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (14)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
    string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (13)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (6)
  • active Boolean
    default=True string='Active'
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.' string='Readonly'
  • sequence Integer
    default='1' required=False string='Sequence'
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True string='Active'
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name'
Public methods (0)

No public methods.

New fields (3)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (2)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
  • agreements_count Integer
    compute='_compute_agreements_count'
Public methods (1)
  • action_open_agreement(self)
REPOSITORY
REPOSITORYOCA/contract
GIT
GIThttps://github.com/OCA/contract.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/contract/tree/13.0/agreement_legal
VERSION
VERSION 2.5.1
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSEnric Tobella, OCA Transbot, Víctor Martínez, João Marques, oca-travis, OCA-git-bot, Olga Marco
WEBSITE
WEBSITEhttps://github.com/OCA/contract
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/contract:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix field Inherits agreement_appendix_form
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_appendix_tree2 Agreement Appendix Tree2 agreement.appendix tree Inherits agreement_appendix_tree
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_form2 Agreement Recital Form2 agreement.recital field Inherits agreement_recital_form
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
agreement_recital_tree2 Agreement Recital Tree2 agreement.recital tree Inherits agreement_recital_tree
agreement_view_activity agreement.activity agreement activity New
assets_backend agreement_legal assets ir.ui.view qweb Inherits web.assets_backend
create_agreement_from_template_form_view Create Agreement From Template create.agreement.wizard form New
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_form_view2 Agreement Clause Form2 agreement.clause field Inherits partner_agreement_clause_form_view
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_clause_list_view2 Agreement Clause List2 agreement.clause tree Inherits partner_agreement_clause_list_view
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_form_view2 Agreement Section Form2 agreement.section field Inherits partner_agreement_section_form_view
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_list_view2 Agreement Section List2 agreement.section tree Inherits partner_agreement_section_list_view
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_stage_search_view Agreement Stage Search agreement.stage search New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_subtype_search_view Agreement Sub Type Search agreement.subtype search New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (12)

New fields (62)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' tracking=True args: 'agreement.subtype'
  • agreement_type_id Many2one
    tracking=True
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    string='Approved Date' tracking=True
  • approved_user_id Many2one → res.users
    string='Approved By' tracking=True args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' tracking=True args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' tracking=True
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' tracking=True
  • color Integer
    string='Color'
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' tracking=True
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' tracking=True args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • create_date_parent Datetime
    related='parent_agreement_id.create_date' string='Created on (parent)'
  • create_uid_parent Many2one
    related='parent_agreement_id.create_uid' string='Created by (parent)'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • description Text
    help='Description of the agreement' string='Description' tracking=True
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description' string='Dynamic Description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties' string='Dynamic Parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms' string='Dynamic Special Terms'
  • end_date Date
    help='When the agreement ends.' string='End Date' tracking=True
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' tracking=True
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • no_end_date Boolean
    related='agreement_type_id.no_end_date'
  • notification_address_id Many2one → res.partner
    help='The address to send notificaitons to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement' string='Parties' tracking=True
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' tracking=True
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' tracking=True args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    context={'active_test': False} copy=False string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • readonly Boolean
    related='stage_id.readonly'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • reviewed_date Date
    string='Reviewed Date' tracking=True
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' tracking=True args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.' string='Revision'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' tracking=True
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' string='Special Terms' tracking=True
  • stage_id Many2one → agreement.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' tracking=True args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' string='Start Date' tracking=True
  • state Selection
    default='draft' tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] string='Template' args: 'agreement'
  • termination_date Date
    help='Date that the contract was terminated.' string='Termination Date' tracking=True
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' tracking=True
  • to_review_date Date
    compute='_compute_to_review_date' help='Date used to warn us some days before agreement expires' readonly=False store=True
  • use_parties_content Boolean
    help='Use custom content for parties' string='Use parties content'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.' string='Version'
Public methods (7)
  • copy(self, default=None)
    Assign a value for code is New
  • create(self, vals)
    @api.model
  • create_new_agreement(self)
  • create_new_version(self)
  • fields_view_get(self, view_id=None, view_type=False, toolbar=False, submenu=False)
    @api.model
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
  • write(self, vals)

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (14)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
    string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • temp_agreement_id Many2one → agreement
    help='This field help to filter section.' string='Temp Agreement' args: 'agreement'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (13)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_id Many2one → ir.model.fields
    help='Select target field from the related document model. If it is a\n relationship field you will be able to select a target field at the\n destination of the relationship.' string='Field' args: 'ir.model.fields'
  • name Char
    required=True string='Name'
  • sequence Integer
    string='Sequence'
  • sub_model_object_field_id Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this\n field lets you select the target field within the destination document\n model (sub-model).' string='Sub-field' args: 'ir.model.fields'
  • sub_object_id Many2one → ir.model
    help='When a relationship field is selected as first field, this\n field shows the document model the relationship goes to.' string='Sub-model' args: 'ir.model'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_id', 'sub_model_object_field_id', 'default_value')

New fields (6)
  • active Boolean
    default=True string='Active'
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • readonly Boolean
    default=False help='The agreement can not edit if set Readonly = True.' string='Readonly'
  • sequence Integer
    default='1' required=False string='Sequence'
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True string='Active'
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Sub-Type Name'
Public methods (0)

No public methods.

New fields (4)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Sub-Types' args: 'agreement.subtype', 'agreement_type_id'
  • no_end_date Boolean
    default=False
  • review_days Integer
  • review_user_id Many2one → res.users
    help='User assigned automatically the activity on review date' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True string='Title'
  • template_id Many2one → agreement
    domain=[('is_template', '=', True)] required=True string='Template' args: 'agreement'
Public methods (1)
  • create_agreement(self)

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (2)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
  • agreements_count Integer
    compute='_compute_agreements_count'
Public methods (1)
  • action_open_agreement(self)
REPOSITORY
REPOSITORYOCA/contract
GIT
GIThttps://github.com/OCA/contract.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/contract/tree/12.0/agreement_legal
VERSION
VERSION 2.1.0
CATEGORY
CATEGORYPartner
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
COMMITTERS
COMMITTERSAlexandre Fayolle, Maxime Chambreuil, GitHub, Jairo Llopis, mreficent, Alexandre Díaz, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Murtuza Saleh, newtratip, Marcel Savegnago, Yves Goldberg
WEBSITE
WEBSITEhttps://github.com/OCA/contract
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/contract:
    - agreement
odoo/odoo:
    - contacts
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - product
    - decimal_precision
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_search Agreement Appendix Search agreement.appendix search New
agreement_appendix_tree Agreement Appendix Tree agreement.appendix tree New
agreement_clause_search_view Agreement Clause Search agreement.clause search New
agreement_graph_view agreement.graph agreement graph New
agreement_pivot_view agreement.pivot agreement pivot New
agreement_recital_form Agreement Recital Form agreement.recital form New
agreement_recital_search Agreement Recital Search agreement.recital search New
agreement_recital_tree Agreement Recital Tree agreement.recital tree New
assets_backend agreement_legal assets ir.ui.view qweb Inherits web.assets_backend
partner_agreement_clause_form_view Agreement clause Form agreement.clause form New
partner_agreement_clause_list_view Agreement Clause List agreement.clause tree New
partner_agreement_form_view Agreement Form agreement form New
partner_agreement_increasetype_form_view Agreement Increase Type Form agreement.increasetype form New
partner_agreement_increasetype_list_view Agreement Increase Type List agreement.increasetype tree New
partner_agreement_list_view Agreement List agreement tree New
partner_agreement_renewaltype_form_view Agreement Renewal Type Form agreement.renewaltype form New
partner_agreement_renewaltype_list_view Agreement Renewal Type List agreement.renewaltype tree New
partner_agreement_search_view Agreement Search agreement search New
partner_agreement_section_form_view Agreement Section Form agreement.section form New
partner_agreement_section_list_view Agreement Section List agreement.section tree New
partner_agreement_section_search_view Agreement Section Search agreement.section search New
partner_agreement_stage_form_view Agreement Stage Form agreement.stage form New
partner_agreement_stage_list_view Agreement Stage List agreement.stage tree New
partner_agreement_subtype_form_view Agreement Sub Type Form agreement.subtype form New
partner_agreement_subtype_list_view Agreement Subtype List agreement.subtype tree New
partner_agreement_type_form_view Agreement Type Form agreement.type xpath Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type field Inherits agreement.agreement_type_list_view
partner_form res.partner xpath Inherits base.view_partner_form
report_agreement_document report_agreement_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.agreement res.config.settings xpath Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
Models touched (15)

New fields (59)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_subtype_id Many2one → agreement.subtype
    help='Select the sub-type of this agreement. Sub-Types are related to agreement types.' string='Agreement Sub-type' track_visibility='onchange' args: 'agreement.subtype'
  • agreement_type_id Many2one
    track_visibility='onchange'
  • appendix_ids One2many → agreement.appendix
    copy=True string='Appendices' args: 'agreement.appendix', 'agreement_id'
  • approved_date Date
    string='Approved Date' track_visibility='onchange'
  • approved_user_id Many2one → res.users
    string='Approved By' track_visibility='onchange' args: 'res.users'
  • assigned_user_id Many2one → res.users
    help='Select the user who manages this agreement.' string='Assigned To' track_visibility='onchange' args: 'res.users'
  • change_notice Integer
    help='Number of Days to be notified before changes.' string='Change Notice (Days)' track_visibility='onchange'
  • child_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', True)] string='Child Agreements' args: 'agreement', 'parent_agreement_id'
  • clauses_ids One2many → agreement.clause
    string='Clauses' args: 'agreement.clause', 'agreement_id'
  • code Char
    copy=False default=<expr> help='ID used for internal contract tracking.' required=True string='Reference' track_visibility='onchange'
  • color Integer
    string='Color'
  • company_contact_email Char
    related='company_contact_id.email' string='Email'
  • company_contact_id Many2one → res.partner
    copy=True help='The primary contact in the company.' string='Company Contact' args: 'res.partner'
  • company_contact_phone Char
    related='company_contact_id.phone' string='Phone'
  • company_partner_id Many2one
    related='company_id.partner_id' string="Company's Partner"
  • company_signed_date Date
    help='Date the contract was signed by Company.' string='Signed on' track_visibility='onchange'
  • company_signed_user_id Many2one → res.users
    help='The user at our company who authorized/signed the agreement or contract.' string='Signed By' track_visibility='onchange' args: 'res.users'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • currency_id Many2one → res.currency
    string='Currency' args: 'res.currency'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • description Text
    help='Description of the agreement' string='Description' track_visibility='onchange'
  • dynamic_description Text
    compute='_compute_dynamic_description' help='Compute dynamic description' string='Dynamic Description'
  • dynamic_parties Html
    compute='_compute_dynamic_parties' help='Compute dynamic parties' string='Dynamic Parties'
  • dynamic_special_terms Text
    compute='_compute_dynamic_special_terms' help='Compute dynamic special terms' string='Dynamic Special Terms'
  • end_date Date
    help='When the agreement ends.' string='End Date' track_visibility='onchange'
  • expiration_notice Integer
    help='Number of Days before expiration to be notified.' string='Exp. Notice (Days)' track_visibility='onchange'
  • field_domain Char
    default='[["active", "=", True]]' string='Field Expression'
  • increase_type_id Many2one → agreement.increasetype
    help='The amount that certain rates may increase.' string='Increase Type' track_visibility='onchange' args: 'agreement.increasetype'
  • line_ids One2many → agreement.line
    copy=False string='Products/Services' args: 'agreement.line', 'agreement_id'
  • name Char
    required=True string='Title'
  • notification_address_id Many2one → res.partner
    help='The address to send notificaitons to, if different from customer address.(Address Type = Other)' string='Notification Address' args: 'res.partner'
  • parent_agreement_id Many2one → agreement
    help='Link this agreement to a parent agreement. For example if this agreement is an amendment to another agreement. This list will only show other agreements related to the same account.' string='Parent Agreement' args: 'agreement'
  • parties Html
    default=_get_default_parties help='Parties of the agreement' string='Parties' track_visibility='onchange'
  • partner_contact_email Char
    related='partner_contact_id.email' string='Partner Email'
  • partner_contact_id Many2one → res.partner
    copy=True help='The primary partner contact (If Applicable).' string='Partner Contact' args: 'res.partner'
  • partner_contact_phone Char
    related='partner_contact_id.phone' string='Partner Phone'
  • partner_id Many2one → res.partner
    copy=True help='The customer or vendor this agreement is related to.' required=False string='Partner' args: 'res.partner'
  • partner_signed_date Date
    help='Date the contract was signed by the Partner.' string='Signed on (Partner)' track_visibility='onchange'
  • partner_signed_user_id Many2one → res.partner
    help='Contact on the account that signed the agreement/contract.' string='Signed By (Partner)' track_visibility='onchange' args: 'res.partner'
  • previous_version_agreements_ids One2many → agreement
    copy=False domain=[('active', '=', False)] string='Previous Versions' args: 'agreement', 'parent_agreement_id'
  • product_ids Many2many → product.template
    string='Products & Services' args: 'product.template'
  • recital_ids One2many → agreement.recital
    copy=True string='Recitals' args: 'agreement.recital', 'agreement_id'
  • renewal_type_id Many2one → agreement.renewaltype
    help='Describes what happens after the contract expires.' string='Renewal Type' track_visibility='onchange' args: 'agreement.renewaltype'
  • reviewed_date Date
    string='Reviewed Date' track_visibility='onchange'
  • reviewed_user_id Many2one → res.users
    string='Reviewed By' track_visibility='onchange' args: 'res.users'
  • revision Integer
    copy=False default=0 help='The revision will increase with every save event.' string='Revision'
  • sections_ids One2many → agreement.section
    copy=True string='Sections' args: 'agreement.section', 'agreement_id'
  • signed_contract Binary
    string='Signed Document' track_visibility='always'
  • signed_contract_filename Char
    string='Filename'
  • special_terms Text
    help='Any terms that you have agreed to and want to track on the agreement/contract.' string='Special Terms' track_visibility='onchange'
  • stage_id Many2one → agreement.stage
    group_expand='_read_group_stage_ids' help='Select the current stage of the agreement.' index=True string='Stage' track_visibility='onchange' args: 'agreement.stage'
  • start_date Date
    help='When the agreement starts.' string='Start Date' track_visibility='onchange'
  • state Selection
    default='draft' track_visibility='always' args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')]
  • term Integer
    help='Number of months this agreement/contract is in effect with the partner.' string='Term (Months)' track_visibility='onchange'
  • termination_date Date
    help='Date that the contract was terminated.' string='Termination Date' track_visibility='onchange'
  • termination_requested Date
    help='Date that a request for termination was received.' string='Termination Requested Date' track_visibility='onchange'
  • use_parties_content Boolean
    help='Use custom content for parties' string='Use parties content'
  • version Integer
    copy=False default=1 help='The versions are used to keep track of document history and previous versions can be referenced.' string='Version'
Public methods (5)
  • create(self, vals)
    @api.model
  • create_new_agreement(self)
  • create_new_version(self, vals)
    @api.multi
  • onchange_copyvalue(self)
    @api.onchange('field_domain', 'default_value')
  • write(self, vals)
    @api.multi

New fields (10)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this appendix without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_domain Char
    default='[["active", "=", True]]' string='Field Expression'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • title Char
    help='The title is displayed on the PDF.The name is not.' required=True string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_domain', 'default_value')

New fields (11)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Clause Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_domain Char
    default='[["active", "=", True]]' string='Field Expression'
  • name Char
    required=True string='Name'
  • section_id Many2one → agreement.section
    ondelete='cascade' string='Section' args: 'agreement.section'
  • sequence Integer
    string='Sequence'
  • title Char
    help='The title is displayed on the PDF.The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_domain', 'default_value')

New fields (3)
  • description Text
    help='Description of the renewal type.' required=True string='Description'
  • increase_percent Integer
    help='Percentage that the amount will increase.' string='Increase Percentage'
  • name Char
    help='Increase types describe any increases that may happen during the contract.' required=True string='Title'
Public methods (0)

No public methods.

New fields (5)
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • name Char
    required=True string='Description'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • qty Float
    string='Quantity'
  • uom_id Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide this recital without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • content Html
    string='Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_domain Char
    default='[["active", "=", True]]' string='Field Expression'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=10 string='Sequence'
  • title Char
    help='The title is displayed on the PDF.The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_domain', 'default_value')

New fields (2)
  • description Text
    help='Description of the renewal type.' required=True string='Description'
  • name Char
    help='Renewal types describe what happens after the agreement/contract expires.' required=True string='Title'
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the agreement without removing it.' string='Active'
  • agreement_id Many2one → agreement
    ondelete='cascade' string='Agreement' args: 'agreement'
  • clauses_ids One2many → agreement.clause
    copy=True string='Clauses' args: 'agreement.clause', 'section_id'
  • content Html
    string='Section Content'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired\n template field.' string='Placeholder Expression'
  • default_value Char
    help='Optional value to use if the target field is empty.' string='Default Value'
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' string='Dynamic Content'
  • field_domain Char
    default='[["active", "=", True]]' string='Field Expression'
  • name Char
    required=True string='Name'
  • sequence Integer
    string='Sequence'
  • title Char
    help='The title is displayed on the PDF. The name is not.' string='Title'
Public methods (1)
  • onchange_copyvalue(self)
    @api.onchange('field_domain', 'default_value')

New fields (6)
  • active Boolean
    default=True string='Active'
  • description Text
    required=False string='Description'
  • fold Boolean
    help='This stage is folded in the kanban view by default.' required=False string='Is Folded'
  • name Char
    required=True string='Stage Name'
  • sequence Integer
    default='1' required=False string='Sequence'
  • stage_type Selection
    required=True string='Type' args: [('agreement', 'Agreement')]
Public methods (0)

No public methods.

New fields (2)
  • agreement_type_id Many2one → agreement.type
    string='Agreement Type' args: 'agreement.type'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (1)
  • agreement_subtypes_ids One2many → agreement.subtype
    string='Subtypes' args: 'agreement.subtype', 'agreement_type_id'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True string='Title'
Public methods (0)

No public methods.

New fields (1)
  • agreements_ids Many2many → agreement
    string='Agreements' args: 'agreement'
Public methods (0)

No public methods.

New fields (10)
  • module_agreement_helpdesk Boolean
    string='Link your Helpdesk tickets to an agreement.'
  • module_agreement_maintenance Boolean
    string='Manage maintenance agreements and contracts.'
  • module_agreement_mrp Boolean
    string='Link your manufacturing orders to an agreement.'
  • module_agreement_project Boolean
    string='Link your projects and tasks to an agreement.'
  • module_agreement_repair Boolean
    string='Link your repair orders to an agreement.'
  • module_agreement_rma Boolean
    string='Link your RMAs to an agreement.'
  • module_agreement_sale Boolean
    string='Create an agreement when the sale order is confirmed.'
  • module_agreement_sale_subscription Boolean
    string='Link your subscriptions to an agreement.'
  • module_agreement_stock Boolean
    string='Link your pickings to an agreement.'
  • module_fieldservice_agreement Boolean
    string='Link your Field Service orders and equipments to an agreement.'
Public methods (0)

No public methods.

New fields (1)
  • agreement_ids One2many → agreement
    string='Agreements' args: 'agreement', 'partner_id'
Public methods (0)

No public methods.