2025-08-27 10:54:05 +09:00
# Field Mapping Migration Guide
This guide provides step-by-step instructions for migrating services to use the simplified centralized field mapping system.
## Overview
The simplified field mapping system in `apps/bff/src/common/config/field-map.ts` provides essential field coverage for Internet, SIM, and VPN products with a clean, maintainable structure. Complex configuration logic is handled by Salesforce flows rather than product fields.
## What's New
### Simplified Structure
2025-08-27 20:01:46 +09:00
- **Core Product fields**: Essential catalog fields only (StockKeepingUnit, category, visibility, pricing)
2025-08-27 10:54:05 +09:00
- **Service-specific fields**: Minimal fields per product type (Internet tier, SIM data size, etc.)
- **Configuration logic**: Moved to Salesforce flows for Gold/Platinum Internet plans
- **Family discount logic**: Handled in personalized catalog service
### Key Simplifications
- **Removed complex configuration fields**: Access mode, service speed, etc. determined by Salesforce
- **Streamlined VPN products**: Region selection at order time, not product level
- **Clean Internet structure**: Silver (customer configures) vs Gold/Platinum (Salesforce configures)
## Migration Steps
### 1. Update Catalog Service
**Current hardcoded usage:**
```typescript
// In catalog.service.ts
2025-08-27 20:01:46 +09:00
const soql = `SELECT Id, Name, ${skuField}, Product2Categories1__c, Portal_Catalog__c FROM Product2...`
2025-08-27 10:54:05 +09:00
```
**Migrate to:**
```typescript
import { getSalesforceFieldMap, getProductQueryFields } from "../common/config/field-map";
// Option 1: Use helper function (recommended)
2025-08-27 20:01:46 +09:00
const soql = `SELECT ${getProductQueryFields()} FROM Product2 WHERE ${fields.product.portalCatalog} = true` ;
2025-08-27 10:54:05 +09:00
// Option 2: Use individual fields
const fields = getSalesforceFieldMap();
2025-08-27 20:01:46 +09:00
const soql = `SELECT Id, Name, ${fields.product.sku}, ${fields.product.portalCategory}, ${fields.product.portalCatalog} FROM Product2...` ;
2025-08-27 10:54:05 +09:00
```
### 2. Update Orders Service
**Current mixed usage:**
```typescript
// Some fields use mapping, others are hardcoded
orderFields.Order_Type__c = normalizedType;
orderFields.Activation_Type__c = body.selections.activationType;
orderFields.Internet_Plan_Tier__c = body.selections.tier;
```
**Migrate to:**
```typescript
const fields = getSalesforceFieldMap();
orderFields[fields.order.orderType] = normalizedType;
orderFields[fields.order.activationType] = body.selections.activationType;
orderFields[fields.order.internetPlanTier] = body.selections.tier;
orderFields[fields.order.accessMode] = body.selections.mode;
orderFields[fields.order.serviceSpeed] = body.selections.speed;
orderFields[fields.order.installmentPlan] = body.selections.install;
orderFields[fields.order.weekendInstall] = body.selections.weekend;
```
### 3. Update Account Service
**Current hardcoded usage:**
```typescript
// In salesforce-account.service.ts
WHERE SF_Account_No__c = '${this.safeSoql(customerNumber.trim())}'
```
**Migrate to:**
```typescript
import { getSalesforceFieldMap } from "../../../common/config/field-map";
const fields = getSalesforceFieldMap();
WHERE ${fields.account.customerNumber} = '${this.safeSoql(customerNumber.trim())}'
```
### 4. Add Personalized Catalog Support
**New functionality for Account eligibility:**
```typescript
const fields = getSalesforceFieldMap();
// Query account eligibility
const accountSoql = `SELECT ${fields.account.internetEligibility} FROM Account WHERE Id = '${accountId}'` ;
// Filter products by eligibility
const productSoql = `SELECT ${getProductQueryFields()}
FROM Product2
WHERE ${fields.product.portalVisible} = true
AND ${fields.product.portalInternetOffering} = '${eligibility}'`;
```
## Service-by-Service Migration Checklist
### ✅ Catalog Service
2025-08-27 20:01:46 +09:00
- [ ] Replace hardcoded `Product2Categories1__c` with `fields.product.portalCategory`
- [ ] Replace hardcoded `Portal_Catalog__c` with `fields.product.portalCatalog`
- [ ] Replace hardcoded `Portal_Accessible__c` with `fields.product.portalAccessible`
2025-08-27 10:54:05 +09:00
- [ ] Use `getProductQueryFields()` for standard queries
- [ ] Add personalized catalog support using `fields.account.internetEligibility`
### ✅ Orders Service
- [ ] Replace all hardcoded Order fields with field mapping
- [ ] Update Order query to use `getOrderQueryFields()`
- [ ] Replace hardcoded `Activation_Status__c` , `Activation_Type__c` , etc.
- [ ] Update MNP field usage to use `fields.order.mnp.*`
- [ ] Replace `WHMCS_Order_ID__c` with `fields.order.whmcsOrderId`
### ✅ Account Service
- [ ] Replace `SF_Account_No__c` with `fields.account.customerNumber`
- [ ] Add eligibility field queries using `fields.account.internetEligibility`
### ✅ User Service
- [ ] Update buildSalesforceUpdate to use field mapping for custom fields
- [ ] Ensure consistency with Account service field usage
## Environment Variable Support
All field mappings support environment variable overrides:
```bash
# Account fields
ACCOUNT_INTERNET_ELIGIBILITY_FIELD=Custom_Internet_Eligibility__c
ACCOUNT_CUSTOMER_NUMBER_FIELD=Custom_Account_Number__c
# Product fields
2025-08-27 20:01:46 +09:00
PRODUCT_PORTAL_CATALOG_FIELD=Custom_Portal_Catalog__c
PRODUCT_PORTAL_ACCESSIBLE_FIELD=Custom_Portal_Accessible__c
PRODUCT_PORTAL_CATEGORY_FIELD=Custom_Product2Categories1__c
2025-08-27 10:54:05 +09:00
# Order fields
ORDER_ACTIVATION_TYPE_FIELD=Custom_Activation_Type__c
ORDER_INTERNET_PLAN_TIER_FIELD=Custom_Plan_Tier__c
# And many more...
```
## Testing Strategy
1. **Unit Tests** : Update tests to use field mapping instead of hardcoded values
2. **Integration Tests** : Verify SOQL queries work with mapped fields
3. **Environment Tests** : Test with different field mappings via env vars
## Rollback Plan
If issues arise, you can quickly rollback by:
1. Setting environment variables to original field names
2. The field mapping defaults ensure backward compatibility
3. No database or Salesforce schema changes required
## Benefits After Migration
1. **Single Source of Truth** : All field references in one place
2. **Environment Flexibility** : Easy customization per environment
3. **Documentation Alignment** : Perfect match with portal documentation
4. **Type Safety** : Strong TypeScript typing for all field references
5. **Maintainability** : Changes only needed in field mapping file
## Next Steps
1. Migrate services one by one following this guide
2. Update unit tests to use field mapping
3. Test in development environment
4. Update documentation with new patterns
5. Consider adding field validation at startup