72 lines
2.1 KiB
TypeScript
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 })),
|
|
);
|
|
};
|