Skip to content

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:

wizard.validate()
# Creates stock.picking type="internal"


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

# Set approver for audit trail
wizard.write({"approved_by_id": current_user_id})
wizard.validate()

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.