Purchase Blanket Orders

purchase_blanket_order
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_blanket_order
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Fernando, Ugne Sinkeviciene
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
odoo/odoo:
    - purchase
    - 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
A purchase blanket order is a pre-agreement to purchase a certain number
of quantities of products at a specific price. From a confirmed blanket
order, the users can create new purchase orders at such price, until the
blanket order expires due to reaching the validity date.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line list New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order list New
Models touched (7)

New fields (26)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • cancelled Boolean
    copy=False
  • company_id Many2one → res.company
    default=_default_company readonly=True string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True tracking=True
Public methods (10)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • compute_warnings(self)
    @api.model
    Base function to create activity warnings
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    string='Description' tracking=True
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' precompute=True readonly=False required=True store=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (1)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    comodel_name='purchase.blanket.order.line' copy=False domain="[('product_id', '=', product_id)]"
Public methods (6)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • create(self, vals_list)
    @api.model_create_multi
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to POs'
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/17.0/purchase_blanket_order
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSDaniel Reis, Weblate, OCA-git-bot, oca-ci, ArnauCForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
odoo/odoo:
    - purchase
    - 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
A purchase blanket order is a pre-agreement to purchase a certain number
of quantities of products at a specific price. From a confirmed blanket
order, the users can create new purchase orders at such price, until the
blanket order expires due to reaching the validity date.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (26)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • cancelled Boolean
    copy=False
  • company_id Many2one → res.company
    default=_default_company readonly=True string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True tracking=True
Public methods (10)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • compute_warnings(self)
    @api.model
    Base function to create activity warnings
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    string='Description' tracking=True
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' precompute=True readonly=False required=True store=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    comodel_name='purchase.blanket.order.line' copy=False domain="[('product_id', '=', product_id)]"
Public methods (6)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • create(self, vals_list)
    @api.model_create_multi
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to POs'
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/16.0/purchase_blanket_order
VERSION
VERSION 2.1.3
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Bruno, ThiagoMForgeFlow, DavidJForgeFlow, Wesley Oliveira, Miguel Granda Martínez
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
OCA/web:
    - web_action_conditionable
odoo/odoo:
    - purchase
    - 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 astor
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (26)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • cancelled Boolean
    copy=False
  • company_id Many2one → res.company
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} tracking=True
Public methods (10)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • compute_warnings(self)
    @api.model
    Base function to create activity warnings
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    string='Description' tracking=True
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    comodel_name='purchase.blanket.order.line' copy=False domain="[('product_id', '=', product_id)]"
Public methods (6)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • create(self, vals_list)
    @api.model_create_multi
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to POs'
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_blanket_order
VERSION
VERSION 2.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSPedro M. Baeza, Lois Rilo, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, SergiCForgeFlow, Juany Davila
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
OCA/web:
    - web_action_conditionable
odoo/odoo:
    - purchase
    - 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 astor
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (26)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • cancelled Boolean
    copy=False
  • company_id Many2one → res.company
    default=_default_company readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} tracking=True
Public methods (9)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    string='Description' tracking=True
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    comodel_name='purchase.blanket.order.line' copy=False
Public methods (5)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to SOs'
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_blanket_order
VERSION
VERSION 2.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSPedro M. Baeza, Lois Rilo, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, Don Kendall, oca-ci, Héctor Villarreal Ortega, Alessandro Uffreduzzi, SergiCForgeFlow, Kevin Luna, Juany Davila, Rodrigo Neves Trindadee, Connor Enterline
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
OCA/web:
    - web_action_conditionable
odoo/odoo:
    - purchase
    - 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 astor
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (26)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • cancelled Boolean
    copy=False
  • company_id Many2one → res.company
    default=_default_company readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} tracking=True
Public methods (9)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    tracking=True args: 'Description'
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    copy=False args: 'purchase.blanket.order.line', 'Blanket Order Line'
Public methods (5)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to SOs'
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/13.0/purchase_blanket_order
VERSION
VERSION 3.0.0
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSPedro M. Baeza, Lois Rilo, Víctor Martínez, oca-travis, OCA-git-bot, oca-ci, Héctor Villarreal Ortega, ThiagoMForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:18
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_view_inheritance_extension
OCA/web:
    - web_action_conditionable
odoo/odoo:
    - purchase
    - 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 astor
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order field Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (25)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' tracking=True
  • company_id Many2one → res.company
    default=_default_company readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' tracking=True args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' tracking=True args: 'res.partner'
  • partner_ref Char
    copy=False string='Vendor Reference'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True tracking=True
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} tracking=True
Public methods (9)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_purchase_blanket_order_line(self)
  • action_view_purchase_orders(self)
  • copy_data(self, default=None)
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
  • unlink(self)

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Invoiced quantity'
  • name Char
    tracking=True args: 'Description'
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits='Product Price' required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits='Product Unit of Measure' store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    default=_default_order readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    copy=False args: 'purchase.blanket.order.line', 'Blanket Order Line'
Public methods (5)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • get_assigned_bo_line(self)
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to SOs'
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/12.0/purchase_blanket_order
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSoca-travis, OCA-git-bot, HviorForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:23
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - purchase
    - 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 (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order field Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (24)
  • amount_tax Monetary
    compute='_compute_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_compute_amount_all' readonly=True store=True string='Untaxed Amount' track_visibility='always'
  • company_id Many2one → res.company
    default=_default_company readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' track_visibility='always' args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' track_visibility='always' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired'), ('cancel', 'Cancelled')] store=True track_visibility='always'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} track_visibility='always'
Public methods (9)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_view_purchase_blanket_order_line(self)
    @api.multi
  • action_view_purchase_orders(self)
    @api.multi
  • copy_data(self, default=None)
    @api.multi
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Invoiced quantity'
  • name Char
    track_visibility='onchange' args: 'Description'
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits=dp.get_precision('Product Price') required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    required=True string='Unit of Measure' args: 'uom.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.multi@api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)
    @api.multi

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → uom.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (3)
  • button_confirm(self)
    @api.multi
  • check_currency(self)
    @api.constrains('currency_id')
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    copy=False args: 'purchase.blanket.order.line', 'Blanket Order Line'
Public methods (4)
  • check_date_planned(self)
    @api.constrains('date_planned')
  • get_assigned_bo_line(self)
    @api.multi
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' readonly=False string='Disable adding more lines to POs'
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/11.0/purchase_blanket_order
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPurchase
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSoca-travis, OCA-git-bot, Akash Bhavsar
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:24:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_action_conditionable
odoo/odoo:
    - purchase
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - barcodes
    - web_planner
    - account
    - analytic
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
purchase_blanket_order_line_form purchase.blanket.order.line.form purchase.blanket.order.line form New
purchase_blanket_order_line_search purchase.blanket.order.line.search purchase.blanket.order.line search New
purchase_blanket_order_line_tree purchase.blanket.order.line.tree purchase.blanket.order.line tree New
purchase_config_settings_form_view res.config.settings.form (in purchase_blanket_order) res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
purchase_order_form purchase.order.from.blanket.form purchase.order field Inherits purchase.purchase_order_form
purchase_order_form_disable_adding_lines purchase.order.from.blanket.form - disable adding lines purchase.order xpath Inherits purchase.purchase_order_form
report_blanketorder report_blanketorder ir.ui.view qweb New
report_blanketorder_document report_blanketorder_document ir.ui.view qweb New
view_create_purchase_order Create Purchase Order purchase.blanket.order.wizard form New
view_purchase_blanket_order_form purchase.blanket.order.form purchase.blanket.order form New
view_purchase_blanket_order_search purchase.blanket.order.search purchase.blanket.order search New
view_purchase_blanket_order_tree purchase.blanket.order.tree purchase.blanket.order tree New
Models touched (7)

New fields (24)
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' track_visibility='always'
  • company_id Many2one → res.company
    default=_default_company readonly=True states={'draft': [('readonly', False)]} string='Company' args: 'res.company'
  • confirmed Boolean
    copy=False
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date_start Datetime
    default=fields.Datetime.now help='Blanket Order starting date.' readonly=True required=True states={'draft': [('readonly', False)]} string='Start Date'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • invoiced_uom_qty Float
    compute='_compute_uom_qty' search='_search_invoiced_uom_qty' string='Invoiced quantity'
  • line_count Integer
    compute='_compute_line_count' readonly=True string='Purchase Blanket Order Line count'
  • line_ids One2many → purchase.blanket.order.line
    copy=True string='Order lines' track_visibility='always' args: 'purchase.blanket.order.line', 'order_id'
  • name Char
    default='Draft' readonly=True
  • note Text
    readonly=True states={'draft': [('readonly', False)]}
  • ordered_uom_qty Float
    compute='_compute_uom_qty' search='_search_ordered_uom_qty' string='Ordered quantity'
  • original_uom_qty Float
    compute='_compute_uom_qty' search='_search_original_uom_qty' string='Original quantity'
  • partner_id Many2one → res.partner
    readonly=True states={'draft': [('readonly', False)]} string='Vendor' track_visibility='always' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    readonly=True states={'draft': [('readonly', False)]} string='Payment Terms' args: 'account.payment.term'
  • product_id Many2one → product.product
    related='line_ids.product_id' string='Product' args: 'product.product'
  • purchase_count Integer
    compute='_compute_purchase_count'
  • received_uom_qty Float
    compute='_compute_uom_qty' search='_search_received_uom_qty' string='Received quantity'
  • remaining_uom_qty Float
    compute='_compute_uom_qty' search='_search_remaining_uom_qty' string='Remaining quantity'
  • state Selection
    compute='_compute_state' copy=False selection=[('draft', 'Draft'), ('open', 'Open'), ('done', 'Done'), ('expired', 'Expired')] store=True track_visibility='always'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Responsible' args: 'res.users'
  • validity_date Date
    help='Date until which the blanket order will be valid, after this date the blanket order will be marked as expired' readonly=True states={'draft': [('readonly', False)]} track_visibility='always'
Public methods (9)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_view_purchase_blanket_order_line(self)
    @api.multi
  • action_view_purchase_orders(self)
    @api.multi
  • copy_data(self, default=None)
    @api.multi
  • expire_orders(self)
    @api.model
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Payment term
  • set_to_draft(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (23)
  • company_id Many2one → res.company
    readonly=True related='order_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='order_id.currency_id' args: 'res.currency'
  • date_schedule Date
    string='Scheduled Date'
  • invoiced_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Invoiced quantity'
  • name Char
    track_visibility='onchange' args: 'Description'
  • order_id Many2one → purchase.blanket.order
    ondelete='cascade' required=True args: 'purchase.blanket.order'
  • ordered_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Ordered quantity'
  • original_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Original quantity'
  • partner_id Many2one
    readonly=True related='order_id.partner_id' string='Vendor'
  • payment_term_id Many2one
    readonly=True related='order_id.payment_term_id' string='Payment Terms'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    digits=dp.get_precision('Product Price') required=True string='Price'
  • product_id Many2one → product.product
    domain=[('purchase_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom Many2one → product.uom
    required=True string='Unit of Measure' args: 'product.uom'
  • purchase_lines One2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False inverse_name='blanket_order_line' readonly=True string='Purchase Order Lines'
  • received_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Received quantity'
  • remaining_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Remaining quantity in base UoM'
  • remaining_uom_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') store=True string='Remaining quantity'
  • sequence Integer
  • taxes_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • user_id Many2one
    readonly=True related='order_id.user_id' string='Responsible'
Public methods (2)
  • name_get(self)
  • onchange_product(self)
    @api.multi@api.onchange('product_id', 'original_uom_qty')

New fields (3)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True args: 'purchase.blanket.order'
  • line_ids One2many → purchase.blanket.order.wizard.line
    default=_default_lines string='Lines' args: 'purchase.blanket.order.wizard.line', 'wizard_id'
  • purchase_order_id Many2one → purchase.order
    domain=[('state', '=', 'draft')] string='Purchase Order' args: 'purchase.order'
Public methods (1)
  • create_purchase_order(self)
    @api.multi

New fields (11)
  • blanket_line_id Many2one → purchase.blanket.order.line
    args: 'purchase.blanket.order.line'
  • currency_id Many2one → res.currency
    related='blanket_line_id.currency_id' args: 'res.currency'
  • date_schedule Date
    readonly=True related='blanket_line_id.date_schedule'
  • partner_id Many2one → res.partner
    readonly=True related='blanket_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='blanket_line_id.price_unit'
  • product_id Many2one → product.product
    readonly=True related='blanket_line_id.product_id' string='Product' args: 'product.product'
  • product_uom Many2one → product.uom
    readonly=True related='blanket_line_id.product_uom' string='Unit of Measure' args: 'product.uom'
  • qty Float
    required=True string='Quantity to Order'
  • remaining_uom_qty Float
    readonly=True related='blanket_line_id.remaining_uom_qty'
  • taxes_id Many2many → account.tax
    readonly=True related='blanket_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → purchase.blanket.order.wizard
    args: 'purchase.blanket.order.wizard'
Public methods (0)

No public methods.

New fields (1)
  • blanket_order_id Many2one → purchase.blanket.order
    readonly=True related='order_line.blanket_order_line.order_id' string='Origin blanket order' args: 'purchase.blanket.order'
Public methods (2)
  • button_confirm(self)
    @api.multi
  • check_partner_id(self)
    @api.constrains('partner_id')

New fields (1)
  • blanket_order_line Many2one → purchase.blanket.order.line
    copy=False args: 'purchase.blanket.order.line', 'Blanket Order Line'
Public methods (5)
  • check_currency(self)
    @api.constrains('currency_id')
  • check_date_planned(self)
    @api.constrains('date_planned')
  • get_assigned_bo_line(self)
    @api.multi
  • onchange_blanket_order_line(self)
    @api.onchange('blanket_order_line')
  • onchange_product_id(self)
    @api.onchange('product_id', 'partner_id')

New fields (1)
  • group_purchase_blanket_disable_adding_lines Boolean
    implied_group='purchase_blanket_order.purchase_blanket_orders_disable_adding_lines' string='Disable adding more lines to SOs'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/purchase-workflow
PULL REQUEST
PULL REQUEST[19.0] [MIG] purchase_blanket_order: Migration to 19.0 (#3118)