Here’s a comprehensive solution that addresses all three key aspects of your warehouse transfer migration challenge:
Location Master Data Setup:
Before importing any transfer history, establish a complete location foundation:
- Analyze Legacy Location Structure:
-- Extract all unique location codes from transfer history
SELECT DISTINCT from_location FROM legacy_transfers
UNION
SELECT DISTINCT to_location FROM legacy_transfers;
This identifies the exact set of legacy locations that must be mapped. For your 8,000 transfers, you’ll likely find 500-1,500 unique location codes.
- Define Location Mapping Strategy:
Option A - Direct Mapping (for similar structures):
Legacy: WH01-A-15-3 → CloudSuite: WH01-A15-03
Maintains granularity, requires reformatting location codes
Option B - Consolidated Mapping (recommended):
Legacy: WH01-A-15-1, WH01-A-15-2, WH01-A-15-3 → CloudSuite: WH01-A15
Reduces location count, groups bins to aisle level
Option C - Hybrid Mapping:
Active locations: Direct mapping with new codes
Obsolete locations: Consolidated to zone level
- Create Location Master Import:
Location_Code,Warehouse,Zone,Aisle,Status,Description
WH01-A15,WH01,A,15,ACTIVE,Aisle 15 Zone A
WH01-B08,WH01,B,08,ACTIVE,Aisle 8 Zone B
LEGACY-WH01,WH01,LEG,00,INACTIVE,Legacy location placeholder
Key considerations:
- Import all locations referenced in transfer history (even if consolidated)
- Mark legacy-only locations as INACTIVE to prevent new transactions
- Use consistent naming convention aligned with CloudSuite standards
- Include location attributes (zone, aisle) for reporting purposes
Transfer Data Validation:
CloudSuite’s Warehouse Data Loader performs strict validation:
- Required Location Validations:
- From_Location must exist in location master for source warehouse
- To_Location must exist in location master for destination warehouse
- Both locations must be active OR have allow_historical_transaction flag set
- Warehouse codes must match between transfer record and location master
- Additional Transfer Validations:
- Material code must exist in material master
- Transfer quantity must be positive
- Transfer date cannot be future dated
- Unit of measure must be valid for the material
- Lot/serial numbers (if tracked) must follow proper format
- Pre-Import Validation Script:
import pandas as pd
# Load transfer data and location master
transfers = pd.read_csv('legacy_transfers.csv')
locations = pd.read_csv('location_master.csv')
# Check for unmapped locations
from_locs = set(transfers['from_location'])
to_locs = set(transfers['to_location'])
valid_locs = set(locations['location_code'])
unmapped_from = from_locs - valid_locs
unmapped_to = to_locs - valid_locs
print(f"Unmapped FROM locations: {len(unmapped_from)}")
print(f"Unmapped TO locations: {len(unmapped_to)}")
if unmapped_from or unmapped_to:
print("ERROR: Location master incomplete - add missing codes before import")
Legacy to CloudSuite Mapping Implementation:
Systematic approach for your 8,000 transfer records:
- Create Comprehensive Mapping Table:
Legacy_Location,CloudSuite_Location,Mapping_Type,Notes
WH01-A-15-1,WH01-A15,CONSOLIDATED,Bin 1 consolidated to aisle
WH01-A-15-2,WH01-A15,CONSOLIDATED,Bin 2 consolidated to aisle
WH01-A-15-3,WH01-A15,CONSOLIDATED,Bin 3 consolidated to aisle
WH02-B-08-5,WH02-B08,CONSOLIDATED,Bin 5 consolidated to aisle
WH03-C-22-1,WH03-C22-01,DIRECT,Active location - code reformatted
- Apply Mapping to Transfer Data:
import pandas as pd
# Load mapping table
mapping = pd.read_csv('location_mapping.csv')
map_dict = dict(zip(mapping['Legacy_Location'], mapping['CloudSuite_Location']))
# Load and transform transfers
transfers = pd.read_csv('legacy_transfers.csv')
transfers['from_location_cs'] = transfers['from_location'].map(map_dict)
transfers['to_location_cs'] = transfers['to_location'].map(map_dict)
# Identify unmapped locations
unmapped = transfers[
transfers['from_location_cs'].isnull() |
transfers['to_location_cs'].isnull()
]
if len(unmapped) > 0:
print(f"WARNING: {len(unmapped)} transfers have unmapped locations")
unmapped.to_csv('unmapped_transfers.csv')
- Handle Consolidated Location Scenarios:
When multiple legacy bins map to one CloudSuite location, transfer history shows movements within the same location. Options:
A) Filter out intra-location transfers (movements within same aisle):
# Remove transfers where from and to are now the same location
transfers_filtered = transfers[
transfers['from_location_cs'] != transfers['to_location_cs']
]
B) Preserve intra-location transfers with annotation:
# Flag intra-location transfers
transfers['transfer_type'] = 'INTER_LOCATION'
transfers.loc[
transfers['from_location_cs'] == transfers['to_location_cs'],
'transfer_type'
] = 'INTRA_LOCATION_LEGACY'
Implementation Sequence:
Phase 1 - Location Master Setup (Week 1):
- Extract all unique locations from 8,000 transfer records
- Create location mapping table (legacy → CloudSuite)
- Generate CloudSuite location master import file
- Import location master into ICS 2021
- Validate all locations created successfully
Phase 2 - Transfer Data Preparation (Week 1-2):
- Apply location mapping to transfer records
- Validate all locations resolved (no nulls)
- Handle consolidated location scenarios (filter or flag)
- Add required CloudSuite fields (transfer type, status, etc.)
- Run pre-import validation checks
Phase 3 - Transfer History Import (Week 2):
- Import transfers in chronological batches (by month)
- Validate each batch before proceeding to next
- Monitor for validation errors and resolve immediately
- Verify transfer counts and quantities match legacy totals
Phase 4 - Inventory Reconciliation (Week 2-3):
- Run inventory balance report in CloudSuite
- Compare to legacy system final balances
- Investigate and resolve discrepancies
- Document any adjustments made during migration
- Mark legacy locations as INACTIVE after validation complete
Handling Complex Mapping Scenarios:
-
Split Locations (one legacy → multiple CloudSuite):
If legacy location was split, assign transfers to the primary CloudSuite location. Add notes field indicating original legacy code for audit trail.
-
Merged Locations (multiple legacy → one CloudSuite):
Most common scenario. All transfers map to single CloudSuite location. Filter out transfers that become intra-location after mapping.
-
Renumbered Locations (1:1 but different codes):
Straightforward mapping. Maintain translation table for reference.
-
Obsolete Locations (no current CloudSuite equivalent):
Create LEGACY warehouse with generic locations (LEGACY-001, LEGACY-002) to preserve transfer history without cluttering active location master.
Inventory Reconciliation Approach:
For audit and compliance:
- Opening Balance Calculation:
Sum all transfers by location to calculate opening balances at go-live:
SELECT
location_code,
material_code,
SUM(quantity) as opening_balance
FROM legacy_transfers_mapped
WHERE transfer_date < '2025-07-01' -- go-live date
GROUP BY location_code, material_code;
- Transfer History Summary:
For audit purposes, create transfer summary report showing:
- Total transfers by location pair
- Total quantity moved by material
- Date range of historical transfers
- Mapping methodology notes
- Reconciliation Documentation:
Maintain:
- Legacy-to-CloudSuite location mapping table
- Transfer import validation reports
- Inventory balance comparison (legacy vs. CloudSuite)
- List of filtered/excluded transfers with justification
This comprehensive approach maintains your audit trail and inventory reconciliation capability while properly integrating with CloudSuite’s location master structure. The key is completing location master setup BEFORE transfer import, not trying to retrofit legacy codes into an already-configured system.