Files
cfw-autumn/shared/api/customers/cusFeatures/utils/convert/apiBalanceV1ToAvailableOverage.ts
2026-02-18 18:46:19 +00:00

57 lines
1.4 KiB
TypeScript

import { Decimal } from "decimal.js";
import type {
ApiBalanceBreakdownInput,
ApiBalanceInput,
} from "./apiBalanceToAllowed";
import { apiBalanceV1ToOverage } from "./apiBalanceV1ToOverage";
const sumValues = (values: number[]) =>
values.reduce((total, value) => total + value, 0);
export const apiBalanceBreakdownV1ToMaxOverage = ({
apiBalanceBreakdown,
}: {
apiBalanceBreakdown: ApiBalanceBreakdownInput;
}): number | undefined => {
if (apiBalanceBreakdown.price?.billing_method === "usage_based") {
return apiBalanceBreakdown.price?.max_purchase ?? undefined;
}
return 0;
};
export const apiBalanceV1ToMaxOverage = ({
apiBalance,
}: {
apiBalance: ApiBalanceInput;
}): number | undefined => {
const breakdownItems = apiBalance.breakdown ?? [];
const availableOverages = breakdownItems.map((item) =>
apiBalanceBreakdownV1ToMaxOverage({ apiBalanceBreakdown: item }),
);
if (availableOverages.some((overage) => overage === undefined)) {
return undefined;
}
return sumValues(
availableOverages.filter((overage) => overage !== undefined),
);
};
export const apiBalanceV1ToAvailableOverage = ({
apiBalance,
}: {
apiBalance: ApiBalanceInput;
}): number | undefined => {
const maxOverage = apiBalanceV1ToMaxOverage({ apiBalance });
const overage = apiBalanceV1ToOverage({ apiBalance });
if (maxOverage === undefined) {
return undefined;
}
return Math.max(0, new Decimal(maxOverage).sub(overage).toNumber());
};