Purchase Work Acceptance Invoice Plan

purchase_work_acceptance_invoice_plan
REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/18.0/purchase_work_acceptance_invoice_plan
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYPurchase Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
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/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_work_acceptance
    - purchase_invoice_plan
    - purchase_open_qty
    - purchase_order_line_menu
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module add ability to create Work Acceptance based on the
predefined invoice plan, one by one.

**Note:**

Because WA is now based on invoice plan, the option "Create Bill by
Plan" will be removed.

User will be left with only option "Create Bill" (and to choose WA), the
chosen WA is now used to control the quantity in invoice instead of the
invoice plan.

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
purchase_order_form purchase.order.form.invoice.plan purchase.order button Inherits purchase_invoice_plan.purchase_order_form
purchase_order_form_inherit purchase.order.form.invoice.plan purchase.order xpath Inherits purchase_work_acceptance.purchase_order_form_inherit
view_purchase_invoice_plan_form view_purchase_invoice_plan_form purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_form
view_purchase_invoice_plan_tree view_purchase_invoice_plan_tree purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree
view_purchase_invoice_plan_tree_readonly view_purchase_invoice_plan_tree_readonly purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
view_select_work_acceptance_invoice_plan_wizard select_work_acceptance_invoice_plan_wizard select.work.acceptance.invoice.plan.wizard form New
view_work_acceptance_form work.acceptance.form work.acceptance xpath Inherits purchase_work_acceptance.view_work_acceptance_form
Models touched (6)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (8)
  • amount Monetary
    compute='_compute_amount' inverse='_inverse_amount'
  • analytic_distribution Json
    related='order_line_id.analytic_distribution'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' related='wizard_id.order_id.currency_id'
  • order_id Many2one
    related='wizard_id.order_id'
  • order_line_id Many2one → purchase.order.line
    comodel_name='purchase.order.line' domain="[('order_id', '=', order_id)]" index=True required=True string='Product Line'
  • qty_not_accepted Float
    digits='Product Unit of Measure' related='order_line_id.qty_to_accept' string='Not Accepted'
  • quantity Float
    digits='Product Unit of Measure' string='To Accept'
  • wizard_id Many2one → select.work.acceptance.invoice.plan.wizard
    comodel_name='select.work.acceptance.invoice.plan.wizard' ondelete='cascade'
Public methods (0)

No public methods.

New fields (7)
  • active_installment_ids Many2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' compute='_compute_active_installment_ids'
  • apply_method_id Many2one → ir.actions.server
    comodel_name='ir.actions.server' domain=[('usage', '=', 'ir_actions_server'), ('model_id.model', '=', 'select.work.acceptance.invoice.plan.wizard')] help='Choose the method to find matcing product line for this installment' string='Base On'
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' domain="[('id', 'in', active_installment_ids), ('installment', '>', 0)]" help='List only installment that has not been used in WA (draft, accepted)' required=True string='Invoice Plan'
  • order_id Many2one → purchase.order
    comodel_name='purchase.order' default=<expr>
  • order_line_ids Many2many → purchase.order.line
    column1='wizard_id' column2='order_line_id' comodel_name='purchase.order.line' compute='_compute_order_line_ids' domain="[('order_id', '=', order_id)]" help='List of product lines used to create WA. Blank means all' readonly=False relation='select_wa_invoice_plan_order_line_rel' store=True string='Product Filter'
  • valid_amount Boolean
    compute='_compute_valid_amount'
  • wa_qty_line_ids One2many → select.work.acceptance.invoice.plan.qty
    comodel_name='select.work.acceptance.invoice.plan.qty' compute='_compute_wa_qty_line_ids' inverse_name='wizard_id' readonly=False store=True
Public methods (2)
  • button_create_wa(self)
  • default_get(self, field_list)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False ondelete='restrict' readonly=True string='Invoice Plan'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/15.0/purchase_work_acceptance_invoice_plan
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPurchase Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSPedro M. Baeza, OCA-git-bot, oca-ci, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_work_acceptance
    - purchase_invoice_plan
    - purchase_open_qty
    - purchase_order_line_menu
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
purchase_order_form purchase.order.form.invoice.plan purchase.order button Inherits purchase_invoice_plan.purchase_order_form
purchase_order_form_inherit purchase.order.form.invoice.plan purchase.order xpath Inherits purchase_work_acceptance.purchase_order_form_inherit
view_purchase_invoice_plan_form view_purchase_invoice_plan_form purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_form
view_purchase_invoice_plan_tree view_purchase_invoice_plan_tree purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree
view_purchase_invoice_plan_tree_readonly view_purchase_invoice_plan_tree_readonly purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
view_select_work_acceptance_invoice_plan_wizard select_work_acceptance_invoice_plan_wizard select.work.acceptance.invoice.plan.wizard form New
view_work_acceptance_form work.acceptance.form work.acceptance xpath Inherits purchase_work_acceptance.view_work_acceptance_form
Models touched (6)

New fields (0)

No new fields.

Public methods (1)
  • name_get(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • account_analytic_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' related='order_line_id.account_analytic_id'
  • amount Monetary
    compute='_compute_amount' inverse='_inverse_amount'
  • analytic_tag_ids Many2many → account.analytic.tag
    comodel_name='account.analytic.tag' related='order_line_id.analytic_tag_ids'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' related='wizard_id.order_id.currency_id'
  • order_id Many2one
    related='wizard_id.order_id'
  • order_line_id Many2one → purchase.order.line
    comodel_name='purchase.order.line' domain="[('order_id', '=', order_id)]" index=True required=True string='Product Line'
  • qty_not_accepted Float
    digits='Product Unit of Measure' related='order_line_id.qty_to_accept' string='Not Accepted'
  • quantity Float
    digits='Product Unit of Measure' string='To Accept'
  • wizard_id Many2one → select.work.acceptance.invoice.plan.wizard
    comodel_name='select.work.acceptance.invoice.plan.wizard' ondelete='cascade'
Public methods (0)

No public methods.

New fields (7)
  • active_installment_ids Many2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' compute='_compute_active_installment_ids'
  • apply_method_id Many2one → ir.actions.server
    comodel_name='ir.actions.server' domain=[('usage', '=', 'ir_actions_server'), ('model_id.model', '=', 'select.work.acceptance.invoice.plan.wizard')] help='Choose the method to find matcing product line for this installment' string='Base On'
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' domain="[('id', 'in', active_installment_ids), ('installment', '>', 0)]" help='List only installment that has not been used in WA (draft, accepted)' required=True string='Invoice Plan'
  • order_id Many2one → purchase.order
    comodel_name='purchase.order' default=<expr>
  • order_line_ids Many2many → purchase.order.line
    column1='wizard_id' column2='order_line_id' comodel_name='purchase.order.line' compute='_compute_order_line_ids' domain="[('order_id', '=', order_id)]" help='List of product lines used to create WA. Blank means all' readonly=False relation='select_wa_invoice_plan_order_line_rel' store=True string='Product Filter'
  • valid_amount Boolean
    compute='_compute_valid_amount'
  • wa_qty_line_ids One2many → select.work.acceptance.invoice.plan.qty
    comodel_name='select.work.acceptance.invoice.plan.qty' compute='_compute_wa_qty_line_ids' inverse_name='wizard_id' readonly=False store=True
Public methods (2)
  • button_create_wa(self)
  • default_get(self, field_list)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False ondelete='restrict' readonly=True string='Invoice Plan'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/14.0/purchase_work_acceptance_invoice_plan
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYPurchase Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSoca-travis, Weblate, OCA-git-bot, oca-ci, Kitti U, Saran440
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_work_acceptance
    - purchase_invoice_plan
    - purchase_open_qty
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
purchase_order_form purchase.order.form.invoice.plan purchase.order button Inherits purchase_invoice_plan.purchase_order_form
purchase_order_form_inherit purchase.order.form.invoice.plan purchase.order xpath Inherits purchase_work_acceptance.purchase_order_form_inherit
view_purchase_invoice_plan_form view_purchase_invoice_plan_form purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_form
view_purchase_invoice_plan_tree view_purchase_invoice_plan_tree purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree
view_purchase_invoice_plan_tree_readonly view_purchase_invoice_plan_tree_readonly purchase.invoice.plan field Inherits purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
view_select_work_acceptance_invoice_plan_wizard select_work_acceptance_invoice_plan_wizard select.work.acceptance.invoice.plan.wizard form New
view_work_acceptance_form work.acceptance.form work.acceptance xpath Inherits purchase_work_acceptance.view_work_acceptance_form
Models touched (6)

New fields (0)

No new fields.

Public methods (1)
  • name_get(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • account_analytic_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' related='order_line_id.account_analytic_id'
  • amount Monetary
    compute='_compute_amount' inverse='_inverse_amount' string='Amount'
  • analytic_tag_ids Many2many → account.analytic.tag
    comodel_name='account.analytic.tag' related='order_line_id.analytic_tag_ids'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' related='wizard_id.order_id.currency_id'
  • order_id Many2one
    related='wizard_id.order_id'
  • order_line_id Many2one → purchase.order.line
    comodel_name='purchase.order.line' domain="[('order_id', '=', order_id)]" index=True required=True string='Product Line'
  • qty_not_accepted Float
    digits='Product Unit of Measure' related='order_line_id.qty_to_accept' string='Not Accepted'
  • quantity Float
    digits='Product Unit of Measure' string='To Accept'
  • wizard_id Many2one → select.work.acceptance.invoice.plan.wizard
    comodel_name='select.work.acceptance.invoice.plan.wizard' ondelete='cascade'
Public methods (0)

No public methods.

New fields (7)
  • active_installment_ids Many2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' compute='_compute_active_installment_ids'
  • apply_method_id Many2one → ir.actions.server
    comodel_name='ir.actions.server' domain=[('usage', '=', 'ir_actions_server'), ('model_id.model', '=', 'select.work.acceptance.invoice.plan.wizard')] help='Choose the method to find matcing product line for this installment' string='Base On'
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' domain="[('id', 'in', active_installment_ids), ('installment', '>', 0)]" help='List only installment that has not been used in WA (draft, accepted)' required=True string='Invoice Plan'
  • order_id Many2one → purchase.order
    comodel_name='purchase.order' default=<expr>
  • order_line_ids Many2many → purchase.order.line
    column1='wizard_id' column2='order_line_id' comodel_name='purchase.order.line' compute='_compute_order_line_ids' domain="[('order_id', '=', order_id)]" help='List of product lines used to create WA. Blank means all' readonly=False relation='select_wa_invoice_plan_order_line_rel' store=True string='Product Filter'
  • valid_amount Boolean
    compute='_compute_valid_amount'
  • wa_qty_line_ids One2many → select.work.acceptance.invoice.plan.qty
    comodel_name='select.work.acceptance.invoice.plan.qty' compute='_compute_wa_qty_line_ids' inverse_name='wizard_id' readonly=False store=True
Public methods (2)
  • button_create_wa(self)
  • default_get(self, field_list)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • installment_id Many2one → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False ondelete='restrict' readonly=True string='Invoice Plan'
Public methods (0)

No public methods.