Barcode Transfer Documentation¶
Overview¶
The Barcode Transfer module (barcode.transfer) provides a barcode-scanning interface for quickly transferring goods between internal locations. This transient wizard enables warehouse staff to move inventory using barcode scanning without manually creating stock pickings.
Model Information¶
Model Name: barcode.transfer
Display Name: Barcode Transfer
Key Fields: None (transient model)
Features¶
- ❌ Audit logging disabled (transient model)
- ✅ Transient model (wizard - session data only)
- ✅ Container support (transfer entire containers)
- ✅ Approval tracking
Purpose¶
- ✅ Fast barcode-based internal transfers
- ✅ Container-based transfers
- ✅ Location-to-location movements
- ✅ Lot/serial tracking during transfer
- ✅ Approval workflow support
Key Fields Reference¶
Header Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
location_from_id |
Many2One | ❌ | Source location (internal only) |
location_to_id |
Many2One | ❌ | Destination location (internal only) |
container_from_id |
Many2One | ❌ | Source container |
journal_id |
Many2One | ❌ | Transfer journal |
state |
Selection | ✅ | pending/done |
approved_by_id |
Many2One | ❌ | User who approved |
related_id |
Reference | ❌ | Related SO/PO |
API Methods¶
1. Fill Products¶
Method: fill_products(ids, context)
Auto-populates products from container or location.
Behavior: - If container_from_id set: Transfers entire container - If only location_from_id set: Transfers all products in location
Example:
# Transfer entire container
wizard.write({"container_from_id": pallet_id})
wizard.fill_products()
# Transfer all from location
wizard.write({"location_from_id": zone_a_id})
wizard.fill_products()
2. Validate¶
Method: validate(ids, context)
Creates internal transfer picking.
Example:
Common Use Cases¶
Use Case 1: Transfer Container Between Zones¶
# Move pallet from receiving to storage
wizard_id = get_model("barcode.transfer").create({
"location_from_id": receiving_zone_id,
"location_to_id": storage_zone_id,
"container_from_id": pallet_id,
"journal_id": transfer_journal_id
})
wizard = get_model("barcode.transfer").browse(wizard_id)
wizard.fill_products() # Loads all products in container
wizard.validate() # Creates transfer picking
Use Case 2: Product Relocation¶
# Move specific products between locations
wizard_id = get_model("barcode.transfer").create({
"location_from_id": zone_a_id,
"location_to_id": zone_b_id,
"journal_id": transfer_journal_id
})
# Scan specific products to transfer
get_model("barcode.transfer.line").create({
"wizard_id": wizard_id,
"product_id": product_id,
"lot_id": lot_id,
"qty": 50,
"uom_id": uom_id
})
get_model("barcode.transfer").validate([wizard_id])
Best Practices¶
1. Use Containers for Bulk Transfers¶
# Good: Transfer entire pallet
wizard.write({"container_from_id": pallet_id})
wizard.fill_products()
# Less efficient: Item by item
for item in items:
# scan each individually...
2. Track Approvals¶
Related Models¶
| Model | Relationship | Description |
|---|---|---|
barcode.transfer.line |
One2Many | Transfer lines |
stock.picking |
Created | Transfer picking |
stock.location |
Many2One | From/to locations |
stock.container |
Many2One | Source container |
Troubleshooting¶
"Product list is empty"¶
Cause: No products to transfer
Solution: Use fill_products() or add lines manually
"Location must be internal"¶
Cause: Selected non-internal location
Solution: Both from/to must be internal locations
Version History¶
Last Updated: October 2025
Model Version: barcode_transfer.py
Framework: Netforce
This documentation is generated for developer onboarding and reference purposes.