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 ; + if (isLoading || !product) return ; if (!customer_id || !product_id) { return
Customer or product not found
; } - if (!product) { - return
Product not found
; - } - const { customer } = data; return (