Repository
OCA/stock-logistics-workflow · module folder · Try on Runboat
Module version
1.0.0
Category
Inventory
Folder size
0.1 MB
License
AGPL-3
Application
No
Auto-installable
No
Website
https://github.com/OCA/stock-logistics-workflow
Last tracking update
2026-07-23 17:05:36
Authors
Odoo Community Association (OCA), ForgeFlow S.L.
Maintainers
Odoo Community Association (OCA), ForgeFlow S.L.
Committers
OCA-git-bot, oca-ci, Andreu Orensanz
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
None
Description
This module adds an **Inter-Warehouse Transfer** document that lets users
explicitly push stock from one warehouse to another within the same company.

Confirming a transfer creates exactly two pickings (OUT at the source warehouse,
IN at the destination warehouse) connected through the company's internal transit
location. The document state is automatically derived from the underlying picking
states and supports backorders.

To keep this the only path for moving stock across warehouses, the module also
blocks any **internal** stock move whose source and destination locations belong
to different warehouses, forcing users through the Inter-Warehouse Transfer
document.

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
view_stock_interwarehouse_transfer_form stock.interwarehouse.transfer.form stock.interwarehouse.transfer form New
view_stock_interwarehouse_transfer_list stock.interwarehouse.transfer.list stock.interwarehouse.transfer tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (5)

New fields (12)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • line_ids One2many → stock.interwarehouse.transfer.line
    string='Products' args: 'stock.interwarehouse.transfer.line', 'transfer_id'
  • location_dest_id Many2one → stock.location
    compute='_compute_locations' precompute=True readonly=False store=True string='To Location' args: 'stock.location'
  • location_id Many2one → stock.location
    compute='_compute_locations' precompute=True readonly=False store=True string='From Location' args: 'stock.location'
  • name Char
    copy=False default='/' readonly=True
  • picking_count Integer
    compute='_compute_picking_count' string='Transfer Count'
  • picking_ids One2many → stock.picking
    copy=False string='Transfers' args: 'stock.picking', 'interwarehouse_transfer_id'
  • procurement_group_id Many2one → procurement.group
    copy=False string='Procurement Group' args: 'procurement.group'
  • scheduled_date Datetime
  • state Selection
    compute='_compute_state' default='draft' selection=[('draft', 'Draft'), ('confirmed', 'Confirmed'), ('in_transit', 'In Transit'), ('done', 'Done'), ('cancelled', 'Cancelled')] store=True
  • warehouse_from_id Many2one → stock.warehouse
    check_company=True required=True string='From Warehouse' args: 'stock.warehouse'
  • warehouse_to_id Many2one → stock.warehouse
    check_company=True required=True string='To Warehouse' args: 'stock.warehouse'
Public methods (4)
  • action_cancel(self)
  • action_confirm(self)
  • action_view_pickings(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (8)
  • move_ids One2many → stock.move
    string='Stock Moves' args: 'stock.move', 'interwh_transfer_line_id'
  • product_id Many2one → product.product
    domain=[('type', '!=', 'service')] required=True args: 'product.product'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' precompute=True readonly=False store=True string='Unit of Measure' args: 'uom.uom'
  • product_uom_qty Float
    default=1.0 required=True string='Quantity'
  • qty_received Float
    compute='_compute_qty_progress' digits='Product Unit of Measure' string='Received'
  • qty_shipped Float
    compute='_compute_qty_progress' digits='Product Unit of Measure' string='Shipped'
  • state Selection
    related='transfer_id.state'
  • transfer_id Many2one → stock.interwarehouse.transfer
    ondelete='cascade' required=True args: 'stock.interwarehouse.transfer'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (1)
  • interwh_transfer_line_id Many2one → stock.interwarehouse.transfer.line
    index=True ondelete='set null' string='Inter-WH Transfer Line' args: 'stock.interwarehouse.transfer.line'
Public methods (0)

No public methods.

New fields (1)
  • interwarehouse_transfer_id Many2one → stock.interwarehouse.transfer
    copy=False string='Inter-WH Transfer' args: 'stock.interwarehouse.transfer'
Public methods (0)

No public methods.

New fields (2)
  • in_inter_wh_type_id Many2one → stock.picking.type
    check_company=True copy=False string='Inter-WH In Type' args: 'stock.picking.type'
  • out_inter_wh_type_id Many2one → stock.picking.type
    check_company=True copy=False string='Inter-WH Out Type' args: 'stock.picking.type'
Public methods (0)

No public methods.