Purchase Invoice Plan

purchase_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_invoice_plan
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYPurchase
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, Ricardoalso, Rafael Lima
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_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
By standard feature, user can gradually create partial invoices, one by
one and in step create invoice the standard call invoice. This module
add ability to create invoices based on the predefined invoice plan,
either all at once, or one by one.

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
purchase_order_form purchase_order_form purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan list New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan list New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True
  • interval Integer
    default=1 required=True
  • interval_type Selection
    default='month' required=True args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (14)
  • amount Float
    compute='_compute_amount' digits='Product Price' help='This amount will be used to calculate the percent' inverse='_inverse_amount'
  • amount_invoiced Float
    compute='_compute_invoiced' readonly=False store=True
  • installment Integer
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' store=True string='Invoice Created'
  • last Boolean
    compute='_compute_last' help='Last installment will create invoice use remaining amount' string='Last Installment'
  • no_edit Boolean
    compute='_compute_no_edit'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Purchase Invoice Plan Percent' help='This percent will be used to calculate new quantity'
  • plan_date Date
    required=True
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' store=True string='Next Invoice'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (5)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • ip_total_amount Monetary
    compute='_compute_ip_total' string='Total Amount'
  • ip_total_percent Float
    compute='_compute_ip_total' string='Percent'
  • use_invoice_plan Boolean
    copy=False default=False
Public methods (4)
  • action_view_invoice(self, invoices=False)
  • button_confirm(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/17.0/purchase_invoice_plan
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSPedro M. Baeza, Weblate, OCA-git-bot, oca-ci, ilo
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - 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_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
By standard feature, user can gradually create partial invoices, one by
one and in step create invoice the standard call invoice. This module
add ability to create invoices based on the predefined invoice plan,
either all at once, or one by one.

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
purchase_order_form purchase_order_form purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True
  • interval Integer
    default=1 required=True
  • interval_type Selection
    default='month' required=True args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (14)
  • amount Float
    compute='_compute_amount' digits='Product Price' help='This amount will be used to calculate the percent' inverse='_inverse_amount'
  • amount_invoiced Float
    compute='_compute_invoiced' readonly=False store=True
  • installment Integer
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' store=True string='Invoice Created'
  • last Boolean
    compute='_compute_last' help='Last installment will create invoice use remaining amount' string='Last Installment'
  • no_edit Boolean
    compute='_compute_no_edit'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Purchase Invoice Plan Percent' help='This percent will be used to calculate new quantity'
  • plan_date Date
    required=True
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' store=True string='Next Invoice'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (5)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • ip_total_amount Monetary
    compute='_compute_ip_total' string='Total Amount'
  • ip_total_percent Float
    compute='_compute_ip_total' string='Percent'
  • use_invoice_plan Boolean
    copy=False default=False
Public methods (4)
  • action_view_invoice(self, invoices=False)
  • button_confirm(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/16.0/purchase_invoice_plan
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYPurchase
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, Aungkokolin1997
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - 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_gs1_nomenclature
    - 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 purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True
  • interval Integer
    default=1 required=True
  • interval_type Selection
    default='month' required=True args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (14)
  • amount Float
    compute='_compute_amount' digits='Product Price' help='This amount will be used to calculate the percent' inverse='_inverse_amount'
  • amount_invoiced Float
    compute='_compute_invoiced' readonly=False store=True
  • installment Integer
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' store=True string='Invoice Created'
  • last Boolean
    compute='_compute_last' help='Last installment will create invoice use remaining amount' string='Last Installment'
  • no_edit Boolean
    compute='_compute_no_edit'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Purchase Invoice Plan Percent' help='This percent will be used to calculate new quantity'
  • plan_date Date
    required=True
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' store=True string='Next Invoice'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (5)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • ip_total_amount Monetary
    compute='_compute_ip_total' string='Total Amount'
  • ip_total_percent Float
    compute='_compute_ip_total' string='Percent'
  • use_invoice_plan Boolean
    copy=False default=False
Public methods (4)
  • action_view_invoice(self, invoices=False)
  • button_confirm(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
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_invoice_plan
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYPurchase
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/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - 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 purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True
  • interval Integer
    default=1 required=True
  • interval_type Selection
    default='month' required=True args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (14)
  • amount Float
    compute='_compute_amount' digits='Product Price' help='This amount will be used to calculate the percent' inverse='_inverse_amount'
  • amount_invoiced Float
    compute='_compute_invoiced' readonly=False store=True
  • installment Integer
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' store=True string='Invoice Created'
  • last Boolean
    compute='_compute_last' help='Last installment will create invoice use remaining amount' string='Last Installment'
  • no_edit Boolean
    compute='_compute_no_edit'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Purchase Invoice Plan Percent' help='This percent will be used to calculate new quantity'
  • plan_date Date
    required=True
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' store=True string='Next Invoice'
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (5)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • ip_total_amount Monetary
    compute='_compute_ip_total' string='Total Amount'
  • ip_total_percent Float
    compute='_compute_ip_total' string='Percent'
  • use_invoice_plan Boolean
    copy=False default=False
Public methods (4)
  • action_view_invoice(self, invoices=False)
  • button_confirm(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
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_invoice_plan
VERSION
VERSION 1.3.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSDenis Roussel, oca-travis, Weblate, OCA-git-bot, Kitti U, newtratip, Saran440, ps-tubtim, oca-git-bot, Surachet Saejueng
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - 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 purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True string='Installment Date'
  • interval Integer
    default=1 required=True string='Interval'
  • interval_type Selection
    default='month' required=True string='Interval Type' args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (14)
  • amount Float
    compute='_compute_amount' digits='Product Price' help='This amount will be used to calculate the percent' inverse='_inverse_amount' string='Amount'
  • amount_invoiced Float
    compute='_compute_invoiced' readonly=False store=True
  • installment Integer
    string='Installment'
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' store=True string='Invoice Created'
  • last Boolean
    compute='_compute_last' help='Last installment will create invoice use remaining amount' string='Last Installment'
  • no_edit Boolean
    compute='_compute_no_edit'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Purchase Invoice Plan Percent' help='This percent will be used to calculate new quantity' string='Percent'
  • plan_date Date
    required=True string='Plan Date'
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' store=True string='Next Invoice'
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (5)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • ip_total_amount Monetary
    compute='_compute_ip_total' string='Total Amount'
  • ip_total_percent Float
    compute='_compute_ip_total' string='Percent'
  • use_invoice_plan Boolean
    copy=False default=False string='Use Invoice Plan'
Public methods (4)
  • action_view_invoice(self, invoices=False)
  • button_confirm(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/13.0/purchase_invoice_plan
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSOCA Transbot, João Marques, oca-travis, OCA-git-bot, Kitti U
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:18
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_open_qty
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - 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 purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True string='Installment Date'
  • interval Integer
    default=1 required=True string='Interval'
  • interval_type Selection
    default='month' required=True string='Interval Type' args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)

New fields (10)
  • installment Integer
    string='Installment'
  • invoice_ids Many2many → account.move
    column1='plan_id' column2='move_id' comodel_name='account.move' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices'
  • invoice_type Selection
    default='installment' required=True selection=[('installment', 'Installment')] string='Type'
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' string='Invoice Created'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits='Product Unit of Measure' help='This percent will be used to calculate new quantity' string='Percent'
  • plan_date Date
    required=True string='Plan Date'
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' selection=[('draft', 'RFQ'), ('sent', 'RFQ Sent'), ('to approve', 'To Approve'), ('purchase', 'Purchase Order'), ('done', 'Locked'), ('cancel', 'Cancelled')] store=True string='Status'
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' string='Next Invoice'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)

New fields (3)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' readonly=True states={'draft': [('readonly', False)]} string='Invoice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • use_invoice_plan Boolean
    copy=False default=False string='Use Invoice Plan'
Public methods (4)
  • action_confirm(self)
  • action_invoice_create(self)
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
  • remove_invoice_plan(self)
REPOSITORY
REPOSITORYOCA/purchase-workflow
GIT
GIThttps://github.com/OCA/purchase-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/purchase-workflow/tree/12.0/purchase_invoice_plan
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Ecosoft
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Ecosoft
COMMITTERS
COMMITTERSSylvain LE GAL, GitHub, oca-travis, OCA-git-bot, Kitti U
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:23
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_open_qty
odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - http_routing
    - digest
    - purchase_stock
    - stock_account
    - stock
    - barcodes
    - 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 purchase.order xpath Inherits purchase.purchase_order_form
view_purchase_create_invoice_plan Create Invoice Plan purchase.create.invoice.plan form New
view_purchase_invoice_plan_filter view.purchase.invoice.plan.filter purchase.invoice.plan search New
view_purchase_invoice_plan_form view.purchase.invoice.plan.form purchase.invoice.plan form New
view_purchase_invoice_plan_tree view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_invoice_plan_tree_readonly view.purchase.invoice.plan.tree purchase.invoice.plan tree New
view_purchase_make_planned_invoice view.purchase.make.planned.invoice purchase.make.planned.invoice form New
Models touched (4)

New fields (4)
  • installment_date Date
    default=fields.Date.context_today required=True string='Installment Date'
  • interval Integer
    default=1 required=True string='Interval'
  • interval_type Selection
    default='month' required=True string='Interval Type' args: [('day', 'Day'), ('month', 'Month'), ('year', 'Year')]
  • num_installment Integer
    default=0 required=True string='Number of Installment'
Public methods (1)
  • purchase_create_invoice_plan(self)
    @api.multi

New fields (10)
  • installment Integer
    string='Installment'
  • invoice_ids Many2many → account.invoice
    column1='plan_id' column2='invoice_id' readonly=True relation='purchase_invoice_plan_invoice_rel' string='Invoices' args: 'account.invoice'
  • invoice_type Selection
    default='installment' required=True string='Type' args: [('installment', 'Installment')]
  • invoiced Boolean
    compute='_compute_invoiced' help='If this line already invoiced' string='Invoice Created'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True related='purchase_id.partner_id' store=True string='Supplier'
  • percent Float
    digits=dp.get_precision('Product Unit of Measure') help='This percent will be used to calculate new quantity' string='Percent'
  • plan_date Date
    required=True string='Plan Date'
  • purchase_id Many2one → purchase.order
    comodel_name='purchase.order' index=True ondelete='cascade' readonly=True string='Purchases Order'
  • state Selection
    index=True related='purchase_id.state' store=True string='Status' args: [('draft', 'RFQ'), ('sent', 'RFQ Sent'), ('to approve', 'To Approve'), ('purchase', 'Purchase Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • to_invoice Boolean
    compute='_compute_to_invoice' help='If this line is ready to create new invoice' string='Next Invoice'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_invoices_by_plan(self)
    @api.multi

New fields (3)
  • invoice_plan_ids One2many → purchase.invoice.plan
    comodel_name='purchase.invoice.plan' copy=False inverse_name='purchase_id' readonly=True states={'draft': [('readonly', False)]} string='Inovice Plan'
  • ip_invoice_plan Boolean
    compute='_compute_ip_invoice_plan' help='At least one invoice plan line pending to create invoice' string='Invoice Plan In Process'
  • use_invoice_plan Boolean
    copy=False default=False string='Use Invoice Plan'
Public methods (4)
  • action_confirm(self)
    @api.multi
  • action_invoice_create(self)
    @api.multi
  • create_invoice_plan(self, num_installment, installment_date, interval, interval_type)
    @api.multi
  • remove_invoice_plan(self)
    @api.multi