tema 05817e8c67 Refactor code for improved readability and consistency across components
- Standardized import statements and formatting in various files for better code clarity.
- Enhanced error messages and logging for improved debugging and user experience.
- Adjusted whitespace and line breaks in multiple components to follow best practices.
- Updated environment variable handling and configuration for consistency across services.
2025-09-09 15:45:03 +09:00

277 lines
10 KiB
TypeScript

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(", ");
}