export type SalesforceFieldMap = { account: { internetEligibility: string; customerNumber: string; }; product: { // Core fields (all products) sku: string; portalCategory: string; portalCatalog: string; portalAccessible: string; itemClass: string; billingCycle: string; whmcsProductId: string; whmcsProductName: string; // Internet fields (simple) internetPlanTier: string; // Silver | Gold | Platinum internetOfferingType: string; // For eligibility filtering displayOrder: string; // For proper product ordering bundledAddon: string; // Lookup to bundled product isBundledAddon: string; // Checkbox for bundled products // SIM fields (unchanged) simDataSize: string; simPlanType: string; simHasFamilyDiscount: string; // VPN fields vpnRegion: string; }; order: { // Core fields orderType: string; // Activation fields activationType: string; activationScheduledAt: string; activationStatus: string; // Internet fields (independent fields synced with OrderItems) internetPlanTier: string; // Silver | Gold | Platinum (syncs with OrderItems) installationType: string; // Single | 12-Month | 24-Month (syncs with OrderItems) weekendInstall: string; // Checkbox (syncs with OrderItems) accessMode: string; // IPoE-BYOR | IPoE-HGW | PPPoE (operator sets) hikariDenwa: string; // Checkbox - customer selected Hikari Denwa // VPN fields vpnRegion: string; // Customer selection (same product, different regions) // SIM fields simType: string; // eSIM | Physical SIM (customer selection) eid: string; // Customer input for eSIM simVoiceMail: string; // Checkbox - customer selected Voice Mail add-on simCallWaiting: string; // Checkbox - customer selected Call Waiting add-on // MNP fields mnp: { application: string; reservationNumber: string; expiryDate: string; phoneNumber: string; mvnoAccountNumber: string; portingDateOfBirth: string; portingFirstName: string; portingLastName: string; portingFirstNameKatakana: string; portingLastNameKatakana: string; portingGender: string; }; // WHMCS integration whmcsOrderId: string; // Provisioning diagnostics lastErrorCode?: string; lastErrorMessage?: string; lastAttemptAt?: string; // Address fields addressChanged: string; // Billing address snapshot fields billing: { street: string; city: string; state: string; postalCode: string; country: string; }; }; orderItem: { billingCycle: string; whmcsServiceId: string; }; }; export function getSalesforceFieldMap(): SalesforceFieldMap { return { account: { internetEligibility: process.env.ACCOUNT_INTERNET_ELIGIBILITY_FIELD || "Internet_Eligibility__c", customerNumber: process.env.ACCOUNT_CUSTOMER_NUMBER_FIELD || "SF_Account_No__c", }, product: { // Core fields (all products) sku: process.env.PRODUCT_SKU_FIELD || "StockKeepingUnit", portalCategory: process.env.PRODUCT_PORTAL_CATEGORY_FIELD || "Product2Categories1__c", portalCatalog: process.env.PRODUCT_PORTAL_CATALOG_FIELD || "Portal_Catalog__c", portalAccessible: process.env.PRODUCT_PORTAL_ACCESSIBLE_FIELD || "Portal_Accessible__c", itemClass: process.env.PRODUCT_ITEM_CLASS_FIELD || "Item_Class__c", billingCycle: process.env.PRODUCT_BILLING_CYCLE_FIELD || "Billing_Cycle__c", whmcsProductId: process.env.PRODUCT_WHMCS_PRODUCT_ID_FIELD || "WH_Product_ID__c", whmcsProductName: process.env.PRODUCT_WHMCS_PRODUCT_NAME_FIELD || "WH_Product_Name__c", // Internet fields (simple) internetPlanTier: process.env.PRODUCT_INTERNET_PLAN_TIER_FIELD || "Internet_Plan_Tier__c", internetOfferingType: process.env.PRODUCT_INTERNET_OFFERING_TYPE_FIELD || "Internet_Offering_Type__c", displayOrder: process.env.PRODUCT_DISPLAY_ORDER_FIELD || "Catalog_Order__c", bundledAddon: process.env.PRODUCT_BUNDLED_ADDON_FIELD || "Bundled_Addon__c", isBundledAddon: process.env.PRODUCT_IS_BUNDLED_ADDON_FIELD || "Is_Bundled_Addon__c", // SIM fields (unchanged) simDataSize: process.env.PRODUCT_SIM_DATA_SIZE_FIELD || "SIM_Data_Size__c", simPlanType: process.env.PRODUCT_SIM_PLAN_TYPE_FIELD || "SIM_Plan_Type__c", simHasFamilyDiscount: process.env.PRODUCT_SIM_HAS_FAMILY_DISCOUNT_FIELD || "SIM_Has_Family_Discount__c", // VPN fields vpnRegion: process.env.PRODUCT_VPN_REGION_FIELD || "VPN_Region__c", }, order: { // Core fields orderType: process.env.ORDER_TYPE_FIELD || "Type", // Activation fields activationType: process.env.ORDER_ACTIVATION_TYPE_FIELD || "Activation_Type__c", activationScheduledAt: process.env.ORDER_ACTIVATION_SCHEDULED_AT_FIELD || "Activation_Scheduled_At__c", activationStatus: process.env.ORDER_ACTIVATION_STATUS_FIELD || "Activation_Status__c", // Internet fields (independent fields synced with OrderItems) internetPlanTier: process.env.ORDER_INTERNET_PLAN_TIER_FIELD || "Internet_Plan_Tier__c", installationType: process.env.ORDER_INSTALLATION_TYPE_FIELD || "Installment_Plan__c", weekendInstall: process.env.ORDER_WEEKEND_INSTALL_FIELD || "Weekend_Install__c", accessMode: process.env.ORDER_ACCESS_MODE_FIELD || "Access_Mode__c", hikariDenwa: process.env.ORDER_HIKARI_DENWA_FIELD || "Hikari_Denwa__c", // VPN fields vpnRegion: process.env.ORDER_VPN_REGION_FIELD || "VPN_Region__c", // SIM fields simType: process.env.ORDER_SIM_TYPE_FIELD || "SIM_Type__c", eid: process.env.ORDER_EID_FIELD || "EID__c", simVoiceMail: process.env.ORDER_SIM_VOICE_MAIL_FIELD || "SIM_Voice_Mail__c", simCallWaiting: process.env.ORDER_SIM_CALL_WAITING_FIELD || "SIM_Call_Waiting__c", // MNP fields mnp: { application: process.env.ORDER_MNP_APPLICATION_FIELD || "MNP_Application__c", reservationNumber: process.env.ORDER_MNP_RESERVATION_FIELD || "MNP_Reservation_Number__c", expiryDate: process.env.ORDER_MNP_EXPIRY_FIELD || "MNP_Expiry_Date__c", phoneNumber: process.env.ORDER_MNP_PHONE_FIELD || "MNP_Phone_Number__c", mvnoAccountNumber: process.env.ORDER_MVNO_ACCOUNT_NUMBER_FIELD || "MVNO_Account_Number__c", portingDateOfBirth: process.env.ORDER_PORTING_DOB_FIELD || "Porting_DateOfBirth__c", portingFirstName: process.env.ORDER_PORTING_FIRST_NAME_FIELD || "Porting_FirstName__c", portingLastName: process.env.ORDER_PORTING_LAST_NAME_FIELD || "Porting_LastName__c", portingFirstNameKatakana: process.env.ORDER_PORTING_FIRST_NAME_KATAKANA_FIELD || "Porting_FirstName_Katakana__c", portingLastNameKatakana: process.env.ORDER_PORTING_LAST_NAME_KATAKANA_FIELD || "Porting_LastName_Katakana__c", portingGender: process.env.ORDER_PORTING_GENDER_FIELD || "Porting_Gender__c", }, // WHMCS integration whmcsOrderId: process.env.ORDER_WHMCS_ORDER_ID_FIELD || "WHMCS_Order_ID__c", // Diagnostics (optional fields) — single source of truth: Activation_* fields lastErrorCode: process.env.ORDER_ACTIVATION_ERROR_CODE_FIELD || "Activation_Error_Code__c", lastErrorMessage: process.env.ORDER_ACTIVATION_ERROR_MESSAGE_FIELD || "Activation_Error_Message__c", lastAttemptAt: process.env.ORDER_ACTIVATION_LAST_ATTEMPT_AT_FIELD || "ActivatedDate", // Address fields addressChanged: process.env.ORDER_ADDRESS_CHANGED_FIELD || "Address_Changed__c", // Billing address snapshot fields — single source of truth: Billing* fields on Order billing: { street: process.env.ORDER_BILLING_STREET_FIELD || "BillingStreet", city: process.env.ORDER_BILLING_CITY_FIELD || "BillingCity", state: process.env.ORDER_BILLING_STATE_FIELD || "BillingState", postalCode: process.env.ORDER_BILLING_POSTAL_CODE_FIELD || "BillingPostalCode", country: process.env.ORDER_BILLING_COUNTRY_FIELD || "BillingCountry", }, }, orderItem: { billingCycle: process.env.ORDER_ITEM_BILLING_CYCLE_FIELD || "Billing_Cycle__c", whmcsServiceId: process.env.ORDER_ITEM_WHMCS_SERVICE_ID_FIELD || "WHMCS_Service_ID__c", }, }; } // Helper functions for commonly used field combinations export function getProductQueryFields(): string { const fields = getSalesforceFieldMap(); return [ "Id", "Name", fields.product.sku, fields.product.portalCategory, fields.product.portalCatalog, fields.product.portalAccessible, fields.product.itemClass, fields.product.billingCycle, fields.product.whmcsProductId, fields.product.whmcsProductName, fields.product.internetPlanTier, fields.product.internetOfferingType, fields.product.displayOrder, fields.product.bundledAddon, fields.product.isBundledAddon, fields.product.simDataSize, fields.product.simPlanType, fields.product.simHasFamilyDiscount, ].join(", "); } export function getOrderQueryFields(): string { const fields = getSalesforceFieldMap(); return [ "Id", "AccountId", "Status", "EffectiveDate", fields.order.orderType, fields.order.activationType, fields.order.activationScheduledAt, fields.order.activationStatus, fields.order.lastErrorCode, fields.order.lastErrorMessage, fields.order.lastAttemptAt, // Internet fields fields.order.internetPlanTier, fields.order.installationType, fields.order.weekendInstall, fields.order.accessMode, fields.order.hikariDenwa, // VPN fields fields.order.vpnRegion, // SIM fields fields.order.simType, fields.order.simVoiceMail, fields.order.simCallWaiting, fields.order.eid, fields.order.whmcsOrderId, ].join(", "); } // Build a nested select list for PricebookEntry.Product2.* fields used in OrderItem queries export function getOrderItemProduct2Select(additional: string[] = []): string { const fields = getSalesforceFieldMap(); const base = [ "Id", "Name", fields.product.sku, fields.product.whmcsProductId, fields.product.itemClass, fields.product.billingCycle, ]; const all = [...base, ...additional]; return all.map(f => `PricebookEntry.Product2.${f}`).join(", "); }