Repository
OCA/agreement · module folder · Try on Runboat
Module version
1.4.0
Category
Partner
Folder size
1.05 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/agreement
Last tracking update
2026-08-07 08:43:01
Authors
Odoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
Maintainers
Odoo Community Association (OCA), Open Source Integrators, Pavlov Media, Yves Goldberg (Ygol Internetwork)
Committers
Maxime Chambreuil, Enric Tobella, Saran440, tarteo, Vincent Van Rossem, Weblate, OCA-git-bot, oca-ci, Antoni Marroig Campomar, Bhavesh Heliconia, MohamedOsman7, TB-Ph35
Odoo dependencies
OCA/agreement:
odoo/odoo:
- web
- bus
- uom
Python dependencies
None
System dependencies
None
Required by
agreement_project, agreement_serviceprofile, agreement_sign_oca
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 (38)
XML IDNameModelTypeStatus
agreement_appendix_form Agreement Appendix Form agreement.appendix form New
agreement_appendix_form2 Agreement Appendix Form2 agreement.appendix form 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 form 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 form 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 form 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 form 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 form Inherits agreement.agreement_type_form_view
partner_agreement_type_list_view Agreement Type List agreement.type list Inherits agreement.agreement_type_list_view
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 form Inherits base.res_config_settings_view_form
view_project_agreement_kanban Agreement Kanban agreement kanban New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (13)

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'
  • 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 (9)
  • 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
  • recompute_from_template(self)
    @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
    translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • name Char
    required=True translate=True
  • sequence Integer
    default=10
  • title Char
    help='The title is displayed on the PDF. The name is not.' required=True translate=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' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • name Char
    required=True translate=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.' translate=True
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
    translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • name Char
    required=True translate=True
  • sequence Integer
    default=10
  • title Char
    help='The title is displayed on the PDF. The name is not.' translate=True
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' translate=True
  • dynamic_content Html
    compute='_compute_dynamic_content' help='compute dynamic Content' translate=True
  • name Char
    required=True translate=True
  • sequence Integer
  • title Char
    help='The title is displayed on the PDF. The name is not.' translate=True
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' 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.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…