TIP: You can type at any time to perform a new search.
Agreements Legal
agreement_legal · OCA/agreement
- 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
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
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)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the agreement without removing it.' -
agreement_subtype_idMany2one → agreement.subtypehelp='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_idMany2onetracking=True -
appendix_idsOne2many → agreement.appendixcopy=Truestring='Appendices' args: 'agreement.appendix', 'agreement_id' -
approved_dateDatetracking=True -
approved_user_idMany2one → res.usersstring='Approved By'tracking=True args: 'res.users' -
assigned_user_idMany2one → res.usershelp='Select the user who manages this agreement.'string='Assigned To'tracking=True args: 'res.users' -
change_noticeIntegerhelp='Number of Days to be notified before changes.'string='Change Notice (Days)'tracking=True -
child_agreements_idsOne2many → agreementcopy=Falsedomain=[('active', '=', True)]string='Child Agreements' args: 'agreement', 'parent_agreement_id' -
clauses_idsOne2many → agreement.clausestring='Clauses' args: 'agreement.clause', 'agreement_id' -
codeCharcopy=Falsedefault=<expr>help='ID used for internal contract tracking.'required=Truestring='Reference'tracking=True -
colorInteger -
company_contact_emailCharrelated='company_contact_id.email'string='Email' -
company_contact_idMany2one → res.partnercopy=Truehelp='The primary contact in the company.'string='Company Contact' args: 'res.partner' -
company_contact_phoneCharrelated='company_contact_id.phone'string='Phone' -
company_partner_idMany2onerelated='company_id.partner_id'string="Company's Partner" -
company_signed_dateDatehelp='Date the contract was signed by Company.'string='Signed on'tracking=True -
company_signed_user_idMany2one → res.usershelp='The user at our company who authorized/signed the agreement or contract.'string='Signed By'tracking=True args: 'res.users' -
create_date_parentDatetimerelated='parent_agreement_id.create_date'string='Created on (parent)' -
create_uid_parentMany2onerelated='parent_agreement_id.create_uid'string='Created by (parent)' -
descriptionTexthelp='Description of the agreement'tracking=True -
dynamic_descriptionTextcompute='_compute_dynamic_description'help='Compute dynamic description' -
dynamic_partiesHtmlcompute='_compute_dynamic_parties'help='Compute dynamic parties' -
dynamic_special_termsTextcompute='_compute_dynamic_special_terms'help='Compute dynamic special terms' -
end_dateDatehelp='When the agreement ends.'tracking=True -
expiration_noticeIntegerhelp='Number of Days before expiration to be notified.'string='Exp. Notice (Days)'tracking=True -
line_idsOne2many → agreement.linecopy=Falsestring='Products/Services' args: 'agreement.line', 'agreement_id' -
nameCharrequired=Truestring='Title' -
notification_address_idMany2one → res.partnerhelp='The address to send notifications to, if different from customer address.(Address Type = Other)'string='Notification Address' args: 'res.partner' -
parent_agreement_idMany2one → agreementhelp='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' -
partiesHtmldefault=_get_default_partieshelp='Parties of the agreement' -
partner_contact_emailCharrelated='partner_contact_id.email'string='Partner Email' -
partner_contact_idMany2one → res.partnercopy=Truehelp='The primary partner contact (If Applicable).'string='Partner Contact' args: 'res.partner' -
partner_contact_phoneCharrelated='partner_contact_id.phone'string='Partner Phone' -
partner_idMany2one → res.partnercopy=Truehelp='The customer or vendor this agreement is related to.'required=Falsestring='Partner' args: 'res.partner' -
partner_signed_dateDatehelp='Date the contract was signed by the Partner.'string='Signed on (Partner)'tracking=True -
partner_signed_user_idMany2one → res.partnerhelp='Contact on the account that signed the agreement/contract.'string='Signed By (Partner)'tracking=True args: 'res.partner' -
previous_version_agreements_idsOne2many → agreementcontext={'active_test': False}copy=Falsestring='Previous Versions' args: 'agreement', 'parent_agreement_id' -
readonlyBooleanrelated='stage_id.readonly' -
recital_idsOne2many → agreement.recitalcopy=Truestring='Recitals' args: 'agreement.recital', 'agreement_id' -
reviewed_dateDatetracking=True -
reviewed_user_idMany2one → res.usersstring='Reviewed By'tracking=True args: 'res.users' -
revisionIntegercopy=Falsedefault=0help='The revision will increase with every save event.' -
sections_idsOne2many → agreement.sectioncopy=Truestring='Sections' args: 'agreement.section', 'agreement_id' -
signed_contractBinarystring='Signed Document' -
signed_contract_filenameCharstring='Filename' -
special_termsTexthelp='Any terms that you have agreed to and want to track on the agreement/contract.'tracking=True -
stage_idMany2one → agreement.stagecopy=Falsedefault=<expr>group_expand='_read_group_stage_ids'help='Select the current stage of the agreement.'index=Truestring='Stage'tracking=True args: 'agreement.stage' -
start_dateDatehelp='When the agreement starts.'tracking=True -
stateSelectiondefault='draft'tracking=True args: [('draft', 'Draft'), ('active', 'Active'), ('inactive', 'Inactive')] -
template_idMany2one → agreementdomain=[('is_template', '=', True)]string='Template' args: 'agreement' -
termination_dateDatehelp='Date that the contract was terminated.'tracking=True -
termination_requestedDatehelp='Date that a request for termination was received.'string='Termination Requested Date'tracking=True -
to_review_dateDatecompute='_compute_to_review_date'help='Date used to warn us some days before agreement expires'readonly=Falsestore=True -
use_parties_contentBooleanhelp='Use custom content for parties' -
versionIntegercopy=Falsedefault=1help='The versions are used to keep track of document history and previous versions can be referenced.'
-
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)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide this appendix without removing it.' -
agreement_idMany2one → agreementondelete='cascade'string='Agreement' args: 'agreement' -
contentHtmltranslate=True -
dynamic_contentHtmlcompute='_compute_dynamic_content'help='compute dynamic Content'translate=True -
nameCharrequired=Truetranslate=True -
sequenceIntegerdefault=10 -
titleCharhelp='The title is displayed on the PDF. The name is not.'required=Truetranslate=True
No public methods.
New fields (9)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the agreement without removing it.' -
agreement_idMany2one → agreementondelete='cascade'string='Agreement' args: 'agreement' -
contentHtmlstring='Clause Content'translate=True -
dynamic_contentHtmlcompute='_compute_dynamic_content'help='compute dynamic Content'translate=True -
nameCharrequired=Truetranslate=True -
section_idMany2one → agreement.sectionondelete='cascade'string='Section' args: 'agreement.section' -
sequenceInteger -
temp_agreement_idMany2one → agreementhelp='This field help to filter section.'string='Temp Agreement' args: 'agreement' -
titleCharhelp='The title is displayed on the PDF. The name is not.'translate=True
No public methods.
New fields (5)
-
copyvalueCharhelp='Final placeholder expression, to be copy-pasted in the desired\n template field.'string='Placeholder Expression' -
default_valueCharhelp='Optional value to use if the target field is empty.' -
field_idMany2one → ir.model.fieldshelp='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_idMany2one → ir.model.fieldshelp='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_idMany2one → ir.modelhelp='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'
-
onchange_copyvalue(self)@api.onchange('field_id', 'sub_model_object_field_id', 'default_value')
New fields (5)
-
agreement_idMany2one → agreementondelete='cascade'string='Agreement' args: 'agreement' -
nameCharrequired=Truestring='Description' -
product_idMany2one → product.productstring='Product' args: 'product.product' -
qtyFloatstring='Quantity' -
uom_idMany2one → uom.uomrequired=Truestring='Unit of Measure' args: 'uom.uom'
No public methods.
New fields (7)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide this recital without removing it.' -
agreement_idMany2one → agreementondelete='cascade'string='Agreement' args: 'agreement' -
contentHtmltranslate=True -
dynamic_contentHtmlcompute='_compute_dynamic_content'help='compute dynamic Content'translate=True -
nameCharrequired=Truetranslate=True -
sequenceIntegerdefault=10 -
titleCharhelp='The title is displayed on the PDF. The name is not.'translate=True
No public methods.
New fields (8)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the agreement without removing it.' -
agreement_idMany2one → agreementondelete='cascade'string='Agreement' args: 'agreement' -
clauses_idsOne2many → agreement.clausecopy=Truestring='Clauses' args: 'agreement.clause', 'section_id' -
contentHtmlstring='Section Content'translate=True -
dynamic_contentHtmlcompute='_compute_dynamic_content'help='compute dynamic Content'translate=True -
nameCharrequired=Truetranslate=True -
sequenceInteger -
titleCharhelp='The title is displayed on the PDF. The name is not.'translate=True
No public methods.
New fields (6)
-
activeBooleandefault=True -
foldBooleanhelp='This stage is folded in the kanban view by default.'required=Falsestring='Is Folded' -
nameCharrequired=Truestring='Stage Name'translate=True -
readonlyBooleandefault=Falsehelp='The agreement can not edit if set Readonly = True.' -
sequenceIntegerdefault='1'required=False -
stage_typeSelectionrequired=Truestring='Type' args: [('agreement', 'Agreement')]
No public methods.
New fields (3)
-
activeBooleandefault=True -
agreement_type_idMany2one → agreement.typestring='Agreement Type' args: 'agreement.type' -
nameCharrequired=Truestring='Sub-Type Name'translate=True
No public methods.
New fields (3)
-
agreement_subtypes_idsOne2many → agreement.subtypestring='Sub-Types' args: 'agreement.subtype', 'agreement_type_id' -
review_daysInteger -
review_user_idMany2one → res.usershelp='User assigned automatically the activity on review date' args: 'res.users'
No public methods.
New fields (2)
-
nameCharrequired=Truestring='Title' -
template_idMany2one → agreementdomain=[('is_template', '=', True)]required=Truestring='Template' args: 'agreement'
-
create_agreement(self)
New fields (2)
-
agreement_idMany2one → agreementreadonly=Truerequired=True args: 'agreement' -
template_idMany2one → agreementreadonly=Truerelated='agreement_id.template_id' args: 'agreement'
-
action_recompute_from_template(self)
New fields (10)
-
module_agreement_helpdeskBooleanstring='Link your Helpdesk tickets to an agreement.' -
module_agreement_maintenanceBooleanstring='Manage maintenance agreements and contracts.' -
module_agreement_mrpBooleanstring='Link your manufacturing orders to an agreement.' -
module_agreement_projectBooleanstring='Link your projects and tasks to an agreement.' -
module_agreement_repairBooleanstring='Link your repair orders to an agreement.' -
module_agreement_rmaBooleanstring='Link your RMAs to an agreement.' -
module_agreement_saleBooleanstring='Create an agreement when the sale order is confirmed.' -
module_agreement_sale_subscriptionBooleanstring='Link your subscriptions to an agreement.' -
module_agreement_stockBooleanstring='Link your pickings to an agreement.' -
module_fieldservice_agreementBooleanstring='Link your Field Service orders and equipments to an agreement.'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…