Internal Transfer: Import Serials (Barcode + Lot/Serial)
by Flex-Ops - Abdalrahman Shahrour https://www.flex-ops.com
Odoo
$ 10.02
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Discuss (mail) |
| Lines of code | 218 |
| Technical Name |
flex_stock_internal_transfer_import_serials |
| License | LGPL-3 |
| Website | https://www.flex-ops.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Discuss (mail) |
| Lines of code | 218 |
| Technical Name |
flex_stock_internal_transfer_import_serials |
| License | LGPL-3 |
| Website | https://www.flex-ops.com |
Internal Transfer: Import Serials (Barcode + Lot/Serial)
Flex-ops
1
Adds an Import Serials wizard on Internal Transfers (stock.picking).
2
Reads an .xlsx with columns PRODUCT (barcode) and Lot/Serial.
3
Creates/assigns stock.move.line rows and bumps the demand automatically.
4
Can create lots/serials if missing and optionally clear existing lines first.
5
Optionally allows non-tracked / consumable products (lots ignored).
Prerequisites
- Odoo with Inventory app (
stock) installed. - Python package
openpyxlinstalled on the Odoo server:pip install openpyxl
- Internal user access (base.group_user).
- If you will assign lots/serials: products must be Storable and Tracking set (Serial or Lot).
Installation
- Upload the module to your addons path (or install from Apps if available).
- Update Apps List â search for "Internal Transfer: Import Serials" â Install.
- Make sure
openpyxlis installed on the server.
Heads up: The wizard only appears on Internal pickings and is hidden for
Done/Cancelled states.
Excel Template
Create an .xlsx file (one row per unit). Required headers (case-insensitive, spaces ignored):
PRODUCTâ product barcode (from the Variant)Lot/Serialâ lot/serial name (for tracked products)
Example rows:
PRODUCT,Lot/Serial
1234567890123,SN-0001
1234567890123,SN-0002
9876543210987,LOT-2025-09-A
Tip: You can reuse the provided template: internal_transfer_serials_template.xlsx.
Using the Wizard
- Go to Inventory â Operations â Transfers and open your Internal Transfer.
- Click the header button Import Serials.
- Upload your .xlsx file.
- Choose options as needed:
- Create Lots/Serials if Not Found Create missing lots automatically.
- Clear existing lines Remove current move lines before import.
- Allow Non-tracked Products Allow products with Tracking=None or Type=Consumable. (Lots are ignored.)
- Click Import.
- Review the generated Operations lines (move lines), then proceed with your normal flow (Reserve/Validate).
Behavior & Notes
- Demand: The module increases product_uom_qty to match the number of rows imported per product.
- Serial-tracked: one line per serial with qty_done = 1.
- Lot-tracked: one line per row for simplicity. (Ask us if you prefer a single line per lot with aggregated quantity.)
- Non-tracked: lines created with qty_done = 1 per row; no lot fields set.
- Company on lots: New lots are created under the pickingâs company.
Troubleshooting
Error:
Fix: Ensure headers are
Missing required columnsFix: Ensure headers are
PRODUCT and Lot/Serial.
Error:
Fix: Confirm the barcode on the variant matches the sheet.
No product found with barcode ...Fix: Confirm the barcode on the variant matches the sheet.
Error:
Fix A: Make product Storable and set Tracking.
Fix B: Or tick Allow Non-tracked Products (lots ignored).
Product ... is not a storable productFix A: Make product Storable and set Tracking.
Fix B: Or tick Allow Non-tracked Products (lots ignored).
Error:
Fix: Tick Create Lots/Serials if Not Found or create them manually.
Lot/Serial ... not foundFix: Tick Create Lots/Serials if Not Found or create them manually.
Error:
Fix: Use .xlsx and ensure
Unable to read the Excel fileFix: Use .xlsx and ensure
openpyxl is installed.
Error:
Fix: Use a picking with type Internal.
This wizard only supports Internal TransfersFix: Use a picking with type Internal.
Change Notes
- v1.0: Initial release + option to allow consumables/non-tracked products (lots ignored).
Please log in to comment on this module