diff --git a/shared/enums/APIVersion.ts b/shared/enums/APIVersion.ts
new file mode 100644
index 000000000..ae6bf1c7b
--- /dev/null
+++ b/shared/enums/APIVersion.ts
@@ -0,0 +1,6 @@
+export enum APIVersion {
+ v1 = 1,
+ v1_1 = 1.1,
+ v1_2 = 1.2,
+ v1_4 = 1.4,
+}
diff --git a/shared/index.ts b/shared/index.ts
index 3948a330a..c849d60b4 100644
--- a/shared/index.ts
+++ b/shared/index.ts
@@ -129,3 +129,4 @@ export * from "./enums/SuccessCode.js";
export * from "./enums/ErrCode.js";
export * from "./enums/LoggerAction.js";
export * from "./enums/AttachErrCode.js";
+export * from "./enums/APIVersion.js";
diff --git a/shared/models/attachModels/attachEnums/AttachConfig.ts b/shared/models/attachModels/attachEnums/AttachConfig.ts
index 8c6f08be9..c6ab0a841 100644
--- a/shared/models/attachModels/attachEnums/AttachConfig.ts
+++ b/shared/models/attachModels/attachEnums/AttachConfig.ts
@@ -12,4 +12,5 @@ export interface AttachConfig {
branch: AttachBranch;
proration: ProrationBehavior;
disableTrial: boolean;
+ invoiceOnly: boolean;
}
diff --git a/shared/models/attachModels/attachPreviewModels.ts b/shared/models/attachModels/attachPreviewModels.ts
index 8e057a9c3..475509d63 100644
--- a/shared/models/attachModels/attachPreviewModels.ts
+++ b/shared/models/attachModels/attachPreviewModels.ts
@@ -1,7 +1,21 @@
import { AttachBranch } from "./attachEnums/AttachBranch.js";
+export interface PreviewLineItem {
+ amount: number;
+ description: string;
+ price: string;
+}
+
export interface AttachPreview {
branch: AttachBranch;
options: any;
new_items: any;
+ due_today: {
+ line_items: PreviewLineItem[];
+ total: string;
+ };
+ due_next_cycle: {
+ line_items: PreviewLineItem[];
+ due_at: number;
+ };
}
diff --git a/shared/models/cusProductModels/cusProductModels.ts b/shared/models/cusProductModels/cusProductModels.ts
index 7acd22e07..4e4be1c3e 100644
--- a/shared/models/cusProductModels/cusProductModels.ts
+++ b/shared/models/cusProductModels/cusProductModels.ts
@@ -62,6 +62,7 @@ export const CusProductSchema = z.object({
.optional(),
quantity: z.number().default(1),
+ api_version: z.number().nullish(),
});
export const FullCusProductSchema = CusProductSchema.extend({
diff --git a/shared/models/cusProductModels/cusProductTable.ts b/shared/models/cusProductModels/cusProductTable.ts
index 2bfb514e8..771935847 100644
--- a/shared/models/cusProductModels/cusProductTable.ts
+++ b/shared/models/cusProductModels/cusProductTable.ts
@@ -47,6 +47,7 @@ export const customerProducts = pgTable(
// Optional...
customer_id: text("customer_id"),
entity_id: text("entity_id"),
+ api_version: numeric({ mode: "number" }),
},
(table) => [
foreignKey({
diff --git a/shared/models/genModels/genEnums.ts b/shared/models/genModels/genEnums.ts
index 59d4bfe89..c8b25ee00 100644
--- a/shared/models/genModels/genEnums.ts
+++ b/shared/models/genModels/genEnums.ts
@@ -1,9 +1,3 @@
-export enum APIVersion {
- v1 = 1,
- v1_1 = 1.1,
- v1_2 = 1.2,
-}
-
export enum AppEnv {
Sandbox = "sandbox",
Live = "live",
diff --git a/shared/models/productModels/priceModels/priceConfig/usagePriceConfig.ts b/shared/models/productModels/priceModels/priceConfig/usagePriceConfig.ts
index 14c56ecbb..505bd3c42 100644
--- a/shared/models/productModels/priceModels/priceConfig/usagePriceConfig.ts
+++ b/shared/models/productModels/priceModels/priceConfig/usagePriceConfig.ts
@@ -21,7 +21,7 @@ export const UsagePriceConfigSchema = z.object({
internal_feature_id: z.string(),
feature_id: z.string(),
usage_tiers: z.array(UsageTierSchema),
- interval: z.nativeEnum(BillingInterval).optional(),
+ interval: z.nativeEnum(BillingInterval),
// For usage in arrear
stripe_meter_id: z.string().nullish(),
diff --git a/shared/utils/displayUtils.ts b/shared/utils/displayUtils.ts
index 63e3223d3..ca513f3b8 100644
--- a/shared/utils/displayUtils.ts
+++ b/shared/utils/displayUtils.ts
@@ -55,6 +55,10 @@ export const getSingularAndPlural = ({
};
};
+export const numberWithCommas = (x: number) => {
+ return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+};
+
export const getFeatureInvoiceDescription = ({
feature,
usage,
@@ -66,11 +70,12 @@ export const getFeatureInvoiceDescription = ({
}) => {
const { singular, plural } = getSingularAndPlural({ feature });
+ const usageStr = numberWithCommas(usage);
if (billingUnits == 1) {
if (usage == 1)
- return `${usage} ${singular}`; // eg. 1 credit
- else return `${usage} ${plural}`; // eg. 4 credits
+ return `${usageStr} ${singular}`; // eg. 1 credit
+ else return `${usageStr} ${plural}`; // eg. 4 credits
} else {
- return `${usage} x ${billingUnits} ${plural}`; // eg. 4 x 100 credits
+ return `${usageStr} x ${billingUnits} ${plural}`; // eg. 4 x 100 credits
}
};
diff --git a/vite/src/services/useAxiosInstance.tsx b/vite/src/services/useAxiosInstance.tsx
index 4b88c6865..f7504dd45 100644
--- a/vite/src/services/useAxiosInstance.tsx
+++ b/vite/src/services/useAxiosInstance.tsx
@@ -31,7 +31,7 @@ export function useAxiosInstance(params?: { env?: AppEnv; isAuth?: boolean }) {
if (token) {
config.headers["Authorization"] = `Bearer ${token}`;
config.headers["app_env"] = trueEnv;
- config.headers["api_version"] = "1.2";
+ config.headers["x-api-version"] = "1.2";
}
return config;
diff --git a/vite/src/views/customers/customer/product/CustomerProductView.tsx b/vite/src/views/customers/customer/product/CustomerProductView.tsx
index 251f6854b..9f7326cb8 100644
--- a/vite/src/views/customers/customer/product/CustomerProductView.tsx
+++ b/vite/src/views/customers/customer/product/CustomerProductView.tsx
@@ -104,7 +104,6 @@ export default function CustomerProductView() {
const attachState = useAttachState({
product,
setProduct,
- preview: data?.preview,
});
useEffect(() => {
@@ -134,16 +133,12 @@ export default function CustomerProductView() {
);
}
- if (isLoading) return