TIP: You can type at any time to perform a new search.
Recurring - Contracts Management
contract · OCA/contract
- Repository
- OCA/contract · module folder · Try on Runboat
- Module version
- 1.0.3
- Category
- Contract Management
- Folder size
- 5.45 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/contract
- Last tracking update
- 2026-08-07 09:06:34
- Authors
- ACSONE SA/NV, Odoo Community Association (OCA), Tecnativa
- Maintainers
- ACSONE SA/NV, Odoo Community Association (OCA), Tecnativa
- Committers
- Pilar Vargas, Weblate, OCA-git-bot, Renzo Meister, oca-ci, bosd, eduezerouali-tecnativa, Bhavesh Heliconia
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- contract_analytic_tag, contract_membership_delegated_partner, contract_payment_mode, contract_sale, contract_update_last_date_invoiced, contract_variable_quantity, pms_contract
- Description
This module enables contracts management with recurring invoicing functions. Also you can print and send by email contract report. It works for customer contract and supplier contracts. Contracts are shown in portal.
Code Analysis ⓘ
Views touched (31)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
contract_contract_customer_form_view |
contract.contract customer form view (in contract) | contract.contract | form | Inherits contract_contract_form_view |
contract_contract_form_view |
contract.contract form view (in contract) | contract.contract | form | New |
contract_contract_search_view |
contract.contract search view (in contract) | contract.contract | search | New |
contract_contract_supplier_form_view |
contract.contract supplier form view (in contract) | contract.contract | form | Inherits contract_contract_form_view |
contract_contract_tree_view |
contract.contract list view (in contract) | contract.contract | list | New |
contract_line_customer_form_view |
contract.line customer form view (in contract) | contract.line | form | Inherits contract_line_form_view |
contract_line_form_view |
contract.line | form | Inherits contract_template_line_form_view | |
contract_line_report_tree_view |
contract.line report tree view (in contract) | contract.line | list | New |
contract_line_search_view |
contract.line search view (in contract) | contract.line | search | New |
contract_line_supplier_form_view |
contract.line supplier form view (in contract) | contract.line | form | Inherits contract_line_form_view |
contract_line_supplier_tree_view |
contract.line supplier list view (in contract) | contract.line | list | Inherits contract_line_tree_view |
contract_line_tree_view |
contract.line list view (in contract) | contract.line | list | New |
contract_line_view_pivot |
contract.line.view.pivot | contract.line | pivot | New |
contract_manually_create_invoice_form_view |
contract.manually.create.invoice | form | New | |
contract_tag_form_view |
contract.tag | form | New | |
contract_tag_tree_view |
contract.tag | list | New | |
contract_template_form_view |
contract.template form view (in contract) | contract.template | form | New |
contract_template_line_form_view |
contract.template.line | form | New | |
contract_template_search_view |
contract.template search view (in contract) | contract.template | search | New |
contract_template_tree_view |
contract.template list view (in contract) | contract.template | list | New |
mail_notification_contract |
mail_notification_contract | ir.ui.view | qweb | Inherits mail.mail_notification_layout |
portal_contract_page |
My Contract | ir.ui.view | qweb | New |
portal_my_contracts |
My Contracts | ir.ui.view | qweb | New |
portal_my_home_contract |
Show Contracts | ir.ui.view | qweb | Inherits portal.portal_my_home |
portal_my_home_menu_contract |
Portal layout : Contract menu entries | ir.ui.view | qweb | Inherits portal.portal_breadcrumbs |
report_contract_document |
report_contract_document | ir.ui.view | qweb | New |
report_contract_template |
report_contract_template | ir.ui.view | qweb | New |
res_config_settings_form_view |
res.config.settings | form | Inherits account.res_config_settings_view_form | |
template_contract_modification |
Contract Modification | ir.ui.view | qweb | New |
view_partner_form |
res.partner | form | Inherits base.view_partner_form | |
view_res_partner_filter |
res.partner | Inherits base.view_res_partner_filter |
HTTP endpoints (2)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/my/contracts/<int:contract_contract_id> |
PortalContract.portal_my_contract_detail |
public | http | ALL | website |
/my/contracts, /my/contracts/page/<int:page> |
PortalContract.portal_my_contracts |
user | http | ALL | website |
Models touched (10)
New fields (1)
-
contract_line_idMany2one → contract.lineindex=Truestring='Contract Line' args: 'contract.line'
No public methods.
New fields (21)
-
activeBooleandefault=True -
codeCharstring='Reference' -
commercial_partner_idMany2one → res.partnercompute_sudo=Trueindex=Truerelated='partner_id.commercial_partner_id'store=Truestring='Commercial Entity' args: 'res.partner' -
contract_line_fixed_idsOne2many → contract.linecomodel_name='contract.line'context={'active_test': False}inverse_name='contract_id'string='Contract lines (fixed)' -
contract_line_idsOne2many → contract.linecomodel_name='contract.line'context={'active_test': False}copy=Trueinverse_name='contract_id'string='Contract lines' -
contract_template_idMany2one → contract.templatecomodel_name='contract.template'string='Contract Template' -
create_invoice_visibilityBooleancompute='_compute_create_invoice_visibility' -
currency_idMany2one → res.currencycomodel_name='res.currency'compute='_compute_currency_id'inverse='_inverse_currency_id'string='Currency' -
date_endDatecompute='_compute_date_end'readonly=Falsestore=True -
fiscal_position_idMany2one → account.fiscal.positioncomodel_name='account.fiscal.position'ondelete='restrict'string='Fiscal Position' -
group_idMany2one → account.analytic.accountcomodel_name='account.analytic.account'compute='_compute_group_id'ondelete='restrict'readonly=Falsestore=Truestring='Group' -
invoice_countIntegercompute='_compute_invoice_count' -
invoice_partner_idMany2one → res.partnercomodel_name='res.partner'domain="['|',('id', 'parent_of', partner_id), ('id', 'child_of', partner_id)]"ondelete='restrict'string='Invoicing contact' -
manual_currency_idMany2one → res.currencycomodel_name='res.currency'readonly=True -
modification_idsOne2many → contract.modificationcomodel_name='contract.modification'inverse_name='contract_id'string='Modifications' -
nameChar -
noteTextstring='Notes' -
partner_idMany2one → res.partnercomodel_name='res.partner'inverse='_inverse_partner_id'required=True -
payment_term_idMany2one → account.payment.termcomodel_name='account.payment.term'index=Truestring='Payment Terms' -
tag_idsMany2many → contract.tagcomodel_name='contract.tag'string='Tags' -
user_idMany2one → res.userscomodel_name='res.users'default=<expr>index=Truestring='Responsible'
-
action_contract_send(self) -
action_preview(self)Invoked when 'Preview' button in contract form view is clicked. -
action_show_invoices(self) -
create(self, vals_list)@api.model_create_multi -
cron_recurring_create_invoice(self, date_ref=None)@api.model -
get_formview_id(self, access_uid=None) -
recurring_create_invoice(self)Button action This method triggers the creation of the next invoices of the contracts even if their next invoicing date is in the future. -
write(self, vals)
New fields (8)
-
activeBooleanreadonly=Truerelated='contract_id.active'store=Truestring='Active' -
contract_idMany2one → contract.contractbypass_search_access=Truecomodel_name='contract.contract'index=Trueondelete='cascade'required=Truestring='Contract' -
create_invoice_visibilityBooleancompute='_compute_create_invoice_visibility' -
currency_idMany2onerelated='contract_id.currency_id'store=True -
monthly_recurringMonetaryaggregator='sum'compute='_compute_monthly_recurring'currency_field='currency_id'store=True -
partner_idMany2onestore=True -
product_idMany2oneindex=True -
sequenceInteger
-
get_view(self, view_id=None, view_type='form', **options)@api.model
New fields (4)
-
contract_to_invoice_countIntegercompute='_compute_contract_to_invoice_ids' -
contract_to_invoice_idsMany2many → contract.contractcomodel_name='contract.contract'compute='_compute_contract_to_invoice_ids' -
contract_typeSelectiondefault='sale'required=Trueselection=[('sale', 'Customer'), ('purchase', 'Supplier')] -
invoice_dateDaterequired=True
-
action_show_contract_to_invoice(self) -
create_invoice(self)
New fields (4)
-
contract_idMany2one → contract.contractcomodel_name='contract.contract'index=Trueondelete='cascade'required=Truestring='Contract' -
dateDaterequired=True -
descriptionTextrequired=True -
sentBoolean
-
check_modification_ids_need_sent(self) -
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (10)
-
date_endDatehelp='Optional contract termination date (limits recurrence)'index=True -
date_startDatedefault=<expr>help='Contract activation date (first recurrence starts here)'index=True -
last_date_invoicedDatecopy=Falsereadonly=True -
next_period_date_endDatecompute='_compute_next_period_date_end'string='Next Period End' -
next_period_date_startDatecompute='_compute_next_period_date_start'string='Next Period Start' -
recurring_intervalIntegerdefault=1help='Invoice every (Days/Week/Month/Year)'string='Invoice Every' -
recurring_invoicing_offsetIntegercompute='_compute_recurring_invoicing_offset'help='Number of days to offset the invoice from the period end date (in post-paid mode) or start date (in pre-paid mode).'string='Invoicing offset' -
recurring_invoicing_typeSelectiondefault='pre-paid'help='Specify if the invoice must be generated at the beginning (pre-paid) or end (post-paid) of the period.'string='Invoicing type' args: [('pre-paid', 'Pre-paid'), ('post-paid', 'Post-paid')] -
recurring_next_dateDatecompute='_compute_recurring_next_date'copy=Truereadonly=Falsestore=Truestring='Date of Next Invoice' -
recurring_rule_typeSelectiondefault='monthly'help='Specify interval for automatic invoice generation.'string='Recurrence' args: [('daily', 'Day(s)'), ('weekly', 'Week(s)'), ('monthly', 'Month(s)'), ('monthlylastday', 'Month(s) last day'), ('quarterly', 'Quarter(s)'), ('semesterly', 'Semester(s)'), ('yearly', 'Year(s)')]
-
get_next_invoice_date(self, next_period_date_start, recurring_invoicing_type, recurring_invoicing_offset, recurring_rule_type, recurring_interval, max_date_end)@api.modelCompute the date of the next invoice based on all parameters. -
get_next_period_date_end(self, next_period_date_start, recurring_rule_type, recurring_interval, max_date_end, next_invoice_date=False, recurring_invoicing_type=False, recurring_invoicing_offset=False)@api.modelCompute the end date for the next period. -
get_relative_delta(self, recurring_rule_type, interval)@api.modelReturn a relativedelta for one period based on rule type.
New fields (3)
-
colorIntegerdefault=0 args: 'Color Index' -
company_idMany2one → res.companydefault=<expr>string='Company' args: 'res.company' -
nameCharrequired=True
No public methods.
New fields (9)
-
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=Truestring='Company' -
contract_line_idsOne2many → contract.template.linecomodel_name='contract.template.line'copy=Trueinverse_name='contract_id'string='Contract template lines' -
contract_typeSelectiondefault='sale'index=Trueselection=[('sale', 'Customer'), ('purchase', 'Supplier')] -
generation_typeSelectiondefault=<expr>help='Defines what document is automatically generated by the cron.'selection=[('invoice', 'Invoice')] -
journal_idMany2one → account.journalcheck_company=Truecomodel_name='account.journal'compute='_compute_journal_id'domain="[('type', '=', contract_type)]"index=Truereadonly=Falsestore=Truestring='Journal' -
line_recurrenceBooleanhelp='Check this if you want to control recurrence at the line level instead of for the whole contract.'string='Recurrence at line level?' -
nameCharrequired=True -
partner_idMany2one → res.partnercomodel_name='res.partner'index=Truestring='Partner' -
pricelist_idMany2one → product.pricelistcomodel_name='product.pricelist'string='Pricelist'
No public methods.
New fields (23)
-
allowed_uom_idsMany2many → uom.uomcomodel_name='uom.uom'compute='_compute_allowed_uom_ids' -
automatic_priceBooleancompute='_compute_automatic_price'help='If checked, the price will be taken from the pricelist. Otherwise, it must be set manually.'readonly=Falsestore=Truestring='Auto-price?' -
company_idMany2onereadonly=Truerelated='contract_id.company_id'store=True -
contract_idMany2one → contract.templatecomodel_name='contract.template'ondelete='cascade'required=Truestring='Contract' -
currency_idMany2one → res.currencyargs: 'res.currency' -
date_startDatecompute='_compute_date_start'copy=Truereadonly=Falsestore=True -
discountFloatdigits='Discount'help='Discount to apply on generated invoices. Must be ≤ 100.'string='Discount (%)' -
display_typeSelectiondefault=Falsehelp='Technical field for UX purposes.'selection=[('line_section', 'Section'), ('line_note', 'Note')] -
is_canceledBooleandefault=Falsestring='Canceled' -
is_recurring_noteBooleancompute='_compute_is_recurring_note'string='Recurring Note' -
nameTextcompute='_compute_name'readonly=Falserequired=Truestore=Truestring='Description' -
note_invoicing_modeSelectiondefault='with_previous_line'help='When to invoice this note line relative to others.'selection=[('with_previous_line', 'With previous line'), ('with_next_line', 'With next line'), ('custom', 'Custom')] -
partner_idMany2one → res.partnercomodel_name='res.partner'related='contract_id.partner_id' -
price_subtotalMonetarycompute='_compute_price_subtotal'string='Sub Total' -
price_unitFloatcompute='_compute_price_unit'inverse='_inverse_price_unit'string='Unit Price' -
product_idMany2one → product.productdomain=[('active', '=', True)]string='Product' args: 'product.product' -
quantityFloatdefault=1.0required=True -
recurring_intervalIntegercompute='_compute_recurring_interval'copy=Truereadonly=Falserequired=Truestore=True -
recurring_invoicing_typeSelectioncompute='_compute_recurring_invoicing_type'copy=Truereadonly=Falserequired=Truestore=True -
recurring_rule_typeSelectioncompute='_compute_recurring_rule_type'copy=Truereadonly=Falserequired=Truestore=True -
sequenceIntegerdefault=10help='Defines line ordering in the contract.' -
specific_priceFloat -
uom_idMany2one → uom.uomcomodel_name='uom.uom'compute='_compute_uom_id'domain="[('id', 'in', allowed_uom_ids)]"readonly=Falsestore=Truestring='Unit of Measure'
No public methods.
New fields (3)
-
contract_idsOne2many → contract.contractcomodel_name='contract.contract'inverse_name='partner_id'string='Contracts' -
purchase_contract_countIntegercompute='_compute_contract_count'string='Purchase Contracts' -
sale_contract_countIntegercompute='_compute_contract_count'string='Sale Contracts'
-
act_show_contract(self)This opens contract view @return: the contract view
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…