This commit is contained in:
John Yeo
2025-12-15 13:43:55 +00:00
parent 30f3f5dd82
commit 1000c2cca3
94 changed files with 1987 additions and 1568 deletions

View File

@@ -2,7 +2,7 @@ import { Decimal } from "decimal.js";
import type { FullCusEntWithFullCusProduct } from "../../../models/cusProductModels/cusEntModels/cusEntWithProduct";
import { isEntityScopedCusEnt } from "../classifyCusEntUtils";
export const cusEntToTotalOverage = ({
export const cusEntToInvoiceOverage = ({
cusEnt,
}: {
cusEnt: FullCusEntWithFullCusProduct;

View File

@@ -0,0 +1,35 @@
import { Decimal } from "decimal.js";
import type { FullCusEntWithFullCusProduct } from "../../../models/cusProductModels/cusEntModels/cusEntWithProduct";
import { cusEntToStartingBalance } from "../balanceUtils/cusEntToStartingBalance";
import { isEntityScopedCusEnt } from "../classifyCusEntUtils";
import { cusEntToInvoiceOverage } from "./cusEntToInvoiceOverage";
export const cusEntToInvoiceUsage = ({
cusEnt,
}: {
cusEnt: FullCusEntWithFullCusProduct;
}) => {
const startingBalance = cusEntToStartingBalance({ cusEnt });
const invoiceOverage = cusEntToInvoiceOverage({ cusEnt });
// 1. If invoice overage > 0:
if (invoiceOverage > 0) {
return new Decimal(startingBalance).add(invoiceOverage).toNumber();
}
// 1. If entity scoped
if (isEntityScopedCusEnt({ cusEnt })) {
let maxUsage = new Decimal(0);
for (const [_, entity] of Object.entries(cusEnt.entities || {})) {
const usage = new Decimal(startingBalance).sub(entity.balance);
maxUsage = Decimal.max(maxUsage, usage);
}
return maxUsage.toNumber();
}
// 2. If not entity scoped
const usage = new Decimal(startingBalance).sub(cusEnt.balance || 0);
return usage.toNumber();
};

View File

@@ -0,0 +1,14 @@
import type { FullCusEntWithFullCusProduct } from "../../../models/cusProductModels/cusEntModels/cusEntWithProduct";
import { entToOptions } from "../../productUtils/convertUtils";
export const cusEntToOptions = ({
cusEnt,
}: {
cusEnt: FullCusEntWithFullCusProduct;
}) => {
const ent = cusEnt.entitlement;
return entToOptions({
ent,
options: cusEnt.customer_product.options,
});
};