From 801276559d324dd39478a3b26cb5e4742a9efe35 Mon Sep 17 00:00:00 2001 From: DeepnaPooja Date: Thu, 22 Oct 2026 16:38:09 +0530 Subject: [PATCH] feat: Enhance pricing and sales API with free goods and discount scheme support --- distribution_fe/lib/api/pricing.ts | 14 ++++++++++++++ distribution_fe/lib/api/sales.ts | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/distribution_fe/lib/api/pricing.ts b/distribution_fe/lib/api/pricing.ts index ea75cb1..3be1a32 100644 --- a/distribution_fe/lib/api/pricing.ts +++ b/distribution_fe/lib/api/pricing.ts @@ -4,6 +4,7 @@ import type { PriceResolution, SchemeResponse, SchemeRuleType, + SchemeSuggestion, } from '@/types/api' // ─── Price Lists ────────────────────────────────────────────────────────────── @@ -89,4 +90,17 @@ export const schemes = { remove: (id: string) => api.delete(`/schemes/${id}`), + + setFreeGoodsRule: (id: string, body: { triggerItemId?: string | null; triggerQty?: number | null; freeItemId: string; freeQty: number }) => + api.put(`/schemes/${id}/free-goods-rule`, body).then(r => r.data), + + upsertBundleComponent: (id: string, itemId: string, qty: number) => + api.put(`/schemes/${id}/bundle-components/${itemId}`, { qty }).then(r => r.data), + + removeBundleComponent: (id: string, itemId: string) => + api.delete(`/schemes/${id}/bundle-components/${itemId}`).then(r => r.data), + + /** Schemes the lines of a not-yet-saved Shop PO qualify for (or are close to). */ + suggest: (body: { storeId: string; items: { itemId: string; quantity: number; unitPrice?: number | null }[] }) => + api.post('/schemes/suggest', body).then(r => r.data), } diff --git a/distribution_fe/lib/api/sales.ts b/distribution_fe/lib/api/sales.ts index cb07213..4ed8840 100644 --- a/distribution_fe/lib/api/sales.ts +++ b/distribution_fe/lib/api/sales.ts @@ -21,16 +21,22 @@ export interface ShopPOItemBody { itemId: string quantity: number unitPrice?: number | null + /** Free issue accepted from a scheme suggestion; priced 0 by the server. */ + isFree?: boolean + schemeId?: string | null } export interface CreateShopPOBody { storeId: string items: ShopPOItemBody[] raisedByUserId?: string | null + /** The one flat/slab discount scheme the user accepted. */ + discountSchemeIds?: string[] } export interface UpdateShopPOItemsBody { items: ShopPOItemBody[] + discountSchemeIds?: string[] } export interface ShopPOListParams extends PageParams { @@ -97,8 +103,12 @@ export const invoices = { finalize: (id: string, finalizedByUserId?: string | null, adjustments?: { invoiceItemId: string; adjustedQuantity: number; isRemoved?: boolean }[]) => api.post(`/invoices/${id}/finalize`, { finalizedByUserId, adjustments }).then(r => r.data), - updateItems: (id: string, items: { invoiceItemId?: string; itemId?: string; quantity: number; unitPrice?: number | null; isRemoved?: boolean }[], editedByUserId?: string | null) => - api.put(`/invoices/${id}/items`, { items, editedByUserId }).then(r => r.data), + updateItems: (id: string, items: { invoiceItemId?: string; itemId?: string; quantity: number; unitPrice?: number | null; isRemoved?: boolean }[], editedByUserId?: string | null, discountSchemeIds?: string[]) => + api.put(`/invoices/${id}/items`, { items, editedByUserId, discountSchemeIds }).then(r => r.data), + + /** What the discount and total would be for these unsaved lines (draft editor preview). */ + previewTotals: (id: string, items: { itemId: string; quantity: number; unitPrice: number; isFree?: boolean; isRemoved?: boolean; schemeId?: string | null }[], discountSchemeIds?: string[]) => + api.post<{ discountAmount: number; totalAmount: number; freeEntitlements: { schemeId: string; quantity: number }[] }>(`/invoices/${id}/preview-totals`, { items, discountSchemeIds }).then(r => r.data), versions: (id: string) => api.get(`/invoices/${id}/versions`).then(r => r.data),