119 lines
4.1 KiB
JavaScript

"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