@classytic/commerce-sdk 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +164 -0
  3. package/dist/adjustment-MNH3AT6S.js +5 -0
  4. package/dist/adjustment-MNH3AT6S.js.map +1 -0
  5. package/dist/analytics/index.d.ts +27 -0
  6. package/dist/analytics/index.js +6 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics-DMcD-o8w.d.ts +76 -0
  9. package/dist/api-factory-B_h4RKBm.d.ts +280 -0
  10. package/dist/auth/index.d.ts +39 -0
  11. package/dist/auth/index.js +5 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/catalog/index.d.ts +571 -0
  14. package/dist/catalog/index.js +9 -0
  15. package/dist/catalog/index.js.map +1 -0
  16. package/dist/chunk-24FDD6UR.js +75 -0
  17. package/dist/chunk-24FDD6UR.js.map +1 -0
  18. package/dist/chunk-2TF7QNYV.js +159 -0
  19. package/dist/chunk-2TF7QNYV.js.map +1 -0
  20. package/dist/chunk-2YAZ5WG6.js +479 -0
  21. package/dist/chunk-2YAZ5WG6.js.map +1 -0
  22. package/dist/chunk-36NLLAVH.js +177 -0
  23. package/dist/chunk-36NLLAVH.js.map +1 -0
  24. package/dist/chunk-3OYSJB3P.js +126 -0
  25. package/dist/chunk-3OYSJB3P.js.map +1 -0
  26. package/dist/chunk-5E57JODA.js +135 -0
  27. package/dist/chunk-5E57JODA.js.map +1 -0
  28. package/dist/chunk-7LZCW4VF.js +13 -0
  29. package/dist/chunk-7LZCW4VF.js.map +1 -0
  30. package/dist/chunk-ANYGZ6O5.js +830 -0
  31. package/dist/chunk-ANYGZ6O5.js.map +1 -0
  32. package/dist/chunk-AQAISI4F.js +183 -0
  33. package/dist/chunk-AQAISI4F.js.map +1 -0
  34. package/dist/chunk-B6MPVOV7.js +328 -0
  35. package/dist/chunk-B6MPVOV7.js.map +1 -0
  36. package/dist/chunk-CILP56G2.js +94 -0
  37. package/dist/chunk-CILP56G2.js.map +1 -0
  38. package/dist/chunk-ERQ52WHY.js +534 -0
  39. package/dist/chunk-ERQ52WHY.js.map +1 -0
  40. package/dist/chunk-FOTUJPM4.js +640 -0
  41. package/dist/chunk-FOTUJPM4.js.map +1 -0
  42. package/dist/chunk-IHCBBLLW.js +198 -0
  43. package/dist/chunk-IHCBBLLW.js.map +1 -0
  44. package/dist/chunk-J4JBQET2.js +76 -0
  45. package/dist/chunk-J4JBQET2.js.map +1 -0
  46. package/dist/chunk-L4OEI4VZ.js +123 -0
  47. package/dist/chunk-L4OEI4VZ.js.map +1 -0
  48. package/dist/chunk-LRV7MWWX.js +616 -0
  49. package/dist/chunk-LRV7MWWX.js.map +1 -0
  50. package/dist/chunk-N43VE355.js +126 -0
  51. package/dist/chunk-N43VE355.js.map +1 -0
  52. package/dist/chunk-PYYLHUV6.js +3 -0
  53. package/dist/chunk-PYYLHUV6.js.map +1 -0
  54. package/dist/chunk-QCTXAMLA.js +261 -0
  55. package/dist/chunk-QCTXAMLA.js.map +1 -0
  56. package/dist/chunk-RIKAPJNG.js +40 -0
  57. package/dist/chunk-RIKAPJNG.js.map +1 -0
  58. package/dist/chunk-U3XT35GZ.js +202 -0
  59. package/dist/chunk-U3XT35GZ.js.map +1 -0
  60. package/dist/chunk-W22WB3WZ.js +148 -0
  61. package/dist/chunk-W22WB3WZ.js.map +1 -0
  62. package/dist/chunk-WTIJMKML.js +27 -0
  63. package/dist/chunk-WTIJMKML.js.map +1 -0
  64. package/dist/chunk-X2CQFJPR.js +75 -0
  65. package/dist/chunk-X2CQFJPR.js.map +1 -0
  66. package/dist/chunk-YYFKLOKO.js +769 -0
  67. package/dist/chunk-YYFKLOKO.js.map +1 -0
  68. package/dist/client-Cs7E_usr.d.ts +113 -0
  69. package/dist/content/index.d.ts +309 -0
  70. package/dist/content/index.js +6 -0
  71. package/dist/content/index.js.map +1 -0
  72. package/dist/core/index.d.ts +166 -0
  73. package/dist/core/index.js +5 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/core/react.d.ts +107 -0
  76. package/dist/core/react.js +5 -0
  77. package/dist/core/react.js.map +1 -0
  78. package/dist/coupon-BZSZ0y3n.d.ts +129 -0
  79. package/dist/coupon-CDzL4bJG.d.ts +655 -0
  80. package/dist/crud.factory-DyKaPHcU.d.ts +181 -0
  81. package/dist/finance/index.d.ts +81 -0
  82. package/dist/finance/index.js +5 -0
  83. package/dist/finance/index.js.map +1 -0
  84. package/dist/finance-BJdfKRw0.d.ts +135 -0
  85. package/dist/index.d.ts +32 -0
  86. package/dist/index.js +29 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/inventory/index.d.ts +512 -0
  89. package/dist/inventory/index.js +16 -0
  90. package/dist/inventory/index.js.map +1 -0
  91. package/dist/inventory-B5pssqRx.d.ts +748 -0
  92. package/dist/logistics/index.d.ts +248 -0
  93. package/dist/logistics/index.js +7 -0
  94. package/dist/logistics/index.js.map +1 -0
  95. package/dist/logistics-CrpKadKE.d.ts +410 -0
  96. package/dist/media-CNLJK93J.d.ts +721 -0
  97. package/dist/movement-R3CERFAM.js +5 -0
  98. package/dist/movement-R3CERFAM.js.map +1 -0
  99. package/dist/order-B3dCvHgK.d.ts +360 -0
  100. package/dist/payment-BRboLqvU.d.ts +127 -0
  101. package/dist/payments/index.d.ts +55 -0
  102. package/dist/payments/index.js +6 -0
  103. package/dist/payments/index.js.map +1 -0
  104. package/dist/platform/index.d.ts +645 -0
  105. package/dist/platform/index.js +8 -0
  106. package/dist/platform/index.js.map +1 -0
  107. package/dist/pos-BCqkx2-K.d.ts +527 -0
  108. package/dist/product-p09zXkXB.d.ts +260 -0
  109. package/dist/purchase-54PER2PY.js +5 -0
  110. package/dist/purchase-54PER2PY.js.map +1 -0
  111. package/dist/request-MP6NV5ZE.js +5 -0
  112. package/dist/request-MP6NV5ZE.js.map +1 -0
  113. package/dist/sales/index.d.ts +587 -0
  114. package/dist/sales/index.js +9 -0
  115. package/dist/sales/index.js.map +1 -0
  116. package/dist/server.d.ts +23 -0
  117. package/dist/server.js +37 -0
  118. package/dist/server.js.map +1 -0
  119. package/dist/size-guide-DgjzjM5P.d.ts +554 -0
  120. package/dist/stock-2LP4HJSB.js +5 -0
  121. package/dist/stock-2LP4HJSB.js.map +1 -0
  122. package/dist/stock-CfrU5_Wr.d.ts +632 -0
  123. package/dist/supplier-BWJTRZ5Z.js +5 -0
  124. package/dist/supplier-BWJTRZ5Z.js.map +1 -0
  125. package/dist/transaction/index.d.ts +104 -0
  126. package/dist/transaction/index.js +8 -0
  127. package/dist/transaction/index.js.map +1 -0
  128. package/dist/transaction-Bf6WjYCh.d.ts +84 -0
  129. package/dist/transaction-dL3WW-er.d.ts +442 -0
  130. package/dist/transfer-4XSS6HWT.js +5 -0
  131. package/dist/transfer-4XSS6HWT.js.map +1 -0
  132. package/dist/user-data-DdLjAGwO.d.ts +132 -0
  133. package/package.json +147 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/inventory/api/index.ts","../src/inventory/hooks/inventory.ts","../src/inventory/hooks/stock.ts","../src/inventory/hooks/purchase.ts","../src/inventory/hooks/transfer.ts","../src/inventory/hooks/adjustment.ts","../src/inventory/hooks/movement.ts","../src/inventory/hooks/request.ts","../src/inventory/hooks/supplier.ts"],"names":["useStockActions","useQueryClient","useMutation","useQuery","useMemo"],"mappings":"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","file":"chunk-LRV7MWWX.js","sourcesContent":["/**\r\n * Inventory API - Barrel Export\r\n *\r\n * Modular inventory API following Bangladesh retail flow:\r\n * - Head Office purchases stock (purchaseApi)\r\n * - Transfers distribute to sub-branches (transferApi)\r\n * - Sub-branches request stock (requestApi)\r\n * - Stock movements tracked for audit (movementApi)\r\n * - Manual corrections via adjustments (adjustmentApi)\r\n * - Supplier management (supplierApi)\r\n */\r\n\r\n// Stock Entry\r\nexport { stockApi, StockApi } from \"./stock\";\r\n\r\n// Purchases\r\nexport { purchaseApi, PurchaseApi } from \"./purchase\";\r\n\r\n// Transfers (Challan)\r\nexport { transferApi, TransferApi } from \"./transfer\";\r\n\r\n// Stock Requests\r\nexport { requestApi, RequestApi } from \"./request\";\r\n\r\n// Stock Movements (Audit)\r\nexport { movementApi, MovementApi } from \"./movement\";\r\n\r\n// Adjustments\r\nexport { adjustmentApi, AdjustmentApi } from \"./adjustment\";\r\n\r\n// Suppliers\r\nexport { supplierApi, SupplierApi } from \"./supplier\";\r\nexport type { SupplierQueryParams } from \"./supplier\";\r\n\r\n// Legacy compatibility - unified API object\r\n// (Use individual APIs for new code)\r\nexport const inventoryApis = {\r\n stock: () => import(\"./stock\").then((m) => m.stockApi),\r\n purchase: () => import(\"./purchase\").then((m) => m.purchaseApi),\r\n transfer: () => import(\"./transfer\").then((m) => m.transferApi),\r\n request: () => import(\"./request\").then((m) => m.requestApi),\r\n movement: () => import(\"./movement\").then((m) => m.movementApi),\r\n adjustment: () => import(\"./adjustment\").then((m) => m.adjustmentApi),\r\n supplier: () => import(\"./supplier\").then((m) => m.supplierApi),\r\n} as const;\r\n","\"use client\";\r\n\r\n/**\r\n * Inventory Hooks\r\n *\r\n * React hooks for inventory management with branch-specific stock.\r\n * These hooks use the POS API internally for product/stock data.\r\n */\r\n\r\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\r\nimport { posApi } from \"../../sales/api/pos\";\r\nimport { adjustmentApi } from \"../api/adjustment\";\r\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\r\nimport type { PosProduct, PosProductsResponse, PosLookupResponse } from \"../../sales/types/pos\";\r\nimport type { CreateAdjustmentPayload, BulkAdjustmentPayload } from \"../types\";\r\n\r\n// ============================================\r\n// Query Keys\r\n// ============================================\r\n\r\nexport const INVENTORY_KEYS = {\r\n all: [\"inventory\"] as const,\r\n products: (branchId?: string) => [...INVENTORY_KEYS.all, \"products\", branchId] as const,\r\n productsList: (branchId?: string, params?: Record<string, unknown>) =>\r\n [...INVENTORY_KEYS.products(branchId), params] as const,\r\n lookup: (code: string, branchId?: string) =>\r\n [...INVENTORY_KEYS.all, \"lookup\", code, branchId] as const,\r\n};\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface InventoryFilters {\r\n category?: string;\r\n parentCategory?: string;\r\n search?: string;\r\n inStockOnly?: boolean;\r\n lowStockOnly?: boolean;\r\n outOfStockOnly?: boolean;\r\n after?: string;\r\n limit?: number;\r\n sort?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface InventorySummary {\r\n totalItems: number;\r\n totalQuantity: number;\r\n lowStockCount: number;\r\n outOfStockCount: number;\r\n}\r\n\r\nexport interface UseInventoryReturn {\r\n items: PosProduct[];\r\n summary: InventorySummary;\r\n branch: PosProductsResponse[\"branch\"];\r\n hasMore: boolean;\r\n nextCursor: string | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\nexport interface UseStockActionsReturn {\r\n adjust: (data: CreateAdjustmentPayload) => Promise<unknown>;\r\n isAdjusting: boolean;\r\n setStock: (params: {\r\n productId: string;\r\n quantity: number;\r\n branchId?: string;\r\n variantSku?: string;\r\n notes?: string;\r\n }) => Promise<unknown>;\r\n isSettingStock: boolean;\r\n bulkAdjust: (data: BulkAdjustmentPayload) => Promise<unknown>;\r\n isBulkAdjusting: boolean;\r\n isLoading: boolean;\r\n}\r\n\r\ninterface QueryOptions {\r\n enabled?: boolean;\r\n}\r\n\r\n// ============================================\r\n// Hooks\r\n// ============================================\r\n\r\n/**\r\n * Hook to fetch inventory products with branch stock\r\n * Uses POS API: GET /pos/products\r\n *\r\n * @param token - Auth token\r\n * @param branchId - Branch to get stock for\r\n * @param filters - Product filters\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function InventoryTable({ branchId }) {\r\n * const { items, summary, isLoading } = useInventory(token, branchId, {\r\n * category: 'electronics',\r\n * lowStockOnly: true,\r\n * });\r\n *\r\n * return (\r\n * <Table data={items} />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useInventory(\r\n token: string,\r\n branchId: string | undefined,\r\n filters: InventoryFilters = {},\r\n options: QueryOptions = {}\r\n): UseInventoryReturn {\r\n const queryKey = INVENTORY_KEYS.productsList(branchId, filters);\r\n\r\n const { data, isLoading, isFetching, error, refetch } = useQuery({\r\n queryKey,\r\n queryFn: () =>\r\n posApi.getProducts({\r\n token,\r\n branchId,\r\n category: filters.category,\r\n search: filters.search,\r\n inStockOnly: filters.inStockOnly,\r\n lowStockOnly: filters.lowStockOnly,\r\n after: filters.after,\r\n limit: filters.limit || 50,\r\n sort: filters.sort || \"name\",\r\n }),\r\n enabled: !!token && options.enabled !== false,\r\n staleTime: 30 * 1000, // 30 seconds - inventory changes frequently\r\n refetchOnWindowFocus: true,\r\n });\r\n\r\n return {\r\n items: data?.docs || [],\r\n summary: data?.summary || { totalItems: 0, totalQuantity: 0, lowStockCount: 0, outOfStockCount: 0 },\r\n branch: data?.branch || { _id: \"\", code: \"\", name: \"\" },\r\n hasMore: data?.hasMore || false,\r\n nextCursor: data?.next || null,\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Hook for barcode/SKU lookup\r\n *\r\n * @param token - Auth token\r\n * @param code - Barcode or SKU to lookup\r\n * @param branchId - Branch for stock info\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function BarcodeScanner({ branchId }) {\r\n * const [code, setCode] = useState('');\r\n * const { data, isFetching } = useInventoryLookup(token, code, branchId, {\r\n * enabled: code.length >= 2,\r\n * });\r\n *\r\n * return <Input value={code} onChange={e => setCode(e.target.value)} />;\r\n * }\r\n * ```\r\n */\r\nexport function useInventoryLookup(\r\n token: string,\r\n code: string,\r\n branchId?: string,\r\n options: QueryOptions = {}\r\n) {\r\n return useQuery<PosLookupResponse>({\r\n queryKey: INVENTORY_KEYS.lookup(code, branchId),\r\n queryFn: () => posApi.lookup({ token, code, branchId }),\r\n enabled: !!token && !!code && code.length >= 2 && options.enabled !== false,\r\n staleTime: 10 * 1000, // 10 seconds\r\n retry: false,\r\n });\r\n}\r\n\r\n/**\r\n * Hook for stock adjustment actions\r\n *\r\n * @param token - Auth token\r\n *\r\n * @example\r\n * ```tsx\r\n * function StockAdjuster({ product, branchId }) {\r\n * const { adjust, isAdjusting } = useStockActions(token);\r\n *\r\n * const handleAdjust = async (quantity: number) => {\r\n * await adjust({\r\n * productId: product._id,\r\n * quantity,\r\n * mode: 'set',\r\n * branchId,\r\n * });\r\n * };\r\n *\r\n * return <Button onClick={() => handleAdjust(10)} disabled={isAdjusting}>Set Stock</Button>;\r\n * }\r\n * ```\r\n */\r\nexport function useStockActions(token: string): UseStockActionsReturn {\r\n const queryClient = useQueryClient();\r\n const toast = getToastHandler();\r\n\r\n /**\r\n * Invalidate all queries affected by stock adjustments.\r\n */\r\n const invalidateStockQueries = (branchId?: string) => {\r\n queryClient.invalidateQueries({\r\n queryKey: INVENTORY_KEYS.products(branchId),\r\n });\r\n // Also invalidate POS queries for consistency\r\n queryClient.invalidateQueries({\r\n queryKey: [\"pos\", \"products\", branchId],\r\n });\r\n };\r\n\r\n // Single item adjustment\r\n const adjustMutation = useMutation({\r\n mutationFn: (data: CreateAdjustmentPayload) =>\r\n adjustmentApi.create({ token, data }),\r\n onSuccess: (_, variables) => {\r\n invalidateStockQueries(variables.branchId);\r\n toast.success(\"Stock adjusted successfully\");\r\n },\r\n onError: (error: Error) => {\r\n toast.error(error.message || \"Failed to adjust stock\");\r\n },\r\n });\r\n\r\n // Set stock directly\r\n const setStockMutation = useMutation({\r\n mutationFn: ({\r\n productId,\r\n quantity,\r\n branchId,\r\n variantSku,\r\n notes,\r\n }: {\r\n productId: string;\r\n quantity: number;\r\n branchId?: string;\r\n variantSku?: string;\r\n notes?: string;\r\n }) =>\r\n adjustmentApi.create({\r\n token,\r\n data: {\r\n productId,\r\n quantity,\r\n branchId,\r\n variantSku,\r\n mode: \"set\",\r\n notes,\r\n },\r\n }),\r\n onSuccess: (_, variables) => {\r\n invalidateStockQueries(variables.branchId);\r\n toast.success(\"Stock level updated\");\r\n },\r\n onError: (error: Error) => {\r\n toast.error(error.message || \"Failed to update stock\");\r\n },\r\n });\r\n\r\n // Bulk adjustment\r\n const bulkAdjustMutation = useMutation({\r\n mutationFn: (data: BulkAdjustmentPayload) =>\r\n adjustmentApi.create({\r\n token,\r\n data: {\r\n adjustments: data.adjustments,\r\n branchId: data.branchId,\r\n reason: data.reason,\r\n },\r\n }),\r\n onSuccess: (_, variables) => {\r\n invalidateStockQueries(variables.branchId);\r\n toast.success(\"Bulk adjustment completed\");\r\n },\r\n onError: (error: Error) => {\r\n toast.error(error.message || \"Failed to bulk adjust stock\");\r\n },\r\n });\r\n\r\n return {\r\n // Adjust stock (add/remove/set)\r\n adjust: adjustMutation.mutateAsync,\r\n isAdjusting: adjustMutation.isPending,\r\n\r\n // Set stock directly\r\n setStock: setStockMutation.mutateAsync,\r\n isSettingStock: setStockMutation.isPending,\r\n\r\n // Bulk operations\r\n bulkAdjust: bulkAdjustMutation.mutateAsync,\r\n isBulkAdjusting: bulkAdjustMutation.isPending,\r\n\r\n // Combined loading state\r\n isLoading: adjustMutation.isPending || setStockMutation.isPending || bulkAdjustMutation.isPending,\r\n };\r\n}\r\n\r\n/**\r\n * Helper to determine stock status\r\n */\r\nexport function getStockStatus(quantity: number, lowThreshold = 10): \"out\" | \"low\" | \"ok\" {\r\n if (quantity === 0) return \"out\";\r\n if (quantity <= lowThreshold) return \"low\";\r\n return \"ok\";\r\n}\r\n\r\n/**\r\n * Helper to format stock status badge props\r\n */\r\nexport function getStockStatusBadge(status: \"out\" | \"low\" | \"ok\") {\r\n switch (status) {\r\n case \"out\":\r\n return { variant: \"destructive\" as const, label: \"Out of Stock\" };\r\n case \"low\":\r\n return { variant: \"warning\" as const, label: \"Low Stock\" };\r\n case \"ok\":\r\n return { variant: \"success\" as const, label: \"In Stock\" };\r\n }\r\n}\r\n","\"use client\";\n\n/**\n * Stock Hooks\n *\n * React hooks for stock entry operations using the factory pattern.\n */\n\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { stockApi } from \"../api/stock\";\nimport type { StockEntry } from \"../types\";\n\n// Type helper for API compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyApi = CrudApi<any, any, any>;\n\n/**\n * Stock hooks using createCrudHooks factory\n *\n * Provides:\n * - useStock: List stock entries with filtering/pagination\n * - useStockDetail: Get single stock entry\n * - useStockActions: CRUD mutations (limited for stock)\n * - useStockNavigation: Navigation between stock entries\n */\nexport const stockHooks = createCrudHooks<StockEntry, Partial<StockEntry>, Partial<StockEntry>>({\n api: stockApi as AnyApi,\n entityKey: \"stock\",\n singular: \"Stock Entry\",\n plural: \"Stock Entries\",\n defaults: {\n staleTime: 2 * 60 * 1000, // 2 minutes\n },\n});\n\nexport const {\n KEYS: STOCK_KEYS,\n useList: useStock,\n useDetail: useStockDetail,\n useActions: useStockActions,\n useNavigation: useStockNavigation,\n} = stockHooks;\n","\"use client\";\n\n/**\n * Purchase Hooks\n *\n * React hooks for purchase CRUD operations using the factory pattern.\n */\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport { purchaseApi } from \"../api/purchase\";\nimport type { Purchase, CreatePurchasePayload, UpdatePurchasePayload } from \"../types\";\n\n// Type helper for API compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyApi = CrudApi<any, any, any>;\n\n/**\n * Purchase hooks using createCrudHooks factory\n *\n * Provides:\n * - usePurchases: List purchases with filtering/pagination\n * - usePurchaseDetail: Get single purchase\n * - usePurchaseActions: Create, update, delete mutations (basic CRUD)\n * - usePurchaseNavigation: Navigation between purchases\n */\nexport const purchaseHooks = createCrudHooks<Purchase, CreatePurchasePayload, UpdatePurchasePayload>({\n api: purchaseApi as AnyApi,\n entityKey: \"purchases\",\n singular: \"Purchase\",\n plural: \"Purchases\",\n});\n\nexport const {\n KEYS: PURCHASE_KEYS,\n useList: usePurchases,\n useDetail: usePurchaseDetail,\n useActions: usePurchaseActions,\n useNavigation: usePurchaseNavigation,\n} = purchaseHooks;\n\n// ============================================\n// Purchase State Actions Hook (receive, pay, cancel)\n// ============================================\n\nexport interface UsePurchaseStateActionsReturn {\n receive: ReturnType<typeof useMutation<Purchase, Error, string>>;\n pay: ReturnType<typeof useMutation<Purchase, Error, {\n id: string;\n amount: number;\n method: string;\n reference?: string;\n }>>;\n cancel: ReturnType<typeof useMutation<Purchase, Error, { id: string; reason?: string }>>;\n isReceiving: boolean;\n isPaying: boolean;\n isCancelling: boolean;\n isLoading: boolean;\n}\n\n/**\n * Hook for purchase state actions (receive, pay, cancel)\n *\n * @param token - Auth token\n * @returns Purchase state action mutations\n *\n * @example\n * ```tsx\n * const { receive, pay, cancel, isReceiving } = usePurchaseStateActions(token);\n *\n * // Receive a purchase (adds stock)\n * await receive.mutateAsync(purchaseId);\n *\n * // Record payment\n * await pay.mutateAsync({ id: purchaseId, amount: 1000, method: 'cash' });\n *\n * // Cancel purchase\n * await cancel.mutateAsync({ id: purchaseId, reason: 'Duplicate entry' });\n * ```\n */\nexport function usePurchaseStateActions(token: string): UsePurchaseStateActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const invalidateAll = () => {\n queryClient.invalidateQueries({ queryKey: PURCHASE_KEYS.all });\n // Also invalidate inventory queries that might be affected\n queryClient.invalidateQueries({ queryKey: [\"inventory\"] });\n queryClient.invalidateQueries({ queryKey: [\"stock\"] });\n };\n\n const receive = useMutation<Purchase, Error, string>({\n mutationFn: async (id: string) => {\n const response = await purchaseApi.receive({ token, id });\n return response.data as Purchase;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Purchase received - stock added\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to receive purchase\");\n },\n });\n\n const pay = useMutation<Purchase, Error, {\n id: string;\n amount: number;\n method: string;\n reference?: string;\n }>({\n mutationFn: async ({ id, amount, method, reference }) => {\n const response = await purchaseApi.pay({ token, id, amount, method, reference });\n return response.data as Purchase;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Payment recorded\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to record payment\");\n },\n });\n\n const cancel = useMutation<Purchase, Error, { id: string; reason?: string }>({\n mutationFn: async ({ id, reason }) => {\n const response = await purchaseApi.cancel({ token, id, reason });\n return response.data as Purchase;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Purchase cancelled\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to cancel purchase\");\n },\n });\n\n return {\n receive,\n pay,\n cancel,\n isReceiving: receive.isPending,\n isPaying: pay.isPending,\n isCancelling: cancel.isPending,\n isLoading: receive.isPending || pay.isPending || cancel.isPending,\n };\n}\n","\"use client\";\n\n/**\n * Transfer Hooks\n *\n * React hooks for inventory transfer (challan) operations using the factory pattern.\n */\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport { transferApi } from \"../api/transfer\";\nimport type { Transfer, CreateTransferPayload, UpdateTransferPayload, DispatchTransferPayload, ReceiveTransferPayload, TransferStats } from \"../types\";\n\n// Type helper for API compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyApi = CrudApi<any, any, any>;\n\n/**\n * Transfer hooks using createCrudHooks factory\n *\n * Provides:\n * - useTransfers: List transfers with filtering/pagination\n * - useTransferDetail: Get single transfer\n * - useTransferActions: Create, update, delete mutations (basic CRUD)\n * - useTransferNavigation: Navigation between transfers\n */\nexport const transferHooks = createCrudHooks<Transfer, CreateTransferPayload, UpdateTransferPayload>({\n api: transferApi as AnyApi,\n entityKey: \"transfers\",\n singular: \"Transfer\",\n plural: \"Transfers\",\n});\n\nexport const {\n KEYS: TRANSFER_KEYS,\n useList: useTransfers,\n useDetail: useTransferDetail,\n useActions: useTransferActions,\n useNavigation: useTransferNavigation,\n} = transferHooks;\n\n// ============================================\n// Transfer State Actions Hook (approve, dispatch, inTransit, receive, cancel)\n// ============================================\n\nexport interface UseTransferStateActionsReturn {\n approve: (id: string) => Promise<Transfer>;\n isApproving: boolean;\n dispatch: (params: { id: string; data?: DispatchTransferPayload }) => Promise<Transfer>;\n isDispatching: boolean;\n inTransit: (id: string) => Promise<Transfer>;\n isMarkingInTransit: boolean;\n receive: (params: { id: string; data?: ReceiveTransferPayload }) => Promise<Transfer>;\n isReceiving: boolean;\n cancel: (params: { id: string; reason?: string }) => Promise<Transfer>;\n isCancelling: boolean;\n isLoading: boolean;\n}\n\n/**\n * Hook for transfer state actions (approve, dispatch, inTransit, receive, cancel)\n *\n * @param token - Auth token\n * @returns Transfer state action functions\n *\n * @example\n * ```tsx\n * const { approve, dispatch, receive, cancel, isApproving } = useTransferStateActions(token);\n *\n * // Approve a transfer\n * await approve(transferId);\n *\n * // Dispatch with transport details\n * await dispatch({ id: transferId, data: { transport: { vehicleNumber: 'ABC123' } } });\n *\n * // Receive a transfer\n * await receive({ id: transferId, data: {} });\n *\n * // Cancel transfer\n * await cancel({ id: transferId, reason: 'Duplicate entry' });\n * ```\n */\nexport function useTransferStateActions(token: string): UseTransferStateActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const invalidateAll = () => {\n queryClient.invalidateQueries({ queryKey: TRANSFER_KEYS.all });\n queryClient.invalidateQueries({ queryKey: [\"inventory\"] });\n queryClient.invalidateQueries({ queryKey: [\"stock\"] });\n };\n\n const approveMutation = useMutation<Transfer, Error, string>({\n mutationFn: async (id: string) => {\n const response = await transferApi.approve({ token, id });\n return response.data as Transfer;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Transfer approved\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to approve transfer\");\n },\n });\n\n const dispatchMutation = useMutation<Transfer, Error, { id: string; data?: DispatchTransferPayload }>({\n mutationFn: async ({ id, data }) => {\n const response = await transferApi.dispatch({ token, id, data });\n return response.data as Transfer;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Transfer dispatched - stock deducted\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to dispatch transfer\");\n },\n });\n\n const inTransitMutation = useMutation<Transfer, Error, string>({\n mutationFn: async (id: string) => {\n const response = await transferApi.markInTransit({ token, id });\n return response.data as Transfer;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Transfer marked in transit\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to mark transfer in transit\");\n },\n });\n\n const receiveMutation = useMutation<Transfer, Error, { id: string; data?: ReceiveTransferPayload }>({\n mutationFn: async ({ id, data }) => {\n const response = await transferApi.receive({ token, id, data });\n return response.data as Transfer;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Transfer received - stock added\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to receive transfer\");\n },\n });\n\n const cancelMutation = useMutation<Transfer, Error, { id: string; reason?: string }>({\n mutationFn: async ({ id, reason }) => {\n const response = await transferApi.cancel({ token, id, reason });\n return response.data as Transfer;\n },\n onSuccess: () => {\n invalidateAll();\n toast.success(\"Transfer cancelled\");\n },\n onError: (err: Error) => {\n toast.error(err.message || \"Failed to cancel transfer\");\n },\n });\n\n return {\n approve: async (id) => {\n return approveMutation.mutateAsync(id);\n },\n isApproving: approveMutation.isPending,\n dispatch: async (params) => {\n return dispatchMutation.mutateAsync(params);\n },\n isDispatching: dispatchMutation.isPending,\n inTransit: async (id) => {\n return inTransitMutation.mutateAsync(id);\n },\n isMarkingInTransit: inTransitMutation.isPending,\n receive: async (params) => {\n return receiveMutation.mutateAsync(params);\n },\n isReceiving: receiveMutation.isPending,\n cancel: async (params) => {\n return cancelMutation.mutateAsync(params);\n },\n isCancelling: cancelMutation.isPending,\n isLoading:\n approveMutation.isPending ||\n dispatchMutation.isPending ||\n inTransitMutation.isPending ||\n receiveMutation.isPending ||\n cancelMutation.isPending,\n };\n}\n\n// ============================================\n// Transfer Stats Hook\n// ============================================\n\n// Query keys for transfer stats\nexport const TRANSFER_STATS_KEYS = {\n all: [\"transfers\", \"stats\"] as const,\n byBranch: (branchId?: string) => [\"transfers\", \"stats\", branchId] as const,\n};\n\n/**\n * Hook to fetch transfer statistics\n *\n * @param token - Auth token\n * @param branchId - Optional branch filter\n * @param options - React Query options\n *\n * @example\n * ```tsx\n * const { data: stats, isLoading } = useTransferStats(token, branchId);\n * ```\n */\nexport function useTransferStats(\n token: string,\n branchId?: string,\n options: { enabled?: boolean } = {}\n) {\n return useQuery({\n queryKey: TRANSFER_STATS_KEYS.byBranch(branchId),\n queryFn: () => transferApi.stats({ token, params: branchId ? { branchId } : {} }),\n enabled: !!token && options.enabled !== false,\n staleTime: 30 * 1000, // 30 seconds\n select: (data) => data?.data as TransferStats,\n });\n}\n","\"use client\";\n\n/**\n * Adjustment Hooks\n *\n * React hooks for stock adjustment operations using the factory pattern.\n */\n\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { adjustmentApi } from \"../api/adjustment\";\nimport type { AdjustStockResult, CreateAdjustmentPayload } from \"../types\";\n\n// Type helper for API compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyApi = CrudApi<any, any, any>;\n\n/**\n * Adjustment hooks using createCrudHooks factory\n *\n * Provides:\n * - useAdjustments: List adjustments with filtering/pagination\n * - useAdjustmentDetail: Get single adjustment\n * - useAdjustmentActions: Create mutations\n * - useAdjustmentNavigation: Navigation between adjustments\n */\nexport const adjustmentHooks = createCrudHooks<AdjustStockResult, CreateAdjustmentPayload, Partial<CreateAdjustmentPayload>>({\n api: adjustmentApi as AnyApi,\n entityKey: \"adjustments\",\n singular: \"Adjustment\",\n plural: \"Adjustments\",\n});\n\nexport const {\n KEYS: ADJUSTMENT_KEYS,\n useList: useAdjustments,\n useDetail: useAdjustmentDetail,\n useActions: useAdjustmentActions,\n useNavigation: useAdjustmentNavigation,\n} = adjustmentHooks;\n","\"use client\";\r\n\r\n/**\r\n * Movement Hooks\r\n *\r\n * React hooks for stock movement (audit trail) queries.\r\n */\r\n\r\nimport { useMemo } from \"react\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { movementApi } from \"../api/movement\";\r\nimport type { StockMovement, MovementQueryParams, LowStockItem } from \"../types\";\r\nimport type { PaginatedResponse, ApiResponse } from \"../../core/api-factory\";\r\n\r\n// ============================================\r\n// Query Keys\r\n// ============================================\r\n\r\nexport const MOVEMENT_KEYS = {\r\n all: [\"inventory\", \"movements\"] as const,\r\n list: (params?: Record<string, unknown>) => [...MOVEMENT_KEYS.all, \"list\", params] as const,\r\n lowStock: (params?: Record<string, unknown>) => [...MOVEMENT_KEYS.all, \"low-stock\", params] as const,\r\n};\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\ninterface QueryOptions {\r\n enabled?: boolean;\r\n staleTime?: number;\r\n}\r\n\r\ninterface PaginationData {\r\n page: number;\r\n limit: number;\r\n total: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n}\r\n\r\nexport interface UseMovementsReturn {\r\n movements: StockMovement[];\r\n pagination: PaginationData | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\n// ============================================\r\n// Movement Hooks\r\n// ============================================\r\n\r\n/**\r\n * Fetch stock movements (audit trail)\r\n *\r\n * @param token - Auth token\r\n * @param params - Query parameters (productId, branchId, type, dates, etc.)\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function MovementHistory({ productId }) {\r\n * const { movements, isLoading } = useMovements(token, {\r\n * productId,\r\n * limit: 50,\r\n * });\r\n *\r\n * return <Timeline events={movements} />;\r\n * }\r\n * ```\r\n */\r\nexport function useMovements(\r\n token: string,\r\n params?: MovementQueryParams,\r\n options: QueryOptions = {}\r\n): UseMovementsReturn {\r\n const { data, isLoading, isFetching, error, refetch } = useQuery<PaginatedResponse<StockMovement>>({\r\n queryKey: MOVEMENT_KEYS.list(params as Record<string, unknown>),\r\n queryFn: () => movementApi.list({ token, params }),\r\n enabled: !!token && options.enabled !== false,\r\n staleTime: options.staleTime ?? 15 * 1000, // 15 seconds\r\n });\r\n\r\n const movements = useMemo(() => {\r\n if (!data) return [];\r\n // Handle both { docs: [...] } and { data: [...] } response formats\r\n return (data as { docs?: StockMovement[] }).docs ||\r\n (data as unknown as { data?: StockMovement[] }).data ||\r\n [];\r\n }, [data]);\r\n\r\n const pagination = useMemo(() => {\r\n if (!data) return null;\r\n const d = data as { page?: number; limit?: number; total?: number; pages?: number; hasNext?: boolean; hasPrev?: boolean };\r\n if (d.page === undefined) return null;\r\n return {\r\n page: d.page || 1,\r\n limit: d.limit || 20,\r\n total: d.total || 0,\r\n pages: d.pages || 1,\r\n hasNext: d.hasNext || false,\r\n hasPrev: d.hasPrev || false,\r\n };\r\n }, [data]);\r\n\r\n return {\r\n movements,\r\n pagination,\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Fetch low stock items\r\n *\r\n * @param token - Auth token\r\n * @param params - Query parameters (branchId, threshold)\r\n * @param options - Query options\r\n */\r\nexport function useLowStock(\r\n token: string,\r\n params?: { branchId?: string; threshold?: number },\r\n options: QueryOptions = {}\r\n) {\r\n return useQuery<ApiResponse<LowStockItem[]>>({\r\n queryKey: MOVEMENT_KEYS.lowStock(params),\r\n queryFn: () => movementApi.lowStock({ token, params }),\r\n enabled: !!token && options.enabled !== false,\r\n staleTime: options.staleTime ?? 60 * 1000, // 1 minute\r\n });\r\n}\r\n\r\n// ============================================\r\n// Invalidation Helpers\r\n// ============================================\r\n\r\n/**\r\n * Get all keys that should be invalidated when stock quantities change.\r\n * Use for: receive transfer, dispatch, adjustments, purchases.\r\n */\r\nexport function getStockChangeInvalidationKeys() {\r\n return [\r\n [\"inventory\"] as const, // All inventory product queries\r\n MOVEMENT_KEYS.all, // Audit trail (new movements created)\r\n ];\r\n}\r\n","\"use client\";\n\n/**\n * Stock Request Hooks\n *\n * React hooks for stock request operations.\n */\n\nimport { useMemo } from \"react\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { requestApi } from \"../api/request\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport type { StockRequest, CreateStockRequestPayload } from \"../types\";\nimport type { PaginatedResponse, ApiResponse } from \"../../core/api-factory\";\nimport { TRANSFER_KEYS } from \"./transfer\";\n\n// ============================================\n// Query Keys\n// ============================================\n\nexport const REQUEST_KEYS = {\n all: [\"inventory\", \"requests\"] as const,\n list: (params?: Record<string, unknown>) => [...REQUEST_KEYS.all, \"list\", params] as const,\n pending: () => [...REQUEST_KEYS.all, \"pending\"] as const,\n detail: (id: string) => [...REQUEST_KEYS.all, \"detail\", id] as const,\n};\n\n// ============================================\n// Types\n// ============================================\n\ninterface QueryOptions {\n enabled?: boolean;\n staleTime?: number;\n}\n\nexport interface UseStockRequestsReturn {\n requests: StockRequest[];\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport interface UseStockRequestActionsReturn {\n create: (data: CreateStockRequestPayload) => Promise<StockRequest>;\n isCreating: boolean;\n approve: (params: {\n id: string;\n items?: { productId: string; variantSku?: string; quantityApproved: number }[];\n reviewNotes?: string;\n }) => Promise<StockRequest>;\n isApproving: boolean;\n reject: (params: { id: string; reason: string }) => Promise<StockRequest>;\n isRejecting: boolean;\n fulfill: (params: {\n id: string;\n remarks?: string;\n items?: { productId: string; variantSku?: string; quantity: number; cartonNumber?: string }[];\n transport?: { vehicleNumber?: string; driverName?: string; driverPhone?: string };\n }) => Promise<StockRequest>;\n isFulfilling: boolean;\n cancel: (params: { id: string; reason?: string }) => Promise<StockRequest>;\n isCancelling: boolean;\n isLoading: boolean;\n}\n\n// ============================================\n// Stock Request Hooks\n// ============================================\n\n/**\n * Fetch stock requests\n *\n * @param token - Auth token\n * @param params - Query parameters (status, branchId, etc.)\n * @param options - Query options\n */\nexport function useStockRequests(\n token: string,\n params?: Record<string, unknown>,\n options: QueryOptions = {}\n): UseStockRequestsReturn {\n const { data, isLoading, isFetching, error, refetch } = useQuery<PaginatedResponse<StockRequest>>({\n queryKey: REQUEST_KEYS.list(params),\n queryFn: () => requestApi.list({ token, params }),\n enabled: !!token && options.enabled !== false,\n staleTime: options.staleTime ?? 15 * 1000,\n });\n\n const requests = useMemo(() => {\n if (!data) return [];\n return (data as { docs?: StockRequest[] }).docs ||\n (data as unknown as { data?: StockRequest[] }).data ||\n [];\n }, [data]);\n\n return {\n requests,\n isLoading,\n isFetching,\n error: error as Error | null,\n refetch,\n };\n}\n\n/**\n * Fetch pending stock requests\n *\n * @param token - Auth token\n * @param options - Query options\n */\nexport function usePendingStockRequests(\n token: string,\n options: QueryOptions = {}\n): UseStockRequestsReturn {\n const { data, isLoading, isFetching, error, refetch } = useQuery<PaginatedResponse<StockRequest>>({\n queryKey: REQUEST_KEYS.pending(),\n queryFn: () => requestApi.listPending({ token }),\n enabled: !!token && options.enabled !== false,\n staleTime: options.staleTime ?? 15 * 1000,\n });\n\n const requests = useMemo(() => {\n if (!data) return [];\n return (data as { docs?: StockRequest[] }).docs ||\n (data as unknown as { data?: StockRequest[] }).data ||\n [];\n }, [data]);\n\n return {\n requests,\n isLoading,\n isFetching,\n error: error as Error | null,\n refetch,\n };\n}\n\n/**\n * Stock request detail\n *\n * @param token - Auth token\n * @param id - Request ID\n * @param options - Query options\n */\nexport function useStockRequestDetail(\n token: string,\n id: string | null,\n options: QueryOptions = {}\n) {\n return useQuery<ApiResponse<StockRequest>>({\n queryKey: REQUEST_KEYS.detail(id || \"\"),\n queryFn: () => requestApi.getById({ token, id: id! }),\n enabled: !!token && !!id && options.enabled !== false,\n staleTime: options.staleTime ?? 30 * 1000,\n });\n}\n\n/**\n * Stock request actions (create, approve, reject, fulfill, cancel)\n *\n * @param token - Auth token\n *\n * @example\n * ```tsx\n * function RequestActions({ request }) {\n * const { approve, reject, fulfill, isLoading } = useStockRequestActions(token);\n *\n * return (\n * <>\n * <Button onClick={() => approve({ id: request._id })}>Approve</Button>\n * <Button onClick={() => reject({ id: request._id, reason: 'Out of stock' })}>Reject</Button>\n * </>\n * );\n * }\n * ```\n */\nexport function useStockRequestActions(token: string): UseStockRequestActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const createMutation = useMutation({\n mutationFn: (data: CreateStockRequestPayload) => requestApi.create({ token, data }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: REQUEST_KEYS.all });\n toast.success(\"Stock request created\");\n },\n onError: (err: Error) => toast.error(err.message || \"Failed to create request\"),\n });\n\n const approveMutation = useMutation({\n mutationFn: ({\n id,\n items,\n reviewNotes,\n }: {\n id: string;\n items?: { productId: string; variantSku?: string; quantityApproved: number }[];\n reviewNotes?: string;\n }) => requestApi.approve({ token, id, items, reviewNotes }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: REQUEST_KEYS.all });\n toast.success(\"Request approved\");\n },\n onError: (err: Error) => toast.error(err.message || \"Failed to approve request\"),\n });\n\n const rejectMutation = useMutation({\n mutationFn: ({ id, reason }: { id: string; reason: string }) =>\n requestApi.reject({ token, id, reason }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: REQUEST_KEYS.all });\n toast.success(\"Request rejected\");\n },\n onError: (err: Error) => toast.error(err.message || \"Failed to reject request\"),\n });\n\n const fulfillMutation = useMutation({\n mutationFn: ({\n id,\n remarks,\n items,\n transport,\n }: {\n id: string;\n remarks?: string;\n items?: { productId: string; variantSku?: string; quantity: number; cartonNumber?: string }[];\n transport?: { vehicleNumber?: string; driverName?: string; driverPhone?: string };\n }) =>\n requestApi.fulfill({\n token,\n id,\n remarks,\n items,\n transport,\n documentType: \"delivery_challan\",\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: REQUEST_KEYS.all });\n queryClient.invalidateQueries({ queryKey: TRANSFER_KEYS.all });\n toast.success(\"Request fulfilled (transfer created)\");\n },\n onError: (err: Error) => toast.error(err.message || \"Failed to fulfill request\"),\n });\n\n const cancelMutation = useMutation({\n mutationFn: ({ id, reason }: { id: string; reason?: string }) =>\n requestApi.cancel({ token, id, reason }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: REQUEST_KEYS.all });\n toast.success(\"Request cancelled\");\n },\n onError: (err: Error) => toast.error(err.message || \"Failed to cancel request\"),\n });\n\n return {\n create: async (data) => {\n const result = await createMutation.mutateAsync(data);\n return result.data as StockRequest;\n },\n isCreating: createMutation.isPending,\n approve: async (params) => {\n const result = await approveMutation.mutateAsync(params);\n return result.data as StockRequest;\n },\n isApproving: approveMutation.isPending,\n reject: async (params) => {\n const result = await rejectMutation.mutateAsync(params);\n return result.data as StockRequest;\n },\n isRejecting: rejectMutation.isPending,\n fulfill: async (params) => {\n const result = await fulfillMutation.mutateAsync(params);\n return result.data as StockRequest;\n },\n isFulfilling: fulfillMutation.isPending,\n cancel: async (params) => {\n const result = await cancelMutation.mutateAsync(params);\n return result.data as StockRequest;\n },\n isCancelling: cancelMutation.isPending,\n isLoading:\n createMutation.isPending ||\n approveMutation.isPending ||\n rejectMutation.isPending ||\n fulfillMutation.isPending ||\n cancelMutation.isPending,\n };\n}\n\n// ============================================\n// Invalidation Helpers\n// ============================================\n\n/**\n * Get all keys that should be invalidated when a transfer state changes.\n * Use for: approve, dispatch, receive, cancel.\n */\nexport function getTransferStateInvalidationKeys() {\n return [\n TRANSFER_KEYS.all, // Transfer list and details\n REQUEST_KEYS.all, // If transfer was from request fulfillment\n ];\n}\n","\"use client\";\n\n/**\n * Supplier Hooks\n *\n * React hooks for supplier CRUD operations using the factory pattern.\n */\n\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { supplierApi } from \"../api/supplier\";\nimport type { Supplier, SupplierCreatePayload, SupplierUpdatePayload } from \"../types\";\n\n// Type helper for API compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyApi = CrudApi<any, any, any>;\n\n/**\n * Supplier hooks using createCrudHooks factory\n *\n * Provides:\n * - useSuppliers: List suppliers with filtering/pagination\n * - useSupplierDetail: Get single supplier\n * - useSupplierActions: Create, update, delete mutations\n * - useSupplierNavigation: Navigation between suppliers\n */\nexport const supplierHooks = createCrudHooks<Supplier, SupplierCreatePayload, SupplierUpdatePayload>({\n api: supplierApi as AnyApi,\n entityKey: \"suppliers\",\n singular: \"Supplier\",\n plural: \"Suppliers\",\n});\n\nexport const {\n KEYS: SUPPLIER_KEYS,\n useList: useSuppliers,\n useDetail: useSupplierDetail,\n useActions: useSupplierActions,\n useNavigation: useSupplierNavigation,\n} = supplierHooks;\n"]}
@@ -0,0 +1,126 @@
1
+ import { handleApiRequest } from './chunk-IHCBBLLW.js';
2
+ import { useQuery } from '@tanstack/react-query';
3
+
4
+ // src/finance/api/finance.ts
5
+ var FinanceApi = class {
6
+ constructor() {
7
+ this.baseUrl = "/api/v1/finance";
8
+ }
9
+ /**
10
+ * Get finance statements (export)
11
+ * GET /finance/statements
12
+ *
13
+ * Query params:
14
+ * - startDate, endDate (ISO datetime) - required
15
+ * - branchId (optional)
16
+ * - source = web|pos|api (optional)
17
+ * - status (optional)
18
+ * - format = csv|json (default: csv)
19
+ * - page, limit (for JSON pagination)
20
+ */
21
+ async getStatements({
22
+ token,
23
+ params,
24
+ options = {}
25
+ }) {
26
+ if (!token) {
27
+ throw new Error("Authentication required");
28
+ }
29
+ const queryParams = new URLSearchParams();
30
+ if (params.startDate) queryParams.append("startDate", params.startDate);
31
+ if (params.endDate) queryParams.append("endDate", params.endDate);
32
+ if (params.branchId) queryParams.append("branchId", params.branchId);
33
+ if (params.source) queryParams.append("source", params.source);
34
+ if (params.status) queryParams.append("status", params.status);
35
+ if (params.format) queryParams.append("format", params.format);
36
+ if (params.page) queryParams.append("page", params.page.toString());
37
+ if (params.limit) queryParams.append("limit", params.limit.toString());
38
+ const url = `${this.baseUrl}/statements${queryParams.toString() ? `?${queryParams}` : ""}`;
39
+ return handleApiRequest("GET", url, {
40
+ token,
41
+ ...options
42
+ });
43
+ }
44
+ /**
45
+ * Get finance summary (dashboard)
46
+ * GET /finance/summary
47
+ *
48
+ * Query params:
49
+ * - startDate, endDate (ISO datetime) - required
50
+ * - branchId (optional)
51
+ * - source = web|pos|api (optional)
52
+ * - status (optional)
53
+ *
54
+ * Response:
55
+ * - data.totals: overall income/expense/net/count
56
+ * - data.byMethod: breakdown by payment method
57
+ * - data.byDay: per-day breakdown by branch
58
+ */
59
+ async getSummary({
60
+ token,
61
+ params,
62
+ options = {}
63
+ }) {
64
+ if (!token) {
65
+ throw new Error("Authentication required");
66
+ }
67
+ const queryParams = new URLSearchParams();
68
+ if (params.startDate) queryParams.append("startDate", params.startDate);
69
+ if (params.endDate) queryParams.append("endDate", params.endDate);
70
+ if (params.branchId) queryParams.append("branchId", params.branchId);
71
+ if (params.source) queryParams.append("source", params.source);
72
+ if (params.status) queryParams.append("status", params.status);
73
+ const url = `${this.baseUrl}/summary${queryParams.toString() ? `?${queryParams}` : ""}`;
74
+ return handleApiRequest("GET", url, {
75
+ token,
76
+ ...options
77
+ });
78
+ }
79
+ };
80
+ var financeApi = new FinanceApi();
81
+ var FINANCE_KEYS = {
82
+ all: ["finance"],
83
+ statements: () => [...FINANCE_KEYS.all, "statements"],
84
+ statementList: (params) => [...FINANCE_KEYS.statements(), params],
85
+ summary: () => [...FINANCE_KEYS.all, "summary"],
86
+ summaryData: (params) => [...FINANCE_KEYS.summary(), params]
87
+ };
88
+ function useFinanceStatements(token, params, options = {}) {
89
+ const { data, isLoading, isFetching, error, refetch } = useQuery({
90
+ queryKey: FINANCE_KEYS.statementList(params),
91
+ queryFn: () => financeApi.getStatements({ token, params }),
92
+ enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,
93
+ staleTime: options.staleTime ?? 2 * 60 * 1e3
94
+ // 2 minutes
95
+ });
96
+ return {
97
+ statements: data?.data || [],
98
+ isLoading,
99
+ isFetching,
100
+ error,
101
+ refetch
102
+ };
103
+ }
104
+ function useFinanceSummary(token, params, options = {}) {
105
+ const { data, isLoading, isFetching, error, refetch } = useQuery({
106
+ queryKey: FINANCE_KEYS.summaryData(params),
107
+ queryFn: () => financeApi.getSummary({ token, params }),
108
+ enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,
109
+ staleTime: options.staleTime ?? 2 * 60 * 1e3
110
+ // 2 minutes
111
+ });
112
+ return {
113
+ summary: data?.data || null,
114
+ totals: data?.data?.totals || null,
115
+ byMethod: data?.data?.byMethod || [],
116
+ byDay: data?.data?.byDay || [],
117
+ isLoading,
118
+ isFetching,
119
+ error,
120
+ refetch
121
+ };
122
+ }
123
+
124
+ export { FINANCE_KEYS, FinanceApi, financeApi, useFinanceStatements, useFinanceSummary };
125
+ //# sourceMappingURL=chunk-N43VE355.js.map
126
+ //# sourceMappingURL=chunk-N43VE355.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/finance/api/finance.ts","../src/finance/hooks/finance.ts"],"names":[],"mappings":";;;;AAsBA,IAAM,aAAN,MAAiB;AAAA,EAGf,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,iBAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,aAAA,CAAc;AAAA,IAClB,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAU;AAAC,GACb,EAI6C;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AAExC,IAAA,IAAI,OAAO,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,OAAO,SAAS,CAAA;AACtE,IAAA,IAAI,OAAO,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAChE,IAAA,IAAI,OAAO,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,OAAO,QAAQ,CAAA;AACnE,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,MAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAClE,IAAA,IAAI,MAAA,CAAO,OAAO,WAAA,CAAY,MAAA,CAAO,SAAS,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAErE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,EAAc,WAAA,CAAY,QAAA,EAAS,GAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAExF,IAAA,OAAO,gBAAA,CAAiB,OAAO,GAAA,EAAK;AAAA,MAClC,KAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,UAAA,CAAW;AAAA,IACf,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAU;AAAC,GACb,EAIyC;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AAExC,IAAA,IAAI,OAAO,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,OAAO,SAAS,CAAA;AACtE,IAAA,IAAI,OAAO,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAChE,IAAA,IAAI,OAAO,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,OAAO,QAAQ,CAAA;AACnE,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAE7D,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,QAAA,EAAW,WAAA,CAAY,QAAA,EAAS,GAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAErF,IAAA,OAAO,gBAAA,CAAiB,OAAO,GAAA,EAAK;AAAA,MAClC,KAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAEO,IAAM,UAAA,GAAa,IAAI,UAAA;ACtGvB,IAAM,YAAA,GAAe;AAAA,EAC1B,GAAA,EAAK,CAAC,SAAS,CAAA;AAAA,EACf,YAAY,MAAM,CAAC,GAAG,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,EACpD,aAAA,EAAe,CAAC,MAAA,KACd,CAAC,GAAG,YAAA,CAAa,UAAA,IAAc,MAAM,CAAA;AAAA,EACvC,SAAS,MAAM,CAAC,GAAG,YAAA,CAAa,KAAK,SAAS,CAAA;AAAA,EAC9C,WAAA,EAAa,CAAC,MAAA,KACZ,CAAC,GAAG,YAAA,CAAa,OAAA,IAAW,MAAM;AACtC;AAsDO,SAAS,oBAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,GAAwB,EAAC,EACG;AAC5B,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,KAAA,EAAO,OAAA,KAAY,QAAA,CAA0C;AAAA,IAChG,QAAA,EAAU,YAAA,CAAa,aAAA,CAAc,MAAM,CAAA;AAAA,IAC3C,SAAS,MAAM,UAAA,CAAW,cAAc,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,IACzD,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,CAAC,CAAC,MAAA,CAAO,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO,OAAA,IAAW,QAAQ,OAAA,KAAY,KAAA;AAAA,IAClF,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,CAAA,GAAI,EAAA,GAAK;AAAA;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,IAAA,EAAM,IAAA,IAAQ,EAAC;AAAA,IAC3B,SAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AA2BO,SAAS,iBAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,GAAwB,EAAC,EACA;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,KAAA,EAAO,OAAA,KAAY,QAAA,CAAsC;AAAA,IAC5F,QAAA,EAAU,YAAA,CAAa,WAAA,CAAY,MAAM,CAAA;AAAA,IACzC,SAAS,MAAM,UAAA,CAAW,WAAW,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,IACtD,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,CAAC,CAAC,MAAA,CAAO,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO,OAAA,IAAW,QAAQ,OAAA,KAAY,KAAA;AAAA,IAClF,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,CAAA,GAAI,EAAA,GAAK;AAAA;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAM,IAAA,IAAQ,IAAA;AAAA,IACvB,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,MAAA,IAAU,IAAA;AAAA,IAC9B,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,QAAA,IAAY,EAAC;AAAA,IACnC,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAC7B,SAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-N43VE355.js","sourcesContent":["// finance/api/finance.ts\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type { ApiResponse, RequestOptions } from \"../../core/api-factory\";\r\nimport type {\r\n FinanceStatement,\r\n FinanceStatementParams,\r\n FinanceSummary,\r\n FinanceSummaryParams,\r\n} from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\n/**\r\n * Finance API - Statements and summaries for backoffice\r\n *\r\n * Endpoints:\r\n * - getStatements({ token, params }) - Export statements (CSV/JSON)\r\n * - getSummary({ token, params }) - Get summary with breakdowns\r\n *\r\n * Roles:\r\n * - admin, superadmin, finance-admin, finance-manager\r\n */\r\nclass FinanceApi {\r\n private baseUrl: string;\r\n\r\n constructor() {\r\n this.baseUrl = \"/api/v1/finance\";\r\n }\r\n\r\n /**\r\n * Get finance statements (export)\r\n * GET /finance/statements\r\n *\r\n * Query params:\r\n * - startDate, endDate (ISO datetime) - required\r\n * - branchId (optional)\r\n * - source = web|pos|api (optional)\r\n * - status (optional)\r\n * - format = csv|json (default: csv)\r\n * - page, limit (for JSON pagination)\r\n */\r\n async getStatements({\r\n token,\r\n params,\r\n options = {},\r\n }: {\r\n token: string;\r\n params: FinanceStatementParams;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<FinanceStatement[]>> {\r\n if (!token) {\r\n throw new Error(\"Authentication required\");\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n\r\n if (params.startDate) queryParams.append(\"startDate\", params.startDate);\r\n if (params.endDate) queryParams.append(\"endDate\", params.endDate);\r\n if (params.branchId) queryParams.append(\"branchId\", params.branchId);\r\n if (params.source) queryParams.append(\"source\", params.source);\r\n if (params.status) queryParams.append(\"status\", params.status);\r\n if (params.format) queryParams.append(\"format\", params.format);\r\n if (params.page) queryParams.append(\"page\", params.page.toString());\r\n if (params.limit) queryParams.append(\"limit\", params.limit.toString());\r\n\r\n const url = `${this.baseUrl}/statements${queryParams.toString() ? `?${queryParams}` : \"\"}`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get finance summary (dashboard)\r\n * GET /finance/summary\r\n *\r\n * Query params:\r\n * - startDate, endDate (ISO datetime) - required\r\n * - branchId (optional)\r\n * - source = web|pos|api (optional)\r\n * - status (optional)\r\n *\r\n * Response:\r\n * - data.totals: overall income/expense/net/count\r\n * - data.byMethod: breakdown by payment method\r\n * - data.byDay: per-day breakdown by branch\r\n */\r\n async getSummary({\r\n token,\r\n params,\r\n options = {},\r\n }: {\r\n token: string;\r\n params: FinanceSummaryParams;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<FinanceSummary>> {\r\n if (!token) {\r\n throw new Error(\"Authentication required\");\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n\r\n if (params.startDate) queryParams.append(\"startDate\", params.startDate);\r\n if (params.endDate) queryParams.append(\"endDate\", params.endDate);\r\n if (params.branchId) queryParams.append(\"branchId\", params.branchId);\r\n if (params.source) queryParams.append(\"source\", params.source);\r\n if (params.status) queryParams.append(\"status\", params.status);\r\n\r\n const url = `${this.baseUrl}/summary${queryParams.toString() ? `?${queryParams}` : \"\"}`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\nexport const financeApi = new FinanceApi();\r\nexport { FinanceApi };\r\n","\"use client\";\r\n\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { financeApi } from \"../api\";\r\nimport type {\r\n FinanceStatement,\r\n FinanceStatementParams,\r\n FinanceSummary,\r\n FinanceSummaryParams,\r\n} from \"../types\";\r\nimport type { ApiResponse } from \"../../core/api-factory\";\r\n\r\n// ============================================\r\n// Query Keys\r\n// ============================================\r\n\r\nexport const FINANCE_KEYS = {\r\n all: [\"finance\"] as const,\r\n statements: () => [...FINANCE_KEYS.all, \"statements\"] as const,\r\n statementList: (params: FinanceStatementParams) =>\r\n [...FINANCE_KEYS.statements(), params] as const,\r\n summary: () => [...FINANCE_KEYS.all, \"summary\"] as const,\r\n summaryData: (params: FinanceSummaryParams) =>\r\n [...FINANCE_KEYS.summary(), params] as const,\r\n};\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\ninterface QueryOptions {\r\n enabled?: boolean;\r\n staleTime?: number;\r\n}\r\n\r\nexport interface UseFinanceStatementsReturn {\r\n statements: FinanceStatement[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\nexport interface UseFinanceSummaryReturn {\r\n summary: FinanceSummary | null;\r\n totals: FinanceSummary[\"totals\"] | null;\r\n byMethod: FinanceSummary[\"byMethod\"];\r\n byDay: FinanceSummary[\"byDay\"];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\n// ============================================\r\n// Hooks\r\n// ============================================\r\n\r\n/**\r\n * Fetch finance statements for a date range\r\n *\r\n * @param token - Auth token (admin/finance roles)\r\n * @param params - Query parameters (startDate, endDate required)\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function StatementTable() {\r\n * const { statements, isLoading } = useFinanceStatements(token, {\r\n * startDate: '2024-01-01T00:00:00Z',\r\n * endDate: '2024-01-31T23:59:59Z',\r\n * branchId: selectedBranch,\r\n * });\r\n *\r\n * return <DataTable data={statements} loading={isLoading} />;\r\n * }\r\n * ```\r\n */\r\nexport function useFinanceStatements(\r\n token: string,\r\n params: FinanceStatementParams,\r\n options: QueryOptions = {}\r\n): UseFinanceStatementsReturn {\r\n const { data, isLoading, isFetching, error, refetch } = useQuery<ApiResponse<FinanceStatement[]>>({\r\n queryKey: FINANCE_KEYS.statementList(params),\r\n queryFn: () => financeApi.getStatements({ token, params }),\r\n enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,\r\n staleTime: options.staleTime ?? 2 * 60 * 1000, // 2 minutes\r\n });\r\n\r\n return {\r\n statements: data?.data || [],\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Fetch finance summary with breakdowns\r\n *\r\n * @param token - Auth token (admin/finance roles)\r\n * @param params - Query parameters (startDate, endDate required)\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function FinanceDashboard() {\r\n * const { totals, byMethod, byDay, isLoading } = useFinanceSummary(token, {\r\n * startDate: '2024-01-01T00:00:00Z',\r\n * endDate: '2024-01-31T23:59:59Z',\r\n * });\r\n *\r\n * return (\r\n * <>\r\n * <SummaryCards totals={totals} />\r\n * <MethodBreakdown data={byMethod} />\r\n * <DailyChart data={byDay} />\r\n * </>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useFinanceSummary(\r\n token: string,\r\n params: FinanceSummaryParams,\r\n options: QueryOptions = {}\r\n): UseFinanceSummaryReturn {\r\n const { data, isLoading, isFetching, error, refetch } = useQuery<ApiResponse<FinanceSummary>>({\r\n queryKey: FINANCE_KEYS.summaryData(params),\r\n queryFn: () => financeApi.getSummary({ token, params }),\r\n enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,\r\n staleTime: options.staleTime ?? 2 * 60 * 1000, // 2 minutes\r\n });\r\n\r\n return {\r\n summary: data?.data || null,\r\n totals: data?.data?.totals || null,\r\n byMethod: data?.data?.byMethod || [],\r\n byDay: data?.data?.byDay || [],\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-PYYLHUV6.js.map
3
+ //# sourceMappingURL=chunk-PYYLHUV6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-PYYLHUV6.js"}
@@ -0,0 +1,261 @@
1
+ import { createQueryString, handleApiRequest } from './chunk-IHCBBLLW.js';
2
+
3
+ // src/core/api-factory.ts
4
+ var BaseApi = class {
5
+ constructor(entity, config = {}) {
6
+ this.entity = entity;
7
+ this.config = {
8
+ basePath: config.basePath ?? "/api/v1",
9
+ defaultParams: {
10
+ limit: 10,
11
+ page: 1,
12
+ ...config.defaultParams || {}
13
+ },
14
+ cache: config.cache ?? "no-store",
15
+ headers: {
16
+ "Content-Type": "application/json",
17
+ ...config.headers || {}
18
+ }
19
+ };
20
+ this.baseUrl = `${this.config.basePath}/${this.entity}`;
21
+ }
22
+ /**
23
+ * Creates query string from parameters
24
+ * Delegates to shared utility from api-handler.ts
25
+ */
26
+ createQueryString(params = {}) {
27
+ return createQueryString(params);
28
+ }
29
+ /**
30
+ * Prepares parameters for API request
31
+ * Handles pagination, sorting, and filters
32
+ * Note: Critical security filters (organizationId, ownerId) are ALWAYS sent, even if null
33
+ */
34
+ prepareParams(params = {}) {
35
+ const result = {};
36
+ const CRITICAL_FILTERS = ["organizationId", "ownerId"];
37
+ Object.entries(params).forEach(([key, value]) => {
38
+ if (CRITICAL_FILTERS.includes(key)) {
39
+ result[key] = value || null;
40
+ return;
41
+ }
42
+ if (value !== void 0 && value !== "") {
43
+ if (["page", "limit"].includes(key)) {
44
+ result[key] = parseInt(String(value)) || (key === "page" ? 1 : 10);
45
+ } else if (Array.isArray(value)) {
46
+ if (value.length > 1) {
47
+ result[`${key}[in]`] = value.join(",");
48
+ } else if (value.length === 1) {
49
+ result[key] = value[0];
50
+ }
51
+ } else {
52
+ result[key] = value;
53
+ }
54
+ }
55
+ });
56
+ return result;
57
+ }
58
+ /**
59
+ * Get all records with pagination and filtering
60
+ * Returns offset or keyset pagination based on params
61
+ */
62
+ async getAll({
63
+ token = null,
64
+ organizationId = null,
65
+ params = {},
66
+ options = {}
67
+ } = {}) {
68
+ const processedParams = this.prepareParams(params);
69
+ const queryString = this.createQueryString(processedParams);
70
+ const requestOptions = {
71
+ cache: this.config.cache,
72
+ ...options
73
+ };
74
+ if (token) requestOptions.token = token;
75
+ if (organizationId) requestOptions.organizationId = organizationId;
76
+ return handleApiRequest(
77
+ "GET",
78
+ `${this.baseUrl}?${queryString}`,
79
+ requestOptions
80
+ );
81
+ }
82
+ /**
83
+ * Get a single record by ID
84
+ */
85
+ async getById({
86
+ token = null,
87
+ organizationId = null,
88
+ id,
89
+ params = {},
90
+ options = {}
91
+ }) {
92
+ if (!id) throw new Error("ID is required");
93
+ const queryString = this.createQueryString(params);
94
+ const url = queryString ? `${this.baseUrl}/${id}?${queryString}` : `${this.baseUrl}/${id}`;
95
+ const requestOptions = {
96
+ cache: this.config.cache,
97
+ ...options
98
+ };
99
+ if (token) requestOptions.token = token;
100
+ if (organizationId) requestOptions.organizationId = organizationId;
101
+ return handleApiRequest("GET", url, requestOptions);
102
+ }
103
+ /**
104
+ * Create a new record
105
+ */
106
+ async create({
107
+ token,
108
+ organizationId = null,
109
+ data,
110
+ options = {}
111
+ }) {
112
+ return handleApiRequest("POST", this.baseUrl, {
113
+ token,
114
+ organizationId,
115
+ body: data,
116
+ ...options
117
+ });
118
+ }
119
+ /**
120
+ * Update an existing record
121
+ */
122
+ async update({
123
+ token,
124
+ organizationId = null,
125
+ id,
126
+ data,
127
+ options = {}
128
+ }) {
129
+ if (!id) throw new Error("ID is required");
130
+ return handleApiRequest("PATCH", `${this.baseUrl}/${id}`, {
131
+ token,
132
+ organizationId,
133
+ body: data,
134
+ ...options
135
+ });
136
+ }
137
+ /**
138
+ * Delete a record
139
+ */
140
+ async delete({
141
+ token,
142
+ organizationId = null,
143
+ id,
144
+ options = {}
145
+ }) {
146
+ if (!id) throw new Error("ID is required");
147
+ return handleApiRequest("DELETE", `${this.baseUrl}/${id}`, {
148
+ token,
149
+ organizationId,
150
+ ...options
151
+ });
152
+ }
153
+ /**
154
+ * Search with custom parameters
155
+ * @example
156
+ * search({ searchParams: { 'brand[contains]': 'nike' } })
157
+ * search({ searchParams: { upc: '123456789' } })
158
+ */
159
+ async search({
160
+ token = null,
161
+ organizationId = null,
162
+ searchParams = {},
163
+ params = {},
164
+ options = {}
165
+ } = {}) {
166
+ const queryParams = { ...params, ...searchParams };
167
+ const processedParams = this.prepareParams(queryParams);
168
+ const queryString = this.createQueryString(processedParams);
169
+ const requestOptions = {
170
+ cache: this.config.cache,
171
+ ...options
172
+ };
173
+ if (token) requestOptions.token = token;
174
+ if (organizationId) requestOptions.organizationId = organizationId;
175
+ return handleApiRequest(
176
+ "GET",
177
+ `${this.baseUrl}?${queryString}`,
178
+ requestOptions
179
+ );
180
+ }
181
+ /**
182
+ * Find records by field with optional operator
183
+ * @example
184
+ * findBy({ field: 'brand', value: 'nike', operator: 'contains' })
185
+ * findBy({ field: 'status', value: ['active', 'pending'], operator: 'in' })
186
+ */
187
+ async findBy({
188
+ token = null,
189
+ organizationId = null,
190
+ field,
191
+ value,
192
+ operator,
193
+ params = {},
194
+ options = {}
195
+ }) {
196
+ if (!field || value === void 0) {
197
+ throw new Error("Field and value are required");
198
+ }
199
+ const queryParams = { ...params };
200
+ if (operator) {
201
+ queryParams[`${field}[${operator}]`] = Array.isArray(value) ? value.join(",") : value;
202
+ } else {
203
+ queryParams[field] = value;
204
+ }
205
+ const processedParams = this.prepareParams(queryParams);
206
+ const queryString = this.createQueryString(processedParams);
207
+ const requestOptions = {
208
+ cache: this.config.cache,
209
+ ...options
210
+ };
211
+ if (token) requestOptions.token = token;
212
+ if (organizationId) requestOptions.organizationId = organizationId;
213
+ return handleApiRequest(
214
+ "GET",
215
+ `${this.baseUrl}?${queryString}`,
216
+ requestOptions
217
+ );
218
+ }
219
+ /**
220
+ * Make a custom API request to a sub-endpoint
221
+ * @example
222
+ * request('POST', `${this.baseUrl}/${id}/action`, { token, data: { ... } })
223
+ */
224
+ async request(method, endpoint, {
225
+ token,
226
+ organizationId = null,
227
+ data,
228
+ params,
229
+ options = {}
230
+ } = {}) {
231
+ let url = endpoint;
232
+ if (params) {
233
+ const processedParams = this.prepareParams(params);
234
+ const queryString = this.createQueryString(processedParams);
235
+ url = `${endpoint}?${queryString}`;
236
+ }
237
+ return handleApiRequest(method, url, {
238
+ token,
239
+ organizationId,
240
+ body: data,
241
+ cache: this.config.cache,
242
+ ...options
243
+ });
244
+ }
245
+ };
246
+ function createCrudApi(entity, config = {}) {
247
+ return new BaseApi(entity, config);
248
+ }
249
+ function isOffsetPagination(response) {
250
+ return response.method === "offset";
251
+ }
252
+ function isKeysetPagination(response) {
253
+ return response.method === "keyset";
254
+ }
255
+ function isAggregatePagination(response) {
256
+ return response.method === "aggregate";
257
+ }
258
+
259
+ export { BaseApi, createCrudApi, isAggregatePagination, isKeysetPagination, isOffsetPagination };
260
+ //# sourceMappingURL=chunk-QCTXAMLA.js.map
261
+ //# sourceMappingURL=chunk-QCTXAMLA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/api-factory.ts"],"names":[],"mappings":"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","file":"chunk-QCTXAMLA.js","sourcesContent":["/**\r\n * @classytic/commerce-sdk - API Factory\r\n *\r\n * Base API class that provides standardized CRUD operations.\r\n * Supports direct field queries and bracket syntax: field[operator]=value\r\n */\r\n\r\nimport { handleApiRequest, createQueryString } from \"./api-handler\";\r\n\r\n// ==================== Response Types ====================\r\n\r\n/**\r\n * Base API response wrapper\r\n * All endpoints return { success: boolean, ... }\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n success: boolean;\r\n data?: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Offset pagination response (page-based)\r\n * Used when: ?page=1&limit=10\r\n */\r\nexport interface OffsetPaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"offset\";\r\n docs: T[];\r\n page: number;\r\n limit: number;\r\n total: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n warning?: string;\r\n}\r\n\r\n/**\r\n * Keyset pagination response (cursor-based)\r\n * Used when: ?after=cursor&limit=10\r\n */\r\nexport interface KeysetPaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"keyset\";\r\n docs: T[];\r\n limit: number;\r\n hasMore: boolean;\r\n next: string | null;\r\n}\r\n\r\n/**\r\n * Aggregate pagination response\r\n * Used for complex aggregation queries\r\n */\r\nexport interface AggregatePaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"aggregate\";\r\n docs: T[];\r\n page: number;\r\n limit: number;\r\n total: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n warning?: string;\r\n}\r\n\r\n/**\r\n * Union type for all paginated responses\r\n */\r\nexport type PaginatedResponse<T = unknown> =\r\n | OffsetPaginationResponse<T>\r\n | KeysetPaginationResponse<T>\r\n | AggregatePaginationResponse<T>;\r\n\r\n/**\r\n * Delete operation response\r\n * Supports both soft delete (default) and hard delete\r\n */\r\nexport interface DeleteResponse {\r\n success: boolean;\r\n deleted: boolean;\r\n /** ID of the deleted record */\r\n id?: string;\r\n /** @deprecated Use `id` instead */\r\n productId?: string;\r\n /** True if soft delete was performed (default behavior) */\r\n soft?: boolean;\r\n /** Legacy message field */\r\n message?: string;\r\n /** Number of records deleted (for bulk operations) */\r\n count?: number;\r\n}\r\n\r\n// ==================== Request Types ====================\r\n\r\n/**\r\n * Sort direction\r\n */\r\nexport type SortDirection = 1 | -1 | \"asc\" | \"desc\";\r\n\r\n/**\r\n * Sort specification\r\n */\r\nexport type SortSpec = Record<string, SortDirection> | string;\r\n\r\n/**\r\n * Filter operators supported by query parser\r\n * Usage: ?field[operator]=value\r\n */\r\nexport type FilterOperator =\r\n | \"eq\" // Equal\r\n | \"ne\" // Not equal\r\n | \"gt\" // Greater than\r\n | \"gte\" // Greater than or equal\r\n | \"lt\" // Less than\r\n | \"lte\" // Less than or equal\r\n | \"in\" // In array\r\n | \"nin\" // Not in array\r\n | \"contains\" // String contains (case-insensitive)\r\n | \"startsWith\" // String starts with\r\n | \"endsWith\" // String ends with\r\n | \"regex\"; // Regex pattern\r\n\r\n/**\r\n * Query parameters for list/search operations\r\n */\r\nexport interface QueryParams {\r\n // Pagination\r\n page?: number;\r\n limit?: number;\r\n after?: string; // Cursor for keyset pagination\r\n\r\n // Sorting\r\n sort?: SortSpec;\r\n\r\n // Filtering - direct equality or bracket operators\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Request options\r\n */\r\nexport interface RequestOptions {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n cache?: RequestCache;\r\n revalidate?: number;\r\n tags?: string[];\r\n headerOptions?: Record<string, string>;\r\n responseType?: \"json\" | \"blob\" | \"text\";\r\n}\r\n\r\n// ==================== Base API Configuration ====================\r\n\r\nexport interface BaseApiConfig {\r\n basePath?: string;\r\n defaultParams?: {\r\n limit?: number;\r\n page?: number;\r\n [key: string]: unknown;\r\n };\r\n cache?: RequestCache;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n// ==================== Base API Class ====================\r\n\r\n/**\r\n * Base API class that provides standardized CRUD operations\r\n * Supports direct field queries and bracket syntax: field[operator]=value\r\n *\r\n * @template TDoc - Document type returned by the API\r\n * @template TCreate - Type for create payload (defaults to Partial<TDoc>)\r\n * @template TUpdate - Type for update payload (defaults to Partial<TDoc>)\r\n */\r\nexport class BaseApi<\r\n TDoc = Record<string, unknown>,\r\n TCreate = Partial<TDoc>,\r\n TUpdate = Partial<TDoc>\r\n> {\r\n readonly entity: string;\r\n readonly config: Required<BaseApiConfig>;\r\n readonly baseUrl: string;\r\n\r\n constructor(entity: string, config: BaseApiConfig = {}) {\r\n this.entity = entity;\r\n this.config = {\r\n basePath: config.basePath ?? \"/api/v1\",\r\n defaultParams: {\r\n limit: 10,\r\n page: 1,\r\n ...(config.defaultParams || {}),\r\n },\r\n cache: config.cache ?? \"no-store\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...(config.headers || {}),\r\n },\r\n };\r\n\r\n this.baseUrl = `${this.config.basePath}/${this.entity}`;\r\n }\r\n\r\n /**\r\n * Creates query string from parameters\r\n * Delegates to shared utility from api-handler.ts\r\n */\r\n createQueryString(params: Record<string, unknown> = {}): string {\r\n return createQueryString(params);\r\n }\r\n\r\n /**\r\n * Prepares parameters for API request\r\n * Handles pagination, sorting, and filters\r\n * Note: Critical security filters (organizationId, ownerId) are ALWAYS sent, even if null\r\n */\r\n prepareParams(params: QueryParams = {}): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n // Critical security filters that MUST always be sent to backend\r\n const CRITICAL_FILTERS = [\"organizationId\", \"ownerId\"];\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n // Critical filters: convert falsy values to null and always include\r\n if (CRITICAL_FILTERS.includes(key)) {\r\n // Convert empty string, undefined, or any falsy value (except 0 and false) to null\r\n result[key] = value || null;\r\n return;\r\n }\r\n\r\n // For all other params: filter out undefined and empty strings\r\n if (value !== undefined && value !== \"\") {\r\n // Handle pagination\r\n if ([\"page\", \"limit\"].includes(key)) {\r\n result[key] = parseInt(String(value)) || (key === \"page\" ? 1 : 10);\r\n }\r\n // Handle arrays with bracket syntax\r\n else if (Array.isArray(value)) {\r\n if (value.length > 1) {\r\n result[`${key}[in]`] = value.join(\",\");\r\n } else if (value.length === 1) {\r\n result[key] = value[0];\r\n }\r\n }\r\n // Pass through null and all other parameters as-is\r\n else {\r\n result[key] = value;\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get all records with pagination and filtering\r\n * Returns offset or keyset pagination based on params\r\n */\r\n async getAll({\r\n token = null,\r\n organizationId = null,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}): Promise<PaginatedResponse<TDoc>> {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Get a single record by ID\r\n */\r\n async getById({\r\n token = null,\r\n organizationId = null,\r\n id,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n params?: { select?: string; populate?: string | string[] };\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n const queryString = this.createQueryString(params);\r\n const url = queryString\r\n ? `${this.baseUrl}/${id}?${queryString}`\r\n : `${this.baseUrl}/${id}`;\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\"GET\", url, requestOptions);\r\n }\r\n\r\n /**\r\n * Create a new record\r\n */\r\n async create({\r\n token,\r\n organizationId = null,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n data: TCreate;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n return handleApiRequest(\"POST\", this.baseUrl, {\r\n token,\r\n organizationId,\r\n body: data,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Update an existing record\r\n */\r\n async update({\r\n token,\r\n organizationId = null,\r\n id,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n return handleApiRequest(\"PATCH\", `${this.baseUrl}/${id}`, {\r\n token,\r\n organizationId,\r\n body: data,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a record\r\n */\r\n async delete({\r\n token,\r\n organizationId = null,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<DeleteResponse> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n return handleApiRequest(\"DELETE\", `${this.baseUrl}/${id}`, {\r\n token,\r\n organizationId,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom parameters\r\n * @example\r\n * search({ searchParams: { 'brand[contains]': 'nike' } })\r\n * search({ searchParams: { upc: '123456789' } })\r\n */\r\n async search({\r\n token = null,\r\n organizationId = null,\r\n searchParams = {},\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n searchParams?: Record<string, unknown>;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}): Promise<PaginatedResponse<TDoc>> {\r\n const queryParams = { ...params, ...searchParams };\r\n const processedParams = this.prepareParams(queryParams);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Find records by field with optional operator\r\n * @example\r\n * findBy({ field: 'brand', value: 'nike', operator: 'contains' })\r\n * findBy({ field: 'status', value: ['active', 'pending'], operator: 'in' })\r\n */\r\n async findBy({\r\n token = null,\r\n organizationId = null,\r\n field,\r\n value,\r\n operator,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n field: string;\r\n value: unknown;\r\n operator?: FilterOperator;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<PaginatedResponse<TDoc>> {\r\n if (!field || value === undefined) {\r\n throw new Error(\"Field and value are required\");\r\n }\r\n\r\n const queryParams: QueryParams = { ...params };\r\n\r\n if (operator) {\r\n queryParams[`${field}[${operator}]`] = Array.isArray(value)\r\n ? value.join(\",\")\r\n : value;\r\n } else {\r\n queryParams[field] = value;\r\n }\r\n\r\n const processedParams = this.prepareParams(queryParams);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Make a custom API request to a sub-endpoint\r\n * @example\r\n * request('POST', `${this.baseUrl}/${id}/action`, { token, data: { ... } })\r\n */\r\n async request<TResponse = unknown>(\r\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\r\n endpoint: string,\r\n {\r\n token,\r\n organizationId = null,\r\n data,\r\n params,\r\n options = {},\r\n }: {\r\n token?: string;\r\n organizationId?: string | null;\r\n data?: unknown;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}\r\n ): Promise<TResponse> {\r\n let url = endpoint;\r\n\r\n if (params) {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n url = `${endpoint}?${queryString}`;\r\n }\r\n\r\n return handleApiRequest(method, url, {\r\n token,\r\n organizationId,\r\n body: data,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\n// ==================== Factory Function ====================\r\n\r\n/**\r\n * Factory function to create a typed BaseApi instance\r\n *\r\n * @template TDoc - Document type returned by the API\r\n * @template TCreate - Type for create payload\r\n * @template TUpdate - Type for update payload\r\n *\r\n * @example\r\n * // Simple usage\r\n * const productApi = createCrudApi('products');\r\n *\r\n * // With types\r\n * interface Product { _id: string; name: string; price: number; }\r\n * interface CreateProduct { name: string; price: number; }\r\n * const productApi = createCrudApi<Product, CreateProduct>('products');\r\n *\r\n * // With custom config\r\n * const productApi = createCrudApi('products', { basePath: '/api/v2' });\r\n */\r\nexport function createCrudApi<\r\n TDoc = Record<string, unknown>,\r\n TCreate = Partial<TDoc>,\r\n TUpdate = Partial<TDoc>\r\n>(entity: string, config: BaseApiConfig = {}): BaseApi<TDoc, TCreate, TUpdate> {\r\n return new BaseApi<TDoc, TCreate, TUpdate>(entity, config);\r\n}\r\n\r\n// ==================== Type Helpers ====================\r\n\r\n/**\r\n * Extract document type from paginated response\r\n */\r\nexport type ExtractDoc<T> = T extends PaginatedResponse<infer D> ? D : never;\r\n\r\n/**\r\n * Helper to check if response is offset pagination\r\n */\r\nexport function isOffsetPagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is OffsetPaginationResponse<T> {\r\n return response.method === \"offset\";\r\n}\r\n\r\n/**\r\n * Helper to check if response is keyset pagination\r\n */\r\nexport function isKeysetPagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is KeysetPaginationResponse<T> {\r\n return response.method === \"keyset\";\r\n}\r\n\r\n/**\r\n * Helper to check if response is aggregate pagination\r\n */\r\nexport function isAggregatePagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is AggregatePaginationResponse<T> {\r\n return response.method === \"aggregate\";\r\n}\r\n"]}