@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/sales/types/order.ts","../src/sales/api/cart.ts","../src/sales/api/order.ts","../src/sales/api/customer.ts","../src/sales/hooks/cart.ts","../src/sales/hooks/order.ts","../src/sales/hooks/customer.ts","../src/sales/hooks/pos.ts"],"names":["OrderStatus","PaymentStatus","useQuery","useQueryClient","useMutation"],"mappings":"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","file":"chunk-ANYGZ6O5.js","sourcesContent":["/**\r\n * Order Types\r\n *\r\n * Source of truth: modules/commerce/order/order.model.js\r\n */\r\n\r\n// Shipping status types (normalized order shipping status)\nexport type ShippingStatus =\n | 'pending'\n | 'requested'\n | 'picked_up'\n | 'in_transit'\n | 'out_for_delivery'\n | 'delivered'\n | 'failed_attempt'\n | 'returned'\n | 'cancelled';\n\r\n// Shipping provider types (maps to logistics LogisticsProvider)\r\nexport type ShippingProvider =\n | 'redx'\n | 'pathao'\n | 'steadfast'\n | 'paperfly'\n | 'sundarban'\n | 'sa_paribahan'\n | 'dhl'\n | 'fedex'\n | 'manual'\n | 'other';\n\r\nexport enum OrderStatus {\r\n PENDING = 'pending',\r\n PROCESSING = 'processing',\r\n CONFIRMED = 'confirmed',\r\n SHIPPED = 'shipped',\r\n DELIVERED = 'delivered',\r\n CANCELLED = 'cancelled',\r\n}\r\n\r\nexport enum PaymentStatus {\r\n PENDING = 'pending',\r\n VERIFIED = 'verified',\r\n FAILED = 'failed',\r\n REFUNDED = 'refunded',\r\n PARTIALLY_REFUNDED = 'partially_refunded',\r\n CANCELLED = 'cancelled',\r\n}\r\n\r\n/**\r\n * Order Item\r\n */\r\nexport interface OrderItem {\r\n _id?: string;\r\n product: string; // Product ID\r\n productName: string;\r\n productSlug?: string;\r\n\r\n // Variant Snapshot\r\n variantSku?: string;\r\n variantAttributes?: Record<string, string>;\r\n variantPriceModifier?: number;\r\n\r\n quantity: number;\r\n price: number;\r\n\r\n /**\r\n * System field: Cost of Goods Sold at time of sale\r\n * Used for profit calculation. Read-only.\r\n */\r\n costPriceAtSale?: number;\r\n\r\n vatRate?: number;\r\n vatAmount?: number;\r\n\r\n // Virtuals\r\n lineTotal?: number;\r\n lineTotalExVat?: number;\r\n profit?: number | null;\r\n profitMargin?: number | null;\r\n}\r\n\r\nexport interface OrderDelivery {\r\n method: string;\r\n price: number;\r\n estimatedDays?: number;\r\n}\r\n\r\n/**\r\n * Order Delivery Address\r\n */\r\nexport interface OrderAddress {\r\n /** Address label (e.g., \"Home\", \"Office\") - optional */\r\n label?: string;\r\n\r\n /** Recipient name for delivery label */\r\n recipientName?: string;\r\n\r\n /** Contact phone for delivery (format: 01XXXXXXXXX) */\r\n recipientPhone?: string;\r\n\r\n /** Street address (required for checkout) */\r\n addressLine1?: string;\r\n\r\n /** Additional address details (apartment, floor, etc.) */\r\n addressLine2?: string;\r\n\r\n /** Area ID from @classytic/bd-areas constants */\r\n areaId?: number;\r\n\r\n /** Area display name (e.g., \"Mohammadpur\", \"Dhanmondi\") */\r\n areaName?: string;\r\n\r\n /** Zone ID for delivery pricing (1-6) */\r\n zoneId?: number;\r\n\r\n /** Provider-specific area IDs for logistics integration */\r\n providerAreaIds?: {\r\n redx?: number;\r\n pathao?: number;\r\n steadfast?: number;\r\n };\r\n\r\n /** City/District name */\r\n city?: string;\r\n\r\n /** Division/State */\r\n division?: string;\r\n\r\n /** Postal code */\r\n postalCode?: string;\r\n\r\n /** Country (defaults to \"Bangladesh\") */\r\n country?: string;\r\n}\r\n\r\nexport interface OrderVat {\r\n applicable: boolean;\r\n rate: number;\r\n amount: number;\r\n pricesIncludeVat: boolean;\r\n taxableAmount: number;\r\n sellerBin?: string;\r\n invoiceNumber?: string;\r\n invoiceIssuedAt?: string;\r\n invoiceBranch?: string;\r\n invoiceDateKey?: string;\r\n}\r\n\r\nexport interface OrderPayment {\r\n transactionId?: string;\r\n /** Amount in paisa (smallest unit). Divide by 100 for BDT display. */\r\n amount: number;\r\n status: PaymentStatus | string;\r\n method: string;\r\n reference?: string;\r\n verifiedAt?: string;\r\n verifiedBy?: string;\r\n}\r\n\r\nexport interface OrderShippingHistory {\r\n status: ShippingStatus | string;\r\n note?: string;\r\n actor?: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface OrderShipping {\r\n provider?: ShippingProvider | string;\r\n status?: ShippingStatus | string;\r\n trackingNumber?: string;\r\n trackingUrl?: string;\r\n consignmentId?: string;\r\n labelUrl?: string;\r\n estimatedDelivery?: string;\r\n requestedAt?: string;\r\n pickedUpAt?: string;\r\n deliveredAt?: string;\r\n metadata?: Record<string, unknown>;\r\n history?: OrderShippingHistory[];\r\n}\r\n\r\n/**\r\n * Parcel metrics for delivery estimation\r\n */\r\nexport interface OrderParcel {\r\n /** Total weight in grams */\r\n weightGrams: number;\r\n /** Package dimensions in centimeters */\r\n dimensionsCm?: {\r\n length: number;\r\n width: number;\r\n height: number;\r\n };\r\n /** Number of items without weight data */\r\n missingWeightItems: number;\r\n /** Number of items without dimension data */\r\n missingDimensionItems: number;\r\n}\r\n\r\n/**\r\n * Cancellation request details\r\n */\r\nexport interface CancellationRequest {\r\n requested: boolean;\r\n reason?: string;\r\n requestedAt?: string;\r\n requestedBy?: string;\r\n}\r\n\r\n/**\r\n * Main Order Interface\r\n */\r\nexport interface Order {\r\n _id: string;\r\n /** Virtual: last 8 chars of _id (uppercase) */\r\n orderNumber?: string;\r\n\r\n customer?: string;\r\n customerName: string;\r\n customerPhone?: string;\r\n customerEmail?: string;\r\n userId?: string;\r\n\r\n items: OrderItem[];\r\n\r\n subtotal: number;\r\n discountAmount: number;\r\n deliveryCharge: number;\r\n totalAmount: number;\r\n\r\n vat?: OrderVat;\r\n\r\n delivery?: OrderDelivery;\r\n deliveryAddress?: OrderAddress;\r\n /** True if ordering on behalf of someone else (gift order) */\r\n isGift?: boolean;\r\n\r\n status: OrderStatus | string;\r\n source: 'web' | 'pos' | 'api';\r\n\r\n // POS specific\r\n branch?: string;\r\n terminalId?: string;\r\n cashier?: string;\r\n /** Idempotency key for safe retries */\r\n idempotencyKey?: string;\r\n\r\n // Stock reservation (web checkout)\r\n /** Reservation ID for stock hold */\r\n stockReservationId?: string;\r\n stockReservationExpiresAt?: string;\r\n\r\n currentPayment?: OrderPayment;\r\n shipping?: OrderShipping;\r\n\r\n /** Parcel metrics for delivery estimation */\r\n parcel?: OrderParcel;\r\n\r\n /** Customer cancellation request (awaiting admin review) */\r\n cancellationRequest?: CancellationRequest;\r\n /** Final cancellation reason (after cancelled) */\r\n cancellationReason?: string;\r\n\r\n notes?: string;\r\n\r\n createdAt: string;\r\n updatedAt: string;\r\n\r\n // Virtuals\r\n canCancel?: boolean;\r\n isCompleted?: boolean;\r\n paymentStatus?: string;\r\n paymentMethod?: string;\r\n netAmount?: number;\r\n grossAmount?: number;\r\n\r\n // Backward compatibility virtuals (from shipping)\r\n trackingNumber?: string;\r\n shippedAt?: string;\r\n deliveredAt?: string;\r\n shippingStatus?: string;\r\n}\r\n\r\n/**\r\n * Payment Data for checkout\r\n */\r\nexport interface PaymentData {\r\n /**\r\n * Payment method (optional, defaults to 'cash')\r\n */\r\n type?: 'cash' | 'bkash' | 'nagad' | 'rocket' | 'bank_transfer' | 'card' | string;\r\n\r\n /**\r\n * Payment gateway (default: 'manual')\r\n */\r\n gateway?: string;\r\n\r\n /**\r\n * Transaction ID/reference (recommended for verification)\r\n */\r\n reference?: string;\r\n\r\n /**\r\n * Mobile wallet sender phone (REQUIRED for bkash/nagad/rocket)\r\n */\r\n senderPhone?: string;\r\n\r\n /**\r\n * Additional payment verification details\r\n */\r\n paymentDetails?: {\r\n walletNumber?: string;\r\n walletType?: 'personal' | 'merchant';\r\n bankName?: string;\r\n accountNumber?: string;\r\n accountName?: string;\r\n proofUrl?: string;\r\n };\r\n\r\n /** Additional payment notes */\r\n notes?: string;\r\n}\r\n\r\n/**\r\n * Payload for Creating an Order (Web/API)\r\n */\r\nexport interface CreateOrderPayload {\r\n /** Delivery address (required) */\r\n deliveryAddress: OrderAddress & {\r\n recipientName: string;\r\n recipientPhone: string;\r\n addressLine1: string;\r\n areaId: number;\r\n areaName: string;\r\n zoneId: number;\r\n city: string;\r\n };\r\n\r\n /** Delivery method and pricing (required) */\r\n delivery: OrderDelivery & {\r\n method: string;\r\n price: number;\r\n };\r\n\r\n /**\r\n * Payment details for verification (optional, defaults to cash)\r\n */\r\n paymentData?: PaymentData;\r\n\r\n /** True if ordering on behalf of someone else (gift order) */\r\n isGift?: boolean;\r\n /** Coupon code to apply */\r\n couponCode?: string;\r\n /** Order notes */\r\n notes?: string;\r\n\r\n /** Preferred branch ID for fulfillment */\r\n branchId?: string;\r\n /** Preferred branch slug (alternative to branchId) */\r\n branchSlug?: string;\r\n /** Idempotency key for safe retries (prevents duplicate orders) */\r\n idempotencyKey?: string;\r\n}\r\n\r\n/**\r\n * Payload for Updating Order Status (Admin)\r\n */\r\nexport interface UpdateStatusPayload {\r\n status: OrderStatus;\r\n /** Optional note for status change */\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Payload for Cancelling an Order\r\n */\r\nexport interface CancelOrderPayload {\r\n /** Cancellation reason */\r\n reason?: string;\r\n /** Process refund if payment was verified */\r\n refund?: boolean;\r\n}\r\n\r\n/**\r\n * Payload for Requesting Cancellation (awaits admin review)\r\n */\r\nexport interface CancelRequestPayload {\r\n /** Reason for cancellation request */\r\n reason?: string;\r\n}\r\n\r\n/**\r\n * Payload for Fulfilling/Shipping an Order (Admin)\r\n */\r\nexport interface FulfillOrderPayload {\r\n /** Shipping tracking number */\r\n trackingNumber?: string;\r\n /** Shipping carrier (e.g., Pathao, Redx) */\r\n carrier?: string;\r\n /** Fulfillment notes */\r\n notes?: string;\r\n /** Shipping date */\r\n shippedAt?: string;\r\n /** Estimated delivery date */\r\n estimatedDelivery?: string;\r\n /** Branch ID for inventory decrement (overrides order.branch) */\r\n branchId?: string;\r\n /** Branch slug (alternative to branchId) */\r\n branchSlug?: string;\r\n /**\r\n * Record COGS expense transaction (default: false)\r\n */\r\n recordCogs?: boolean;\r\n}\r\n\r\n/**\r\n * Payload for Refunding an Order (Admin)\r\n */\r\nexport interface RefundOrderPayload {\r\n /** Refund amount in smallest unit (paisa). Omit for full refund. */\r\n amount?: number;\r\n /** Refund reason */\r\n reason?: string;\r\n}\r\n\r\n/**\r\n * Payload for Requesting Shipping Pickup (Admin)\r\n */\r\nexport interface RequestShippingPayload {\r\n /** Shipping provider (required) */\r\n provider: string;\r\n /** Additional shipping options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Payload for Updating Shipping Status (Admin/Webhook)\r\n */\r\nexport interface UpdateShippingPayload {\r\n /** Shipping status (required) */\r\n status: string;\r\n /** Status note */\r\n note?: string;\r\n /** Tracking number */\r\n trackingNumber?: string;\r\n /** Tracking URL */\r\n trackingUrl?: string;\r\n}\r\n","/**\r\n * Cart API Client\r\n *\r\n * **Authentication:** Required for all endpoints (use Bearer token)\r\n *\r\n * **Base URL:** `/api/v1/cart`\r\n *\r\n * **Endpoints:**\r\n * - `GET /api/v1/cart` - Get current user's cart (auto-creates if doesn't exist)\r\n * - `POST /api/v1/cart/items` - Add item to cart (productId + quantity + optional variantSku)\r\n * - `PATCH /api/v1/cart/items/:itemId` - Update cart item quantity\r\n * - `DELETE /api/v1/cart/items/:itemId` - Remove item from cart\r\n * - `DELETE /api/v1/cart` - Clear all items from cart\r\n *\r\n * **Response Format:** All endpoints return `{ success: true, data: Cart }`\r\n */\r\n\r\nimport { type ApiResponse } from '../../core/api-factory';\r\nimport { handleApiRequest } from '../../core/api-handler';\r\nimport type { Cart, AddCartItemPayload } from '../types/cart';\r\n\r\nconst ENDPOINT = '/api/v1/cart';\r\n\r\nexport const cartApi = {\r\n /**\r\n * Get current user's cart\r\n * GET /api/v1/cart\r\n *\r\n * Auto-creates cart if it doesn't exist for the user.\r\n * Returns cart with fully populated product details.\r\n *\r\n * @param token - User authentication token\r\n * @returns Cart with items array\r\n */\r\n getCart: async (token: string): Promise<Cart> => {\r\n const response = await handleApiRequest<ApiResponse<Cart>>('GET', ENDPOINT, { token });\r\n return response.data!;\r\n },\r\n\r\n /**\r\n * Add item to cart\r\n * POST /api/v1/cart/items\r\n *\r\n * @param token - User authentication token\r\n * @param data - Product ID, quantity, and optional variant SKU\r\n * @returns Updated cart\r\n */\r\n addToCart: async (token: string, data: AddCartItemPayload): Promise<Cart> => {\r\n const response = await handleApiRequest<ApiResponse<Cart>>('POST', `${ENDPOINT}/items`, {\r\n token,\r\n body: data,\r\n });\r\n return response.data!;\r\n },\r\n\r\n /**\r\n * Update cart item quantity\r\n * PATCH /api/v1/cart/items/:itemId\r\n *\r\n * @param token - User authentication token\r\n * @param itemId - Cart item ID (from cart.items[]._id)\r\n * @param quantity - New quantity (minimum: 1)\r\n * @returns Updated cart\r\n */\r\n updateCartItem: async (token: string, itemId: string, quantity: number): Promise<Cart> => {\r\n const response = await handleApiRequest<ApiResponse<Cart>>('PATCH', `${ENDPOINT}/items/${itemId}`, {\r\n token,\r\n body: { quantity },\r\n });\r\n return response.data!;\r\n },\r\n\r\n /**\r\n * Remove item from cart\r\n * DELETE /api/v1/cart/items/:itemId\r\n *\r\n * @param token - User authentication token\r\n * @param itemId - Cart item ID (from cart.items[]._id)\r\n * @returns Updated cart\r\n */\r\n removeCartItem: async (token: string, itemId: string): Promise<Cart> => {\r\n const response = await handleApiRequest<ApiResponse<Cart>>('DELETE', `${ENDPOINT}/items/${itemId}`, {\r\n token,\r\n });\r\n return response.data!;\r\n },\r\n\r\n /**\r\n * Clear all items from cart\r\n * DELETE /api/v1/cart\r\n *\r\n * @param token - User authentication token\r\n * @returns Empty cart\r\n */\r\n clearCart: async (token: string): Promise<Cart> => {\r\n const response = await handleApiRequest<ApiResponse<Cart>>('DELETE', ENDPOINT, { token });\r\n return response.data!;\r\n },\r\n};\r\n","/**\r\n * Order API Client\r\n *\r\n * Customer: checkout, getMyOrders, getMyOrder, cancel, requestCancellation\r\n * Admin: updateStatus, fulfill, refund, requestShipping, updateShipping\r\n */\r\n\r\nimport { BaseApi } from '../../core/api-factory';\r\nimport type {\r\n Order,\r\n OrderShipping,\r\n CreateOrderPayload,\r\n UpdateStatusPayload,\r\n FulfillOrderPayload,\r\n RefundOrderPayload,\r\n RequestShippingPayload,\r\n UpdateShippingPayload,\r\n} from '../types/order';\r\n\r\nclass OrderApi extends BaseApi<Order, CreateOrderPayload, Partial<Order>> {\r\n\r\n // ============ Customer ============\r\n\r\n /**\r\n * Checkout - create order from cart\r\n * POST /api/v1/orders\r\n */\r\n checkout = ({ token, organizationId, data }: {\r\n token: string;\r\n organizationId?: string | null;\r\n data: CreateOrderPayload;\r\n }) => this.create({ token, organizationId, data });\r\n\r\n /** Get my orders */\r\n getMyOrders = ({ token, params = {} }: {\r\n token: string;\r\n params?: Record<string, unknown>;\r\n }) => this.request<Order[]>('GET', `${this.baseUrl}/my`, { token, params });\r\n\r\n /** Get my order detail */\r\n getMyOrder = ({ token, id }: {\r\n token: string;\r\n id: string;\r\n }) => this.request<Order>('GET', `${this.baseUrl}/my/${id}`, { token });\r\n\r\n /** Cancel order */\r\n cancel = ({ token, id, reason, refund = false }: {\r\n token: string;\r\n id: string;\r\n reason?: string;\r\n refund?: boolean;\r\n }) => this.request<Order>('POST', `${this.baseUrl}/${id}/cancel`, {\r\n token,\r\n data: { reason, refund },\r\n });\r\n\r\n /** Request cancellation (awaits admin review) */\r\n requestCancellation = ({ token, id, reason }: {\r\n token: string;\r\n id: string;\r\n reason?: string;\r\n }) => this.request<Order>('POST', `${this.baseUrl}/${id}/cancel-request`, {\r\n token,\r\n data: { reason },\r\n });\r\n\r\n // ============ Admin ============\r\n\r\n /** Update order status */\r\n updateStatus = ({ token, organizationId, id, data }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data: UpdateStatusPayload;\r\n }) => this.request<Order>('PATCH', `${this.baseUrl}/${id}/status`, {\r\n token,\r\n organizationId,\r\n data,\r\n });\r\n\r\n /**\r\n * Fulfill order (ship)\r\n * - Decrements inventory from branch\r\n * - recordCogs: true -> also creates COGS expense transaction\r\n */\r\n fulfill = ({ token, organizationId, id, data = {} }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data?: FulfillOrderPayload;\r\n }) => this.request<Order>('POST', `${this.baseUrl}/${id}/fulfill`, {\r\n token,\r\n organizationId,\r\n data,\r\n });\r\n\r\n /** Refund order */\r\n refund = ({ token, organizationId, id, data = {} }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data?: RefundOrderPayload;\r\n }) => this.request<Order>('POST', `${this.baseUrl}/${id}/refund`, {\r\n token,\r\n organizationId,\r\n data,\r\n });\r\n\r\n // ============ Shipping ============\r\n\r\n /** Get shipping info */\r\n getShipping = ({ token, id }: {\r\n token: string;\r\n id: string;\r\n }) => this.request<OrderShipping>('GET', `${this.baseUrl}/${id}/shipping`, { token });\r\n\r\n /** Request shipping pickup */\r\n requestShipping = ({ token, organizationId, id, data }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data: RequestShippingPayload;\r\n }) => this.request<OrderShipping>('POST', `${this.baseUrl}/${id}/shipping`, {\r\n token,\r\n organizationId,\r\n data,\r\n });\r\n\r\n /** Update shipping status */\r\n updateShipping = ({ token, organizationId, id, data }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data: UpdateShippingPayload;\r\n }) => this.request<OrderShipping>('PATCH', `${this.baseUrl}/${id}/shipping`, {\r\n token,\r\n organizationId,\r\n data,\r\n });\r\n}\r\n\r\nexport const orderApi = new OrderApi('orders');\r\nexport default orderApi;\r\n","/**\r\n * Customer API - CRUD + helper endpoint\r\n *\r\n * Standard CRUD (inherited from BaseApi):\r\n * - getAll({ token, params }) - list with filtering/search/pagination\r\n * - getById({ token, id }) - get by ID\r\n * - update({ token, id, data }) - update (admin/staff rules apply)\r\n * - delete({ token, id }) - delete (admin only)\r\n *\r\n * Notes:\r\n * - Customers may be auto-created by backend workflows; some environments may not expose create.\r\n *\r\n * Extra endpoint:\r\n * - getMe({ token }) - current user's customer profile\r\n */\r\n\r\nimport { BaseApi, type ApiResponse, type RequestOptions } from '../../core/api-factory';\r\nimport { handleApiRequest } from '../../core/api-handler';\r\nimport type { Customer, CustomerPayload, CustomerQueryParams } from '../types/customer';\r\n\r\ntype FetchOptions = Omit<RequestOptions, 'token' | 'organizationId'>;\r\n\r\nclass CustomerApi extends BaseApi<Customer, CustomerPayload, CustomerPayload> {\r\n constructor(config = {}) {\r\n super('customers', config);\r\n }\r\n\r\n /**\r\n * Get current user's customer profile\r\n * GET /customers/me\r\n */\r\n async getMe({\r\n token,\r\n options = {},\r\n }: {\r\n token: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Customer>> {\r\n if (!token) {\r\n throw new Error('Authentication required');\r\n }\r\n\r\n return handleApiRequest('GET', `${this.baseUrl}/me`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Membership actions\r\n * POST /customers/:id/membership\r\n */\r\n async membershipAction({\r\n token,\r\n id,\r\n data,\r\n }: {\r\n token: string;\r\n id: string;\r\n data: {\r\n action: 'enroll' | 'deactivate' | 'reactivate' | 'adjust';\r\n points?: number;\r\n reason?: string;\r\n type?: 'bonus' | 'correction' | 'manual_redemption' | 'redemption' | 'expiry';\r\n };\r\n }): Promise<ApiResponse<Customer>> {\r\n if (!token) {\r\n throw new Error('Authentication required');\r\n }\r\n\r\n return handleApiRequest('POST', `${this.baseUrl}/${id}/membership`, {\r\n token,\r\n body: data,\r\n cache: this.config.cache,\r\n });\r\n }\r\n}\r\n\r\nexport const customerApi = new CustomerApi();\r\nexport { CustomerApi };\r\nexport type { CustomerQueryParams };\r\n","\"use client\";\n\n/**\n * Cart Hooks\n *\n * React hooks for shopping cart operations with optimistic updates.\n */\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { cartApi } from \"../api/cart\";\nimport { createQueryKeys, type QueryKeys } from \"../../core/react\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport type { Cart, CartItem, AddCartItemPayload, UpdateCartItemPayload } from \"../types/cart\";\n\n// ============================================\n// Query Keys\n// ============================================\n\nexport const CART_KEYS: QueryKeys = createQueryKeys(\"cart\");\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Calculate unit price for a cart item\n * Handles both simple products and variant products\n */\nexport function calculateItemPrice(item: CartItem): number {\n if (!item?.product) return 0;\n\n const product = item.product;\n const basePrice = product.currentPrice ?? product.basePrice ?? 0;\n\n // For variant products, add the priceModifier from the selected variant\n if (item.variantSku && product.variants && product.variants.length > 0) {\n const variant = product.variants.find((v) => v.sku === item.variantSku);\n if (variant) {\n return basePrice + (variant.priceModifier || 0);\n }\n }\n\n return basePrice;\n}\n\n/**\n * Calculate total for a cart item\n */\nexport function calculateItemTotal(item: CartItem): number {\n return calculateItemPrice(item) * (item.quantity || 1);\n}\n\n/**\n * Calculate cart subtotal\n */\nexport function calculateCartSubtotal(items: CartItem[]): number {\n return items?.reduce((total, item) => total + calculateItemTotal(item), 0) || 0;\n}\n\n/**\n * Get total item count in cart\n */\nexport function getCartItemCount(items: CartItem[]): number {\n return items?.reduce((count, item) => count + (item.quantity || 0), 0) || 0;\n}\n\n/**\n * Get variant details from a cart item\n */\nexport function getCartItemVariant(item: CartItem) {\n if (!item?.variantSku || !item?.product?.variants) return null;\n return item.product.variants.find((v) => v.sku === item.variantSku) || null;\n}\n\n/**\n * Format variant attributes for display\n * @example \"Size: M, Color: Red\"\n */\nexport function formatVariantAttributes(attributes?: Record<string, string> | null): string {\n if (!attributes || Object.keys(attributes).length === 0) return \"\";\n return Object.entries(attributes)\n .map(([key, value]) => `${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}`)\n .join(\", \");\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseCartReturn {\n cart: Cart | null | undefined;\n items: CartItem[];\n itemCount: number;\n subtotal: number;\n isLoading: boolean;\n isFetching: boolean;\n isUpdating: boolean;\n error: Error | null;\n addToCart: (data: AddCartItemPayload) => void;\n addToCartAsync: (data: AddCartItemPayload) => Promise<Cart>;\n updateCartItem: (data: UpdateCartItemPayload) => void;\n updateCartItemAsync: (data: UpdateCartItemPayload) => Promise<Cart>;\n removeCartItem: (itemId: string) => void;\n removeCartItemAsync: (itemId: string) => Promise<Cart>;\n clearCart: () => void;\n clearCartAsync: () => Promise<Cart>;\n refetch: () => void;\n getItemPrice: typeof calculateItemPrice;\n}\n\nexport interface UseCartCountReturn {\n count: number;\n isLoading: boolean;\n}\n\nexport interface CartOptions {\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nconst CART_QUERY_KEY = [\"cart\"];\n\n/**\n * Full cart hook with optimistic updates\n *\n * @example\n * ```tsx\n * function CartPage() {\n * const {\n * items,\n * itemCount,\n * subtotal,\n * addToCart,\n * updateCartItem,\n * removeCartItem,\n * clearCart,\n * isLoading,\n * isUpdating,\n * } = useCart(token);\n *\n * // Add item\n * addToCart({ productId: \"123\", quantity: 2 });\n *\n * // Add variant item\n * addToCart({ productId: \"123\", variantSku: \"SIZE-M\", quantity: 1 });\n *\n * // Update quantity\n * updateCartItem({ itemId: \"item_id\", quantity: 3 });\n *\n * // Remove item\n * removeCartItem(\"item_id\");\n *\n * // Clear cart\n * clearCart();\n * }\n * ```\n */\nexport function useCart(\n token: string | null | undefined,\n options: CartOptions = {}\n): UseCartReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n const { enabled = true, staleTime = 2 * 60 * 1000, gcTime = 10 * 60 * 1000 } = options;\n\n // Query\n const {\n data: cart,\n isLoading,\n error,\n isFetching,\n refetch,\n } = useQuery<Cart | null>({\n queryKey: CART_QUERY_KEY,\n queryFn: () => cartApi.getCart(token!),\n enabled: enabled && !!token,\n staleTime,\n gcTime,\n });\n\n // Add to cart mutation\n const addMutation = useMutation({\n mutationFn: (data: AddCartItemPayload) => cartApi.addToCart(token!, data),\n onMutate: async () => {\n await queryClient.cancelQueries({ queryKey: CART_QUERY_KEY });\n return { previousCart: queryClient.getQueryData<Cart>(CART_QUERY_KEY) };\n },\n onError: (err: Error, _, context) => {\n if (context?.previousCart) {\n queryClient.setQueryData(CART_QUERY_KEY, context.previousCart);\n }\n toast.error?.(err.message || \"Failed to add item to cart\");\n },\n onSuccess: (data) => {\n queryClient.setQueryData(CART_QUERY_KEY, data);\n toast.success?.(\"Added to cart!\");\n },\n });\n\n // Update quantity mutation\n const updateMutation = useMutation({\n mutationFn: ({ itemId, quantity }: UpdateCartItemPayload) =>\n cartApi.updateCartItem(token!, itemId, quantity),\n onMutate: async ({ itemId, quantity }) => {\n await queryClient.cancelQueries({ queryKey: CART_QUERY_KEY });\n const previousCart = queryClient.getQueryData<Cart>(CART_QUERY_KEY);\n\n queryClient.setQueryData<Cart | null>(CART_QUERY_KEY, (old) =>\n old\n ? {\n ...old,\n items: old.items.map((i) =>\n i._id === itemId ? { ...i, quantity } : i\n ),\n }\n : old\n );\n\n return { previousCart };\n },\n onError: (err: Error, _, context) => {\n if (context?.previousCart) {\n queryClient.setQueryData(CART_QUERY_KEY, context.previousCart);\n }\n toast.error?.(err.message || \"Failed to update cart\");\n },\n onSuccess: (data) => {\n queryClient.setQueryData(CART_QUERY_KEY, data);\n },\n });\n\n // Remove item mutation\n const removeMutation = useMutation({\n mutationFn: (itemId: string) => cartApi.removeCartItem(token!, itemId),\n onMutate: async (itemId) => {\n await queryClient.cancelQueries({ queryKey: CART_QUERY_KEY });\n const previousCart = queryClient.getQueryData<Cart>(CART_QUERY_KEY);\n\n queryClient.setQueryData<Cart | null>(CART_QUERY_KEY, (old) =>\n old ? { ...old, items: old.items.filter((i) => i._id !== itemId) } : old\n );\n\n return { previousCart };\n },\n onError: (err: Error, _, context) => {\n if (context?.previousCart) {\n queryClient.setQueryData(CART_QUERY_KEY, context.previousCart);\n }\n toast.error?.(err.message || \"Failed to remove item\");\n },\n onSuccess: (data) => {\n queryClient.setQueryData(CART_QUERY_KEY, data);\n toast.success?.(\"Item removed\");\n },\n });\n\n // Clear cart mutation\n const clearMutation = useMutation({\n mutationFn: () => cartApi.clearCart(token!),\n onMutate: async () => {\n await queryClient.cancelQueries({ queryKey: CART_QUERY_KEY });\n const previousCart = queryClient.getQueryData<Cart>(CART_QUERY_KEY);\n queryClient.setQueryData<Cart | null>(CART_QUERY_KEY, (old) =>\n old ? { ...old, items: [] } : old\n );\n return { previousCart };\n },\n onError: (err: Error, _, context) => {\n if (context?.previousCart) {\n queryClient.setQueryData(CART_QUERY_KEY, context.previousCart);\n }\n toast.error?.(err.message || \"Failed to clear cart\");\n },\n onSuccess: (data) => {\n queryClient.setQueryData(CART_QUERY_KEY, data);\n toast.success?.(\"Cart cleared\");\n },\n });\n\n const items = cart?.items || [];\n const isUpdating =\n addMutation.isPending ||\n updateMutation.isPending ||\n removeMutation.isPending ||\n clearMutation.isPending;\n\n return {\n cart,\n items,\n itemCount: getCartItemCount(items),\n subtotal: calculateCartSubtotal(items),\n isLoading,\n isFetching,\n isUpdating,\n error: error as Error | null,\n addToCart: (data) => addMutation.mutate(data),\n addToCartAsync: (data) => addMutation.mutateAsync(data),\n updateCartItem: (data) => updateMutation.mutate(data),\n updateCartItemAsync: (data) => updateMutation.mutateAsync(data),\n removeCartItem: (itemId) => removeMutation.mutate(itemId),\n removeCartItemAsync: (itemId) => removeMutation.mutateAsync(itemId),\n clearCart: () => clearMutation.mutate(),\n clearCartAsync: () => clearMutation.mutateAsync(),\n refetch: () => refetch(),\n getItemPrice: calculateItemPrice,\n };\n}\n\n/**\n * Lightweight hook for cart count (header badge)\n *\n * @example\n * ```tsx\n * function CartBadge() {\n * const { count, isLoading } = useCartCount(token);\n * return <Badge>{isLoading ? \"...\" : count}</Badge>;\n * }\n * ```\n */\nexport function useCartCount(\n token: string | null | undefined,\n options: CartOptions = {}\n): UseCartCountReturn {\n const { enabled = true, staleTime = 2 * 60 * 1000, gcTime = 10 * 60 * 1000 } = options;\n\n const { data: cart, isLoading } = useQuery<Cart | null>({\n queryKey: CART_QUERY_KEY,\n queryFn: () => cartApi.getCart(token!),\n enabled: enabled && !!token,\n staleTime,\n gcTime,\n });\n\n return {\n count: getCartItemCount(cart?.items || []),\n isLoading,\n };\n}\n","\"use client\";\n\n/**\n * Order Hooks\n *\n * React hooks for order CRUD operations using the factory pattern.\n * Includes customer-facing and admin-specific hooks.\n */\n\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport { orderApi } from \"../api/order\";\nimport type { ApiResponse, PaginatedResponse } from \"../../core\";\nimport type {\n Order,\n OrderShipping,\n CreateOrderPayload,\n UpdateStatusPayload,\n FulfillOrderPayload,\n RequestShippingPayload,\n UpdateShippingPayload,\n} from \"../types/order\";\n\n// Response types for type safety\ninterface OrderListResponse {\n success: boolean;\n data?: Order[];\n docs?: Order[];\n pagination?: {\n total?: number;\n page?: number;\n limit?: number;\n hasMore?: boolean;\n };\n}\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// Query Keys\n// ============================================\n\n/**\n * Extended order query keys\n */\nconst createOrderKeys = () => ({\n all: [\"orders\"] as const,\n lists: () => [...createOrderKeys().all, \"list\"] as const,\n list: (params?: Record<string, unknown>) => [...createOrderKeys().lists(), params] as const,\n details: () => [...createOrderKeys().all, \"detail\"] as const,\n detail: (id: string) => [...createOrderKeys().details(), id] as const,\n // Customer-specific keys\n myOrders: (params?: Record<string, unknown>) => [...createOrderKeys().all, \"my\", params] as const,\n myDetail: (id: string) => [...createOrderKeys().all, \"my\", \"detail\", id] as const,\n});\n\n// ============================================\n// Base CRUD Hooks (Admin)\n// ============================================\n\n/**\n * Order hooks using createCrudHooks factory\n *\n * Provides:\n * - useOrders: List orders with filtering/pagination\n * - useOrderDetail: Get single order\n * - useOrderActions: Create, update, delete mutations\n * - useOrderNavigation: Navigation between orders\n */\nexport const orderHooks = createCrudHooks<Order, CreateOrderPayload, Partial<Order>>({\n api: orderApi as AnyApi,\n entityKey: \"orders\",\n singular: \"Order\",\n plural: \"Orders\",\n defaults: {\n staleTime: 1 * 60 * 1000, // 1 minute (orders change frequently)\n },\n});\n\n// Export ORDER_KEYS with extended keys for customer-facing hooks\nexport const ORDER_KEYS = createOrderKeys();\n\nexport const {\n useList: useOrders,\n useDetail: useOrderDetail,\n useActions: useOrderActions,\n useNavigation: useOrderNavigation,\n} = orderHooks;\n\n// ============================================\n// Types\n// ============================================\n\ninterface QueryOptions {\n enabled?: boolean;\n staleTime?: number;\n}\n\nexport interface UseMyOrdersReturn {\n orders: Order[];\n total: number;\n page: number;\n limit: number;\n hasMore: boolean;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport interface UseCustomerOrderActionsReturn {\n checkout: (data: CreateOrderPayload) => Promise<Order>;\n isCheckingOut: boolean;\n requestCancel: (params: { orderId: string; reason?: string }) => Promise<Order>;\n isRequestingCancel: boolean;\n isLoading: boolean;\n}\n\nexport interface UseAdminOrderActionsReturn {\n updateStatus: (params: { orderId: string; status: string; note?: string }) => Promise<Order>;\n isUpdatingStatus: boolean;\n fulfillOrder: (params: FulfillOrderPayload & { orderId: string }) => Promise<Order>;\n isFulfilling: boolean;\n refundOrder: (params: { orderId: string; amount?: number; reason?: string }) => Promise<Order>;\n isRefunding: boolean;\n cancelOrder: (params: { orderId: string; reason?: string; refund?: boolean }) => Promise<Order>;\n isCancelling: boolean;\n requestShipping: (params: RequestShippingPayload & { orderId: string }) => Promise<OrderShipping>;\n isRequestingShipping: boolean;\n updateShipping: (params: UpdateShippingPayload & { orderId: string }) => Promise<OrderShipping>;\n isUpdatingShipping: boolean;\n isLoading: boolean;\n}\n\n// ============================================\n// Customer-Facing Hooks\n// ============================================\n\n/**\n * Get customer's own orders\n *\n * @param token - Auth token\n * @param params - Query params { page, limit, status, sort }\n * @param options - Query options\n *\n * @example\n * ```tsx\n * function MyOrdersPage() {\n * const { orders, isLoading, hasMore } = useMyOrders(token, { limit: 10 });\n *\n * return (\n * <OrderList orders={orders} loading={isLoading} />\n * );\n * }\n * ```\n */\nexport function useMyOrders(\n token: string,\n params: Record<string, unknown> = {},\n options: QueryOptions = {}\n): UseMyOrdersReturn {\n const { data, isLoading, isFetching, error, refetch } = useQuery<OrderListResponse>({\n queryKey: ORDER_KEYS.myOrders(params),\n queryFn: async () => {\n const response = await orderApi.getMyOrders({ token, params });\n return response as unknown as OrderListResponse;\n },\n enabled: !!token && options.enabled !== false,\n staleTime: options.staleTime ?? 30 * 1000,\n });\n\n const orders = data?.data || data?.docs || [];\n const pagination = data?.pagination;\n\n return {\n orders,\n total: pagination?.total || orders.length,\n page: pagination?.page || 1,\n limit: pagination?.limit || 10,\n hasMore: pagination?.hasMore ?? false,\n isLoading,\n isFetching,\n error: error as Error | null,\n refetch,\n };\n}\n\n/**\n * Get customer's own order detail\n *\n * @param token - Auth token\n * @param orderId - Order ID\n * @param options - Query options\n *\n * @example\n * ```tsx\n * function OrderDetailPage({ orderId }) {\n * const { data: order, isLoading } = useMyOrderDetail(token, orderId);\n *\n * if (isLoading) return <Skeleton />;\n * return <OrderDetail order={order} />;\n * }\n * ```\n */\nexport function useMyOrderDetail(\n token: string,\n orderId: string,\n options: QueryOptions = {}\n) {\n return useQuery<Order>({\n queryKey: ORDER_KEYS.myDetail(orderId),\n queryFn: async () => {\n const response = await orderApi.getMyOrder({ token, id: orderId }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n enabled: !!token && !!orderId && options.enabled !== false,\n staleTime: options.staleTime ?? 30 * 1000,\n });\n}\n\n/**\n * Customer order actions (checkout, request cancellation)\n *\n * @param token - Customer auth token\n *\n * @example\n * ```tsx\n * function CheckoutButton({ cart }) {\n * const { checkout, isCheckingOut } = useCustomerOrderActions(token);\n *\n * const handleCheckout = async () => {\n * const order = await checkout({\n * items: cart.items,\n * shipping: shippingAddress,\n * payment: { method: 'bkash' },\n * });\n * router.push(`/orders/${order._id}`);\n * };\n *\n * return (\n * <Button onClick={handleCheckout} disabled={isCheckingOut}>\n * {isCheckingOut ? 'Processing...' : 'Place Order'}\n * </Button>\n * );\n * }\n * ```\n */\nexport function useCustomerOrderActions(token: string): UseCustomerOrderActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n // Checkout mutation\n const checkoutMutation = useMutation({\n mutationFn: async (data: CreateOrderPayload) => {\n const response = await orderApi.checkout({ token, data }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n // Clear cart and invalidate queries\n queryClient.setQueryData([\"cart\"], null);\n queryClient.invalidateQueries({ queryKey: [\"cart\"] });\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Order placed successfully!\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to place order\");\n },\n });\n\n // Request cancellation mutation\n const requestCancelMutation = useMutation({\n mutationFn: async ({ orderId, reason }: { orderId: string; reason?: string }) => {\n const response = await orderApi.requestCancellation({ token, id: orderId, reason }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Cancellation request submitted\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to request cancellation\");\n },\n });\n\n return {\n checkout: checkoutMutation.mutateAsync,\n isCheckingOut: checkoutMutation.isPending,\n requestCancel: requestCancelMutation.mutateAsync,\n isRequestingCancel: requestCancelMutation.isPending,\n isLoading: checkoutMutation.isPending || requestCancelMutation.isPending,\n };\n}\n\n// ============================================\n// Admin Hooks\n// ============================================\n\n/**\n * Admin order actions (status, fulfill, refund, cancel, shipping)\n *\n * @param token - Admin auth token\n *\n * @example\n * ```tsx\n * function OrderActions({ order }) {\n * const {\n * updateStatus,\n * fulfillOrder,\n * cancelOrder,\n * isLoading,\n * } = useAdminOrderActions(token);\n *\n * return (\n * <>\n * <Button onClick={() => updateStatus({ orderId: order._id, status: 'processing' })}>\n * Mark Processing\n * </Button>\n * <Button onClick={() => fulfillOrder({ orderId: order._id, branchId: 'branch_123' })}>\n * Fulfill Order\n * </Button>\n * </>\n * );\n * }\n * ```\n */\nexport function useAdminOrderActions(token: string): UseAdminOrderActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n // Update status\n const updateStatusMutation = useMutation({\n mutationFn: async ({ orderId, status, note }: { orderId: string; status: string; note?: string }) => {\n const response = await orderApi.updateStatus({\n token,\n id: orderId,\n data: { status, note } as UpdateStatusPayload,\n }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Order status updated\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to update status\");\n },\n });\n\n // Fulfill order\n const fulfillMutation = useMutation({\n mutationFn: async ({ orderId, ...data }: FulfillOrderPayload & { orderId: string }) => {\n const response = await orderApi.fulfill({ token, id: orderId, data }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n queryClient.invalidateQueries({ queryKey: [\"branches\"] });\n queryClient.invalidateQueries({ queryKey: [\"stock\"] });\n toast.success(\"Order fulfilled successfully\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to fulfill order\");\n },\n });\n\n // Refund order\n const refundMutation = useMutation({\n mutationFn: async ({ orderId, amount, reason }: { orderId: string; amount?: number; reason?: string }) => {\n const response = await orderApi.refund({ token, id: orderId, data: { amount, reason } }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Refund processed successfully\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to process refund\");\n },\n });\n\n // Cancel order\n const cancelMutation = useMutation({\n mutationFn: async ({ orderId, reason, refund }: { orderId: string; reason?: string; refund?: boolean }) => {\n const response = await orderApi.cancel({ token, id: orderId, reason, refund }) as unknown as ApiResponse<Order>;\n return response.data as Order;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Order cancelled\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to cancel order\");\n },\n });\n\n // Request shipping\n const requestShippingMutation = useMutation({\n mutationFn: async ({ orderId, ...data }: RequestShippingPayload & { orderId: string }) => {\n const response = await orderApi.requestShipping({ token, id: orderId, data }) as unknown as ApiResponse<OrderShipping>;\n return response.data as OrderShipping;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Shipping pickup requested\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to request shipping\");\n },\n });\n\n // Update shipping\n const updateShippingMutation = useMutation({\n mutationFn: async ({ orderId, ...data }: UpdateShippingPayload & { orderId: string }) => {\n const response = await orderApi.updateShipping({ token, id: orderId, data }) as unknown as ApiResponse<OrderShipping>;\n return response.data as OrderShipping;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ORDER_KEYS.all });\n toast.success(\"Shipping status updated\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to update shipping\");\n },\n });\n\n return {\n updateStatus: updateStatusMutation.mutateAsync,\n isUpdatingStatus: updateStatusMutation.isPending,\n fulfillOrder: fulfillMutation.mutateAsync,\n isFulfilling: fulfillMutation.isPending,\n refundOrder: refundMutation.mutateAsync,\n isRefunding: refundMutation.isPending,\n cancelOrder: cancelMutation.mutateAsync,\n isCancelling: cancelMutation.isPending,\n requestShipping: requestShippingMutation.mutateAsync,\n isRequestingShipping: requestShippingMutation.isPending,\n updateShipping: updateShippingMutation.mutateAsync,\n isUpdatingShipping: updateShippingMutation.isPending,\n isLoading:\n updateStatusMutation.isPending ||\n fulfillMutation.isPending ||\n refundMutation.isPending ||\n cancelMutation.isPending ||\n requestShippingMutation.isPending ||\n updateShippingMutation.isPending,\n };\n}\n","\"use client\";\n\n/**\n * Customer Hooks\n *\n * React hooks for customer CRUD operations using the factory pattern.\n * Includes customer profile and membership management.\n */\n\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport { customerApi } from \"../api/customer\";\nimport type { Customer, CustomerPayload } from \"../types/customer\";\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// Types\n// ============================================\n\ninterface QueryOptions {\n enabled?: boolean;\n staleTime?: number;\n}\n\ntype MembershipAction = \"enroll\" | \"deactivate\" | \"reactivate\" | \"adjust\";\ntype PointsType = \"bonus\" | \"correction\" | \"manual_redemption\" | \"redemption\" | \"expiry\";\n\nexport interface MembershipActionParams {\n id: string;\n action: MembershipAction;\n points?: number;\n reason?: string;\n type?: PointsType;\n}\n\nexport interface UseCustomerMembershipReturn {\n membershipAction: (params: MembershipActionParams) => Promise<Customer>;\n isPending: boolean;\n}\n\n// ============================================\n// Base CRUD Hooks (Admin)\n// ============================================\n\n/**\n * Customer hooks using createCrudHooks factory\n *\n * Provides:\n * - useCustomers: List customers with filtering/pagination\n * - useCustomerDetail: Get single customer\n * - useCustomerActions: Create, update, delete mutations\n * - useCustomerNavigation: Navigation between customers\n */\nexport const customerHooks = createCrudHooks<Customer, CustomerPayload, CustomerPayload>({\n api: customerApi as AnyApi,\n entityKey: \"customers\",\n singular: \"Customer\",\n plural: \"Customers\",\n defaults: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n },\n});\n\nexport const {\n KEYS: CUSTOMER_KEYS,\n useList: useCustomers,\n useDetail: useCustomerDetail,\n useActions: useCustomerActions,\n useNavigation: useCustomerNavigation,\n} = customerHooks;\n\n// ============================================\n// Customer Profile Hooks\n// ============================================\n\n/**\n * Get current user's customer profile\n *\n * @param token - Auth token\n * @param options - Query options\n *\n * @example\n * ```tsx\n * function ProfilePage() {\n * const { data: customer, isLoading } = useCurrentCustomer(token);\n *\n * if (isLoading) return <Skeleton />;\n * return (\n * <div>\n * <h1>{customer?.name}</h1>\n * <p>Points: {customer?.membership?.points || 0}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useCurrentCustomer(\n token: string,\n options: QueryOptions = {}\n) {\n return useQuery({\n queryKey: [...CUSTOMER_KEYS.all, \"me\"] as const,\n queryFn: async () => {\n const response = await customerApi.getMe({ token });\n return response.data as Customer;\n },\n enabled: !!token && options.enabled !== false,\n staleTime: options.staleTime ?? 5 * 60 * 1000,\n });\n}\n\n// ============================================\n// Membership Hooks\n// ============================================\n\n/**\n * Customer membership actions (enroll, deactivate, reactivate, adjust points)\n *\n * @param token - Admin auth token\n *\n * @example\n * ```tsx\n * function MembershipManager({ customer }) {\n * const { membershipAction, isPending } = useCustomerMembership(token);\n *\n * const handleEnroll = async () => {\n * await membershipAction({\n * id: customer._id,\n * action: 'enroll',\n * });\n * };\n *\n * const handleAdjustPoints = async (points: number) => {\n * await membershipAction({\n * id: customer._id,\n * action: 'adjust',\n * points,\n * type: 'bonus',\n * reason: 'Birthday bonus',\n * });\n * };\n *\n * return (\n * <Button onClick={handleEnroll} disabled={isPending}>\n * Enroll in Membership\n * </Button>\n * );\n * }\n * ```\n */\nexport function useCustomerMembership(token: string): UseCustomerMembershipReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const mutation = useMutation({\n mutationFn: async ({ id, action, points, reason, type }: MembershipActionParams) => {\n const response = await customerApi.membershipAction({\n token,\n id,\n data: { action, points, reason, type },\n });\n return response.data as Customer;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: CUSTOMER_KEYS.lists() });\n queryClient.invalidateQueries({ queryKey: CUSTOMER_KEYS.details() });\n toast.success(\"Membership updated successfully\");\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to update membership\");\n },\n });\n\n return {\n membershipAction: mutation.mutateAsync,\n isPending: mutation.isPending,\n };\n}\n","\"use client\";\n\n/**\n * POS Hooks\n *\n * React hooks for Point of Sale operations.\n */\n\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { posApi } from \"../api/pos\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport type {\n PosProduct,\n PosProductsResponse,\n PosOrderPayload,\n PosLookupResponse,\n PosReceiptResponse,\n} from \"../types/pos\";\nimport type {\n CreateAdjustmentPayload,\n BulkAdjustmentPayload,\n} from \"../../inventory/types\";\n\n// ============================================\n// Query Keys\n// ============================================\n\nexport const POS_KEYS = {\n all: [\"pos\"] as const,\n products: (branchId?: string) => [...POS_KEYS.all, \"products\", branchId] as const,\n productsList: (branchId?: string, params?: Record<string, unknown>) =>\n [...POS_KEYS.products(branchId), params] as const,\n lookup: (code: string, branchId?: string) =>\n [...POS_KEYS.all, \"lookup\", code, branchId] as const,\n orders: () => [...POS_KEYS.all, \"orders\"] as const,\n receipt: (orderId: string) => [...POS_KEYS.orders(), orderId, \"receipt\"] as const,\n};\n\n// ============================================\n// Types\n// ============================================\n\nexport interface PosProductFilters {\n category?: string;\n search?: string;\n inStockOnly?: boolean;\n lowStockOnly?: boolean;\n after?: string;\n limit?: number;\n sort?: string;\n [key: string]: unknown;\n}\n\nexport interface UsePosProductsReturn {\n products: PosProduct[];\n summary: PosProductsResponse[\"summary\"];\n branch: PosProductsResponse[\"branch\"];\n hasMore: boolean;\n nextCursor: string | null;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\ninterface QueryOptions {\n enabled?: boolean;\n}\n\n// ============================================\n// Product Hooks\n// ============================================\n\n/**\n * Fetch POS products with branch-specific stock\n *\n * @param token - Auth token\n * @param branchId - Branch to get stock for\n * @param filters - Product filters\n * @param options - Query options\n *\n * @example\n * ```tsx\n * function ProductGrid({ branchId }) {\n * const { products, isLoading, summary } = usePosProducts(token, branchId, {\n * category: 'electronics',\n * inStockOnly: true,\n * });\n *\n * return (\n * <Grid>\n * {products.map(product => (\n * <ProductCard key={product._id} product={product} />\n * ))}\n * </Grid>\n * );\n * }\n * ```\n */\nexport function usePosProducts(\n token: string,\n branchId: string | undefined,\n filters: PosProductFilters = {},\n options: QueryOptions = {}\n): UsePosProductsReturn {\n const queryKey = POS_KEYS.productsList(branchId, filters);\n\n const { data, isLoading, isFetching, error, refetch } = useQuery({\n queryKey,\n queryFn: () =>\n posApi.getProducts({\n token,\n branchId,\n category: filters.category,\n search: filters.search,\n inStockOnly: filters.inStockOnly,\n lowStockOnly: filters.lowStockOnly,\n after: filters.after,\n limit: filters.limit || 50,\n sort: filters.sort || \"name\",\n }),\n enabled: !!token && options.enabled !== false,\n staleTime: 30 * 1000, // 30 seconds\n refetchOnWindowFocus: true,\n });\n\n return {\n products: data?.docs || [],\n summary: data?.summary || { totalItems: 0, totalQuantity: 0, lowStockCount: 0, outOfStockCount: 0 },\n branch: data?.branch || { _id: \"\", code: \"\", name: \"\" },\n hasMore: data?.hasMore || false,\n nextCursor: data?.next || null,\n isLoading,\n isFetching,\n error: error as Error | null,\n refetch,\n };\n}\n\n/**\n * Lookup product by barcode/SKU (query-based)\n *\n * @param token - Auth token\n * @param code - Barcode or SKU to lookup\n * @param branchId - Branch for stock info\n * @param options - Query options\n */\nexport function usePosLookup(\n token: string,\n code: string,\n branchId?: string,\n options: QueryOptions = {}\n) {\n return useQuery<PosLookupResponse>({\n queryKey: POS_KEYS.lookup(code, branchId),\n queryFn: () => posApi.lookup({ token, code, branchId }),\n enabled: !!token && !!code && code.length >= 2 && options.enabled !== false,\n staleTime: 10 * 1000, // 10 seconds\n retry: false, // Don't retry failed lookups\n });\n}\n\n/**\n * Lookup product by barcode/SKU (mutation-based)\n * Preferred for \"scan -> act\" flows\n *\n * @param token - Auth token\n *\n * @example\n * ```tsx\n * function BarcodeScanner() {\n * const { lookup, isLooking } = usePosLookupMutation(token);\n *\n * const handleScan = async (code: string) => {\n * const result = await lookup({ code, branchId });\n * if (result) addToCart(result.data);\n * };\n * }\n * ```\n */\nexport function usePosLookupMutation(token: string) {\n const toast = getToastHandler();\n\n const mutation = useMutation<PosLookupResponse, Error, { code: string; branchId?: string }>({\n mutationFn: ({ code, branchId }) => posApi.lookup({ token, code, branchId }),\n onError: (error: Error) => {\n toast.error(error.message || \"Lookup failed\");\n },\n });\n\n return {\n lookup: mutation.mutateAsync,\n isLooking: mutation.isPending,\n error: mutation.error,\n };\n}\n\n/**\n * Get receipt for an order\n *\n * @param token - Auth token\n * @param orderId - Order ID\n * @param options - Query options\n */\nexport function usePosReceipt(\n token: string,\n orderId: string,\n options: QueryOptions = {}\n) {\n return useQuery<PosReceiptResponse>({\n queryKey: POS_KEYS.receipt(orderId),\n queryFn: async (): Promise<PosReceiptResponse> => {\n const result = await posApi.getReceipt({ token, orderId });\n return result as PosReceiptResponse;\n },\n enabled: !!token && !!orderId && options.enabled !== false,\n staleTime: Infinity, // Receipts don't change\n });\n}\n\n// ============================================\n// Order Mutations\n// ============================================\n\nexport interface UsePosOrdersReturn {\n createOrder: (data: PosOrderPayload) => Promise<unknown>;\n isCreatingOrder: boolean;\n}\n\n/**\n * POS order operations\n *\n * @param token - Auth token\n *\n * @example\n * ```tsx\n * function Checkout({ cart, branchId }) {\n * const { createOrder, isCreatingOrder } = usePosOrders(token);\n *\n * const handleCheckout = async () => {\n * const order = await createOrder({\n * items: cart.items,\n * branchId,\n * payment: { method: 'cash' },\n * });\n * // Handle success (show receipt, clear cart, etc.)\n * };\n * }\n * ```\n */\nexport function usePosOrders(token: string): UsePosOrdersReturn {\n const queryClient = useQueryClient();\n\n const createOrderMutation = useMutation({\n mutationFn: (data: PosOrderPayload) => posApi.createOrder({ token, data }),\n onSuccess: (_result, variables) => {\n // Invalidate inventory queries for the branch\n queryClient.invalidateQueries({\n queryKey: POS_KEYS.products(variables.branchId),\n });\n },\n });\n\n return {\n createOrder: createOrderMutation.mutateAsync,\n isCreatingOrder: createOrderMutation.isPending,\n };\n}\n\n// ============================================\n// Stock Adjustment Mutations\n// ============================================\n\nexport interface UsePosStockActionsReturn {\n adjustStock: (data: CreateAdjustmentPayload) => Promise<unknown>;\n isAdjusting: boolean;\n setStock: (params: {\n productId: string;\n quantity: number;\n branchId?: string;\n variantSku?: string;\n reason?: string;\n }) => Promise<unknown>;\n isSetting: boolean;\n bulkAdjust: (data: BulkAdjustmentPayload) => Promise<unknown>;\n isBulkAdjusting: boolean;\n isLoading: boolean;\n}\n\n/**\n * POS stock adjustment actions\n *\n * @param token - Auth token\n * @param branchId - Branch for cache invalidation\n *\n * @example\n * ```tsx\n * function StockAdjuster({ product, branchId }) {\n * const { setStock, isSetting } = usePosStockActions(token, branchId);\n *\n * const handleSetStock = async (newQuantity: number) => {\n * await setStock({\n * productId: product._id,\n * quantity: newQuantity,\n * reason: 'Inventory count',\n * });\n * };\n * }\n * ```\n */\nexport function usePosStockActions(token: string, branchId?: string): UsePosStockActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const adjustMutation = useMutation({\n mutationFn: (data: CreateAdjustmentPayload) => posApi.adjustStock({ token, data }),\n onSuccess: () => {\n toast.success(\"Stock adjusted\");\n queryClient.invalidateQueries({ queryKey: POS_KEYS.products(branchId) });\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to adjust stock\");\n },\n });\n\n const setMutation = useMutation({\n mutationFn: (params: {\n productId: string;\n quantity: number;\n branchId?: string;\n variantSku?: string;\n reason?: string;\n }) =>\n posApi.setStock({\n token,\n productId: params.productId,\n data: {\n quantity: params.quantity,\n branchId: params.branchId || branchId,\n variantSku: params.variantSku,\n reason: params.reason,\n },\n }),\n onSuccess: () => {\n toast.success(\"Stock updated\");\n queryClient.invalidateQueries({ queryKey: POS_KEYS.products(branchId) });\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to set stock\");\n },\n });\n\n const bulkMutation = useMutation({\n mutationFn: (data: BulkAdjustmentPayload) => posApi.bulkAdjust({ token, data }),\n onSuccess: () => {\n toast.success(\"Bulk adjustment complete\");\n queryClient.invalidateQueries({ queryKey: POS_KEYS.products(branchId) });\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to bulk adjust\");\n },\n });\n\n return {\n adjustStock: adjustMutation.mutateAsync,\n isAdjusting: adjustMutation.isPending,\n setStock: setMutation.mutateAsync,\n isSetting: setMutation.isPending,\n bulkAdjust: bulkMutation.mutateAsync,\n isBulkAdjusting: bulkMutation.isPending,\n isLoading: adjustMutation.isPending || setMutation.isPending || bulkMutation.isPending,\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Generate idempotency key for POS orders\n * Format: pos_{terminal}_{timestamp}_{counter}\n */\nexport function generateIdempotencyKey(terminalId?: string): string {\n const terminal = terminalId || \"default\";\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const counter = Math.floor(Math.random() * 10000).toString().padStart(4, \"0\");\n return `pos_${terminal}_${timestamp}_${counter}`;\n}\n\n/**\n * Calculate price for variant product\n */\nexport function calculateVariantPrice(basePrice: number, priceModifier: number = 0): number {\n return basePrice + priceModifier;\n}\n\n/**\n * Format variant attributes for display\n */\nexport function formatVariantLabel(attributes?: Record<string, string>): string {\n if (!attributes || Object.keys(attributes).length === 0) return \"\";\n return Object.entries(attributes)\n .map(([key, value]) => `${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}`)\n .join(\", \");\n}\n\n/**\n * Check if product has variants\n */\nexport function isVariantProduct(product: PosProduct): boolean {\n return product.productType === \"variant\" || (!!product.variants && product.variants.length > 0);\n}\n\n/**\n * Get available (active) variants for a product\n */\nexport function getAvailableVariants(product: PosProduct) {\n if (!product.variants) return [];\n return product.variants.filter((v) => v.isActive);\n}\n\n/**\n * Find variant by SKU\n */\nexport function findVariantBySku(product: PosProduct, sku: string) {\n if (!product.variants) return null;\n return product.variants.find((v) => v.sku === sku) || null;\n}\n\n/**\n * Get variant stock for branch\n */\nexport function getVariantStock(product: PosProduct, variantSku: string): number {\n if (!product.branchStock?.variants) return 0;\n const variantStock = product.branchStock.variants.find((v) => v.sku === variantSku);\n return variantStock?.quantity || 0;\n}\n\n/**\n * Check if product/variant is in stock\n */\nexport function isInStock(product: PosProduct, variantSku?: string): boolean {\n if (variantSku) {\n const stock = getVariantStock(product, variantSku);\n return stock > 0;\n }\n return product.branchStock?.inStock ?? false;\n}\n\n/**\n * Get product image URL (thumbnail preferred)\n */\nexport function getPosProductImage(product: PosProduct): string {\n const firstImage = product.images?.[0];\n if (!firstImage) return \"/placeholder.png\";\n return firstImage.variants?.thumbnail || firstImage.url;\n}\n"]}
@@ -0,0 +1,183 @@
1
+ import { BaseApi } from './chunk-QCTXAMLA.js';
2
+ import { createCrudHooks } from './chunk-B6MPVOV7.js';
3
+ import { useQuery } from '@tanstack/react-query';
4
+
5
+ // src/transaction/types/transaction.ts
6
+ var TransactionFlow = /* @__PURE__ */ ((TransactionFlow2) => {
7
+ TransactionFlow2["INFLOW"] = "inflow";
8
+ TransactionFlow2["OUTFLOW"] = "outflow";
9
+ return TransactionFlow2;
10
+ })(TransactionFlow || {});
11
+ var TransactionStatus = /* @__PURE__ */ ((TransactionStatus2) => {
12
+ TransactionStatus2["PENDING"] = "pending";
13
+ TransactionStatus2["PAYMENT_INITIATED"] = "payment_initiated";
14
+ TransactionStatus2["PROCESSING"] = "processing";
15
+ TransactionStatus2["REQUIRES_ACTION"] = "requires_action";
16
+ TransactionStatus2["VERIFIED"] = "verified";
17
+ TransactionStatus2["COMPLETED"] = "completed";
18
+ TransactionStatus2["FAILED"] = "failed";
19
+ TransactionStatus2["CANCELLED"] = "cancelled";
20
+ TransactionStatus2["EXPIRED"] = "expired";
21
+ TransactionStatus2["REFUNDED"] = "refunded";
22
+ TransactionStatus2["PARTIALLY_REFUNDED"] = "partially_refunded";
23
+ return TransactionStatus2;
24
+ })(TransactionStatus || {});
25
+ var TransactionCategory = /* @__PURE__ */ ((TransactionCategory2) => {
26
+ TransactionCategory2["ORDER_PURCHASE"] = "order_purchase";
27
+ TransactionCategory2["ORDER_SUBSCRIPTION"] = "order_subscription";
28
+ TransactionCategory2["WHOLESALE_SALE"] = "wholesale_sale";
29
+ TransactionCategory2["PLATFORM_SUBSCRIPTION"] = "platform_subscription";
30
+ TransactionCategory2["CREATOR_SUBSCRIPTION"] = "creator_subscription";
31
+ TransactionCategory2["ENROLLMENT_PURCHASE"] = "enrollment_purchase";
32
+ TransactionCategory2["ENROLLMENT_SUBSCRIPTION"] = "enrollment_subscription";
33
+ TransactionCategory2["INVENTORY_PURCHASE"] = "inventory_purchase";
34
+ TransactionCategory2["PURCHASE_RETURN"] = "purchase_return";
35
+ TransactionCategory2["INVENTORY_LOSS"] = "inventory_loss";
36
+ TransactionCategory2["INVENTORY_ADJUSTMENT"] = "inventory_adjustment";
37
+ TransactionCategory2["COGS"] = "cogs";
38
+ TransactionCategory2["REFUND"] = "refund";
39
+ TransactionCategory2["SUBSCRIPTION"] = "subscription";
40
+ TransactionCategory2["PURCHASE"] = "purchase";
41
+ TransactionCategory2["RENT"] = "rent";
42
+ TransactionCategory2["UTILITIES"] = "utilities";
43
+ TransactionCategory2["EQUIPMENT"] = "equipment";
44
+ TransactionCategory2["SUPPLIES"] = "supplies";
45
+ TransactionCategory2["MAINTENANCE"] = "maintenance";
46
+ TransactionCategory2["MARKETING"] = "marketing";
47
+ TransactionCategory2["OTHER_EXPENSE"] = "other_expense";
48
+ TransactionCategory2["CAPITAL_INJECTION"] = "capital_injection";
49
+ TransactionCategory2["RETAINED_EARNINGS"] = "retained_earnings";
50
+ TransactionCategory2["TIP_INCOME"] = "tip_income";
51
+ TransactionCategory2["OTHER_INCOME"] = "other_income";
52
+ return TransactionCategory2;
53
+ })(TransactionCategory || {});
54
+ var TransactionType = /* @__PURE__ */ ((TransactionType2) => {
55
+ TransactionType2["INCOME"] = "income";
56
+ TransactionType2["EXPENSE"] = "expense";
57
+ return TransactionType2;
58
+ })(TransactionType || {});
59
+
60
+ // src/transaction/api/transaction.ts
61
+ var TransactionApi = class extends BaseApi {
62
+ /**
63
+ * Get Profit & Loss Report
64
+ * Returns income (inflow), expenses (outflow), and net profit for a date range
65
+ */
66
+ async getProfitLoss(params = {}, options = {}) {
67
+ return this.request("GET", `${this.baseUrl}/reports/profit-loss`, {
68
+ params,
69
+ ...options
70
+ });
71
+ }
72
+ /**
73
+ * Get Cash Flow Report
74
+ * Returns monthly inflow, outflow, and net trend
75
+ */
76
+ async getCashFlow(params = {}, options = {}) {
77
+ return this.request("GET", `${this.baseUrl}/reports/cash-flow`, {
78
+ params,
79
+ ...options
80
+ });
81
+ }
82
+ /**
83
+ * Get Category Breakdown
84
+ * Returns top spending/income categories for a date range
85
+ * Filter by flow='inflow' for income categories, flow='outflow' for expense categories
86
+ */
87
+ async getCategoryReport(params = {}, options = {}) {
88
+ return this.request("GET", `${this.baseUrl}/reports/categories`, {
89
+ params,
90
+ ...options
91
+ });
92
+ }
93
+ /**
94
+ * Get Statement Export
95
+ * Accountant-friendly export with branch + VAT invoice references
96
+ *
97
+ * @param params.format - 'csv' (default) or 'json'
98
+ * @returns CSV blob (format=csv) or StatementResponse (format=json)
99
+ */
100
+ async getStatement(params = {}, options = {}) {
101
+ if (params.format === "json") {
102
+ return this.request("GET", `${this.baseUrl}/statement`, {
103
+ params,
104
+ ...options
105
+ });
106
+ }
107
+ return this.request("GET", `${this.baseUrl}/statement`, {
108
+ params: { ...params, format: "csv" },
109
+ options: { responseType: "blob", ...options }
110
+ });
111
+ }
112
+ };
113
+ var transactionApi = new TransactionApi("transactions");
114
+ var transaction_default = transactionApi;
115
+ var TRANSACTION_KEYS = {
116
+ all: ["transactions"],
117
+ lists: () => [...TRANSACTION_KEYS.all, "list"],
118
+ list: (params) => [...TRANSACTION_KEYS.lists(), params],
119
+ details: () => [...TRANSACTION_KEYS.all, "detail"],
120
+ detail: (id) => [...TRANSACTION_KEYS.details(), id],
121
+ // Report keys
122
+ reports: () => [...TRANSACTION_KEYS.all, "reports"],
123
+ profitLoss: (params) => [...TRANSACTION_KEYS.reports(), "profit-loss", params],
124
+ cashFlow: (params) => [...TRANSACTION_KEYS.reports(), "cash-flow", params],
125
+ categories: (params) => [...TRANSACTION_KEYS.reports(), "categories", params],
126
+ statement: (params) => [...TRANSACTION_KEYS.reports(), "statement", params]
127
+ };
128
+ var transactionHooks = createCrudHooks({
129
+ api: transactionApi,
130
+ entityKey: "transactions",
131
+ singular: "Transaction",
132
+ plural: "Transactions",
133
+ defaults: {
134
+ staleTime: 1 * 60 * 1e3
135
+ // 1 minute (transactions change frequently)
136
+ }
137
+ });
138
+ var {
139
+ useList: useTransactions,
140
+ useDetail: useTransactionDetail,
141
+ useActions: useTransactionActions,
142
+ useNavigation: useTransactionNavigation
143
+ } = transactionHooks;
144
+ function useProfitLoss(params, options = {}) {
145
+ return useQuery({
146
+ queryKey: TRANSACTION_KEYS.profitLoss(params),
147
+ queryFn: () => transactionApi.getProfitLoss(params),
148
+ enabled: options.enabled !== false,
149
+ staleTime: options.staleTime ?? 5 * 60 * 1e3
150
+ // 5 minutes
151
+ });
152
+ }
153
+ function useCashFlow(params = {}, options = {}) {
154
+ return useQuery({
155
+ queryKey: TRANSACTION_KEYS.cashFlow(params),
156
+ queryFn: () => transactionApi.getCashFlow(params),
157
+ enabled: options.enabled !== false,
158
+ staleTime: options.staleTime ?? 5 * 60 * 1e3
159
+ // 5 minutes
160
+ });
161
+ }
162
+ function useCategoryReport(params = {}, options = {}) {
163
+ return useQuery({
164
+ queryKey: TRANSACTION_KEYS.categories(params),
165
+ queryFn: () => transactionApi.getCategoryReport(params),
166
+ enabled: options.enabled !== false,
167
+ staleTime: options.staleTime ?? 5 * 60 * 1e3
168
+ // 5 minutes
169
+ });
170
+ }
171
+ function useStatement(params, options = {}) {
172
+ return useQuery({
173
+ queryKey: TRANSACTION_KEYS.statement(params),
174
+ queryFn: () => transactionApi.getStatement({ ...params, format: "json" }),
175
+ enabled: !!params.startDate && !!params.endDate && options.enabled !== false,
176
+ staleTime: options.staleTime ?? 5 * 60 * 1e3
177
+ // 5 minutes
178
+ });
179
+ }
180
+
181
+ export { TRANSACTION_KEYS, TransactionApi, TransactionCategory, TransactionFlow, TransactionStatus, TransactionType, transactionApi, transactionHooks, transaction_default, useCashFlow, useCategoryReport, useProfitLoss, useStatement, useTransactionActions, useTransactionDetail, useTransactionNavigation, useTransactions };
182
+ //# sourceMappingURL=chunk-AQAISI4F.js.map
183
+ //# sourceMappingURL=chunk-AQAISI4F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transaction/types/transaction.ts","../src/transaction/api/transaction.ts","../src/transaction/hooks/transaction.ts"],"names":["TransactionFlow","TransactionStatus","TransactionCategory","TransactionType"],"mappings":"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","file":"chunk-AQAISI4F.js","sourcesContent":["/**\n * Transaction Types\n *\n * Transactions track cashflow events across the system.\n * Used by: Orders, POS, Inventory, CRM, HRM, and manual entries.\n *\n * Sources:\n * - modules/transaction/transaction.model.js\n * - common/revenue/enums.js\n * - @classytic/revenue library\n *\n * Key concepts:\n * - `flow`: Direction of money ('inflow' = income, 'outflow' = expense)\n * - `type`: Category of transaction (order_purchase, refund, rent, etc.)\n * - Amounts in smallest unit (paisa for BDT)\n */\n\n// ============================================\n// PAYMENT ENUMS\n// ============================================\n\n/**\n * Payment methods supported by the system\n */\nexport type PaymentMethod =\n | 'cash'\n | 'bkash'\n | 'nagad'\n | 'rocket'\n | 'bank_transfer'\n | 'card'\n | 'online'\n | 'manual'\n | 'split';\n\nexport type PaymentGatewayType =\n | 'manual'\n | 'stripe'\n | 'sslcommerz'\n | 'bkash'\n | 'nagad';\n\n// ============================================\n// TRANSACTION FLOW (Money Direction)\n// ============================================\n\n/**\n * Transaction Flow - Direction of money movement\n * - inflow: Money coming in (sales, income, capital injection)\n * - outflow: Money going out (expenses, refunds, purchases)\n */\nexport enum TransactionFlow {\n INFLOW = 'inflow',\n OUTFLOW = 'outflow',\n}\n\nexport type TransactionFlowType = 'inflow' | 'outflow';\n\n// ============================================\n// TRANSACTION STATUS\n// ============================================\n\n/**\n * Transaction Status - Payment lifecycle states\n */\nexport enum TransactionStatus {\n PENDING = 'pending',\n PAYMENT_INITIATED = 'payment_initiated',\n PROCESSING = 'processing',\n REQUIRES_ACTION = 'requires_action',\n VERIFIED = 'verified',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n EXPIRED = 'expired',\n REFUNDED = 'refunded',\n PARTIALLY_REFUNDED = 'partially_refunded',\n}\n\nexport type TransactionStatusType =\n | 'pending'\n | 'payment_initiated'\n | 'processing'\n | 'requires_action'\n | 'verified'\n | 'completed'\n | 'failed'\n | 'cancelled'\n | 'expired'\n | 'refunded'\n | 'partially_refunded';\n\n// ============================================\n// TRANSACTION CATEGORIES (type field values)\n// ============================================\n\n/**\n * Transaction Categories\n *\n * The `type` field stores the category for reporting/grouping.\n * Flow is determined by `flow` field, not by category.\n *\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ INFLOW (Income) │ OUTFLOW (Expense) │\n * ├─────────────────────────────────┼───────────────────────────────┤\n * │ order_purchase (POS/Web sales) │ inventory_purchase (stock) │\n * │ wholesale_sale (B2B sales) │ purchase_return (refund recv) │\n * │ capital_injection │ cogs (cost of goods sold) │\n * │ retained_earnings │ rent, utilities, equipment... │\n * │ other_income │ inventory_loss │\n * │ tip_income (optional) │ marketing, maintenance... │\n * │ │ refund (customer refunds) │\n * └─────────────────────────────────┴───────────────────────────────┘\n */\nexport enum TransactionCategory {\n // ============ REVENUE CATEGORIES (INFLOW) ============\n ORDER_PURCHASE = 'order_purchase',\n ORDER_SUBSCRIPTION = 'order_subscription',\n WHOLESALE_SALE = 'wholesale_sale',\n PLATFORM_SUBSCRIPTION = 'platform_subscription',\n CREATOR_SUBSCRIPTION = 'creator_subscription',\n ENROLLMENT_PURCHASE = 'enrollment_purchase',\n ENROLLMENT_SUBSCRIPTION = 'enrollment_subscription',\n\n // ============ INVENTORY CATEGORIES ============\n INVENTORY_PURCHASE = 'inventory_purchase',\n PURCHASE_RETURN = 'purchase_return',\n INVENTORY_LOSS = 'inventory_loss',\n INVENTORY_ADJUSTMENT = 'inventory_adjustment',\n COGS = 'cogs',\n\n // ============ REFUNDS (OUTFLOW) ============\n REFUND = 'refund',\n SUBSCRIPTION = 'subscription',\n PURCHASE = 'purchase',\n\n // ============ OPERATIONAL EXPENSES (OUTFLOW) ============\n RENT = 'rent',\n UTILITIES = 'utilities',\n EQUIPMENT = 'equipment',\n SUPPLIES = 'supplies',\n MAINTENANCE = 'maintenance',\n MARKETING = 'marketing',\n OTHER_EXPENSE = 'other_expense',\n\n // ============ OPERATIONAL INCOME (INFLOW) ============\n CAPITAL_INJECTION = 'capital_injection',\n RETAINED_EARNINGS = 'retained_earnings',\n TIP_INCOME = 'tip_income',\n OTHER_INCOME = 'other_income',\n}\n\nexport type TransactionCategoryType =\n | 'order_purchase'\n | 'order_subscription'\n | 'wholesale_sale'\n | 'platform_subscription'\n | 'creator_subscription'\n | 'enrollment_purchase'\n | 'enrollment_subscription'\n | 'refund'\n | 'subscription'\n | 'purchase'\n | 'inventory_purchase'\n | 'purchase_return'\n | 'inventory_loss'\n | 'inventory_adjustment'\n | 'cogs'\n | 'rent'\n | 'utilities'\n | 'equipment'\n | 'supplies'\n | 'maintenance'\n | 'marketing'\n | 'other_expense'\n | 'capital_injection'\n | 'retained_earnings'\n | 'tip_income'\n | 'other_income';\n\n// ============================================\n// NESTED TYPES\n// ============================================\n\n/**\n * Transaction Split Payment - Individual payment in a split transaction\n * Different from POS SplitPaymentEntry which has additional UI state fields\n */\nexport interface TransactionSplitPayment {\n method: PaymentMethod;\n amount: number;\n reference?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Payment Details - For manual/split payments\n */\nexport interface TransactionPaymentDetails {\n provider?: string;\n walletNumber?: string;\n walletType?: 'personal' | 'merchant';\n trxId?: string;\n bankName?: string;\n accountNumber?: string;\n accountName?: string;\n proofUrl?: string;\n /** Split payment entries (when method is 'split') */\n payments?: TransactionSplitPayment[];\n}\n\n/**\n * Tax type for transactions\n */\nexport type TaxType = 'vat' | 'gst' | 'sales_tax' | 'income_tax' | 'withholding_tax' | 'none';\n\n/**\n * Tax Details for VAT/GST/Sales Tax tracking\n */\nexport interface TransactionTaxDetails {\n /** Tax type: vat, gst, sales_tax, etc. */\n type?: TaxType;\n /** Tax rate as decimal (0.15 = 15%) */\n rate?: number;\n /** Whether prices include tax (BD default: true) */\n isInclusive?: boolean;\n /** Tax jurisdiction code (e.g., 'BD' for Bangladesh) */\n jurisdiction?: string;\n}\n\n/**\n * Gateway Details - Payment provider info\n */\nexport interface TransactionGateway {\n type: PaymentGatewayType | string;\n provider?: string;\n sessionId?: string;\n paymentIntentId?: string;\n metadata?: Record<string, unknown>;\n verificationData?: Record<string, unknown>;\n}\n\n/**\n * Commission tracking for gateway/marketplace payments\n */\nexport interface TransactionCommission {\n /** Commission rate as decimal */\n rate?: number;\n /** Gross commission amount */\n grossAmount?: number;\n /** Gateway fee rate as decimal */\n gatewayFeeRate?: number;\n /** Gateway fee amount */\n gatewayFeeAmount?: number;\n /** Net commission amount (grossAmount - gatewayFeeAmount) */\n netAmount?: number;\n /** Commission status */\n status?: 'pending' | 'paid' | 'waived' | 'reversed';\n /** Affiliate tracking (optional) */\n affiliate?: {\n recipientId?: string;\n recipientType?: 'user' | 'organization' | 'partner';\n rate?: number;\n grossAmount?: number;\n netAmount?: number;\n };\n /** Multi-party commission splits (optional) */\n splits?: Array<{\n type?: string;\n recipientId?: string;\n rate?: number;\n grossAmount?: number;\n netAmount?: number;\n }>;\n}\n\n/**\n * Webhook tracking\n */\nexport interface TransactionWebhook {\n eventId?: string;\n eventType?: string;\n receivedAt?: string;\n processedAt?: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * Reconciliation tracking\n */\nexport interface TransactionReconciliation {\n isReconciled?: boolean;\n reconciledAt?: string;\n reconciledBy?: string;\n bankStatementRef?: string;\n}\n\n// ============================================\n// TRANSACTION DOCUMENT\n// ============================================\n\n/**\n * Transaction Document\n *\n * Key fields:\n * - flow: Direction of money (inflow/outflow)\n * - type: Category of transaction (order_purchase, refund, etc.)\n * - amount: Gross amount in smallest unit (paisa)\n * - fee: Platform/gateway fees deducted\n * - tax: VAT/tax portion (informational)\n * - net: amount - fee - tax (derived)\n */\nexport interface Transaction {\n _id: string;\n organizationId?: string;\n\n // ===== CLASSIFICATION =====\n /**\n * Flow direction: 'inflow' (money in) or 'outflow' (money out)\n * Use this for Income/Expense classification in UI\n */\n flow: TransactionFlowType;\n\n /**\n * Transaction category (e.g. 'order_purchase', 'refund', 'rent', 'cogs')\n * Note: Backend stores category in the 'type' field\n */\n type: TransactionCategoryType | string;\n\n /** Transaction status */\n status: TransactionStatusType | string;\n\n // ===== AMOUNTS (in smallest currency unit - paisa for BDT) =====\n /** Gross money that moved (in smallest unit, e.g. paisa) */\n amount: number;\n\n /** Currency code (default: 'BDT') */\n currency?: string;\n\n /** Platform/gateway fees deducted */\n fee?: number;\n\n /** VAT/tax portion (informational, for VAT reporting) */\n tax?: number;\n\n /** Net amount: amount - fee - tax */\n net?: number;\n\n /** Tax details for VAT/GST reporting */\n taxDetails?: TransactionTaxDetails;\n\n // ===== PARTIES =====\n customerId?: string | null;\n handledBy?: string | null;\n\n // ===== PAYMENT =====\n method: PaymentMethod | string;\n gateway?: TransactionGateway;\n paymentDetails?: TransactionPaymentDetails;\n\n // ===== REFERENCES =====\n /** Source model type (Order, Purchase, Manual) - polymorphic reference */\n sourceModel?: 'Order' | 'Purchase' | 'Manual' | string;\n /** Source document ID */\n sourceId?: string;\n /** Related transaction (for refunds linking to original) */\n relatedTransactionId?: string;\n\n // ===== SOURCE & BRANCH =====\n /** Source channel: where the transaction originated */\n source: 'web' | 'pos' | 'api';\n /** Branch reference ID */\n branch?: string;\n /** Branch code for display */\n branchCode?: string;\n\n // ===== COMMISSION & SPLITS =====\n /** Commission tracking for gateway payments */\n commission?: TransactionCommission;\n /** Revenue splits (for marketplace use) */\n splits?: Array<{\n recipientId?: string;\n recipientType?: string;\n type?: string;\n amount?: number;\n status?: string;\n paidAt?: string;\n }>;\n\n // ===== METADATA =====\n metadata?: Record<string, unknown>;\n description?: string;\n notes?: string;\n idempotencyKey?: string;\n webhook?: TransactionWebhook;\n\n // ===== TIMESTAMPS =====\n /** Actual transaction date (when it occurred) */\n date?: string;\n\n // Verification\n verifiedBy?: string;\n verifiedAt?: string;\n\n // Status timestamps\n initiatedAt?: string;\n completedAt?: string;\n paidAt?: string;\n failedAt?: string;\n failureReason?: string;\n\n // Refund tracking\n refundedAt?: string;\n refundedAmount?: number;\n refundReason?: string;\n\n // Reconciliation\n reconciliation?: TransactionReconciliation;\n\n // Standard timestamps\n createdAt: string;\n updatedAt: string;\n\n // ===== VIRTUALS =====\n isPaid?: boolean;\n amountInUnits?: number;\n}\n\n// ============================================\n// PAYLOADS\n// ============================================\n\n/**\n * Payload to create a Manual Transaction (OpEx, CapEx, etc.)\n * Most transactions are system-managed via order/POS flows.\n */\nexport interface CreateTransactionPayload {\n flow: TransactionFlowType;\n type: TransactionCategoryType | string;\n amount: number;\n method?: PaymentMethod | string;\n source?: 'web' | 'pos' | 'api';\n branch?: string;\n branchCode?: string;\n date?: string;\n notes?: string;\n description?: string;\n paymentDetails?: TransactionPaymentDetails;\n taxDetails?: TransactionTaxDetails;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Payload to update a Transaction (limited fields)\n * Editable correction fields (permissioned)\n */\nexport interface UpdateTransactionPayload {\n flow?: TransactionFlowType;\n type?: TransactionCategoryType | string;\n amount?: number;\n fee?: number;\n tax?: number;\n net?: number;\n method?: PaymentMethod | string;\n paymentDetails?: TransactionPaymentDetails;\n taxDetails?: TransactionTaxDetails;\n branch?: string;\n branchCode?: string;\n source?: 'web' | 'pos' | 'api';\n notes?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================\n// PAYMENT INTENT (returned with monetization-managed transactions)\n// ============================================\n\n/**\n * Payment Intent - Returned with order/POS transactions\n */\nexport interface PaymentIntent {\n id: string;\n provider: PaymentGatewayType | string;\n status: 'pending' | 'processing' | 'succeeded' | 'failed' | 'cancelled';\n /** Manual payment instructions */\n instructions?: {\n bkash?: string;\n nagad?: string;\n bank?: string;\n reference?: string;\n note?: string;\n };\n /** Stripe SDK client secret */\n clientSecret?: string | null;\n /** Redirect URL for hosted payment pages */\n paymentUrl?: string | null;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================\n// REPORT TYPES\n// ============================================\n\n/**\n * Financial Report Response (Profit & Loss)\n * Uses flow-based totals: inflow (income) vs outflow (expense)\n */\nexport interface FinancialReport {\n /** Total inflow (income) */\n income: number;\n /** Total outflow (expense) */\n expense: number;\n /** Net profit (income - expense) */\n net: number;\n /** Breakdown by category (type field) */\n breakdown: Record<string, number>;\n}\n\n/**\n * Cash Flow Report Response\n * Monthly trend of inflow vs outflow\n */\nexport interface CashFlowReport {\n months: Array<{\n month: string;\n /** Total inflow (income) for the month */\n inflow: number;\n /** Total outflow (expense) for the month */\n outflow: number;\n /** Net cash flow (inflow - outflow) */\n net: number;\n }>;\n}\n\n/**\n * Category Report Response\n */\nexport interface CategoryReport {\n categories: Array<{\n category: string;\n total: number;\n count: number;\n }>;\n}\n\n/**\n * Statement Row (for CSV/JSON export)\n */\nexport interface StatementRow {\n transactionId: string;\n transactionDate: string | null;\n createdAt: string | null;\n status: string;\n /** Flow direction: inflow/outflow */\n flow: string;\n /** Transaction category (type field) */\n type: string;\n source: string;\n branchCode: string | null;\n branchId: string | null;\n method: string;\n /** Gross amount in BDT (converted from paisa) */\n amountBdt: number;\n /** Fee amount in BDT */\n feeBdt?: number;\n /** Tax amount in BDT */\n taxBdt?: number;\n /** Net amount in BDT (amount - fee - tax) */\n netBdt?: number;\n currency: string;\n /** Source model (Order, Purchase, Manual) */\n sourceModel?: string;\n /** Source document ID */\n sourceId?: string | null;\n orderId: string | null;\n orderCustomerName: string | null;\n vatInvoiceNumber: string | null;\n vatSellerBin: string | null;\n paymentReference: string | null;\n narration: string | null;\n}\n\n/**\n * Statement Export Response (JSON format)\n */\nexport interface StatementResponse {\n success: boolean;\n count: number;\n data: StatementRow[];\n}\n\n// ============================================\n// DEPRECATED TYPES (for backwards compatibility)\n// ============================================\n\n/**\n * @deprecated Use TransactionFlow instead. Backend uses flow (inflow/outflow).\n */\nexport enum TransactionType {\n INCOME = 'income',\n EXPENSE = 'expense',\n}\n","/**\n * Transaction API Client\n *\n * Transactions track cashflow events (money in/out) across the system.\n * Used by: Orders, POS, Inventory, CRM, HRM, and manual entries.\n *\n * CRUD (via BaseApi):\n * - getAll(params) - List transactions\n * - getById(id) - Get transaction\n * - create(payload) - Create manual transaction (staff only)\n * - update(id, payload) - Update transaction (limited fields)\n * - delete(id) - Delete transaction (admin/superadmin only)\n *\n * Reports:\n * - getProfitLoss(params) - P&L statement\n * - getCashFlow(params) - Monthly trend\n * - getCategoryReport(params) - Category breakdown\n *\n * Export:\n * - getStatement(params) - CSV/JSON export for accountants\n */\n\nimport { BaseApi } from '../../core/api-factory';\nimport type {\n Transaction,\n CreateTransactionPayload,\n UpdateTransactionPayload,\n FinancialReport,\n CashFlowReport,\n CategoryReport,\n StatementResponse,\n} from '../types/transaction';\n\n/**\n * Statement Query Params\n */\nexport interface StatementParams {\n startDate?: string;\n endDate?: string;\n branchId?: string;\n source?: 'web' | 'pos' | 'api';\n status?: string;\n format?: 'csv' | 'json';\n [key: string]: unknown;\n}\n\n/**\n * Report Query Params\n */\nexport interface ReportParams {\n startDate?: string;\n endDate?: string;\n branchId?: string;\n [key: string]: unknown;\n}\n\nexport interface CashFlowParams {\n months?: number; // 1-12, default: 6\n branchId?: string;\n [key: string]: unknown;\n}\n\nexport interface CategoryParams extends ReportParams {\n flow?: 'inflow' | 'outflow';\n limit?: number; // default: 10\n}\n\nclass TransactionApi extends BaseApi<Transaction, CreateTransactionPayload, UpdateTransactionPayload> {\n\n /**\n * Get Profit & Loss Report\n * Returns income (inflow), expenses (outflow), and net profit for a date range\n */\n async getProfitLoss(params: ReportParams = {}, options = {}) {\n return this.request<FinancialReport>('GET', `${this.baseUrl}/reports/profit-loss`, {\n params,\n ...options,\n });\n }\n\n /**\n * Get Cash Flow Report\n * Returns monthly inflow, outflow, and net trend\n */\n async getCashFlow(params: CashFlowParams = {}, options = {}) {\n return this.request<CashFlowReport>('GET', `${this.baseUrl}/reports/cash-flow`, {\n params,\n ...options,\n });\n }\n\n /**\n * Get Category Breakdown\n * Returns top spending/income categories for a date range\n * Filter by flow='inflow' for income categories, flow='outflow' for expense categories\n */\n async getCategoryReport(params: CategoryParams = {}, options = {}) {\n return this.request<CategoryReport>('GET', `${this.baseUrl}/reports/categories`, {\n params,\n ...options,\n });\n }\n\n /**\n * Get Statement Export\n * Accountant-friendly export with branch + VAT invoice references\n *\n * @param params.format - 'csv' (default) or 'json'\n * @returns CSV blob (format=csv) or StatementResponse (format=json)\n */\n async getStatement(params: StatementParams = {}, options = {}) {\n if (params.format === 'json') {\n return this.request<StatementResponse>('GET', `${this.baseUrl}/statement`, {\n params,\n ...options,\n });\n }\n // For CSV, caller should handle blob response\n return this.request<Blob>('GET', `${this.baseUrl}/statement`, {\n params: { ...params, format: 'csv' },\n options: { responseType: 'blob', ...options },\n });\n }\n}\n\nexport const transactionApi = new TransactionApi('transactions');\nexport { TransactionApi };\nexport default transactionApi;\n","\"use client\";\n\n/**\n * Transaction Hooks\n *\n * React hooks for transaction CRUD operations and reports.\n * Transactions are used across the system for cashflow tracking.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { createCrudHooks, type CrudApi } from \"../../core/react\";\nimport { transactionApi } from \"../api/transaction\";\nimport type { Transaction, CreateTransactionPayload, UpdateTransactionPayload } from \"../types/transaction\";\nimport type {\n FinancialReport,\n CashFlowReport,\n CategoryReport,\n StatementResponse,\n} from \"../types/transaction\";\nimport type {\n ReportParams,\n CashFlowParams,\n CategoryParams,\n StatementParams,\n} from \"../api/transaction\";\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// Query Keys\n// ============================================\n\nexport const TRANSACTION_KEYS = {\n all: [\"transactions\"] as const,\n lists: () => [...TRANSACTION_KEYS.all, \"list\"] as const,\n list: (params: Record<string, unknown>) => [...TRANSACTION_KEYS.lists(), params] as const,\n details: () => [...TRANSACTION_KEYS.all, \"detail\"] as const,\n detail: (id: string) => [...TRANSACTION_KEYS.details(), id] as const,\n // Report keys\n reports: () => [...TRANSACTION_KEYS.all, \"reports\"] as const,\n profitLoss: (params: ReportParams) => [...TRANSACTION_KEYS.reports(), \"profit-loss\", params] as const,\n cashFlow: (params: CashFlowParams) => [...TRANSACTION_KEYS.reports(), \"cash-flow\", params] as const,\n categories: (params: CategoryParams) => [...TRANSACTION_KEYS.reports(), \"categories\", params] as const,\n statement: (params: StatementParams) => [...TRANSACTION_KEYS.reports(), \"statement\", params] as const,\n};\n\n// ============================================\n// CRUD Hooks (via factory)\n// ============================================\n\n/**\n * Transaction CRUD hooks using createCrudHooks factory\n *\n * Provides:\n * - useTransactions: List transactions with filtering/pagination\n * - useTransactionDetail: Get single transaction\n * - useTransactionActions: Create, update, delete mutations\n * - useTransactionNavigation: Navigation between transactions\n */\nexport const transactionHooks = createCrudHooks<Transaction, CreateTransactionPayload, UpdateTransactionPayload>({\n api: transactionApi as AnyApi,\n entityKey: \"transactions\",\n singular: \"Transaction\",\n plural: \"Transactions\",\n defaults: {\n staleTime: 1 * 60 * 1000, // 1 minute (transactions change frequently)\n },\n});\n\nexport const {\n useList: useTransactions,\n useDetail: useTransactionDetail,\n useActions: useTransactionActions,\n useNavigation: useTransactionNavigation,\n} = transactionHooks;\n\n// ============================================\n// Report Hooks\n// ============================================\n\ninterface QueryOptions {\n enabled?: boolean;\n staleTime?: number;\n}\n\n/**\n * Fetch Profit & Loss report\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useProfitLoss({\n * startDate: '2024-01-01',\n * endDate: '2024-12-31',\n * });\n *\n * return (\n * <div>\n * <p>Income: {data?.income}</p>\n * <p>Expense: {data?.expense}</p>\n * <p>Net: {data?.net}</p>\n * </div>\n * );\n * ```\n */\nexport function useProfitLoss(params: ReportParams, options: QueryOptions = {}) {\n return useQuery<FinancialReport>({\n queryKey: TRANSACTION_KEYS.profitLoss(params),\n queryFn: () => transactionApi.getProfitLoss(params),\n enabled: options.enabled !== false,\n staleTime: options.staleTime ?? 5 * 60 * 1000, // 5 minutes\n });\n}\n\n/**\n * Fetch Cash Flow report (monthly trend)\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useCashFlow({ months: 6 });\n *\n * return (\n * <BarChart data={data?.months} />\n * );\n * ```\n */\nexport function useCashFlow(params: CashFlowParams = {}, options: QueryOptions = {}) {\n return useQuery<CashFlowReport>({\n queryKey: TRANSACTION_KEYS.cashFlow(params),\n queryFn: () => transactionApi.getCashFlow(params),\n enabled: options.enabled !== false,\n staleTime: options.staleTime ?? 5 * 60 * 1000, // 5 minutes\n });\n}\n\n/**\n * Fetch Category breakdown report\n *\n * @example\n * ```tsx\n * // Get expense categories\n * const { data } = useCategoryReport({ flow: 'outflow', limit: 10 });\n *\n * return (\n * <PieChart data={data?.categories} />\n * );\n * ```\n */\nexport function useCategoryReport(params: CategoryParams = {}, options: QueryOptions = {}) {\n return useQuery<CategoryReport>({\n queryKey: TRANSACTION_KEYS.categories(params),\n queryFn: () => transactionApi.getCategoryReport(params),\n enabled: options.enabled !== false,\n staleTime: options.staleTime ?? 5 * 60 * 1000, // 5 minutes\n });\n}\n\n/**\n * Fetch Statement export (JSON format)\n *\n * @example\n * ```tsx\n * const { data } = useStatement({\n * startDate: '2024-01-01',\n * endDate: '2024-12-31',\n * format: 'json',\n * });\n *\n * return (\n * <DataTable data={data?.data} />\n * );\n * ```\n */\nexport function useStatement(params: StatementParams, options: QueryOptions = {}) {\n return useQuery<StatementResponse>({\n queryKey: TRANSACTION_KEYS.statement(params),\n queryFn: () => transactionApi.getStatement({ ...params, format: 'json' }) as Promise<StatementResponse>,\n enabled: !!params.startDate && !!params.endDate && options.enabled !== false,\n staleTime: options.staleTime ?? 5 * 60 * 1000, // 5 minutes\n });\n}\n"]}