Files
cfw-autumn/shared/utils/cusEntUtils/balanceUtils/cusEntsToReset.ts
2026-02-13 15:50:07 +00:00

60 lines
1.6 KiB
TypeScript

import type { ApiBalanceReset } from "../../../api/customers/cusFeatures/apiBalance";
import type { FullCusEntWithFullCusProduct } from "../../../models/cusProductModels/cusEntModels/cusEntWithProduct";
import { isContUseFeature } from "../../featureUtils/convertFeatureUtils";
import {
entIntvToResetIntv,
toIntervalCountResponse,
} from "../../productV2Utils/productItemUtils/convertProductItem/planItemIntervals.js";
export const cusEntsToNextResetAt = ({
cusEnts,
}: {
cusEnts: FullCusEntWithFullCusProduct[];
}) => {
const result = cusEnts.reduce((acc, curr) => {
if (curr.next_reset_at && curr.next_reset_at < acc) {
return curr.next_reset_at;
}
return acc;
}, Infinity);
if (result === Infinity) return null;
return result;
};
export const cusEntsToReset = ({
cusEnts,
}: {
cusEnts: FullCusEntWithFullCusProduct[];
}): ApiBalanceReset | null => {
if (cusEnts.length === 0) return null;
const feature = cusEnts[0].entitlement.feature;
// 1. If feature is allocated, null
if (isContUseFeature({ feature })) return null;
// Check if there are multiple intervals
const uniqueIntervals = [
...new Set(cusEnts.map((cusEnt) => cusEnt.entitlement.interval)),
];
if (uniqueIntervals.length > 1) {
return { interval: "multiple", interval_count: undefined, resets_at: null };
}
// 3. Only 1 interval
return {
interval: entIntvToResetIntv({
entInterval: cusEnts[0].entitlement.interval,
}),
interval_count: toIntervalCountResponse({
intervalCount: cusEnts[0].entitlement.interval_count,
}),
resets_at: cusEntsToNextResetAt({ cusEnts }),
};
};