Sale Order Blanket Order

sale_order_blanket_order
REPOSITORY
REPOSITORYOCA/sale-blanket
GIT
GIThttps://github.com/OCA/sale-blanket.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-blanket/tree/18.0/sale_order_blanket_order
VERSION
VERSION 1.0.4
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Nicolas Delbovier, David Gallay
WEBSITE
WEBSITEhttps://github.com/OCA/sale-blanket
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/sale-workflow:
    - sale_manual_delivery
odoo/odoo:
    - stock_delivery
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - stock_account
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - delivery
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module extends the functionality of Sale Order to support Blanket Order and Call-off Order.

# Blanket Order

A Blanket Order is a standard sales order with the following specific features:

* Type: Classified as "Blanket Order".
* Defined Duration: Includes a validity period (end date).
* Payment Terms: Allows selection of preferred terms (e.g., 90 days end of month, upon delivery, etc.).
* Invoicing Policy: Can be based on product settings or the order itself.
* Stock Reservation: Allows advance reservation of sold quantities.
* Handling Unfulfilled Quantities: Provides options for dealing with undelivered quantities upon order expiration.
* Prices are calculated based on existing rules since it is a standard sales order type.

The blanket order serves as the central element triggering stock management and invoicing mechanisms.

## Stock Management
Delivered quantities are tracked on the sales order lines as with regular sales orders.
By default, the stock is not reserved upon confirmation of the blanket order. This is 
achieved by using the OCA module [sale_manual_delivery](https://pypi.org/project/odoo-addon-sale-manual-delivery/). As a result, the stock will be reserved only when a call-off order is created for the quantity to be delivered.

In some cases, you may want to reserve stock upon confirmation of the blanket order. This can be achieved by using the OCA module [sale_order_blanket_order_stock_prebook](https://pypi.org/project/odoo-addon-sale-order-blanket-order-stock-prebook/). This module extends the functionality of Sale Blanket Order to support the reservation of stock for future consumption by call-off orders. The reservation is done at the time of the blanket order confirmation for a consumption starting at the validity start date of the blanket order.
This behavior can be configured on the blanket order.

## Invoicing

Standard invoicing policies apply (e.g., invoice on order or on delivery). Payment terms are configurable per order. Prepayment can be enforced by configuring the invoicing policy at the order level using the OCA module [sale_invoice_policy](https://pypi.org/project/odoo-addon-sale-invoice-policy/).

## Consumption Management

A wizard will be available on the blanket order to initiate a delivery. It allows users to select products and quantities for delivery. This action creates a Call-off Order linked to the blanket order.

# Call-off Order

A Call-off Order is a standard sales order with these specific characteristics:

* Type: Classified as "Call-off Order".
* Linked to Blanket Order: Only includes products from the blanket order.
* Delivery Release: Enables the release of reserved stock for delivery.
* No Invoicing or Stock Management: These are handled via the linked blanket order.

## Stock Management

No delivery is generated directly from the call-off order.

It triggers:
* Release of the reserved quantity in the blanket order.
* Adjustment of stock reservations for the remaining quantities.


# Standard Sales Orders

To support existing workflows (e.g., e-commerce), call-off orders can be generated transparently from standard sales orders based on product and availability:

Entire orders may be converted into call-off orders if all products are linked to a blanket order.
Mixed orders split call-off items into a new call-off order, with both confirmed within the available quantities of the blanket order.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
blanket_tree_view sale.order field Inherits sale.view_order_tree
product_template_form_view product.template xpath Inherits sale.product_template_form_view
quotation_tree_view sale.order field Inherits sale.view_quotation_tree
res_config_settings_form_view res.config.settings setting Inherits sale.res_config_settings_view_form
sale_order_form_view sale.order xpath Inherits sale.view_order_form
sale_order_line_form_view sale.order.line field Inherits sale.sale_order_line_view_form_readonly
sale_order_line_search_view sale.order.line filter Inherits sale.view_sales_order_line_filter
sale_order_line_tree_view sale.order.line field Inherits sale.view_order_line_tree
sale_order_search_view sale.order filter Inherits sale.view_sales_order_filter
sale_order_tree_view sale.order field Inherits sale.view_order_tree
view_create_call_off_wizard_form Create Call-off Sale Order sale.order.deliver.remaining.wizard form New
Models touched (9)

New fields (1)
  • allow_blanket_order_overlap Boolean
    help='If enabled, blanket orders for this product can have overlapping validityperiods. By default, overlap is not allowed, ensuring only one active blanket order applies at a time.'
Public methods (0)

No public methods.

New fields (1)
  • create_call_off_from_so_if_possible Boolean
    help='If checked, when a sales order is confirmed and some lines refer to a blanket order, these lines will be automatically moved to a new call-off order.' string='Create Call-Off from SO if possible'
Public methods (0)

No public methods.

New fields (1)
  • create_call_off_from_so_if_possible Boolean
    help='If checked, when a sales order is confirmed and some lines refer to a blanket order, these lines will be automatically moved to a new call-off order.' readonly=False related='company_id.create_call_off_from_so_if_possible' string='Create Call-Off from SO if possible'
Public methods (0)

No public methods.

New fields (15)
  • blanket_eol_strategy Selection
    help="Specifies the end-of-life strategy for the blanket order. At the end of the validity period, in any case if a reserved quantity remains, the system will release the reservation. If the strategy is 'Deliver Remaining Quantity', the system will automaticaly create a delivery order for the remaining quantity." args: [('deliver', 'Deliver Remaining Quantity')]
  • blanket_need_to_be_finalized Boolean
    default=False help='Indicates if the blanket order needs to be finalized. This field is a technical field used to manage the end-of-life of the blanket orders. To avoid costly operations to determine if the blanket order needs to be finalized once the validity period is reached, the system will set this field to True when a blanket order is confirmed. To know if a blanket order needs to be finalized, the system will search for the blanket orders with this field set to True and the validity period reached.Once the blanket order is finalized, the system will set this field to False. In this way, the DB will always contain less records to search with this field set to True.' string='Need to be Finalized'
  • blanket_order_id Many2one → sale.order
    help='The blanket order that this call-off order is related to.' index='btree_not_null' string='Blanket Order' args: 'sale.order'
  • blanket_order_id_domain Binary
    compute='_compute_blanket_order_id_domain' help='The domain to search for the blanket order candidates.' string='Blanket Order Domain'
  • blanket_reservation_strategy Selection
    compute='_compute_blanket_reservation_strategy' help="Specifies when the stock should be reserved for the blanket order. When the strategy is 'At Order Confirmation', the stock is reserved when the blanket order is confirmed. When the strategy is 'At Call-off', the stock is reserved when the call-off order is confirmed." precompute=True readonly=False store=True string='Reservation Strategy' args: [('at_call_off', 'At Call-off')]
  • blanket_strict_packaging Boolean
    help='If checked, the system will enforce that the products are called off with the same packaging as the one defined on the blanket order lines. If not checked, the system will not take care of the packaging defined on the blanket order lines when calling off products nor the one on the call-off order lines.' string='Strict Packaging ?' tracking=True
  • blanket_validity_end_date Date
    help='The end date of the validity period for the blanket order.' string='Validity End Date'
  • blanket_validity_start_date Date
    help='The start date of the validity period for the blanket order.' string='Validity Start Date'
  • call_off_order_count Integer
    compute='_compute_call_off_order_count' help='The number of call-off orders related to this blanket order.' string='Call-off Order Count'
  • call_off_order_ids One2many → sale.order
    help='The call-off orders related to this blanket order.' string='Call-off Orders' args: 'sale.order', 'blanket_order_id'
  • create_call_off_from_so_if_possible Boolean
    default=<expr> help='When this option is enabled, the system will automatically create call-off orders when a sales order is confirmed and some lines refer to a blanket order.'
  • is_blanket_eol_strategy_editable Boolean
    compute='_compute_is_blanket_eol_strategy_editable' help='Indicates if the end-of-life strategy can be edited. By default, the end-of-life strategy can be edited while the blanket order is not finalized.'
  • is_blanket_reservation_strategy_editable Boolean
    compute='_compute_is_blanket_reservation_strategy_editable' help='Indicates if the reservation strategy can be edited.'
  • order_type Selection
    default='order' help='Specifies the type of sale order: Order, Blanket, or Call-off.' index=True required=True args: [('order', 'Order'), ('blanket', 'Blanket Order'), ('call_off', 'Call-off Order')]
  • show_deliver_remaining Boolean
    compute='_compute_show_deliver_remaining' help="Whether to show the 'deliver remaining' button or not"
Public methods (5)
  • action_deliver_remaining(self)
  • action_view_call_off_orders(self)
  • init(self)
  • release_reservation(self)
  • write(self, values)

New fields (2)
  • order_id Many2one → sale.order
    readonly=True required=True string='Order' args: 'sale.order'
  • wizard_line_ids One2many → sale.order.deliver.remaining.wizard.line
    string='Products to Deliver' args: 'sale.order.deliver.remaining.wizard.line', 'wizard_id'
Public methods (1)
  • action_create_call_off(self)

New fields (6)
  • call_off_remaining_qty Float
    readonly=True related='sale_order_line_id.call_off_remaining_qty' string='Remaining Quantity'
  • product_id Many2one → product.product
    readonly=True related='sale_order_line_id.product_id' string='Product' args: 'product.product'
  • product_packaging_id Many2one → product.packaging
    readonly=True related='sale_order_line_id.product_packaging_id' string='Packaging' args: 'product.packaging'
  • qty_to_deliver Float
    required=True string='Quantity to Deliver'
  • sale_order_line_id Many2one → sale.order.line
    readonly=True required=True string='Sale Order Line' args: 'sale.order.line'
  • wizard_id Many2one → sale.order.deliver.remaining.wizard
    ondelete='cascade' required=True string='Wizard' args: 'sale.order.deliver.remaining.wizard'
Public methods (0)

No public methods.

New fields (9)
  • blanket_line_id Many2one → sale.order.line
    help='The blanket order line corresponding to this call-off order line.' index='btree_not_null' string='Blanket Order Line' args: 'sale.order.line'
  • blanket_move_ids One2many → stock.move
    string='Stock Moves on Blanket Order' args: 'stock.move', 'call_off_sale_line_id'
  • blanket_order_id Many2one → sale.order
    copy=False precompute=True readonly=True related='order_id.blanket_order_id' store=True args: 'sale.order'
  • blanket_strict_packaging Boolean
    copy=False precompute=True readonly=True related='order_id.blanket_strict_packaging' store=True string='Strict Packaging'
  • blanket_validity_end_date Date
    copy=False precompute=True readonly=True related='order_id.blanket_validity_end_date' store=True string='Validity End Date'
  • blanket_validity_start_date Date
    copy=False precompute=True readonly=True related='order_id.blanket_validity_start_date' store=True string='Validity Start Date'
  • call_off_line_ids One2many → sale.order.line
    help='The call-off order lines linked to this blanket order line.' string='Call-off Order Lines' args: 'sale.order.line', 'blanket_line_id'
  • call_off_remaining_qty Float
    compute='_compute_call_off_remaining_qty' help='The quantity remaining to consume by call-off orders in case of a blanket order. This quantity is the difference between the quantity not yet delivered or part of a pending delivery and the ordered quantity.' store=True string='Quantity remaining for Call-off'
  • order_type Selection
    precompute=True readonly=True related='order_id.order_type' store=True
Public methods (2)
  • init(self)
  • write(self, values)

New fields (1)
  • call_off_sale_line_id Many2one → sale.order.line
    index='btree_not_null' args: 'sale.order.line', 'Call Off Sale Line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/sale-blanket
GIT
GIThttps://github.com/OCA/sale-blanket.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-blanket/tree/16.0/sale_order_blanket_order
VERSION
VERSION 1.2.3
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
COMMITTERS
COMMITTERSLaurent Mignon (ACSONE), Weblate, OCA-git-bot, oca-ci, Nicolas Delbovier
WEBSITE
WEBSITEhttps://github.com/OCA/sale-blanket
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:12:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/sale-workflow:
    - sale_manual_delivery
odoo/odoo:
    - delivery
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - stock_account
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module extends the functionality of Sale Order to support Blanket Order and Call-off Order.

# Blanket Order

A Blanket Order is a standard sales order with the following specific features:

* Type: Classified as "Blanket Order".
* Defined Duration: Includes a validity period (end date).
* Payment Terms: Allows selection of preferred terms (e.g., 90 days end of month, upon delivery, etc.).
* Invoicing Policy: Can be based on product settings or the order itself.
* Stock Reservation: Allows advance reservation of sold quantities.
* Handling Unfulfilled Quantities: Provides options for dealing with undelivered quantities upon order expiration.
* Prices are calculated based on existing rules since it is a standard sales order type.

The blanket order serves as the central element triggering stock management and invoicing mechanisms.

## Stock Management
Delivered quantities are tracked on the sales order lines as with regular sales orders.
By default, the stock is not reserved upon confirmation of the blanket order. This is 
achieved by using the OCA module [sale_manual_delivery](https://pypi.org/project/odoo-addon-sale-manual-delivery/). As a result, the stock will be reserved only when a call-off order is created for the quantity to be delivered.

In some cases, you may want to reserve stock upon confirmation of the blanket order. This can be achieved by using the OCA module [sale_order_blanket_order_stock_prebook](https://pypi.org/project/odoo-addon-sale-order-blanket-order-stock-prebook/). This module extends the functionality of Sale Blanket Order to support the reservation of stock for future consumption by call-off orders. The reservation is done at the time of the blanket order confirmation for a consumption starting at the validity start date of the blanket order.
This behavior can be configured on the blanket order.

## Invoicing

Standard invoicing policies apply (e.g., invoice on order or on delivery). Payment terms are configurable per order. Prepayment can be enforced by configuring the invoicing policy at the order level using the OCA module [sale_invoice_policy](https://pypi.org/project/odoo-addon-sale-invoice-policy/).

## Consumption Management

A wizard will be available on the blanket order to initiate a delivery. It allows users to select products and quantities for delivery. This action creates a Call-off Order linked to the blanket order.

# Call-off Order

A Call-off Order is a standard sales order with these specific characteristics:

* Type: Classified as "Call-off Order".
* Linked to Blanket Order: Only includes products from the blanket order.
* Delivery Release: Enables the release of reserved stock for delivery.
* No Invoicing or Stock Management: These are handled via the linked blanket order.

## Stock Management

No delivery is generated directly from the call-off order.

It triggers:
* Release of the reserved quantity in the blanket order.
* Adjustment of stock reservations for the remaining quantities.


# Standard Sales Orders

To support existing workflows (e.g., e-commerce), call-off orders can be generated transparently from standard sales orders based on product and availability:

Entire orders may be converted into call-off orders if all products are linked to a blanket order.
Mixed orders split call-off items into a new call-off order, with both confirmed within the available quantities of the blanket order.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
blanket_tree_view sale.order field Inherits sale.view_order_tree
product_template_form_view product.template xpath Inherits sale.product_template_form_view
quotation_tree_view sale.order field Inherits sale.view_quotation_tree
res_config_settings_form_view res.config.settings div Inherits sale.res_config_settings_view_form
sale_order_form_view sale.order xpath Inherits sale.view_order_form
sale_order_line_form_view sale.order.line field Inherits sale.sale_order_line_view_form_readonly
sale_order_line_search_view sale.order.line filter Inherits sale.view_sales_order_line_filter
sale_order_line_tree_view sale.order.line field Inherits sale.view_order_line_tree
sale_order_search_view sale.order filter Inherits sale.view_sales_order_filter
sale_order_tree_view sale.order field Inherits sale.view_order_tree
view_create_call_off_wizard_form Create Call-off Sale Order sale.order.deliver.remaining.wizard form New
Models touched (9)

New fields (1)
  • allow_blanket_order_overlap Boolean
    help='If enabled, blanket orders for this product can have overlapping validityperiods. By default, overlap is not allowed, ensuring only one active blanket order applies at a time.'
Public methods (0)

No public methods.

New fields (1)
  • create_call_off_from_so_if_possible Boolean
    help='If checked, when a sales order is confirmed and some lines refer to a blanket order, these lines will be automatically moved to a new call-off order.' string='Create Call-Off from SO if possible'
Public methods (0)

No public methods.

New fields (1)
  • create_call_off_from_so_if_possible Boolean
    help='If checked, when a sales order is confirmed and some lines refer to a blanket order, these lines will be automatically moved to a new call-off order.' readonly=False related='company_id.create_call_off_from_so_if_possible' string='Create Call-Off from SO if possible'
Public methods (0)

No public methods.

New fields (15)
  • blanket_eol_strategy Selection
    help="Specifies the end-of-life strategy for the blanket order. At the end of the validity period, in any case if a reserved quantity remains, the system will release the reservation. If the strategy is 'Deliver Remaining Quantity', the system will automaticaly create a delivery order for the remaining quantity." args: [('deliver', 'Deliver Remaining Quantity')]
  • blanket_need_to_be_finalized Boolean
    default=False help='Indicates if the blanket order needs to be finalized. This field is a technical field used to manage the end-of-life of the blanket orders. To avoid costly operations to determine if the blanket order needs to be finalized once the validity period is reached, the system will set this field to True when a blanket order is confirmed. To know if a blanket order needs to be finalized, the system will search for the blanket orders with this field set to True and the validity period reached.Once the blanket order is finalized, the system will set this field to False. In this way, the DB will always contain less records to search with this field set to True.' string='Need to be Finalized'
  • blanket_order_id Many2one → sale.order
    help='The blanket order that this call-off order is related to.' index='btree_not_null' states=READONLY_FIELD_STATES string='Blanket Order' args: 'sale.order'
  • blanket_order_id_domain Binary
    compute='_compute_blanket_order_id_domain' help='The domain to search for the blanket order candidates.' string='Blanket Order Domain'
  • blanket_reservation_strategy Selection
    compute='_compute_blanket_reservation_strategy' help="Specifies when the stock should be reserved for the blanket order. When the strategy is 'At Order Confirmation', the stock is reserved when the blanket order is confirmed. When the strategy is 'At Call-off', the stock is reserved when the call-off order is confirmed." precompute=True readonly=False store=True string='Reservation Strategy' args: [('at_call_off', 'At Call-off')]
  • blanket_strict_packaging Boolean
    help='If checked, the system will enforce that the products are called off with the same packaging as the one defined on the blanket order lines. If not checked, the system will not take care of the packaging defined on the blanket order lines when calling off products nor the one on the call-off order lines.' states=LOCKED_FIELD_STATES string='Strict Packaging ?' tracking=True
  • blanket_validity_end_date Date
    help='The end date of the validity period for the blanket order.' string='Validity End Date'
  • blanket_validity_start_date Date
    help='The start date of the validity period for the blanket order.' string='Validity Start Date'
  • call_off_order_count Integer
    compute='_compute_call_off_order_count' help='The number of call-off orders related to this blanket order.' string='Call-off Order Count'
  • call_off_order_ids One2many → sale.order
    help='The call-off orders related to this blanket order.' string='Call-off Orders' args: 'sale.order', 'blanket_order_id'
  • create_call_off_from_so_if_possible Boolean
    default=<expr> help='When this option is enabled, the system will automatically create call-off orders when a sales order is confirmed and some lines refer to a blanket order.' states=READONLY_FIELD_STATES
  • is_blanket_eol_strategy_editable Boolean
    compute='_compute_is_blanket_eol_strategy_editable' help='Indicates if the end-of-life strategy can be edited. By default, the end-of-life strategy can be edited while the blanket order is not finalized.'
  • is_blanket_reservation_strategy_editable Boolean
    compute='_compute_is_blanket_reservation_strategy_editable' help='Indicates if the reservation strategy can be edited.'
  • order_type Selection
    default='order' help='Specifies the type of sale order: Order, Blanket, or Call-off.' index=True required=True states=READONLY_FIELD_STATES args: [('order', 'Order'), ('blanket', 'Blanket Order'), ('call_off', 'Call-off Order')]
  • show_deliver_remaining Boolean
    compute='_compute_show_deliver_remaining' help="Whether to show the 'deliver remaining' button or not"
Public methods (5)
  • action_deliver_remaining(self)
  • action_view_call_off_orders(self)
  • init(self)
  • release_reservation(self)
  • write(self, values)

New fields (2)
  • order_id Many2one → sale.order
    readonly=True required=True string='Order' args: 'sale.order'
  • wizard_line_ids One2many → sale.order.deliver.remaining.wizard.line
    string='Products to Deliver' args: 'sale.order.deliver.remaining.wizard.line', 'wizard_id'
Public methods (1)
  • action_create_call_off(self)

New fields (6)
  • call_off_remaining_qty Float
    readonly=True related='sale_order_line_id.call_off_remaining_qty' string='Remaining Quantity'
  • product_id Many2one → product.product
    readonly=True related='sale_order_line_id.product_id' string='Product' args: 'product.product'
  • product_packaging_id Many2one → product.packaging
    readonly=True related='sale_order_line_id.product_packaging_id' string='Packaging' args: 'product.packaging'
  • qty_to_deliver Float
    required=True string='Quantity to Deliver'
  • sale_order_line_id Many2one → sale.order.line
    readonly=True required=True string='Sale Order Line' args: 'sale.order.line'
  • wizard_id Many2one → sale.order.deliver.remaining.wizard
    ondelete='cascade' required=True string='Wizard' args: 'sale.order.deliver.remaining.wizard'
Public methods (0)

No public methods.

New fields (9)
  • blanket_line_id Many2one → sale.order.line
    help='The blanket order line corresponding to this call-off order line.' index='btree_not_null' string='Blanket Order Line' args: 'sale.order.line'
  • blanket_move_ids One2many → stock.move
    string='Stock Moves on Blanket Order' args: 'stock.move', 'call_off_sale_line_id'
  • blanket_order_id Many2one → sale.order
    copy=False precompute=True readonly=True related='order_id.blanket_order_id' store=True args: 'sale.order'
  • blanket_strict_packaging Boolean
    copy=False precompute=True readonly=True related='order_id.blanket_strict_packaging' store=True string='Strict Packaging'
  • blanket_validity_end_date Date
    copy=False precompute=True readonly=True related='order_id.blanket_validity_end_date' store=True string='Validity End Date'
  • blanket_validity_start_date Date
    copy=False precompute=True readonly=True related='order_id.blanket_validity_start_date' store=True string='Validity Start Date'
  • call_off_line_ids One2many → sale.order.line
    help='The call-off order lines linked to this blanket order line.' string='Call-off Order Lines' args: 'sale.order.line', 'blanket_line_id'
  • call_off_remaining_qty Float
    compute='_compute_call_off_remaining_qty' help='The quantity remaining to consume by call-off orders in case of a blanket order. This quantity is the difference between the quantity not yet delivered or part of a pending delivery and the ordered quantity.' store=True string='Quantity remaining for Call-off'
  • order_type Selection
    precompute=True readonly=True related='order_id.order_type' store=True
Public methods (2)
  • init(self)
  • write(self, values)

New fields (1)
  • call_off_sale_line_id Many2one → sale.order.line
    index='btree_not_null' args: 'sale.order.line', 'Call Off Sale Line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.