| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) |
| Lines of code | 1793 |
| Technical Name |
two_step_transfer |
| License | OPL-1 |
| Website | https://todoo.uz |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) |
| Lines of code | 1793 |
| Technical Name |
two_step_transfer |
| License | OPL-1 |
| Website | https://todoo.uz |
2-Step Warehouse Transfer
One document, two chained pickings. Move stock between warehouses through the company transit location — with automatic discrepancy and over-receipt tracking, backorder support, and a single unified view of the entire operation.
What it does
Create a single 2-Step Warehouse Transfer document and the module spawns two linked stock.picking records using standard Odoo mechanics — an outgoing transfer (source → transit) and an incoming transfer (transit → destination). The user keeps one unified view while Odoo's inventory engine handles the underlying moves.
Version 2.0.0 adds a full over-receipt anomaly workflow: when the destination receives more than was dispatched, a wizard lets the receiver accept or refuse the surplus — both choices trigger the correct reconciliation pickings automatically and notify the source dispatcher via a chatter activity.
One document, two pickings
Standard Odoo mechanics only — no custom inventory math. Source ships to transit, destination receives from transit, both sides stay linked to one parent document.
Discrepancy tracking
Difference between dispatched and received quantities computed live. Surfaced as a Discrepancy measure, a Has Discrepancy filter, and red visual cues in list and form views.
Over-receipt wizard
When a receiver validates more than dispatched, the module intercepts button_validate and asks: Accept (keep surplus at destination) or Refuse (return to source). Each choice triggers the correct reconciliation flow automatically.
Source reconcile wizard
After an accepted surplus, the source dispatcher gets a chatter activity and a Reconcile Anomalies button — to decide whether source books need a downward stock adjustment.
Backorder-aware
Partial receipts that spawn backorders automatically keep the 2-step warehouse link. The document tracks remaining quantities until every last backorder is validated.
Multi-company isolation
Global record rules scope every transfer and every line to the user's allowed companies. Each company uses its own internal transit location.
Standard permissions only
No custom security groups. Any Inventory / User creates and confirms; Inventory / Manager keeps reset-to-draft and delete rights.
Built-in analytics
List, Kanban, Form, Pivot and Graph views with summable totals for demand, discrepancy, and surplus.
Light & dark mode safe
Only Bootstrap and Odoo standard CSS classes — no hardcoded hex colors, no inline styles.
Fully localized
Uzbek, Russian, English. Every string translated — including wizard messages, anomaly state labels, and chatter notes.
⚠ Over-receipt anomaly flow (v2.0.0)
When the destination validates more units than were dispatched, the module opens the Over-Receipt Wizard:
- Accept surplus — destination keeps the extra units. A reconciliation picking (Inventory → Transit) rebalances transit stock. The source dispatcher receives a chatter activity and uses the Reconcile Anomalies button to close the loop.
- Refuse surplus — destination receives only the demanded quantity. A return picking (Transit → Source) is created automatically for the source dispatcher to validate when goods physically arrive.
Screenshots
Surplus and Discrepancy columns surface both types of mismatch at a glance. The totals row sums all measures across the filtered set.
Anomaly State badge, and the totals area breaks out Surplus (Over-receipt) separately from Discrepancy. The chatter records each state change and anomaly event automatically.
How a transfer flows
- Draft — pick source & destination warehouses, set scheduled date, add product lines with demand quantities.
- Confirm — two pickings are created (outgoing & incoming) routed through the company internal transit location.
- In Transit — once the outgoing picking is validated, the document switches to In Transit. The Transit smart button shows the quantity currently in the transit location.
- Done — once every outgoing and incoming picking (including backorders) is validated, the document closes. Any gap is preserved as a discrepancy or resolved anomaly.
- Cancelled / Reset — managers can cancel an open transfer (open pickings are cancelled too) and reset a cancelled transfer back to draft.
Technical specs
| Odoo version | 19.0 |
|---|---|
| Module version | 19.0.2.0.0 |
| Dependencies | stock, mail |
| New models | two.step.transfer, two.step.transfer.line |
| Wizards | two.step.over.receipt.wizard, two.step.source.reconcile.wizard, two.step.return.validate.wizard |
| Inherited | stock.picking — back-link, backorder handling, state sync, over-receipt intercept, anomaly flags |
| Sequence | 2ST/<year>/0001, year-ranged, 4-digit padding |
| Anomaly fields | has_anomaly, anomaly_qty on transfer; anomaly_state, reconciled_surplus_qty, return_picking_id on line |
| Picking flags | is_anomaly_reconciliation, is_anomaly_return — excluded from Done calculations |
| Permissions | stock.group_stock_user and stock.group_stock_manager — no custom groups |
| Multi-company | Global ir.rule on transfer and transfer line |
| Views | List, Kanban, Form, Search, Pivot, Graph + stat button on stock.picking |
| Translations | Uzbek, Russian, English — full .po files |
| License | OPL-1 |
Highlights
- One unified document orchestrates the full warehouse-to-warehouse round trip
- Discrepancy (loss) and Surplus (over-receipt) tracked as separate, independent measures
- Over-receipt wizard intercepts excess receipts before they silently inflate destination stock
- Accept path: auto-creates reconciliation picking and notifies source dispatcher via activity
- Refuse path: auto-creates return picking (Transit → Source) for physical return flow
- Source reconcile wizard closes the anomaly loop at the source warehouse
- Backorders on either side keep the 2-step warehouse link — nothing is lost on partial receipts
- State machine: Draft → Confirmed → In Transit → Done, plus Cancelled / Reset-to-Draft
- Reuses standard Odoo inventory mechanics — no custom stock math, no hidden quants
- Multi-company safe out of the box
- Light and dark theme safe (Bootstrap utility classes only)
- Fully translated to Uzbek, Russian and English
What's NOT included
- No transport-management, routing or carrier integration — the module focuses on the inventory side.
- No accounting/landed-cost layer — valuation is handled by Odoo's standard inventory valuation on the underlying pickings.
- The transit location is the standard internal transit location already present on each company — the module does not create a new one.
Setup
- Install the module from your Odoo Apps menu.
- Make sure each company has its internal transit location configured (Odoo creates one by default). Each warehouse must also have a default Internal Transfer operation type — also configured by default.
- Open Inventory → Operations → 2-Step Warehouse Transfers.
- Create a transfer, pick source and destination warehouses, add product lines, then click Confirm. Validate the outgoing picking when stock leaves; validate the incoming picking when it arrives. If a receiver enters more than was dispatched, the over-receipt wizard appears automatically.
Support
Bug reports, configuration help and customization requests: info@todoo.uz. Average response time: 1 business day.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module