"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformWhmcsSubscription = transformWhmcsSubscription; exports.transformWhmcsSubscriptions = transformWhmcsSubscriptions; const schema_1 = require("../../schema"); const raw_types_1 = require("./raw.types"); const STATUS_MAP = { active: "Active", inactive: "Inactive", pending: "Pending", cancelled: "Cancelled", canceled: "Cancelled", terminated: "Terminated", completed: "Completed", suspended: "Suspended", fraud: "Cancelled", }; const CYCLE_MAP = { monthly: "Monthly", annually: "Annually", annual: "Annually", yearly: "Annually", quarterly: "Quarterly", "semi annually": "Semi-Annually", semiannually: "Semi-Annually", "semi-annually": "Semi-Annually", biennially: "Biennially", triennially: "Triennially", "one time": "One-time", onetime: "One-time", "one-time": "One-time", "one time fee": "One-time", free: "Free", }; function mapStatus(status) { if (!status) return "Cancelled"; const mapped = STATUS_MAP[status.trim().toLowerCase()]; return mapped ?? "Cancelled"; } function mapCycle(cycle) { if (!cycle) return "One-time"; const normalized = cycle.trim().toLowerCase().replace(/[_\s-]+/g, " "); return CYCLE_MAP[normalized] ?? "One-time"; } function parseAmount(amount) { if (typeof amount === "number") { return amount; } if (!amount) { return 0; } const cleaned = String(amount).replace(/[^\d.-]/g, ""); const parsed = Number.parseFloat(cleaned); return Number.isNaN(parsed) ? 0 : parsed; } function formatDate(input) { if (!input) { return undefined; } const date = new Date(input); if (Number.isNaN(date.getTime())) { return undefined; } return date.toISOString(); } function extractCustomFields(raw) { if (!raw) return undefined; const container = raw_types_1.whmcsCustomFieldsContainerSchema.safeParse(raw); if (!container.success) return undefined; const customfield = container.data.customfield; const fieldsArray = Array.isArray(customfield) ? customfield : [customfield]; const entries = fieldsArray.reduce((acc, field) => { if (field?.name && field.value) { acc[field.name] = field.value; } return acc; }, {}); return Object.keys(entries).length > 0 ? entries : undefined; } function transformWhmcsSubscription(rawProduct, options = {}) { const product = raw_types_1.whmcsProductRawSchema.parse(rawProduct); const currency = product.pricing?.currency || options.defaultCurrencyCode || "JPY"; const currencySymbol = product.pricing?.currencyprefix || product.pricing?.currencysuffix || options.defaultCurrencySymbol; const amount = parseAmount(product.amount || product.recurringamount || product.pricing?.amount || product.firstpaymentamount || 0); const subscription = { id: product.id, serviceId: product.serviceid || product.id, productName: product.name || product.translated_name || "Unknown Product", domain: product.domain || undefined, cycle: mapCycle(product.billingcycle), status: mapStatus(product.status), nextDue: formatDate(product.nextduedate || product.nextinvoicedate), amount, currency, currencySymbol, registrationDate: formatDate(product.regdate) || new Date().toISOString(), notes: product.notes || undefined, customFields: extractCustomFields(product.customfields), orderNumber: product.ordernumber || undefined, groupName: product.groupname || product.translated_groupname || undefined, paymentMethod: product.paymentmethodname || product.paymentmethod || undefined, serverName: product.servername || product.serverhostname || undefined, }; return schema_1.subscriptionSchema.parse(subscription); } function transformWhmcsSubscriptions(rawProducts, options = {}) { return rawProducts.map(raw => transformWhmcsSubscription(raw, options)); } //# sourceMappingURL=mapper.js.map