@mohasinac/appkit 4.59.0 → 4.60.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 (532) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
  3. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
  4. package/dist/_internal/server/features/brands/actions.js +78 -4
  5. package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
  6. package/dist/_internal/server/features/checkout/actions.js +668 -183
  7. package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
  8. package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
  9. package/dist/_internal/server/features/gateway-events/index.js +10 -0
  10. package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
  11. package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
  12. package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
  13. package/dist/_internal/server/features/gateway-events/redact.js +151 -0
  14. package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
  15. package/dist/_internal/server/features/grievance/actions.js +173 -0
  16. package/dist/_internal/server/features/grievance/index.d.ts +8 -0
  17. package/dist/_internal/server/features/grievance/index.js +8 -0
  18. package/dist/_internal/server/features/grouped/data.js +28 -3
  19. package/dist/_internal/server/features/lottery/actions.js +99 -4
  20. package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
  21. package/dist/_internal/server/features/order-completion/actions.js +336 -0
  22. package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
  23. package/dist/_internal/server/features/order-completion/index.js +7 -0
  24. package/dist/_internal/server/features/orders/actions.d.ts +13 -0
  25. package/dist/_internal/server/features/orders/actions.js +56 -2
  26. package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
  27. package/dist/_internal/server/features/orders/adapters.js +44 -0
  28. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
  29. package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
  30. package/dist/_internal/server/features/orders/index.d.ts +2 -1
  31. package/dist/_internal/server/features/orders/index.js +1 -1
  32. package/dist/_internal/server/features/orders/service.d.ts +60 -0
  33. package/dist/_internal/server/features/orders/service.js +74 -0
  34. package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
  35. package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
  36. package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
  37. package/dist/_internal/server/features/payment-cases/index.js +9 -0
  38. package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
  39. package/dist/_internal/server/features/payouts/actions.js +84 -10
  40. package/dist/_internal/server/features/points/adjust.d.ts +61 -0
  41. package/dist/_internal/server/features/points/adjust.js +121 -0
  42. package/dist/_internal/server/features/points/award.d.ts +65 -0
  43. package/dist/_internal/server/features/points/award.js +145 -0
  44. package/dist/_internal/server/features/price-index/market.d.ts +33 -0
  45. package/dist/_internal/server/features/price-index/market.js +54 -1
  46. package/dist/_internal/server/features/products/data.js +40 -22
  47. package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
  48. package/dist/_internal/server/features/protection-claims/actions.js +228 -0
  49. package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
  50. package/dist/_internal/server/features/protection-claims/index.js +8 -0
  51. package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
  52. package/dist/_internal/server/features/refunds/actions.js +259 -17
  53. package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
  54. package/dist/_internal/server/features/refunds/capacity.js +37 -0
  55. package/dist/_internal/server/features/reviews/actions.js +3 -2
  56. package/dist/_internal/server/features/search/index-build/sources.js +20 -1
  57. package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
  58. package/dist/_internal/server/features/shipping/reconcile.js +34 -3
  59. package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
  60. package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
  61. package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
  62. package/dist/_internal/server/features/stores/tabs.js +24 -4
  63. package/dist/_internal/server/functions/https.d.ts +31 -1
  64. package/dist/_internal/server/functions/https.js +52 -1
  65. package/dist/_internal/server/functions/scheduled.d.ts +72 -1
  66. package/dist/_internal/server/functions/scheduled.js +124 -1
  67. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
  68. package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
  69. package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
  70. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
  71. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
  72. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
  73. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/core/index.js +2 -0
  75. package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
  76. package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
  77. package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
  78. package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
  79. package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
  80. package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
  81. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
  83. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
  84. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
  85. package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
  86. package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
  87. package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
  88. package/dist/_internal/server/jobs/handlers/index.js +5 -0
  89. package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
  90. package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
  91. package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
  92. package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
  93. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
  94. package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
  95. package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
  96. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  97. package/dist/_internal/shared/actions/action-registry.js +71 -0
  98. package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
  99. package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
  100. package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
  101. package/dist/_internal/shared/checkout/lanes.js +46 -0
  102. package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
  103. package/dist/_internal/shared/checkout/order-math.js +251 -3
  104. package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
  105. package/dist/_internal/shared/checkout/refundable-base.js +122 -0
  106. package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
  107. package/dist/_internal/shared/features/auctions/config.js +30 -1
  108. package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
  109. package/dist/_internal/shared/features/brands/schema.js +18 -0
  110. package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
  111. package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
  112. package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
  113. package/dist/_internal/shared/features/print/label-profiles.js +350 -0
  114. package/dist/_internal/shared/features/products/to-product-item.js +33 -5
  115. package/dist/_internal/shared/fees/calculator.d.ts +31 -2
  116. package/dist/_internal/shared/fees/calculator.js +103 -5
  117. package/dist/_internal/shared/fees/india-states.d.ts +195 -0
  118. package/dist/_internal/shared/fees/india-states.js +190 -0
  119. package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
  120. package/dist/_internal/shared/fees/payout-hold.js +74 -0
  121. package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
  122. package/dist/_internal/shared/obligations/deadlines.js +155 -0
  123. package/dist/_internal/shared/shipping/quote.d.ts +96 -0
  124. package/dist/_internal/shared/shipping/quote.js +67 -0
  125. package/dist/_internal/shared/time/business-days.d.ts +91 -0
  126. package/dist/_internal/shared/time/business-days.js +185 -0
  127. package/dist/cli/index.js +0 -2
  128. package/dist/client.d.ts +10 -4
  129. package/dist/client.js +29 -3
  130. package/dist/configs/tailwind.d.ts +0 -12
  131. package/dist/configs/tailwind.js +28 -15
  132. package/dist/constants/api-endpoints.d.ts +51 -9
  133. package/dist/constants/api-endpoints.js +23 -7
  134. package/dist/constants/index.d.ts +1 -1
  135. package/dist/constants/index.js +1 -1
  136. package/dist/contracts/index.d.ts +1 -1
  137. package/dist/contracts/payment.d.ts +131 -0
  138. package/dist/features/about/components/AboutView.js +1 -1
  139. package/dist/features/about/components/DeveloperView.js +5 -2
  140. package/dist/features/about/components/FAQPageView.js +2 -1
  141. package/dist/features/about/components/FeesView.js +2 -1
  142. package/dist/features/about/components/HelpPageView.js +2 -1
  143. package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
  144. package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
  145. package/dist/features/about/components/HowEmiWorksView.js +2 -1
  146. package/dist/features/about/components/HowOffersWorkView.js +2 -1
  147. package/dist/features/about/components/HowOrdersWorkView.js +2 -1
  148. package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
  149. package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
  150. package/dist/features/about/components/HowReviewsWorkView.js +2 -1
  151. package/dist/features/about/components/PolicyPageView.js +2 -1
  152. package/dist/features/about/components/ProseHero.d.ts +73 -0
  153. package/dist/features/about/components/ProseHero.js +18 -0
  154. package/dist/features/about/components/SecurityPrivacyView.js +2 -1
  155. package/dist/features/about/components/ShippingPolicyView.js +2 -1
  156. package/dist/features/about/components/TrackOrderView.js +2 -1
  157. package/dist/features/about/components/UnauthorizedView.js +1 -1
  158. package/dist/features/about/index.d.ts +2 -0
  159. package/dist/features/about/index.js +5 -0
  160. package/dist/features/account/actions/address-actions.d.ts +26 -2
  161. package/dist/features/account/actions/address-actions.js +25 -1
  162. package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
  163. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  164. package/dist/features/account/components/UserOrdersView.js +17 -0
  165. package/dist/features/account/components/UserSidebar.js +1 -1
  166. package/dist/features/account/hooks/useNotifications.js +29 -0
  167. package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
  168. package/dist/features/admin/components/AdminBeysView.js +2 -2
  169. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  170. package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
  171. package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
  172. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
  173. package/dist/features/admin/components/AdminCategoriesView.js +1 -1
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
  175. package/dist/features/admin/components/AdminContactEditorView.js +1 -1
  176. package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
  177. package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
  178. package/dist/features/admin/components/AdminFaqsView.js +2 -2
  179. package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
  180. package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
  181. package/dist/features/admin/components/AdminGuideHubView.js +1 -1
  182. package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
  183. package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
  184. package/dist/features/admin/components/AdminPartsView.js +2 -2
  185. package/dist/features/admin/components/AdminProductsView.js +75 -4
  186. package/dist/features/admin/components/AdminSidebar.js +2 -2
  187. package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
  188. package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
  189. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  190. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  191. package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
  192. package/dist/features/admin/components/AdminUsersView.js +72 -1
  193. package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
  194. package/dist/features/admin/components/AdminViewCards.js +4 -4
  195. package/dist/features/admin/components/DataListingView.d.ts +28 -0
  196. package/dist/features/admin/components/DataListingView.js +175 -14
  197. package/dist/features/admin/components/DataTable.d.ts +12 -1
  198. package/dist/features/admin/components/DataTable.js +3 -3
  199. package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
  200. package/dist/features/admin/components/OwnerQuickActions.js +60 -2
  201. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
  202. package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
  203. package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
  204. package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
  205. package/dist/features/admin/components/index.d.ts +4 -0
  206. package/dist/features/admin/components/index.js +6 -0
  207. package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
  208. package/dist/features/admin/constants/filter-tabs.js +106 -0
  209. package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
  210. package/dist/features/admin/repository/site-settings.repository.js +82 -1
  211. package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
  212. package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
  213. package/dist/features/admin/schemas/firestore.js +5 -1
  214. package/dist/features/admin/schemas/site-settings-form.js +30 -1
  215. package/dist/features/auctions/actions/bid-actions.js +13 -1
  216. package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
  217. package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
  218. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
  219. package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
  220. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
  221. package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
  222. package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
  223. package/dist/features/audit-log/schemas/firestore.js +14 -0
  224. package/dist/features/auth/permissions/constants.d.ts +17 -1
  225. package/dist/features/auth/permissions/constants.js +18 -0
  226. package/dist/features/blog/components/BlogPostView.js +1 -1
  227. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
  228. package/dist/features/categories/api/[id]/description-template/route.js +107 -1
  229. package/dist/features/categories/components/BrandDetailPageView.js +2 -2
  230. package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
  231. package/dist/features/categories/components/BundleDetailView.js +1 -1
  232. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  233. package/dist/features/categories/components/CategoryForm.js +12 -1
  234. package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
  235. package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
  236. package/dist/features/categories/repository/market-price-index.repository.js +105 -0
  237. package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
  238. package/dist/features/categories/repository/price-observation.repository.js +132 -0
  239. package/dist/features/events/components/EventSaleBanner.js +1 -1
  240. package/dist/features/events/components/EventStatusBadge.js +1 -1
  241. package/dist/features/faq/components/FAQAccordion.js +2 -1
  242. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  243. package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
  244. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  245. package/dist/features/filters/FilterFacetSection.js +1 -1
  246. package/dist/features/filters/SwitchFilter.js +1 -1
  247. package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
  248. package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
  249. package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
  250. package/dist/features/gateway-events/schemas/firestore.js +125 -0
  251. package/dist/features/gateway-events/schemas/index.d.ts +81 -0
  252. package/dist/features/gateway-events/schemas/index.js +79 -0
  253. package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
  254. package/dist/features/homepage/components/AnnouncementBar.js +37 -1
  255. package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
  256. package/dist/features/homepage/components/BrandsSection.js +1 -1
  257. package/dist/features/homepage/components/CTABannerSection.js +1 -1
  258. package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
  259. package/dist/features/homepage/components/HeroCarousel.js +2 -2
  260. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  261. package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
  262. package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
  263. package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
  264. package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
  265. package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
  266. package/dist/features/inventory/components/ReceiveStationView.js +413 -0
  267. package/dist/features/inventory/components/operator-message.d.ts +29 -0
  268. package/dist/features/inventory/components/operator-message.js +41 -0
  269. package/dist/features/inventory/index.d.ts +13 -0
  270. package/dist/features/inventory/index.js +28 -0
  271. package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
  272. package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
  273. package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
  274. package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
  275. package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
  276. package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
  277. package/dist/features/inventory/schemas/firestore.d.ts +197 -0
  278. package/dist/features/inventory/schemas/firestore.js +159 -0
  279. package/dist/features/layout/AppLayoutShell.d.ts +12 -1
  280. package/dist/features/layout/AppLayoutShell.js +25 -12
  281. package/dist/features/layout/AutoBreadcrumbs.js +162 -3
  282. package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
  283. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  284. package/dist/features/layout/BottomNavbar.js +2 -2
  285. package/dist/features/media/MediaAvatar.js +1 -1
  286. package/dist/features/media/MediaImage.d.ts +24 -4
  287. package/dist/features/media/MediaImage.js +44 -4
  288. package/dist/features/media/MediaLightbox.js +1 -1
  289. package/dist/features/media/modals/ImageCropModal.js +1 -1
  290. package/dist/features/media/modals/ImageEditor.js +1 -1
  291. package/dist/features/media/upload/MediaUploadField.js +91 -3
  292. package/dist/features/obligations/constants/policies.d.ts +92 -0
  293. package/dist/features/obligations/constants/policies.js +378 -0
  294. package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
  295. package/dist/features/obligations/repository/obligations.repository.js +158 -0
  296. package/dist/features/obligations/schemas/firestore.d.ts +160 -0
  297. package/dist/features/obligations/schemas/firestore.js +87 -0
  298. package/dist/features/orders/actions/order-actions.d.ts +43 -4
  299. package/dist/features/orders/actions/order-actions.js +60 -3
  300. package/dist/features/orders/actions/refund-actions.js +70 -10
  301. package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
  302. package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
  303. package/dist/features/orders/components/OrdersList.js +2 -2
  304. package/dist/features/orders/components/RefundHistoryTable.js +3 -1
  305. package/dist/features/orders/components/index.d.ts +2 -0
  306. package/dist/features/orders/components/index.js +6 -0
  307. package/dist/features/orders/constants/transitions.d.ts +59 -0
  308. package/dist/features/orders/constants/transitions.js +104 -0
  309. package/dist/features/orders/repository/orders.repository.d.ts +109 -6
  310. package/dist/features/orders/repository/orders.repository.js +464 -21
  311. package/dist/features/orders/schemas/firestore.d.ts +270 -0
  312. package/dist/features/orders/schemas/firestore.js +24 -0
  313. package/dist/features/orders/schemas/index.d.ts +61 -0
  314. package/dist/features/orders/schemas/index.js +22 -0
  315. package/dist/features/orders/types/index.d.ts +79 -0
  316. package/dist/features/parts/components/PartsIndexPageView.js +8 -1
  317. package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
  318. package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
  319. package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
  320. package/dist/features/payment-cases/schemas/firestore.js +105 -0
  321. package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
  322. package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
  323. package/dist/features/payments/repository/payout.repository.d.ts +0 -1
  324. package/dist/features/payments/repository/payout.repository.js +0 -1
  325. package/dist/features/points/repository/points.repository.d.ts +122 -0
  326. package/dist/features/points/repository/points.repository.js +304 -1
  327. package/dist/features/points/schemas/adjust-form.d.ts +58 -0
  328. package/dist/features/points/schemas/adjust-form.js +63 -0
  329. package/dist/features/points/schemas/firestore.d.ts +108 -1
  330. package/dist/features/points/schemas/firestore.js +84 -0
  331. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
  332. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  333. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
  334. package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
  335. package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
  336. package/dist/features/price-index/market-stats.d.ts +82 -0
  337. package/dist/features/price-index/market-stats.js +230 -0
  338. package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
  339. package/dist/features/print/components/BoxLabelPrintView.js +66 -0
  340. package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
  341. package/dist/features/print/components/LabelProfilePicker.js +38 -0
  342. package/dist/features/print/components/labels.d.ts +117 -0
  343. package/dist/features/print/components/labels.js +258 -0
  344. package/dist/features/print/components/labels.style.css +46 -0
  345. package/dist/features/print/index.d.ts +6 -0
  346. package/dist/features/print/index.js +16 -0
  347. package/dist/features/products/columns/productTableColumns.js +5 -4
  348. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  349. package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
  350. package/dist/features/products/components/PrizeDrawCollage.js +1 -1
  351. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  352. package/dist/features/products/components/PrizeRevealModal.js +2 -2
  353. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  354. package/dist/features/products/components/ProductForm.js +34 -23
  355. package/dist/features/products/components/ProductGrid.js +86 -62
  356. package/dist/features/products/constants/card-badges.d.ts +97 -0
  357. package/dist/features/products/constants/card-badges.js +100 -0
  358. package/dist/features/products/repository/products.repository.js +34 -1
  359. package/dist/features/products/schemas/firestore.d.ts +46 -3
  360. package/dist/features/products/schemas/firestore.js +21 -0
  361. package/dist/features/promotions/components/PromotionsView.js +1 -1
  362. package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
  363. package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
  364. package/dist/features/promotions/schemas/firestore.js +30 -3
  365. package/dist/features/promotions/schemas/index.d.ts +6 -6
  366. package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
  367. package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
  368. package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
  369. package/dist/features/protection-claims/schemas/firestore.js +130 -0
  370. package/dist/features/reviews/actions/review-actions.js +3 -2
  371. package/dist/features/reviews/components/ReviewModal.js +1 -1
  372. package/dist/features/reviews/components/ReviewsList.js +1 -1
  373. package/dist/features/reviews/schemas/firestore.d.ts +20 -1
  374. package/dist/features/scams/constants/scam-types.d.ts +2 -0
  375. package/dist/features/scams/constants/scam-types.js +18 -0
  376. package/dist/features/scams/schemas/report-form.d.ts +3 -3
  377. package/dist/features/scams/schemas/report-form.js +26 -1
  378. package/dist/features/search/components/Search.js +9 -9
  379. package/dist/features/search/components/SearchResultsClient.js +18 -3
  380. package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
  381. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  382. package/dist/features/seller/actions/offer-actions.js +16 -1
  383. package/dist/features/seller/actions/seller-actions.js +14 -3
  384. package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
  385. package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
  386. package/dist/features/seller/components/PrintCenterView.js +41 -30
  387. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  388. package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
  389. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  390. package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
  391. package/dist/features/seller/components/SellerProductShell.js +123 -13
  392. package/dist/features/seller/components/SellerReviewsView.js +4 -2
  393. package/dist/features/seller/components/SellerSidebar.js +1 -1
  394. package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
  395. package/dist/features/seller/schemas/coupon-form.js +27 -0
  396. package/dist/features/seller/schemas/product-form.d.ts +3 -0
  397. package/dist/features/seller/schemas/product-form.js +5 -0
  398. package/dist/features/shell/FormShell.js +2 -2
  399. package/dist/features/shell/QuickFormDrawer.js +14 -0
  400. package/dist/features/shell/SectionForm.d.ts +19 -0
  401. package/dist/features/shell/SectionForm.js +133 -9
  402. package/dist/features/shell/SectionForm.style.css +54 -0
  403. package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
  404. package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
  405. package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
  406. package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
  407. package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
  408. package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
  409. package/dist/features/stores/components/StoreGuideHubView.js +1 -1
  410. package/dist/features/stores/components/StoreHeader.js +1 -1
  411. package/dist/features/support/schemas/firestore.d.ts +73 -2
  412. package/dist/features/support/schemas/firestore.js +59 -0
  413. package/dist/index.d.ts +16 -24
  414. package/dist/index.js +38 -47
  415. package/dist/next/ErrorBoundary.js +1 -1
  416. package/dist/next/routing/route-map.d.ts +24 -0
  417. package/dist/next/routing/route-map.js +40 -0
  418. package/dist/providers/payment-manual/index.d.ts +15 -1
  419. package/dist/providers/payment-manual/index.js +37 -0
  420. package/dist/providers/payment-phonepe/index.d.ts +14 -1
  421. package/dist/providers/payment-phonepe/index.js +36 -0
  422. package/dist/providers/payment-razorpay/index.d.ts +44 -1
  423. package/dist/providers/payment-razorpay/index.js +99 -0
  424. package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
  425. package/dist/providers/shipping-shiprocket/index.js +18 -0
  426. package/dist/schemas/registry.d.ts +44 -11
  427. package/dist/server-entry.d.ts +2 -0
  428. package/dist/server-entry.js +27 -0
  429. package/dist/server.d.ts +43 -0
  430. package/dist/server.js +98 -0
  431. package/dist/styles.css +418 -149
  432. package/dist/tailwind-utilities.css +1 -1
  433. package/dist/tokens/themes/default-dark.js +15 -12
  434. package/dist/tokens/themes/default-light.js +14 -11
  435. package/dist/tokens/tokens.css +106 -23
  436. package/dist/ui/DataTable.style.css +4 -4
  437. package/dist/ui/columns/cell-renderers.d.ts +20 -0
  438. package/dist/ui/columns/cell-renderers.js +26 -1
  439. package/dist/ui/columns/index.d.ts +1 -1
  440. package/dist/ui/columns/index.js +4 -1
  441. package/dist/ui/components/Badge.style.css +1 -1
  442. package/dist/ui/components/Breadcrumb.js +19 -1
  443. package/dist/ui/components/BulkActionBar.style.css +4 -4
  444. package/dist/ui/components/Button.style.css +1 -1
  445. package/dist/ui/components/Checkbox.style.css +1 -1
  446. package/dist/ui/components/FallbackShell.js +1 -1
  447. package/dist/ui/components/Form.d.ts +14 -1
  448. package/dist/ui/components/Form.js +2 -2
  449. package/dist/ui/components/FormField.js +18 -4
  450. package/dist/ui/components/FormField.style.css +43 -3
  451. package/dist/ui/components/GatedPrice.style.css +1 -1
  452. package/dist/ui/components/IconButton.style.css +1 -1
  453. package/dist/ui/components/Input.js +22 -1
  454. package/dist/ui/components/Input.style.css +38 -22
  455. package/dist/ui/components/ListingFilterDrawer.js +1 -1
  456. package/dist/ui/components/ListingToolbar.js +1 -1
  457. package/dist/ui/components/PaginatedSelect.js +0 -0
  458. package/dist/ui/components/Radio.style.css +1 -1
  459. package/dist/ui/components/Repeater.d.ts +53 -0
  460. package/dist/ui/components/Repeater.js +7 -0
  461. package/dist/ui/components/RichTextEditor.d.ts +20 -1
  462. package/dist/ui/components/RichTextEditor.js +23 -2
  463. package/dist/ui/components/Select.style.css +7 -21
  464. package/dist/ui/components/Semantic.js +27 -3
  465. package/dist/ui/components/TagInput.style.css +4 -9
  466. package/dist/ui/components/Textarea.style.css +4 -18
  467. package/dist/ui/components/Toggle.style.css +1 -1
  468. package/dist/ui/components/Typography.d.ts +3 -3
  469. package/dist/ui/components/Typography.js +15 -15
  470. package/dist/ui/components/ViewToggle.style.css +4 -4
  471. package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
  472. package/dist/ui/forms/AddAnotherToggle.js +56 -0
  473. package/dist/ui/forms/ColorPickerField.js +15 -2
  474. package/dist/ui/forms/FieldCheckbox.js +15 -2
  475. package/dist/ui/forms/FieldInput.d.ts +22 -1
  476. package/dist/ui/forms/FieldInput.js +19 -5
  477. package/dist/ui/forms/FieldLabel.d.ts +35 -0
  478. package/dist/ui/forms/FieldLabel.js +70 -0
  479. package/dist/ui/forms/FieldSelect.d.ts +4 -1
  480. package/dist/ui/forms/FieldSelect.js +27 -5
  481. package/dist/ui/forms/FieldTextarea.d.ts +4 -1
  482. package/dist/ui/forms/FieldTextarea.js +22 -5
  483. package/dist/ui/forms/FormShell.d.ts +17 -1
  484. package/dist/ui/forms/FormShell.js +36 -2
  485. package/dist/ui/forms/FormShell.style.css +41 -33
  486. package/dist/ui/forms/index.d.ts +5 -1
  487. package/dist/ui/forms/index.js +2 -0
  488. package/dist/ui/icons/icon-registry.d.ts +1 -0
  489. package/dist/ui/icons/icon-registry.js +17 -1
  490. package/dist/utils/id-generators.d.ts +80 -0
  491. package/dist/utils/id-generators.js +93 -0
  492. package/dist/utils/search-txt-builders.d.ts +12 -0
  493. package/dist/utils/search-txt-builders.js +17 -0
  494. package/package.json +1 -1
  495. package/scripts/seed-cli.mjs +106 -5
  496. package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
  497. package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
  498. package/dist/features/loyalty/api/balance/route.d.ts +0 -12
  499. package/dist/features/loyalty/api/balance/route.js +0 -41
  500. package/dist/features/loyalty/api/earn/route.d.ts +0 -12
  501. package/dist/features/loyalty/api/earn/route.js +0 -38
  502. package/dist/features/loyalty/api/history/route.d.ts +0 -12
  503. package/dist/features/loyalty/api/history/route.js +0 -58
  504. package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
  505. package/dist/features/loyalty/api/redeem/route.js +0 -38
  506. package/dist/features/loyalty/columns/index.d.ts +0 -17
  507. package/dist/features/loyalty/columns/index.js +0 -40
  508. package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
  509. package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
  510. package/dist/features/loyalty/components/index.d.ts +0 -1
  511. package/dist/features/loyalty/components/index.js +0 -1
  512. package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
  513. package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
  514. package/dist/features/loyalty/index.d.ts +0 -6
  515. package/dist/features/loyalty/index.js +0 -6
  516. package/dist/features/loyalty/manifest.d.ts +0 -2
  517. package/dist/features/loyalty/manifest.js +0 -16
  518. package/dist/features/loyalty/messages/en.json +0 -19
  519. package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
  520. package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
  521. package/dist/features/loyalty/schemas/index.d.ts +0 -85
  522. package/dist/features/loyalty/schemas/index.js +0 -40
  523. package/dist/features/loyalty/server.d.ts +0 -6
  524. package/dist/features/loyalty/server.js +0 -6
  525. package/dist/features/loyalty/types/index.d.ts +0 -31
  526. package/dist/features/loyalty/types/index.js +0 -1
  527. package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
  528. package/dist/features/loyalty/types/loyalty-config.js +0 -1
  529. package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
  530. package/dist/features/loyalty/types/loyalty-math.js +0 -27
  531. package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
  532. package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
@@ -749,7 +749,28 @@ export interface ProductDocument extends BaseDocument {
749
749
  w: number;
750
750
  h: number;
751
751
  };
752
- /** Physical storage location for inventory management (Print & Label Center). */
752
+ /**
753
+ * @deprecated Free-text storage location. Superseded by `inventoryPlacements`.
754
+ *
755
+ * 🛑 READ-ONLY FROM 2026-10-21. Three uncontrolled text inputs with no
756
+ * registry behind them, so "shelf 3", "Shelf-3" and "AC60 3" all meant one
757
+ * place: no list could group them, no query could find everything on a
758
+ * shelf, and the label printed whichever spelling that one product carried.
759
+ * Three boxes a human types into cannot be made consistent by validation.
760
+ *
761
+ * Where something lives is now a PLACEMENT (`storageBoxes` +
762
+ * `inventoryPlacements`), which carries a quantity and permits one product
763
+ * in two boxes — neither expressible here.
764
+ *
765
+ * 🛑 NOT DELETED, AND THE REASON IS NOT TIMIDITY. The stored strings cannot
766
+ * be mechanically mapped to box codes — that impossibility is exactly why
767
+ * the registry exists — so an automatic migration would either invent boxes
768
+ * from free text or lose the data. Listings that carry a value still show it
769
+ * (the product form and the label both do) until a human has re-placed them
770
+ * in a real box. The inputs are gone, so nothing new accumulates;
771
+ * `audit-no-physical-location-input` keeps it that way, and the field goes
772
+ * when the last value does.
773
+ */
753
774
  physicalLocation?: {
754
775
  zone: string;
755
776
  shelf: string;
@@ -757,8 +778,30 @@ export interface ProductDocument extends BaseDocument {
757
778
  };
758
779
  /** Scannable barcode identifier linking this listing to a physical stickered item.
759
780
  * Auto-generated as `LIR-{8-char-hex}` on product creation when not supplied.
760
- * Override by scanning a pre-printed sticker during the create/edit flow. */
781
+ * Override by scanning a pre-printed sticker during the create/edit flow.
782
+ *
783
+ * 🛑 THE MACHINE KEY, and it must stay uniform-width. This field used to
784
+ * hold the semantic codes too — 23 seeded products carried
785
+ * `LIR-BEY-X-005` while everything app-created carried the SHA-1 form, so
786
+ * the audit found both printed in one list. Those moved to `sku`; see the
787
+ * note above `generateBarcodeId` for why the widths cannot share a field.
788
+ */
761
789
  barcodeId?: string;
790
+ /**
791
+ * The HUMAN key — a stock-keeping unit a person reads, says aloud and files
792
+ * by. `LIR-BURS-K3F9P` from `generateSku`, or whatever the seller authored.
793
+ *
794
+ * 🛑 Distinct from `barcodeId` ON PURPOSE, and the pair is the whole
795
+ * reconciliation of the audit's two-barcode finding. A barcode is scanned
796
+ * and must be fixed-width for a label to fit; a SKU is spoken and must be
797
+ * meaningful. One field could not be both, and was not.
798
+ *
799
+ * Optional, and absent on most live rows until the backfill runs
800
+ * (`appkit/scripts/backfill-sku.mjs`). 🛑 Nothing may assume its presence:
801
+ * the admin toolbar advertised SKU search for a field that did not exist at
802
+ * all, and every row read "No SKU" as a result.
803
+ */
804
+ sku?: string;
762
805
  /** Normalized edge-n-gram search field. Replaced `searchTokens`. */
763
806
  searchTxt?: string[];
764
807
  }
@@ -795,7 +838,7 @@ export declare const PRODUCT_COLLECTION: "products";
795
838
  export declare const PRODUCT_INDEXED_FIELDS: readonly ["storeId", "status", "category", "categoryIds", "featured", "listingType", "isPromoted", "isOnSale", "isSold", "searchTxt", "createdAt", "barcodeId", "physicalLocation.zone"];
796
839
  export declare const DEFAULT_PRODUCT_DATA: Partial<ProductDocument>;
797
840
  export declare const PRODUCT_PUBLIC_FIELDS: readonly ["allowOffers", "minOfferPercent", "id", "title", "description", "category", "categoryIds", "categoryIdNames", "subcategory", "brand", "price", "originalPrice", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "views7d", "views30d", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "madeToOrder", "sourceStickerSheetId", "sourceStickerPartOrdinal", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "groupMinMembers", "groupMaxMembers", "groupMaxUnitsPerMember", "groupRequiredMemberIds", "groupDiscountPercent", "createdAt"];
798
- export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "categoryIds", "subcategory", "brand", "price", "originalPrice", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "madeToOrder", "sourceStickerSheetId", "sourceStickerPartOrdinal", "allowShipBeforeEmiComplete", "gstRate", "hsnCode", "authenticity", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "groupMinMembers", "groupMaxMembers", "groupMaxUnitsPerMember", "groupRequiredMemberIds", "groupDiscountPercent", "barcodeId"];
841
+ export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "categoryIds", "subcategory", "brand", "price", "originalPrice", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "physicalLocation", "sku", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "madeToOrder", "sourceStickerSheetId", "sourceStickerPartOrdinal", "allowShipBeforeEmiComplete", "gstRate", "hsnCode", "authenticity", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "groupMinMembers", "groupMaxMembers", "groupMaxUnitsPerMember", "groupRequiredMemberIds", "groupDiscountPercent", "barcodeId"];
799
842
  export type ProductCreateInput = Omit<ProductDocument, "id" | "createdAt" | "updatedAt" | "availableQuantity" | "bidCount" | "currentBid" | "auctionOriginalEndDate">;
800
843
  export type ProductUpdateInput = Partial<Pick<ProductDocument, (typeof PRODUCT_UPDATABLE_FIELDS)[number]>>;
801
844
  export type ProductAdminUpdateInput = Partial<Omit<ProductDocument, "id" | "createdAt">>;
@@ -305,6 +305,27 @@ export const PRODUCT_UPDATABLE_FIELDS = [
305
305
  * (which both renderers read) was not in this list either. */
306
306
  "isLot",
307
307
  "lotSize",
308
+ /*
309
+ * 🛑 `physicalLocation` WAS MISSING, and the comment five lines above
310
+ * describes the identical defect one field over: "the form wrote
311
+ * `compareAtPrice`, nothing declared it, and `originalPrice` was not in
312
+ * this list either".
313
+ *
314
+ * `ProductForm` renders three inputs for it — zone, shelf, bin. They
315
+ * accept typing, they parse, and the repository dropped the whole object
316
+ * on every save, so 0 of the catalogue's products carry one. The field is
317
+ * declared on `ProductDocument`, and `physicalLocation.zone` is even in
318
+ * the searchable-field list, so everything existed except the one entry
319
+ * that lets a write through.
320
+ *
321
+ * Added rather than removing the inputs. Phase 5 of the current plan
322
+ * retires this field in favour of a box registry with a move ledger, and
323
+ * until that lands a working field is better than three inputs that lie —
324
+ * a seller who labels a shelf today should find it there tomorrow.
325
+ */
326
+ "physicalLocation",
327
+ // The human stock key. Seller-authored or generated; see ProductDocument.sku.
328
+ "sku",
308
329
  "pickupAddressId",
309
330
  "condition",
310
331
  "insurance",
@@ -7,7 +7,7 @@ export function PromotionsViewProductSection({ title, subtitle, renderProducts,
7
7
  }
8
8
  /** Slim hero banner for the promotions page — tabs + content live in the page. */
9
9
  export function PromotionsHero({ labels, heroBannerClass = "", }) {
10
- return (_jsx(Section, { color: "inverse", tone: "accent-banner", className: `${heroBannerClass}`, padding: "y-2-5xl", children: _jsxs(Div, { paddingX: "x-page", className: "max-w-5xl mx-auto text-left", children: [_jsxs(Text, { color: "inverse", className: "mb-2 tracking-widest", size: "sm", weight: "medium", transform: "uppercase", children: ["\uD83C\uDF89 ", labels.exclusiveOffersBadge] }), _jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: labels.title }), _jsx(Text, { color: "inverse", variant: "none", className: "/90 max-w-2xl mx-auto", size: "lg", children: labels.subtitle })] }) }));
10
+ return (_jsx(Section, { color: "inverse", tone: "accent-banner", className: `${heroBannerClass}`, padding: "y-2-5xl", children: _jsxs(Div, { paddingX: "x-page", className: "max-w-5xl mx-auto text-left", children: [_jsxs(Text, { color: "inverse", className: "mb-2 tracking-widest", size: "sm", weight: "medium", transform: "uppercase", children: ["\uD83C\uDF89 ", labels.exclusiveOffersBadge] }), _jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: labels.title }), _jsx(Text, { color: "inverse-muted", variant: "none", className: "max-w-2xl mx-auto", size: "lg", children: labels.subtitle })] }) }));
11
11
  }
12
12
  /** @deprecated Use PromotionsHero + per-tab content in your page instead. */
13
13
  export function PromotionsView({ labels, hasContent, heroBannerClass = "", renderCoupons, couponsCount = 0, renderDealsSection, renderFeaturedSection, }) {
@@ -21,6 +21,38 @@ export declare class ClaimedCouponsRepository extends BaseRepository<ClaimedCoup
21
21
  /** Idempotent claim — returns the existing claim if one already exists. */
22
22
  claim(input: ClaimedCouponCreateInput): Promise<ClaimedCouponDocument>;
23
23
  listForUser(userId: string): Promise<ClaimedCouponDocument[]>;
24
+ /**
25
+ * Re-sync every wallet copy of a coupon's snapshot after the source coupon
26
+ * is edited (D59).
27
+ *
28
+ * 🛑 WHY THIS EXISTS, and what the defect actually was — the plan overstates
29
+ * it and the correction matters.
30
+ *
31
+ * `ClaimedCouponDocument.couponSnapshot` is a denormalised copy of
32
+ * `discount` + `restrictions` + `type` + `scope`, so `/user/coupons` renders
33
+ * the wallet in ONE indexed read instead of N joins. Nothing re-synced it
34
+ * when an admin edited the source coupon, so it drifted — the mirror shape
35
+ * of Root Cause #42.
36
+ *
37
+ * The plan says the consequence is that "a spin/raffle win keeps the old
38
+ * terms". **It does not.** Verified: redemption goes
39
+ * `validateCouponForCart` → `_fetchAndValidateCoupon` →
40
+ * `getCouponByCode(code)`, which reads the LIVE `CouponDocument`. The
41
+ * snapshot is never consulted when money moves.
42
+ *
43
+ * So this is a DISPLAY defect, not a money one — and still worth fixing,
44
+ * because the wallet advertising "20% off" while checkout applies 10% is a
45
+ * trust problem and a support ticket. Calling it a money bug would have
46
+ * sent someone looking for an exploit that is not there.
47
+ *
48
+ * Re-syncing beats dropping the snapshot: rendering live would cost a join
49
+ * per wallet row, which is the exact thing the denormalisation buys.
50
+ *
51
+ * Best-effort by design — a failed re-sync must never fail the admin's
52
+ * coupon edit, which has already succeeded. The worst case is a stale
53
+ * DISPLAY, i.e. exactly today's behaviour.
54
+ */
55
+ resyncSnapshotsForCoupon(couponId: string, snapshot: ClaimedCouponSnapshot): Promise<number>;
24
56
  markUsed(userId: string, couponCode: string, orderId: string): Promise<void>;
25
57
  softRemove(userId: string, couponCode: string): Promise<void>;
26
58
  }
@@ -82,6 +82,64 @@ export class ClaimedCouponsRepository extends BaseRepository {
82
82
  throw new DatabaseError("Failed to list claimed coupons", error);
83
83
  }
84
84
  }
85
+ /**
86
+ * Re-sync every wallet copy of a coupon's snapshot after the source coupon
87
+ * is edited (D59).
88
+ *
89
+ * 🛑 WHY THIS EXISTS, and what the defect actually was — the plan overstates
90
+ * it and the correction matters.
91
+ *
92
+ * `ClaimedCouponDocument.couponSnapshot` is a denormalised copy of
93
+ * `discount` + `restrictions` + `type` + `scope`, so `/user/coupons` renders
94
+ * the wallet in ONE indexed read instead of N joins. Nothing re-synced it
95
+ * when an admin edited the source coupon, so it drifted — the mirror shape
96
+ * of Root Cause #42.
97
+ *
98
+ * The plan says the consequence is that "a spin/raffle win keeps the old
99
+ * terms". **It does not.** Verified: redemption goes
100
+ * `validateCouponForCart` → `_fetchAndValidateCoupon` →
101
+ * `getCouponByCode(code)`, which reads the LIVE `CouponDocument`. The
102
+ * snapshot is never consulted when money moves.
103
+ *
104
+ * So this is a DISPLAY defect, not a money one — and still worth fixing,
105
+ * because the wallet advertising "20% off" while checkout applies 10% is a
106
+ * trust problem and a support ticket. Calling it a money bug would have
107
+ * sent someone looking for an exploit that is not there.
108
+ *
109
+ * Re-syncing beats dropping the snapshot: rendering live would cost a join
110
+ * per wallet row, which is the exact thing the denormalisation buys.
111
+ *
112
+ * Best-effort by design — a failed re-sync must never fail the admin's
113
+ * coupon edit, which has already succeeded. The worst case is a stale
114
+ * DISPLAY, i.e. exactly today's behaviour.
115
+ */
116
+ async resyncSnapshotsForCoupon(couponId, snapshot) {
117
+ try {
118
+ /*
119
+ * Bounded at 500. A coupon claimed by more wallets than that is a
120
+ * campaign, and silently updating only the first page would be worse
121
+ * than saying so — the count is returned and the caller logs it.
122
+ */
123
+ const snap = await this.db
124
+ .collection(this.collection)
125
+ .where("couponId", "==", couponId)
126
+ .limit(500)
127
+ .get();
128
+ if (snap.empty)
129
+ return 0;
130
+ const writer = this.db.bulkWriter();
131
+ for (const doc of snap.docs) {
132
+ writer.update(doc.ref, { couponSnapshot: snapshot, updatedAt: new Date() });
133
+ }
134
+ await writer.close();
135
+ return snap.size;
136
+ }
137
+ catch (error) {
138
+ void normalizeError(error);
139
+ // Deliberately NOT thrown — see the docstring.
140
+ return 0;
141
+ }
142
+ }
85
143
  async markUsed(userId, couponCode, orderId) {
86
144
  const id = createClaimedCouponId(userId, couponCode);
87
145
  try {
@@ -204,18 +204,45 @@ export function calculateDiscount(coupon, orderTotal,
204
204
  lines) {
205
205
  if (coupon.discount.minPurchase && orderTotal < coupon.discount.minPurchase)
206
206
  return 0;
207
+ /*
208
+ * ── Tiered discounts ──────────────────────────────────────────────────────
209
+ *
210
+ * 🛑 `tiers` HAS BEEN ON `CouponDocument` SINCE IT SHIPPED, AND NOTHING EVER
211
+ * READ IT. `getTieredDiscount` existed, was exported from the barrel, and
212
+ * had ZERO callers — so a coupon carrying tiers was charged at its flat
213
+ * `discount.value` and the tiers did nothing at all. This is the reader.
214
+ *
215
+ * A tier REPLACES `discount.value` rather than adding to it, which is what
216
+ * its own field comment describes: "Percentage (0-100) when the coupon type
217
+ * === percentage; decimal rupees when type === fixed". So the tier is the
218
+ * value for that band, not a bonus on top.
219
+ *
220
+ * 🛑 Only `percentage` and `fixed` consult it. A BOGO's value lives in
221
+ * `bxgy` and free shipping is a shipping-line waiver, so neither has a
222
+ * `discount.value` for a tier to replace — applying one there would be
223
+ * inventing semantics the field does not define.
224
+ *
225
+ * 🛑 `> 0` means "a tier matched". `getTieredDiscount` returns 0 for all
226
+ * three of "no tiers", "no band matched" and "the matched band is worth
227
+ * zero", and those are indistinguishable in its signature. That is fine
228
+ * here ONLY because a zero-value tier is a no-op either way — it would
229
+ * discount nothing whether honoured or ignored. Do not reuse this test for
230
+ * anything where zero is a meaningful outcome.
231
+ */
232
+ const tieredValue = getTieredDiscount(coupon.tiers, orderTotal);
233
+ const effectiveValue = tieredValue > 0 ? tieredValue : coupon.discount.value;
207
234
  let discountAmount = 0;
208
235
  switch (coupon.type) {
209
236
  case "percentage":
210
- // audit-money-units-ok: percentage divisor (coupon.discount.value is 0-100), not paise
211
- discountAmount = (orderTotal * coupon.discount.value) / 100;
237
+ // audit-money-units-ok: percentage divisor (effectiveValue is 0-100), not paise
238
+ discountAmount = (orderTotal * effectiveValue) / 100;
212
239
  if (coupon.discount.maxDiscount &&
213
240
  discountAmount > coupon.discount.maxDiscount) {
214
241
  discountAmount = coupon.discount.maxDiscount;
215
242
  }
216
243
  break;
217
244
  case "fixed":
218
- discountAmount = Math.min(coupon.discount.value, orderTotal);
245
+ discountAmount = Math.min(effectiveValue, orderTotal);
219
246
  break;
220
247
  case "buy_x_get_y":
221
248
  // Needs the basket — see calculateBxgyDiscount. Capped at the total so a
@@ -34,11 +34,11 @@ export declare const tieredDiscountSchema: z.ZodObject<{
34
34
  minAmount: z.ZodEffects<z.ZodNumber, number, number>;
35
35
  discountValue: z.ZodNumber;
36
36
  }, "strip", z.ZodTypeAny, {
37
- discountValue: number;
38
37
  minAmount: number;
39
- }, {
40
38
  discountValue: number;
39
+ }, {
41
40
  minAmount: number;
41
+ discountValue: number;
42
42
  }>;
43
43
  export declare const usageConfigSchema: z.ZodObject<{
44
44
  totalLimit: z.ZodOptional<z.ZodNumber>;
@@ -177,11 +177,11 @@ export declare const couponFirestoreSchema: z.ZodObject<{
177
177
  minAmount: z.ZodEffects<z.ZodNumber, number, number>;
178
178
  discountValue: z.ZodNumber;
179
179
  }, "strip", z.ZodTypeAny, {
180
- discountValue: number;
181
180
  minAmount: number;
182
- }, {
183
181
  discountValue: number;
182
+ }, {
184
183
  minAmount: number;
184
+ discountValue: number;
185
185
  }>, "many">>;
186
186
  usage: z.ZodObject<{
187
187
  totalLimit: z.ZodOptional<z.ZodNumber>;
@@ -320,8 +320,8 @@ export declare const couponFirestoreSchema: z.ZodObject<{
320
320
  applicableCategories?: string[] | undefined;
321
321
  } | undefined;
322
322
  tiers?: {
323
- discountValue: number;
324
323
  minAmount: number;
324
+ discountValue: number;
325
325
  }[] | undefined;
326
326
  }, {
327
327
  code: string;
@@ -378,8 +378,8 @@ export declare const couponFirestoreSchema: z.ZodObject<{
378
378
  applicableCategories?: string[] | undefined;
379
379
  } | undefined;
380
380
  tiers?: {
381
- discountValue: number;
382
381
  minAmount: number;
382
+ discountValue: number;
383
383
  }[] | undefined;
384
384
  }>;
385
385
  export declare const couponUsageFirestoreSchema: z.ZodObject<{
@@ -0,0 +1,54 @@
1
+ import { BaseRepository } from "../../../providers/db-firebase";
2
+ import { type ProtectionClaimDocument, type ProtectionClaimReason, type ProtectionClaimStatus } from "../schemas/firestore";
3
+ import type { ClaimFinding, ClaimOutcome, ProtectionKind } from "../../../_internal/shared/features/shipping/protections";
4
+ export interface FileClaimInput {
5
+ kind: ProtectionKind;
6
+ orderId: string;
7
+ storeId: string;
8
+ buyerId: string;
9
+ reason: ProtectionClaimReason;
10
+ detail: string;
11
+ claimedAmount: number;
12
+ itemIds?: string[];
13
+ evidenceUrls?: string[];
14
+ isTestData?: boolean;
15
+ now?: Date;
16
+ }
17
+ export declare class ProtectionClaimsRepository extends BaseRepository<ProtectionClaimDocument> {
18
+ constructor();
19
+ /**
20
+ * File a claim. **Refuses a second claim on the same (order, kind).**
21
+ *
22
+ * 🛑 `.create()` with a deterministic id, and the refusal is a 409 rather
23
+ * than a silent no-op — the buyer needs to know their existing claim is the
24
+ * one being worked, not that their second attempt vanished.
25
+ *
26
+ * Why it matters more here than elsewhere: a protected sale claim is
27
+ * refunded **unconditionally** (`adjudicateClaim` refunds on a
28
+ * change-of-mind finding too, and only shifts who pays). So N claims on one
29
+ * order would be N refunds against the same goods.
30
+ */
31
+ file(input: FileClaimInput): Promise<ProtectionClaimDocument>;
32
+ /**
33
+ * Record the human finding and the outcome `adjudicateClaim` produced.
34
+ *
35
+ * 🛑 It does NOT move money. The refund is `processRefundAction`'s job, and
36
+ * keeping them apart is what lets the refund carry its own idempotency key
37
+ * — a claim that adjudicated and then failed to refund leaves a `upheld`
38
+ * claim with no `refundId`, which is a findable state rather than a lost one.
39
+ */
40
+ adjudicate(id: string, input: {
41
+ finding: ClaimFinding;
42
+ outcome: ClaimOutcome;
43
+ adjudicatedBy: string;
44
+ now?: Date;
45
+ }): Promise<void>;
46
+ /** Link the refund that settled this claim. */
47
+ attachRefund(id: string, refundId: string, now?: Date): Promise<void>;
48
+ setStatus(id: string, status: ProtectionClaimStatus, reason: string, now?: Date): Promise<void>;
49
+ findByOrderAndKind(orderId: string, kind: ProtectionKind): Promise<ProtectionClaimDocument | null>;
50
+ /** The admin queue: claims still needing work, oldest first. */
51
+ listActive(limit?: number): Promise<ProtectionClaimDocument[]>;
52
+ listForBuyer(buyerId: string, limit?: number): Promise<ProtectionClaimDocument[]>;
53
+ }
54
+ export declare function protectionClaimsRepository(): ProtectionClaimsRepository;
@@ -0,0 +1,174 @@
1
+ import { BaseRepository, prepareForFirestore } from "../../../providers/db-firebase/index.js";
2
+ import { normalizeError } from "../../../errors/normalize.js";
3
+ import { buildHistoryEntry } from "../../../_internal/shared/history/history.js";
4
+ import { ConflictError } from "../../../errors/index.js";
5
+ import { PROTECTION_CLAIMS_COLLECTION, PROTECTION_CLAIM_ACTIVE_STATUSES, PROTECTION_CLAIM_FIELDS, createProtectionClaimId, } from "../schemas/firestore.js";
6
+ const GRPC_ALREADY_EXISTS = 6;
7
+ function isAlreadyExists(err) {
8
+ if (typeof err !== "object" || err === null)
9
+ return false;
10
+ const code = err.code;
11
+ if (code === GRPC_ALREADY_EXISTS)
12
+ return true;
13
+ if (code === "already-exists" || code === "ALREADY_EXISTS")
14
+ return true;
15
+ const message = err.message;
16
+ return typeof message === "string" && message.includes("ALREADY_EXISTS");
17
+ }
18
+ export class ProtectionClaimsRepository extends BaseRepository {
19
+ constructor() {
20
+ super(PROTECTION_CLAIMS_COLLECTION);
21
+ }
22
+ /**
23
+ * File a claim. **Refuses a second claim on the same (order, kind).**
24
+ *
25
+ * 🛑 `.create()` with a deterministic id, and the refusal is a 409 rather
26
+ * than a silent no-op — the buyer needs to know their existing claim is the
27
+ * one being worked, not that their second attempt vanished.
28
+ *
29
+ * Why it matters more here than elsewhere: a protected sale claim is
30
+ * refunded **unconditionally** (`adjudicateClaim` refunds on a
31
+ * change-of-mind finding too, and only shifts who pays). So N claims on one
32
+ * order would be N refunds against the same goods.
33
+ */
34
+ async file(input) {
35
+ const now = input.now ?? new Date();
36
+ const id = createProtectionClaimId(input.orderId, input.kind);
37
+ const doc = {
38
+ id,
39
+ kind: input.kind,
40
+ orderId: input.orderId,
41
+ storeId: input.storeId,
42
+ buyerId: input.buyerId,
43
+ status: "open",
44
+ reason: input.reason,
45
+ detail: input.detail,
46
+ claimedAmount: input.claimedAmount,
47
+ ...(input.itemIds?.length ? { itemIds: input.itemIds } : {}),
48
+ ...(input.evidenceUrls?.length ? { evidenceUrls: input.evidenceUrls } : {}),
49
+ ...(input.isTestData ? { isTestData: true } : {}),
50
+ statusHistory: [
51
+ buildHistoryEntry({
52
+ actor: { role: "buyer", uid: input.buyerId },
53
+ trigger: `protectionClaim:file:${input.kind}`,
54
+ changes: { status: { from: null, to: "open" } },
55
+ reason: input.reason,
56
+ now,
57
+ }),
58
+ ],
59
+ createdAt: now,
60
+ updatedAt: now,
61
+ };
62
+ try {
63
+ await this.getCollection().doc(id).create(prepareForFirestore(doc));
64
+ return doc;
65
+ }
66
+ catch (err) {
67
+ if (isAlreadyExists(err)) {
68
+ void normalizeError(err);
69
+ throw new ConflictError(`A ${input.kind} protection claim is already open on this order. Add to that claim rather than filing a second one.`);
70
+ }
71
+ void normalizeError(err);
72
+ throw err;
73
+ }
74
+ }
75
+ /**
76
+ * Record the human finding and the outcome `adjudicateClaim` produced.
77
+ *
78
+ * 🛑 It does NOT move money. The refund is `processRefundAction`'s job, and
79
+ * keeping them apart is what lets the refund carry its own idempotency key
80
+ * — a claim that adjudicated and then failed to refund leaves a `upheld`
81
+ * claim with no `refundId`, which is a findable state rather than a lost one.
82
+ */
83
+ async adjudicate(id, input) {
84
+ const now = input.now ?? new Date();
85
+ const existing = await this.findById(id);
86
+ const status = input.outcome.refundBuyer ? "upheld" : "rejected";
87
+ await this.getCollection()
88
+ .doc(id)
89
+ .update({
90
+ status,
91
+ finding: input.finding,
92
+ outcome: {
93
+ refundBuyer: input.outcome.refundBuyer,
94
+ costBorneBy: input.outcome.costBorneBy,
95
+ raisesReport: input.outcome.raisesReport,
96
+ },
97
+ adjudicatedBy: input.adjudicatedBy,
98
+ adjudicatedAt: now,
99
+ updatedAt: now,
100
+ statusHistory: [
101
+ ...(existing?.statusHistory ?? []),
102
+ buildHistoryEntry({
103
+ actor: { role: "admin", uid: input.adjudicatedBy },
104
+ trigger: "protectionClaim:adjudicate",
105
+ changes: {
106
+ status: { from: existing?.status ?? null, to: status },
107
+ finding: { from: null, to: input.finding },
108
+ },
109
+ note: `cost borne by ${input.outcome.costBorneBy}`,
110
+ now,
111
+ }),
112
+ ],
113
+ });
114
+ }
115
+ /** Link the refund that settled this claim. */
116
+ async attachRefund(id, refundId, now = new Date()) {
117
+ try {
118
+ await this.getCollection().doc(id).update({ refundId, updatedAt: now });
119
+ }
120
+ catch (err) {
121
+ void normalizeError(err);
122
+ }
123
+ }
124
+ async setStatus(id, status, reason, now = new Date()) {
125
+ try {
126
+ const existing = await this.findById(id);
127
+ await this.getCollection()
128
+ .doc(id)
129
+ .update({
130
+ status,
131
+ updatedAt: now,
132
+ statusHistory: [
133
+ ...(existing?.statusHistory ?? []),
134
+ buildHistoryEntry({
135
+ actor: { role: "system" },
136
+ trigger: "protectionClaim:setStatus",
137
+ changes: { status: { from: existing?.status ?? null, to: status } },
138
+ reason,
139
+ now,
140
+ }),
141
+ ],
142
+ });
143
+ }
144
+ catch (err) {
145
+ void normalizeError(err);
146
+ }
147
+ }
148
+ async findByOrderAndKind(orderId, kind) {
149
+ return this.findById(createProtectionClaimId(orderId, kind));
150
+ }
151
+ /** The admin queue: claims still needing work, oldest first. */
152
+ async listActive(limit = 100) {
153
+ const snap = await this.getCollection()
154
+ .where(PROTECTION_CLAIM_FIELDS.STATUS, "in", [...PROTECTION_CLAIM_ACTIVE_STATUSES])
155
+ .orderBy(PROTECTION_CLAIM_FIELDS.CREATED_AT, "asc")
156
+ .limit(limit)
157
+ .get();
158
+ return snap.docs.map((d) => this.mapDoc(d));
159
+ }
160
+ async listForBuyer(buyerId, limit = 50) {
161
+ const snap = await this.getCollection()
162
+ .where(PROTECTION_CLAIM_FIELDS.BUYER_ID, "==", buyerId)
163
+ .orderBy(PROTECTION_CLAIM_FIELDS.CREATED_AT, "desc")
164
+ .limit(limit)
165
+ .get();
166
+ return snap.docs.map((d) => this.mapDoc(d));
167
+ }
168
+ }
169
+ let cached = null;
170
+ export function protectionClaimsRepository() {
171
+ if (!cached)
172
+ cached = new ProtectionClaimsRepository();
173
+ return cached;
174
+ }