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

8.9 KiB

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:

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:

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:

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:

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:

orderItem: {
  billingCycle: "ORDER_ITEM_BILLING_CYCLE_FIELD",
  whmcsServiceId: "ORDER_ITEM_WHMCS_SERVICE_ID_FIELD",
}

Raw Type Has:

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:

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:

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:

billing: {
  street: string,
  city: string,
  state: string,
  postalCode: string,
  country: string,
}

These should be:

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:

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:

// 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...

// 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.