Files
cfw-autumn/shared/api/customers/cusFeatures/utils/convert/apiBalanceToAllowed.ts
2026-03-12 12:00:29 +00:00

63 lines
1.4 KiB
TypeScript

import type { ApiSubjectV0 } from "@api/customers/apiSubjectV0";
import type { ApiBalanceV1 } from "@api/customers/cusFeatures/apiBalanceV1";
import { apiBalanceV1ToAvailableOverage } from "@api/customers/cusFeatures/utils/convert/apiBalanceV1ToAvailableOverage";
import type { Feature } from "@models/featureModels/featureModels";
import { isBooleanFeature, notNullish } from "@utils/index";
import { Decimal } from "decimal.js";
export const apiBalanceToAllowed = ({
apiBalance,
apiSubject,
feature,
requiredBalance,
}: {
apiBalance: ApiBalanceV1;
apiSubject: ApiSubjectV0;
feature: Feature;
requiredBalance: number;
}) => {
if (!apiBalance) {
return false;
}
// 1. Boolean
if (isBooleanFeature({ feature })) {
return true;
}
// 2. Unlimited
if (apiBalance.unlimited) {
return true;
}
// 2. Required balance is negative
if (requiredBalance < 0) {
return true;
}
// 3. Overage allowed
if (apiBalance.overage_allowed) {
// 1. Available overage
const availableOverage = apiBalanceV1ToAvailableOverage({
apiBalance,
apiSubject,
feature,
});
if (notNullish(availableOverage)) {
return new Decimal(availableOverage)
.add(apiBalance.remaining)
.gte(requiredBalance);
}
return true;
}
// 4. Balance >= required balance (V1 uses 'remaining' instead of 'current_balance')
if (new Decimal(apiBalance.remaining).gte(requiredBalance)) {
return true;
}
return false;
};