tema 1283880f7d Revamp Physical SIM activation to use PA02-01 + PA05-05
Replace PA05-33 OTA API with the proper two-step activation flow:
- PA02-01: Account Registration (/master/addAcnt/)
- PA05-05: Voice Options Registration (/mvno/talkoption/addOrder/)

Changes:
- Add FreebitAccountRegistrationService for PA02-01 account registration
- Add FreebitVoiceOptionsService for PA05-05 voice options
- Update SimFulfillmentService to use new APIs instead of PA05-33 OTA
- Add SalesforceSIMInventoryService for fetching SIM inventory data
- Remove deprecated FreebitOtaService (PA05-33 no longer used)
- Remove debug console.log statements

The new flow:
1. Fetch SIM inventory from Salesforce (phone number, PT number)
2. Call PA02-01 to register MVNO account with plan code
3. Call PA05-05 to configure voice options with customer identity
4. Update SIM inventory status to "In Use"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 18:22:00 +09:00

131 lines
5.1 KiB
TypeScript

import type { SalesforceProduct2WithPricebookEntries } from "#internal/services/providers/salesforce";
import type { SalesforceOrderItemRecord, SalesforceOrderRecord } from "./raw.types.js";
type SalesforceOrderRecordKey = Extract<keyof SalesforceOrderRecord, string>;
type SalesforceOrderItemRecordKey = Extract<keyof SalesforceOrderItemRecord, string>;
type SalesforceProductKey = Extract<keyof SalesforceProduct2WithPricebookEntries, string>;
export interface SalesforceOrderFieldMap {
order: {
type: SalesforceOrderRecordKey;
activationType: SalesforceOrderRecordKey;
activationScheduledAt: SalesforceOrderRecordKey;
activationStatus: SalesforceOrderRecordKey;
activationErrorCode: SalesforceOrderRecordKey;
activationErrorMessage: SalesforceOrderRecordKey;
activationLastAttemptAt: SalesforceOrderRecordKey;
internetPlanTier: SalesforceOrderRecordKey;
installationType: SalesforceOrderRecordKey;
weekendInstall: SalesforceOrderRecordKey;
accessMode: SalesforceOrderRecordKey;
hikariDenwa: SalesforceOrderRecordKey;
vpnRegion: SalesforceOrderRecordKey;
simType: SalesforceOrderRecordKey;
simVoiceMail: SalesforceOrderRecordKey;
simCallWaiting: SalesforceOrderRecordKey;
eid: SalesforceOrderRecordKey;
whmcsOrderId: SalesforceOrderRecordKey;
addressChanged: SalesforceOrderRecordKey;
billingStreet: SalesforceOrderRecordKey;
billingCity: SalesforceOrderRecordKey;
billingState: SalesforceOrderRecordKey;
billingPostalCode: SalesforceOrderRecordKey;
billingCountry: SalesforceOrderRecordKey;
mnpApplication: SalesforceOrderRecordKey;
mnpReservation: SalesforceOrderRecordKey;
mnpExpiry: SalesforceOrderRecordKey;
mnpPhone: SalesforceOrderRecordKey;
mvnoAccountNumber: SalesforceOrderRecordKey;
portingDateOfBirth: SalesforceOrderRecordKey;
portingFirstName: SalesforceOrderRecordKey;
portingLastName: SalesforceOrderRecordKey;
portingFirstNameKatakana: SalesforceOrderRecordKey;
portingLastNameKatakana: SalesforceOrderRecordKey;
portingGender: SalesforceOrderRecordKey;
};
orderItem: {
billingCycle: SalesforceOrderItemRecordKey;
whmcsServiceId: SalesforceOrderItemRecordKey;
};
product: {
sku: SalesforceProductKey;
itemClass: SalesforceProductKey;
billingCycle: SalesforceProductKey;
whmcsProductId: SalesforceProductKey;
internetOfferingType: SalesforceProductKey;
internetPlanTier: SalesforceProductKey;
vpnRegion: SalesforceProductKey;
bundledAddon: SalesforceProductKey;
isBundledAddon: SalesforceProductKey;
};
}
export type PartialSalesforceOrderFieldMap = {
[Section in keyof SalesforceOrderFieldMap]?: Partial<SalesforceOrderFieldMap[Section]>;
};
export const defaultSalesforceOrderFieldMap: SalesforceOrderFieldMap = {
order: {
type: "Type",
activationType: "Activation_Type__c",
activationScheduledAt: "Activation_Scheduled_At__c",
activationStatus: "Activation_Status__c",
activationErrorCode: "Activation_Error_Code__c",
activationErrorMessage: "Activation_Error_Message__c",
activationLastAttemptAt: "Activation_Last_Attempt_At__c",
internetPlanTier: "Internet_Plan_Tier__c",
installationType: "Installment_Plan__c",
weekendInstall: "Weekend_Install__c",
accessMode: "Access_Mode__c",
hikariDenwa: "Hikari_Denwa__c",
vpnRegion: "VPN_Region__c",
simType: "SIM_Type__c",
simVoiceMail: "SIM_Voice_Mail__c",
simCallWaiting: "SIM_Call_Waiting__c",
eid: "EID__c",
whmcsOrderId: "WHMCS_Order_ID__c",
addressChanged: "Address_Changed__c",
billingStreet: "BillingStreet",
billingCity: "BillingCity",
billingState: "BillingState",
billingPostalCode: "BillingPostalCode",
billingCountry: "BillingCountry",
mnpApplication: "MNP_Application__c",
mnpReservation: "MNP_Reservation_Number__c",
mnpExpiry: "MNP_Expiry_Date__c",
mnpPhone: "MNP_Phone_Number__c",
mvnoAccountNumber: "MVNO_Account_Number__c",
portingDateOfBirth: "Porting_DateOfBirth__c",
portingFirstName: "Porting_FirstName__c",
portingLastName: "Porting_LastName__c",
portingFirstNameKatakana: "Porting_FirstName_Katakana__c",
portingLastNameKatakana: "Porting_LastName_Katakana__c",
portingGender: "Porting_Gender__c",
},
orderItem: {
billingCycle: "Billing_Cycle__c",
whmcsServiceId: "WHMCS_Service_ID__c",
},
product: {
sku: "StockKeepingUnit",
itemClass: "Item_Class__c",
billingCycle: "Billing_Cycle__c",
whmcsProductId: "WH_Product_ID__c",
internetOfferingType: "Internet_Offering_Type__c",
internetPlanTier: "Internet_Plan_Tier__c",
vpnRegion: "VPN_Region__c",
bundledAddon: "Bundled_Addon__c",
isBundledAddon: "Is_Bundled_Addon__c",
},
};
export function createSalesforceOrderFieldMap(
overrides: PartialSalesforceOrderFieldMap = {}
): SalesforceOrderFieldMap {
return {
order: { ...defaultSalesforceOrderFieldMap.order, ...overrides.order },
orderItem: { ...defaultSalesforceOrderFieldMap.orderItem, ...overrides.orderItem },
product: { ...defaultSalesforceOrderFieldMap.product, ...overrides.product },
};
}