Files
cfw-autumn/shared/utils/cusEntUtils/balanceUtils/cusEntsToPurchasedBalance.ts
2026-01-16 14:37:41 +00:00

72 lines
2.1 KiB
TypeScript

import { cusEntToCusPrice } from "@utils/cusEntUtils/convertCusEntUtils/cusEntToCusPrice.js";
import { Decimal } from "decimal.js";
import type { FullCustomerEntitlement } from "../../../models/cusProductModels/cusEntModels/cusEntModels.js";
import type { FullCusEntWithFullCusProduct } from "../../../models/cusProductModels/cusEntModels/cusEntWithProduct.js";
import { BillingType } from "../../../models/productModels/priceModels/priceEnums.js";
import { getBillingType } from "../../productUtils/priceUtils.js";
import { nullish, sumValues } from "../../utils.js";
import { isEntityScopedCusEnt } from "../classifyCusEntUtils.js";
import { cusEntToPrepaidQuantity } from "./cusEntsToPrepaidQuantity.js";
export const getCusEntMainOverage = ({
cusEnt,
entityId,
}: {
cusEnt: FullCustomerEntitlement;
entityId?: string;
}) => {
if (isEntityScopedCusEnt(cusEnt)) {
if (nullish(entityId)) {
const entities = Object.values(cusEnt.entities ?? {});
return sumValues(entities.map((entity) => Math.max(0, -entity.balance)));
} else {
const entityBalance = cusEnt.entities?.[entityId]?.balance;
return Math.max(0, -(entityBalance ?? 0));
}
}
return Math.max(0, -(cusEnt.balance ?? 0));
};
export const cusEntToPurchasedBalance = ({
cusEnt,
entityId,
}: {
cusEnt: FullCusEntWithFullCusProduct;
entityId?: string;
}) => {
const cusPrice = cusEntToCusPrice({ cusEnt });
if (nullish(cusPrice)) {
return getCusEntMainOverage({ cusEnt, entityId });
}
const billingType = getBillingType(cusPrice.price.config);
if (billingType === BillingType.UsageInAdvance) {
// Purchased balance is how much was prepaid
const prepaidQuantity = cusEntToPrepaidQuantity({
cusEnt,
sumAcrossEntities: nullish(entityId),
});
const mainOverage = getCusEntMainOverage({ cusEnt, entityId });
return new Decimal(prepaidQuantity).add(mainOverage).toNumber();
}
return getCusEntMainOverage({ cusEnt, entityId });
};
export const cusEntsToPurchasedBalance = ({
cusEnts,
entityId,
}: {
cusEnts: FullCusEntWithFullCusProduct[];
entityId?: string;
}) => {
return sumValues(
cusEnts.map((cusEnt) => cusEntToPurchasedBalance({ cusEnt, entityId })),
);
};