Assist_Design/docs/_archive/FIELD-CONFIG-AUDIT.md

310 lines
8.9 KiB
Markdown
Raw Normal View History

# Field Config vs Raw Types - Audit Report
## Audit Objective
Verify that all fields referenced in the field config system actually exist in the raw type schemas before removing the field config abstraction layer.
---
## Product Fields (from Product2)
### Field Config Expects:
```typescript
product: {
sku: "PRODUCT_SKU_FIELD",
portalCategory: "PRODUCT_PORTAL_CATEGORY_FIELD",
portalCatalog: "PRODUCT_PORTAL_CATALOG_FIELD",
portalAccessible: "PRODUCT_PORTAL_ACCESSIBLE_FIELD",
itemClass: "PRODUCT_ITEM_CLASS_FIELD",
billingCycle: "PRODUCT_BILLING_CYCLE_FIELD",
whmcsProductId: "PRODUCT_WHMCS_PRODUCT_ID_FIELD",
whmcsProductName: "PRODUCT_WHMCS_PRODUCT_NAME_FIELD",
internetPlanTier: "PRODUCT_INTERNET_PLAN_TIER_FIELD",
internetOfferingType: "PRODUCT_INTERNET_OFFERING_TYPE_FIELD",
displayOrder: "PRODUCT_DISPLAY_ORDER_FIELD",
bundledAddon: "PRODUCT_BUNDLED_ADDON_FIELD",
isBundledAddon: "PRODUCT_IS_BUNDLED_ADDON_FIELD",
simDataSize: "PRODUCT_SIM_DATA_SIZE_FIELD",
simPlanType: "PRODUCT_SIM_PLAN_TYPE_FIELD",
simHasFamilyDiscount: "PRODUCT_SIM_HAS_FAMILY_DISCOUNT_FIELD",
vpnRegion: "PRODUCT_VPN_REGION_FIELD",
}
```
### Raw Type Has:
```typescript
SalesforceProduct2Record {
Id: string ✅
Name: string ✅
StockKeepingUnit: string ✅ (sku)
Description: string ✅
Product2Categories1__c: string ✅ (portalCategory)
Portal_Catalog__c: boolean ✅ (portalCatalog)
Portal_Accessible__c: boolean ✅ (portalAccessible)
Item_Class__c: string ✅ (itemClass)
Billing_Cycle__c: string ✅ (billingCycle)
Catalog_Order__c: number ✅ (displayOrder)
Bundled_Addon__c: string ✅ (bundledAddon)
Is_Bundled_Addon__c: boolean ✅ (isBundledAddon)
Internet_Plan_Tier__c: string ✅ (internetPlanTier)
Internet_Offering_Type__c: string ✅ (internetOfferingType)
Feature_List__c: string ✅
SIM_Data_Size__c: string ✅ (simDataSize)
SIM_Plan_Type__c: string ✅ (simPlanType)
SIM_Has_Family_Discount__c: boolean ✅ (simHasFamilyDiscount)
VPN_Region__c: string ✅ (vpnRegion)
WH_Product_ID__c: number ✅ (whmcsProductId)
WH_Product_Name__c: string ✅ (whmcsProductName)
Price__c: number ✅
Monthly_Price__c: number ✅
One_Time_Price__c: number ✅
}
```
**Status:** ✅ ALL PRODUCT FIELDS EXIST IN RAW TYPE
---
## Order Fields (from Order)
### Field Config Expects:
```typescript
order: {
orderType: "ORDER_TYPE_FIELD",
activationType: "ORDER_ACTIVATION_TYPE_FIELD",
activationScheduledAt: "ORDER_ACTIVATION_SCHEDULED_AT_FIELD",
activationStatus: "ORDER_ACTIVATION_STATUS_FIELD",
internetPlanTier: "ORDER_INTERNET_PLAN_TIER_FIELD",
installationType: "ORDER_INSTALLATION_TYPE_FIELD",
weekendInstall: "ORDER_WEEKEND_INSTALL_FIELD",
accessMode: "ORDER_ACCESS_MODE_FIELD",
hikariDenwa: "ORDER_HIKARI_DENWA_FIELD",
vpnRegion: "ORDER_VPN_REGION_FIELD",
simType: "ORDER_SIM_TYPE_FIELD",
eid: "ORDER_EID_FIELD",
simVoiceMail: "ORDER_SIM_VOICE_MAIL_FIELD",
simCallWaiting: "ORDER_SIM_CALL_WAITING_FIELD",
whmcsOrderId: "ORDER_WHMCS_ORDER_ID_FIELD",
lastErrorCode: "ORDER_ACTIVATION_ERROR_CODE_FIELD",
lastErrorMessage: "ORDER_ACTIVATION_ERROR_MESSAGE_FIELD",
lastAttemptAt: "ORDER_ACTIVATION_LAST_ATTEMPT_AT_FIELD",
addressChanged: "ORDER_ADDRESS_CHANGED_FIELD",
mnp: { ... },
billing: { ... }
}
```
### Raw Type Has:
```typescript
SalesforceOrderRecord {
Id: string ✅
OrderNumber: string ✅
Status: string ✅
Type: string ✅ (orderType)
EffectiveDate: string ✅
TotalAmount: number ✅
AccountId: string ✅
Account: { Name: string } ✅
Pricebook2Id: string ✅
Activation_Type__c: string ✅ (activationType)
Activation_Status__c: string ✅ (activationStatus)
Activation_Scheduled_At__c: string ✅ (activationScheduledAt)
Internet_Plan_Tier__c: string ✅ (internetPlanTier)
Installment_Plan__c: string ✅ (installationType)
Access_Mode__c: string ✅ (accessMode)
Weekend_Install__c: boolean ✅ (weekendInstall)
Hikari_Denwa__c: boolean ✅ (hikariDenwa)
VPN_Region__c: string ✅ (vpnRegion)
SIM_Type__c: string ✅ (simType)
SIM_Voice_Mail__c: boolean ✅ (simVoiceMail)
SIM_Call_Waiting__c: boolean ✅ (simCallWaiting)
EID__c: string ✅ (eid)
WHMCS_Order_ID__c: string ✅ (whmcsOrderId)
Activation_Error_Code__c: string ✅ (lastErrorCode)
Activation_Error_Message__c: string ✅ (lastErrorMessage)
ActivatedDate: string ✅
CreatedDate: string ✅
LastModifiedDate: string ✅
}
```
**Status:** ✅ ALL ORDER FIELDS EXIST IN RAW TYPE
**Missing Fields in Raw Type:**
-`lastAttemptAt` (ORDER_ACTIVATION_LAST_ATTEMPT_AT_FIELD) - NOT IN SCHEMA
-`addressChanged` (ORDER_ADDRESS_CHANGED_FIELD) - NOT IN SCHEMA
- ❌ MNP fields (all nested under order.mnp) - NOT IN SCHEMA
- ❌ Billing address fields (all nested under order.billing) - NOT IN SCHEMA
---
## OrderItem Fields
### Field Config Expects:
```typescript
orderItem: {
billingCycle: "ORDER_ITEM_BILLING_CYCLE_FIELD",
whmcsServiceId: "ORDER_ITEM_WHMCS_SERVICE_ID_FIELD",
}
```
### Raw Type Has:
```typescript
SalesforceOrderItemRecord {
Id: string ✅
OrderId: string ✅
Quantity: number ✅
UnitPrice: number ✅
TotalPrice: number ✅
PricebookEntryId: string ✅
PricebookEntry: SalesforcePricebookEntryRecord ✅
Billing_Cycle__c: string ✅ (billingCycle)
WHMCS_Service_ID__c: string ✅ (whmcsServiceId)
CreatedDate: string ✅
LastModifiedDate: string ✅
}
```
**Status:** ✅ ALL ORDER ITEM FIELDS EXIST IN RAW TYPE
---
## 🚨 CRITICAL FINDINGS
### Missing Fields in Raw Types:
#### 1. **MNP (Mobile Number Portability) Fields**
Field config expects these but they're **NOT in raw type**:
```typescript
mnp: {
application: string,
reservationNumber: string,
expiryDate: string,
phoneNumber: string,
mvnoAccountNumber: string,
portingDateOfBirth: string,
portingFirstName: string,
portingLastName: string,
portingFirstNameKatakana: string,
portingLastNameKatakana: string,
portingGender: string,
}
```
**These should be:**
```typescript
MNP_Application__c?: string
MNP_Reservation_Number__c?: string
MNP_Expiry_Date__c?: string
MNP_Phone_Number__c?: string
MVNO_Account_Number__c?: string
Porting_Date_Of_Birth__c?: string
Porting_First_Name__c?: string
Porting_Last_Name__c?: string
Porting_First_Name_Katakana__c?: string
Porting_Last_Name_Katakana__c?: string
Porting_Gender__c?: string
```
#### 2. **Billing Address Fields**
Field config expects these but they're **NOT in raw type**:
```typescript
billing: {
street: string,
city: string,
state: string,
postalCode: string,
country: string,
}
```
**These should be:**
```typescript
Billing_Street__c?: string
Billing_City__c?: string
Billing_State__c?: string
Billing_Postal_Code__c?: string
Billing_Country__c?: string
```
#### 3. **Other Missing Fields:**
```typescript
lastAttemptAt → Activation_Last_Attempt_At__c?
addressChanged → Address_Changed__c?
```
---
## Impact Analysis
### **Used in Order Builder** (Order Creation)
The order builder **DOES use** MNP and billing fields when creating orders:
```typescript
// apps/bff/src/modules/orders/services/order-builder.service.ts
private addSimFields(...) {
// Uses MNP fields if configurations.isMnp === "true"
orderFields[mnpField("application", fieldMap)] = ...
orderFields[mnpField("phoneNumber", fieldMap)] = ...
// etc.
}
private async addAddressSnapshot(...) {
// Uses billing fields for address snapshot
orderFields[billingField("street", fieldMap)] = ...
orderFields[billingField("city", fieldMap)] = ...
// etc.
}
```
### **Used in Mapper?**
Let me check if the mapper tries to read these fields...
```typescript
// packages/domain/orders/providers/salesforce/mapper.ts
// The mapper DOES NOT try to read MNP or billing fields
// It only reads simple order fields
```
**Status:** ✅ These fields are only used for **writing** (order creation), not **reading** (order display)
---
## ✅ SAFE TO PROCEED - With Additions
### **Conclusion:**
1. ✅ All fields used for **reading** (display) exist in raw types
2. ❌ Fields used for **writing** (creation) are missing from raw types
3. ✅ We can safely remove field config for **reading/mapping**
4. ⚠️ We need to **ADD missing fields** to raw types for **writing**
### **Action Plan:**
1. **First:** Add missing fields to `SalesforceOrderRecord` schema
- MNP fields (11 fields)
- Billing address fields (5 fields)
- lastAttemptAt field
- addressChanged field
2. **Then:** Remove field config system
- Update mappers to use direct access
- Update query builders to use actual field names
- Update order builder to use actual field names
- Delete field config service
- Delete field config interfaces
---
## Next Steps
Before proceeding with removal, I need to:
1. ✅ Update `SalesforceOrderRecord` schema with missing fields
2. ✅ Verify order creation still works
3. ✅ Then remove field config system
**Ready to proceed?** I'll first add the missing fields to the raw types.