Assessing the Cost Drivers of Custom Module Development in ERP Upgrades
A practical guide for CIOs and ERP leaders to identify, quantify, and manage the hidden costs of custom module development during ERP version upgrades and migrations.
Connected business operations. Flexible deployment.
A practical guide to migrating manufacturing data in Odoo, covering BOMs, work orders, and routings. Learn how to map complex structures, validate dependencies, and ensure production continuity during version upgrades or system replacements.
Migrating manufacturing data in Odoo requires a structured approach that prioritizes data integrity over speed. The recommended approach involves profiling source data, mapping complex BOM hierarchies and routing sequences to Odoo's specific data models, and executing phased trial migrations in a staging environment. This process is critical because manufacturing data is highly relational; a single error in a Bill of Materials (BOM) line or a routing operation can halt production lines or distort cost accounting. The primary risks to control include broken parent-child relationships in multi-level BOMs, loss of custom routing logic, and discrepancies in work order status that affect inventory valuation. Success depends on rigorous validation of dependencies between products, work centers, and operations before any production cutover.
Before writing any migration scripts, you must understand the state of your legacy data. Manufacturing data is often fragmented across multiple systems, including PLM tools, spreadsheets, and the legacy ERP. Begin by extracting a representative sample of your most complex products. Analyze the depth of your BOMs, identifying any circular references or orphaned components. For work orders, determine which historical records are necessary. Typically, only open work orders and recent closed orders for cost reconciliation are migrated; older historical data is often archived separately to reduce migration complexity and risk.
Review your legacy system for custom fields that track specific manufacturing attributes, such as batch numbers, serial numbers, or quality inspection flags. Determine if these fields have equivalents in Odoo's standard manufacturing module or if they require custom development. If custom fields exist, map them to Odoo's 'extra' fields or plan for a custom module. This step is crucial because ignoring custom logic can lead to data loss that is not immediately visible but impacts downstream reporting and compliance.
Odoo uses a specific structure for Bills of Materials, where each BOM line references a component product and a quantity. In multi-level BOMs, the parent BOM references sub-assemblies, which have their own BOMs. During migration, you must ensure that the sequence of creation is correct: components first, then sub-assemblies, and finally the finished goods. If you attempt to create a finished good BOM before its sub-assembly components exist in the target system, the migration will fail or create broken links. Use a topological sort algorithm in your migration script to determine the correct insertion order based on dependencies.
| Data Element | Source System Attribute | Odoo Target Model | Key Consideration |
|---|---|---|---|
| BOM Header | Product ID, Type (Manufacture) | mrp.bom | Ensure product type is set to 'Manufacture' before BOM creation |
| BOM Line | Component ID, Quantity, UoM | mrp.bom.line | Validate UoM conversion factors match source system |
| Routing | Operation Sequence, Work Center | mrm.routing / mrp.routing.workcenter | Map work centers first; operations depend on work center existence |
| Work Order | Order ID, Status, Dates | mrp.production | Only migrate open orders; closed orders may require manual reconciliation |
Routings define the sequence of operations required to manufacture a product. In Odoo, routings are linked to work centers, which represent physical resources or logical groups of resources. Before migrating routings, you must migrate all work centers. Each operation in a routing must be mapped to a specific work center. If your legacy system uses generic operation codes that do not map directly to Odoo's work center concept, you will need to create a mapping table. For example, a legacy 'Assembly' operation might map to an 'Assembly Line A' work center in Odoo. Ensure that the time estimates (setup, cycle time) are correctly converted to Odoo's time units, which are typically in minutes or hours.
Some manufacturing processes include optional or variable operations that are not always executed. Odoo supports this through routing lines that can be marked as optional or through custom logic. If your legacy system tracks these variations, ensure that the migration script preserves this metadata. If Odoo's standard routing does not support a specific variation logic, you may need to implement a custom module or adjust the process design to fit Odoo's standard capabilities. Do not force complex legacy logic into standard fields if it compromises data clarity.
Migrating work orders is the most complex part of the process because they represent a live state. You must decide which work orders to migrate. Generally, only work orders that are 'In Progress' or 'Planned' should be migrated. Closed work orders are typically not migrated because their data is already reflected in inventory and financial records. For open work orders, you must migrate the current status, including consumed materials, produced quantities, and remaining quantities. This requires careful reconciliation with inventory levels to ensure that the migration does not create duplicate stock or negative inventory.
Manual entry of manufacturing data is error-prone and inefficient. Use automated migration scripts, typically written in Python using Odoo's ORM (Object-Relational Mapping) API. The scripts should be idempotent, meaning they can be run multiple times without creating duplicate records. Implement logging to track every record created, updated, or skipped. This log is essential for troubleshooting and reconciliation. Run the scripts in a staging environment that mirrors the production database structure and data volume. Do not run migration scripts directly in production without prior testing in staging.
The order of data insertion is critical. The general sequence should be: 1. Products (Raw Materials, Semi-Finished, Finished Goods), 2. Work Centers, 3. BOMs (Components to Finished Goods), 4. Routings, 5. Work Orders. If you attempt to create a BOM before the products exist, the script will fail. If you create a routing before the work centers exist, the routing will be incomplete. Use foreign key constraints in your database to enforce these dependencies, but also handle errors gracefully in your script to provide clear feedback on missing dependencies.
After the migration, you must validate the data. This involves comparing the source and target systems. For BOMs, check that the total quantity of components matches the source system. For work orders, verify that the sum of consumed materials and produced quantities matches the source system's records. Use automated reconciliation scripts to generate a report of discrepancies. Investigate any discrepancies before proceeding to user acceptance testing. Common issues include unit of measure conversion errors, missing work center mappings, and incorrect BOM line quantities.
| Validation Check | Method | Pass Criteria |
|---|---|---|
| BOM Completeness | Compare component count and quantities | 100% match with source system |
| Routing Integrity | Verify all operations have valid work centers | No null work center references |
| Work Order Status | Check status and quantities for open orders | Status and quantities match source |
| Inventory Reconciliation | Compare stock levels before and after migration | No unexplained stock variances |
User Acceptance Testing (UAT) is critical for manufacturing data. Involve production planners, shop floor supervisors, and finance teams to test the migrated data. They should create new work orders using the migrated BOMs and routings to ensure the process works end-to-end. Check that the system correctly calculates material requirements and production times. Performance testing is also important, especially if you have large BOMs or many open work orders. Ensure that the system can handle the load without significant delays. If performance issues are found, optimize database indexes or adjust Odoo's configuration.
The cutover is the final step where you switch from the legacy system to Odoo. Plan a freeze window where no new work orders are created in the legacy system. Perform a final data load of any changes that occurred during the freeze. Execute the migration scripts in production. After the migration, perform a final reconciliation and notify users that the system is live. Have a rollback plan ready in case of critical failures. The rollback plan should include restoring the database from a backup and reverting any changes made to the legacy system.
After go-live, monitor the system closely for the first few weeks. Track any errors or discrepancies reported by users. Provide additional training if users are struggling with the new interface or processes. Monitor system performance and resource usage. Address any issues promptly to maintain user confidence. Document any lessons learned for future migrations or upgrades. This stabilization phase is crucial for ensuring long-term success and user adoption.
Manufacturing migrations carry high risk due to the complexity of the data and the impact on production. Key risks include data loss, broken BOMs, and inventory discrepancies. Mitigate these risks by maintaining verified backups of the source and target databases. Test the restore process to ensure backups are valid. Define clear go/no-go criteria based on the results of validation and UAT. If critical issues are found, do not proceed with the cutover. An approved rollback plan is essential to minimize downtime and business impact in case of failure.
Migrating BOMs, work orders, and routings in Odoo is a complex but manageable process if approached with discipline and attention to detail. By following a structured methodology that includes data profiling, careful mapping, automated execution, and rigorous validation, you can ensure a successful migration. The key is to prioritize data integrity and user experience over speed. Invest time in testing and reconciliation to avoid costly errors in production. With the right planning and execution, you can transition to Odoo with confidence, maintaining operational continuity and improving long-term ERP maintainability.
Common questions on this topic. Talk to our team for anything specific to your business.
It is generally recommended to migrate only open work orders. Historical closed work orders are typically not migrated because their data is already reflected in inventory and financial records. Migrating them can increase complexity and risk without providing significant value.
Use a topological sort to determine the correct order of creation. Create components first, then sub-assemblies, and finally finished goods. This ensures that all dependencies are met before creating higher-level BOMs.
Risks include missing work center mappings, incorrect operation sequences, and loss of custom routing logic. These can lead to production delays and inaccurate cost calculations. Thorough testing and validation are essential to mitigate these risks.
No, you do not need to migrate all manufacturing history. Focus on open work orders and recent closed orders for cost reconciliation. Older historical data can be archived separately to reduce migration complexity.
Use automated reconciliation scripts to compare component quantities and totals between the source and target systems. Manually verify a sample of BOMs to ensure accuracy. Investigate any discrepancies before proceeding to UAT.
Map custom fields to Odoo's 'extra' fields or plan for a custom module. Ensure that the migration script preserves the data and that the fields are accessible in the user interface. Test the functionality to ensure it works as expected.
A practical guide for CIOs and ERP leaders to identify, quantify, and manage the hidden costs of custom module development during ERP version upgrades and migrations.
Learn practical strategies to reduce user training gaps during ERP cutover, including role-based training, simulation environments, and post-go-live support to ensure smooth adoption.
Learn how to modernize distribution ERP systems to connect regional centers, standardize processes, and improve inventory visibility through cloud architecture and robust integration strategies.
Discuss your workflows, modules and deployment options with our team.
Back to resources