Account Invoice Payment Retention

account_invoice_payment_retention
REPOSITORY
REPOSITORYOCA/account-invoicing
GIT
GIThttps://github.com/OCA/account-invoicing.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-invoicing/tree/16.0/account_invoice_payment_retention
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting & Finance
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSkittiu
COMMITTERS
COMMITTERSWeblate, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/account-invoicing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings div Inherits account.res_config_settings_view_form
view_account_payment_register_form account.payment.register.form account.payment.register field Inherits account.view_account_payment_register_form
view_move_form account.move.form account.move xpath Inherits account.view_move_form
Models touched (5)

New fields (7)
  • amount_retention Float
    help='Retention in percent of this invoice, or by amount' readonly=True states={'draft': [('readonly', False)]} string='Retention'
  • domain_retained_move_ids Many2many → account.move
    column1='move_id' column2='retained_id' comodel_name='account.move' copy=False readonly=True relation='account_move_domain_retained_rel'
  • payment_retention Selection
    help='Suggested retention amount to be withheld on payment.\nNote: as a suggestiong, during payment, user can ignore it.' readonly=True selection=[('percent', 'Percent'), ('amount', 'Amount')] states={'draft': [('readonly', False)]}
  • retained_move_ids Many2many → account.move
    column1='invoice_id' column2='move_id' comodel_name='account.move' copy=False readonly=True relation='account_invoice_move_rel' states={'draft': [('readonly', False)]} string='Return Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Based on retention type, this field show the amount to retain.' store=True string='Retention Amount'
  • retention_method Selection
    default=<expr> help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=True selection=[('untax', 'Untaxed Amount'), ('total', 'Total')] states={'draft': [('readonly', False)]}
  • retention_residual_currency Monetary
    compute='_compute_retention_residual_currency' string='Retention Residual'
Public methods (1)
  • action_post(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • apply_payment_retention Boolean
    string='Apply Retention'
  • enforce_payment_retention Boolean
    default=True help='Enforce retention amount as suggested, otherwise, user can ignore the retention.' string='Enforce Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Expected amount to retain on payment currency' store=True string='Suggested Retention'
Public methods (1)
  • action_create_payments(self)

New fields (3)
  • retention_account_id Many2one → account.account
    comodel_name='account.account' domain=[('account_type', 'not in', ['asset_receivable', 'asset_cash', 'liability_payable'])] help='Retention account used for case payment retention'
  • retention_method Selection
    default='untax' help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' selection=[('untax', 'Untaxed Amount'), ('total', 'Total')]
  • retention_receivable_account_id Many2one → account.account
    comodel_name='account.account' domain=[('account_type', 'not in', ['asset_receivable', 'asset_cash', 'liability_payable'])] help='Retention account used for case payment retention'
Public methods (0)

No public methods.

New fields (4)
  • group_payment_retention Boolean
    implied_group='account_invoice_payment_retention.group_payment_retention' string="Enable Invoice's Retention on Payment"
  • retention_account_id Many2one → account.account
    comodel_name='account.account' help='Retention account used for case payment retention' readonly=False related='company_id.retention_account_id'
  • retention_method Selection
    help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=False related='company_id.retention_method' string='Retention Method'
  • retention_receivable_account_id Many2one → account.account
    comodel_name='account.account' help='Retention receivable account used for case payment retention' readonly=False related='company_id.retention_receivable_account_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-invoicing
GIT
GIThttps://github.com/OCA/account-invoicing.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-invoicing/tree/15.0/account_invoice_payment_retention
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting & Finance
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSkittiu
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/account-invoicing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:38
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings div Inherits account.res_config_settings_view_form
view_account_payment_register_form account.payment.register.form account.payment.register field Inherits account.view_account_payment_register_form
view_move_form account.move.form account.move xpath Inherits account.view_move_form
Models touched (5)

New fields (7)
  • amount_retention Float
    help='Retention in percent of this invoice, or by amount' readonly=True states={'draft': [('readonly', False)]} string='Retention'
  • domain_retained_move_ids Many2many → account.move
    column1='move_id' column2='retained_id' comodel_name='account.move' copy=False readonly=True relation='account_move_domain_retained_rel'
  • payment_retention Selection
    help='Suggested retention amount to be withheld on payment.\nNote: as a suggestiong, during payment, user can ignore it.' readonly=True selection=[('percent', 'Percent'), ('amount', 'Amount')] states={'draft': [('readonly', False)]}
  • retained_move_ids Many2many → account.move
    column1='invoice_id' column2='move_id' comodel_name='account.move' copy=False readonly=True relation='account_invoice_move_rel' states={'draft': [('readonly', False)]} string='Return Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Based on retention type, this field show the amount to retain.' store=True string='Retention Amount'
  • retention_method Selection
    default=<expr> help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=True selection=[('untax', 'Untaxed Amount'), ('total', 'Total')] states={'draft': [('readonly', False)]}
  • retention_residual_currency Monetary
    compute='_compute_retention_residual_currency' string='Retention Residual'
Public methods (1)
  • action_post(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • apply_payment_retention Boolean
    string='Apply Retention'
  • enforce_payment_retention Boolean
    default=True help='Enforce retention amount as suggested, otherwise, user can ignore the retention.' string='Enforce Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Expected amount to retain on payment currency' store=True string='Suggested Retention'
Public methods (1)
  • action_create_payments(self)

New fields (3)
  • retention_account_id Many2one → account.account
    comodel_name='account.account' domain=[('user_type_id.type', '=', 'other')] help='Retention account used for case payment retention'
  • retention_method Selection
    default='untax' help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' selection=[('untax', 'Untaxed Amount'), ('total', 'Total')]
  • retention_receivable_account_id Many2one → account.account
    comodel_name='account.account' domain=[('user_type_id.type', '=', 'other')] help='Retention account used for case payment retention'
Public methods (0)

No public methods.

New fields (4)
  • group_payment_retention Boolean
    implied_group='account_invoice_payment_retention.group_payment_retention' string="Enable Invoice's Retention on Payment"
  • retention_account_id Many2one → account.account
    comodel_name='account.account' help='Retention account used for case payment retention' readonly=False related='company_id.retention_account_id'
  • retention_method Selection
    help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=False related='company_id.retention_method' string='Retention Method'
  • retention_receivable_account_id Many2one → account.account
    comodel_name='account.account' help='Retention receivable account used for case payment retention' readonly=False related='company_id.retention_receivable_account_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-invoicing
GIT
GIThttps://github.com/OCA/account-invoicing.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-invoicing/tree/14.0/account_invoice_payment_retention
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYAccounting & Finance
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSkittiu
COMMITTERS
COMMITTERSOCA Transbot, Miquel Raïch, oca-travis, Weblate, OCA-git-bot, oca-ci, Kitti U, Saran440, ps-tubtim, oca-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/account-invoicing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings div Inherits account.res_config_settings_view_form
view_account_payment_register_form account.payment.register.form account.payment.register field Inherits account.view_account_payment_register_form
view_move_form account.move.form account.move xpath Inherits account.view_move_form
Models touched (5)

New fields (6)
  • amount_retention Float
    help='Retention in percent of this invoice, or by amount' readonly=True states={'draft': [('readonly', False)]} string='Retention'
  • payment_retention Selection
    help='Suggested retention amount to be withheld on payment.\nNote: as a suggestiong, during payment, user can ignore it.' readonly=True selection=[('percent', 'Percent'), ('amount', 'Amount')] states={'draft': [('readonly', False)]} string='Payment Retention'
  • retained_move_ids Many2many → account.move
    column1='invoice_id' column2='move_id' comodel_name='account.move' copy=False readonly=True relation='account_invoice_move_rel' states={'draft': [('readonly', False)]} string='Return Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Based on retention type, this field show the amount to retain.' store=True string='Retention Amount'
  • retention_method Selection
    default=<expr> help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=True selection=[('untax', 'Untaxed Amount'), ('total', 'Total')] states={'draft': [('readonly', False)]} string='Retention Method'
  • retention_residual_currency Monetary
    compute='_compute_retention_residual_currency' string='Retention Residual'
Public methods (1)
  • action_post(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • apply_payment_retention Boolean
    string='Apply Retention'
  • enforce_payment_retention Boolean
    default=True help='Enforce retention amount as suggested, otherwise, user can ignore the retention.' string='Enforce Retention'
  • retention_amount_currency Monetary
    compute='_compute_retention_amount_currency' help='Expected amount to retain on payment currency' store=True string='Suggested Retention'
Public methods (1)
  • action_create_payments(self)

New fields (2)
  • retention_account_id Many2one → account.account
    comodel_name='account.account' domain=[('user_type_id.type', '=', 'other')] help='Retention account used for case payment retention' string='Retention Account'
  • retention_method Selection
    default='untax' help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' selection=[('untax', 'Untaxed Amount'), ('total', 'Total')] string='Retention Method'
Public methods (0)

No public methods.

New fields (3)
  • group_payment_retention Boolean
    implied_group='account_invoice_payment_retention.group_payment_retention' string="Enable Invoice's Retention on Payment"
  • retention_account_id Many2one → account.account
    comodel_name='account.account' help='Retention account used for case payment retention' readonly=False related='company_id.retention_account_id' string='Retention Account'
  • retention_method Selection
    help='Method for computing the retention\n- Untaxed Amount: The retention compute from the untaxed amount\n- Total: The retention compute from the total amount' readonly=False related='company_id.retention_method' string='Retention Method'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/account-invoicing
PULL REQUEST
PULL REQUEST[18.0][MIG] account_invoice_payment_retention (#2025)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/account-invoicing
PULL REQUEST
PULL REQUEST[17.0][MIG] account_invoice_payment_retention: Migration to 17.0 (#2034)