Purchase Manual Delivery

purchase_manual_delivery
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_manual_delivery
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSStefan Rijnhart, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/purchase-workflow:
    - purchase_order_line_menu
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The goal of this module is to allow the manual creation of incoming
shipments. When installed, a purchase order won't impact directly the
stock. It will not create the pickings upon order confirmation. It
allows the reception and the impact on stock to be done manually when
needed. The goal is to be used when a supplier does not confirm the full
order at once. As the supplier confirms the different purchase order
lines, the user can manually create the incoming shipments for those
specific lines.

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
purchase_order_line_search purchase.order.line group Inherits purchase.purchase_order_line_search
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
res_config_settings_view_form res.config.settings.view.form.inherit.manual.delivery res.config.settings block Inherits purchase.res_config_settings_view_form_purchase
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
Models touched (8)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (15)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits='Product Unit of Measure' related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits='Product Unit of Measure' help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • qty_in_receipt Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_in_receipt'
  • qty_received Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_received'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • manual_delivery Boolean
    compute='_compute_manual_delivery' help="Stock transfers need to be created manually to receive this PO's products" readonly=False store=True string='Manual delivery'
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (0)

No public methods.

New fields (2)
  • pending_to_receive Boolean
    compute='_compute_qty_in_receipt' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
  • qty_in_receipt Float
    compute='_compute_qty_in_receipt' digits='Product Unit of Measure' help='Quantity for which there are pending stock moves' store=True
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    required=False string='Purchase manual delivery?'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    readonly=False related='company_id.purchase_manual_delivery'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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_manual_delivery
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSStefan Rijnhart, Weblate, OCA-git-bot, oca-ci, len
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The goal of this module is to allow the manual creation of incoming
shipments. When installed, a purchase order won't impact directly the
stock. It will not create the pickings upon order confirmation. It
allows the reception and the impact on stock to be done manually when
needed. The goal is to be used when a supplier does not confirm the full
order at once. As the supplier confirms the different purchase order
lines, the user can manually create the incoming shipments for those
specific lines.

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
res_config_settings_view_form res.config.settings.view.form.inherit.manual.delivery res.config.settings block Inherits purchase.res_config_settings_view_form_purchase
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (8)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (15)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits='Product Unit of Measure' related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits='Product Unit of Measure' help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • qty_in_receipt Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_in_receipt'
  • qty_received Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_received'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • manual_delivery Boolean
    compute='_compute_manual_delivery' help="Stock transfers need to be created manually to receive this PO's products" readonly=False store=True string='Manual delivery'
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (2)
  • button_approve(self, force=False)
  • button_confirm_manual(self)

New fields (2)
  • pending_to_receive Boolean
    compute='_compute_qty_in_receipt' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
  • qty_in_receipt Float
    compute='_compute_qty_in_receipt' digits='Product Unit of Measure' help='Quantity for which there are pending stock moves' store=True
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    required=False string='Purchase manual delivery?'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    readonly=False related='company_id.purchase_manual_delivery'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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_manual_delivery
VERSION
VERSION 2.0.3
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSVíctor Martínez, JordiMForgeFlow, Weblate, OCA-git-bot, oca-ci, Christopher Ormaza, ntsirintanis, AlexPForgeFlow, PauBForgeFlow, andrea, Christoph Abenthung
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
res_config_settings_view_form res.config.settings.view.form.inherit.manual.delivery res.config.settings div Inherits purchase.res_config_settings_view_form_purchase
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (8)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (14)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • existing_qty Float
    digits='Product Unit of Measure' related='purchase_order_line_id.existing_qty' string='Existing Quantity'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits='Product Unit of Measure' related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits='Product Unit of Measure' help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' readonly=True string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • manual_delivery Boolean
    default=<expr> string='Purchase manual delivery?'
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (2)
  • button_approve(self, force=False)
  • button_confirm_manual(self)

New fields (2)
  • existing_qty Float
    compute='_compute_existing_qty' digits='Product Unit of Measure' help='Quantity already planned or shipped (stock movements already created)' store=True string='Existing Quantity'
  • pending_to_receive Boolean
    compute='_compute_existing_qty' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    required=False string='Purchase manual delivery?'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    readonly=False related='company_id.purchase_manual_delivery'
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_manual_delivery
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSoca-travis, Weblate, OCA-git-bot, Christopher Ormaza
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
res_config_settings_view_form res.config.settings.view.form.inherit.manual.delivery res.config.settings div Inherits purchase.res_config_settings_view_form_purchase
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (6)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (14)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • existing_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.existing_qty' string='Existing Quantity'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits=dp.get_precision('Product Unit of Measure') help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (2)
  • manual_delivery Boolean
    default=<expr> string='Purchase manual delivery?'
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (1)
  • button_confirm_manual(self)

New fields (2)
  • existing_qty Float
    compute='_compute_existing_qty' digits='Product Unit of Measure' help='Quantity already planned or shipped (stock movements already created)' string='Existing Qty'
  • pending_to_receive Boolean
    compute='_compute_existing_qty' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    required=False string='Purchase manual delivery?'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    readonly=False related='company_id.purchase_manual_delivery'
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_manual_delivery
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Héctor Vi Or
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:18
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
res_config_settings_view_form res.config.settings.view.form.inherit.manual.delivery res.config.settings xpath Inherits purchase.res_config_settings_view_form_purchase
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (6)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (15)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits='Product Unit of Measure' related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits='Product Unit of Measure' help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • qty_in_receipt Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_in_receipt' string='In Receipt Quantity'
  • qty_received Float
    digits='Product Unit of Measure' related='purchase_order_line_id.qty_received' string='In Receipt Quantity'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' readonly=True string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (2)
  • manual_delivery Boolean
    default=<expr> string='Purchase manual delivery?'
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (1)
  • button_confirm_manual(self)

New fields (2)
  • pending_to_receive Boolean
    compute='_compute_qty_in_receipt' compute_sudo=True help='There is pending quantity to receive not yet planned' store=True string='Pending to Receive'
  • qty_in_receipt Float
    compute='_compute_qty_in_receipt' compute_sudo=True digits='Product Unit of Measure' help='Quantity already planned to receive' store=True string='In Receipt Qty'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    required=False string='Purchase manual delivery?'
Public methods (0)

No public methods.

New fields (1)
  • purchase_manual_delivery Boolean
    readonly=False related='company_id.purchase_manual_delivery'
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_manual_delivery
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSOCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes
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_stock
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - http_routing
    - digest
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (4)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (14)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • existing_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.existing_qty' string='Existing Quantity'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → uom.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits=dp.get_precision('Product Unit of Measure') help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (1)
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (1)
  • button_confirm_manual(self)
    @api.multi

New fields (2)
  • existing_qty Float
    compute='_compute_existing_qty' digits=dp.get_precision('Product Unit of Measure') help='Quantity already planned or shipped (stock movements already created)' string='Existing Qty'
  • pending_to_receive Boolean
    compute='_compute_existing_qty' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
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_manual_delivery
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow S.L.
COMMITTERS
COMMITTERSAaronHForgeFlow, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/purchase-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:24:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES 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 (4)
XML IDNameModelTypeStatus
purchase_order_line_tree purchase.order.line xpath Inherits purchase.purchase_order_line_tree
purchase_order_view_form_inherit purchase.order.form purchase.order xpath Inherits purchase.purchase_order_form
view_create_stock_picking Create Stock Picking create.stock.picking.wizard form New
view_purchase_order_unreceived_line_filter purchase.order.unreceived.line purchase.order.line search New
Models touched (4)

New fields (6)
  • line_ids One2many → create.stock.picking.wizard.line
    comodel_name='create.stock.picking.wizard.line' inverse_name='wizard_id' string='Lines'
  • location_dest_id Many2one → stock.location
    default=_default_location_dest_id help='Location where the system will stock the received products.' args: 'stock.location', 'Destination Location'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Vendor'
  • picking_id Many2one → stock.picking
    string='Stock Picking' args: 'stock.picking'
  • purchase_id Many2one → purchase.order
    default=_default_purchase_order readonly=True string='Purchase Order' args: 'purchase.order'
  • scheduled_date Datetime
    related='picking_id.scheduled_date' args: 'Scheduled Date'
Public methods (4)
  • create_stock_picking(self)
  • default_get(self, fields)
    @api.model
  • fill_lines(self, po_lines)
  • onchange_picking_id(self)
    @api.onchange('picking_id')

New fields (14)
  • currency_id Many2one → res.currency
    related='purchase_order_line_id.currency_id' args: 'res.currency'
  • date_planned Datetime
    related='purchase_order_line_id.date_planned'
  • existing_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.existing_qty' string='Existing Quantity'
  • name Text
    readonly=True string='Description'
  • partner_id Many2one → res.partner
    related='purchase_order_line_id.partner_id' string='Vendor' args: 'res.partner'
  • price_unit Float
    readonly=True related='purchase_order_line_id.price_unit'
  • product_id Many2one → product.product
    related='purchase_order_line_id.product_id' string='Product' args: 'product.product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') related='purchase_order_line_id.product_qty' string='Quantity'
  • product_uom Many2one → product.uom
    related='purchase_order_line_id.product_uom' string='Unit of Measure' args: 'product.uom'
  • purchase_order_line_id Many2one → purchase.order.line
    args: 'purchase.order.line'
  • qty Float
    digits=dp.get_precision('Product Unit of Measure') help='This is the quantity taken into account to create the picking' string='Quantity to Receive'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True string='Remaining Quantity'
  • taxes_id Many2many → account.tax
    related='purchase_order_line_id.taxes_id' args: 'account.tax'
  • wizard_id Many2one → create.stock.picking.wizard
    comodel_name='create.stock.picking.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (1)
  • pending_to_receive Boolean
    compute='_compute_pending_to_receive'
Public methods (1)
  • button_confirm_manual(self)
    @api.multi

New fields (2)
  • existing_qty Float
    compute='_compute_existing_qty' digits=dp.get_precision('Product Unit of Measure') help='Quantity already planned or shipped (stock movements already created)' string='Existing Qty'
  • pending_to_receive Boolean
    compute='_compute_existing_qty' help='There is pending quantity to receive not yet planned' store=True string='Pending Qty to Receive'
Public methods (1)
  • write(self, values)
    @api.multi