Payment Register with Multiple Deduction

account_payment_multi_deduction
REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/18.0/account_payment_multi_deduction
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - 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
This module extend invoice(s)'s register payment feature, from "Mark
invoice as fully paid" with a single writeoff amount, to "Mark invoice
as fully paid (multi deduct)" which allow multiple deduction amounts.

**Note:** We use the word "Deduction", as the diff amount can be
anything not only to writeoff.

Code Analysis

Views touched (1)
XML IDNameModelTypeStatus
view_account_payment_register_form account.payment.register.form account.payment.register xpath Inherits account.view_account_payment_register_form
Models touched (3)

New fields (1)
  • is_writeoff Boolean
Public methods (0)

No public methods.

New fields (7)
  • account_id Many2one → account.account
    check_company=True comodel_name='account.account' domain=[('deprecated', '=', False)]
  • amount Monetary
    required=True string='Deduction Amount'
  • company_id Many2one → res.company
    comodel_name='res.company' related='register_payment_id.company_id'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' related='register_payment_id.currency_id'
  • is_open Boolean
    help='Keep this line open' string='Open'
  • name Char
    required=True string='Label'
  • register_payment_id Many2one → account.payment.register
    comodel_name='account.payment.register' index=True ondelete='cascade' readonly=True
Public methods (0)

No public methods.

New fields (4)
  • deduct_analytic_distribution Json
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='register_payment_id' string='Deductions'
  • payment_difference_handling Selection
    ondelete={'reconcile_multi_deduct': 'cascade'} selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/17.0/account_payment_multi_deduction
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Randall Castro, Jesús Valdez
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - 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
This module extend invoice(s)'s register payment feature, from "Mark
invoice as fully paid" with a single writeoff amount, to "Mark invoice
as fully paid (multi deduct)" which allow multiple deduction amounts.

**Note:** We use the word "Deduction", as the diff amount can be
anything not only to writeoff.

Code Analysis

Views touched (1)
XML IDNameModelTypeStatus
view_account_payment_register_form account.payment.register.form account.payment.register xpath Inherits account.view_account_payment_register_form
Models touched (3)

New fields (1)
  • is_multi_deduction Boolean
Public methods (1)
  • write(self, vals)
    Skip move synchronization when edit payment with multi deduction

New fields (6)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=False
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id'
  • is_open Boolean
    help='Keep this line open' string='Open'
  • name Char
    required=True string='Label'
  • payment_id Many2one → account.payment.register
    comodel_name='account.payment.register' ondelete='cascade' readonly=True
Public methods (0)

No public methods.

New fields (4)
  • deduct_analytic_distribution Json
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
  • payment_difference_handling Selection
    ondelete={'reconcile_multi_deduct': 'cascade'} selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/16.0/account_payment_multi_deduction
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSWeblate, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:56
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 (1)
XML IDNameModelTypeStatus
view_account_payment_register_form account.payment.register.form account.payment.register xpath Inherits account.view_account_payment_register_form
Models touched (3)

New fields (1)
  • is_multi_deduction Boolean
Public methods (1)
  • write(self, vals)
    Skip move synchronization when edit payment with multi deduction

New fields (6)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=False
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id'
  • is_open Boolean
    help='Keep this line open' string='Open'
  • name Char
    required=True string='Label'
  • payment_id Many2one → account.payment.register
    comodel_name='account.payment.register' ondelete='cascade' readonly=True
Public methods (0)

No public methods.

New fields (4)
  • deduct_analytic_distribution Json
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
  • payment_difference_handling Selection
    ondelete={'reconcile_multi_deduct': 'cascade'} selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/15.0/account_payment_multi_deduction
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
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 (1)
XML IDNameModelTypeStatus
view_account_payment_register_form account.payment.register.form account.payment.register xpath Inherits account.view_account_payment_register_form
Models touched (3)

New fields (1)
  • is_multi_deduction Boolean
Public methods (0)

No public methods.

New fields (8)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=False
  • amount Monetary
    required=True string='Deduction Amount'
  • analytic_account_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' compute='_compute_analytic_multi_deduction' index=True readonly=False store=True string='Analytic Account'
  • analytic_tag_ids Many2many → account.analytic.tag
    comodel_name='account.analytic.tag' string='Analytic Tags'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id'
  • name Char
    required=True string='Label'
  • open Boolean
    help='Keep this line open'
  • payment_id Many2one → account.payment.register
    comodel_name='account.payment.register' ondelete='cascade' readonly=True
Public methods (0)

No public methods.

New fields (7)
  • deduct_analytic_account_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' compute='_compute_default_analytic'
  • deduct_analytic_tag_ids Many2many → account.analytic.tag
    comodel_name='account.analytic.tag' compute='_compute_default_analytic'
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
  • payment_difference_handling Selection
    ondelete={'reconcile_multi_deduct': 'cascade'} selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
  • writeoff_analytic_account_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' index=True string='Analytic Account'
  • writeoff_analytic_tag_ids Many2many → account.analytic.tag
    comodel_name='account.analytic.tag' string='Analytic Tags'
Public methods (1)
  • action_create_payments(self)
REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/14.0/account_payment_multi_deduction
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSAlexandre Fayolle, oca-travis, Weblate, OCA-git-bot, Saran440, ps-tubtim, oca-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
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 (1)
XML IDNameModelTypeStatus
view_account_payment_register_form account.payment.register.form account.payment.register xpath Inherits account.view_account_payment_register_form
Models touched (3)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=False string='Account'
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id' string='Currency'
  • name Char
    required=True string='Label'
  • open Boolean
    help='Keep this line open' string='Open'
  • payment_id Many2one → account.payment.register
    comodel_name='account.payment.register' ondelete='cascade' readonly=True string='Payment'
Public methods (0)

No public methods.

New fields (3)
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
  • payment_difference_handling Selection
    ondelete={'reconcile_multi_deduct': 'cascade'} selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (1)
  • action_create_payments(self)
REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/13.0/account_payment_multi_deduction
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSStéphane Bidoul, GitHub, Víctor Martínez, oca-travis, OCA-git-bot, Kitti U, Saran440, kittiu
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:19
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 (1)
XML IDNameModelTypeStatus
view_account_payment_form view.account.payment.form account.payment xpath Inherits account.view_account_payment_form
Models touched (2)

New fields (3)
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
  • payment_difference_handling Selection
    selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (0)

No public methods.

New fields (6)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=False string='Account'
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id' string='Currency'
  • name Char
    required=True string='Label'
  • open Boolean
    help='Keep this line open' string='Open'
  • payment_id Many2one → account.payment
    comodel_name='account.payment' ondelete='cascade' readonly=True string='Payment'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/account-payment
GIT
GIThttps://github.com/OCA/account-payment.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-payment/tree/12.0/account_payment_multi_deduction
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSGitHub, sbejaoui, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Kitti U
WEBSITE
WEBSITEhttps://github.com/OCA/account-payment/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
view_account_payment_from_invoices view.account.payment.from.invoices account.register.payments xpath Inherits account.view_account_payment_from_invoices
view_account_payment_invoice_form account.payment.form account.payment xpath Inherits account.view_account_payment_invoice_form
Models touched (5)

New fields (1)
  • payment_difference_handling Selection
    selection_add=[('reconcile_multi_deduct', 'Mark invoice as fully paid (multi deduct)')]
Public methods (0)

No public methods.

New fields (2)
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.payment.deduction
    comodel_name='account.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
Public methods (0)

No public methods.

New fields (5)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=True string='Account'
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id' string='Currency'
  • name Char
    required=True string='Label'
  • payment_id Many2one → account.payment
    comodel_name='account.payment' ondelete='cascade' readonly=True string='Payment'
Public methods (0)

No public methods.

New fields (5)
  • account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] required=True string='Account'
  • amount Monetary
    required=True string='Deduction Amount'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True related='payment_id.currency_id' string='Currency'
  • name Char
    required=True string='Label'
  • payment_id Many2one → account.register.payments
    comodel_name='account.register.payments' ondelete='cascade' readonly=True string='Payment'
Public methods (0)

No public methods.

New fields (2)
  • deduct_residual Monetary
    compute='_compute_deduct_residual' string='Remainings'
  • deduction_ids One2many → account.register.payment.deduction
    comodel_name='account.register.payment.deduction' copy=False help='Sum of deduction amount(s) must equal to the payment difference' inverse_name='payment_id' string='Deductions'
Public methods (0)

No public methods.