@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
@@ -0,0 +1,229 @@
1
+ /**
2
+ * `paymentCases` — ONE operator queue for everything where money is at risk.
3
+ *
4
+ * ## Why one collection and not several
5
+ *
6
+ * A missing order, an unprocessed webhook, a chargeback, a refund mismatch and
7
+ * a dead job are different problems with the same audience: one person, once a
8
+ * day, asking "is anything wrong with the money". Three collections would mean
9
+ * three places to look and three chances to not look at one — and the one you
10
+ * forget is the one with the deadline.
11
+ *
12
+ * `kind` discriminates. Adding a seventh kind is a union edit, not a new
13
+ * collection.
14
+ *
15
+ * ## It mirrors `ReportDocument` on purpose
16
+ *
17
+ * `status` / `assignedTo` / `resolution` / `resolvedAt` / `entityType` /
18
+ * `entityId` are field-for-field the same as `store-extensions`'
19
+ * `ReportDocument`, so the admin list and detail views are a near-copy of the
20
+ * reports ones rather than a new UI. The four status values are identical too.
21
+ * Where it differs it is because a payment case has things a report does not: a
22
+ * **external deadline**, an **amount at risk**, and an **observation count**.
23
+ */
24
+ import type { BaseDocument } from "../../../_internal/shared/types/base-document";
25
+ import type { StatusChangeEntry } from "../../../_internal/shared/history/types";
26
+ export declare const PAYMENT_CASES_COLLECTION = "paymentCases";
27
+ /**
28
+ * What kind of problem this is.
29
+ *
30
+ * | kind | opened when |
31
+ * |---|---|
32
+ * | `missing_order` | the gateway has a captured payment and we have no order — **the D64 shape** |
33
+ * | `unprocessed_event` | a `gatewayEvents` row never reached a terminal status |
34
+ * | `status_conflict` | a late event would have regressed an order's status |
35
+ * | `dispute` | a chargeback. The only kind with a deadline we do not control |
36
+ * | `refund_mismatch` | the gateway's `amount_refunded` disagrees with our `refunds[]` |
37
+ * | `amount_mismatch` | captured amount ≠ the order's recorded total |
38
+ * | `dead_job` | a job exhausted its retries (Phase 8) |
39
+ * | `grievance` | a statutory grievance with a clock (Phase 10) |
40
+ * | `shipping_unpriced` | a store's shipping could not be priced, so we shipped free |
41
+ * | `manual_refund_due` | a cancellation owes money that no automatic rail can move |
42
+ * | `protection_claim` | a buyer claimed against cover they paid for |
43
+ * | `ledger_drift` | a buyer's points mirror disagreed with their ledger |
44
+ *
45
+ * 🛑 `shipping_unpriced` is a CONFIGURATION fault with a money consequence,
46
+ * which is why it belongs in this queue rather than in `serverErrors`. An
47
+ * `estimate`-mode store with no carrier rate quoted `unavailable`, which the
48
+ * checkout mapped to `shippingFee: 0` — so every parcel for that store shipped
49
+ * free at our expense, silently, for as long as nobody looked (D44). Keyed on
50
+ * the STORE, so a misconfigured seller produces one case however many
51
+ * checkouts hit them.
52
+ */
53
+ export type PaymentCaseKind = "missing_order" | "unprocessed_event" | "status_conflict" | "dispute" | "refund_mismatch" | "amount_mismatch" | "dead_job" | "grievance" | "shipping_unpriced"
54
+ /**
55
+ * A buyer has claimed against protection cover they paid for.
56
+ *
57
+ * 🛑 Its own kind rather than borrowed from `refund_mismatch`, which is what
58
+ * I reached for first and is wrong: a claim is not a disagreement with the
59
+ * gateway about refund totals, it is a human decision about who absorbs a
60
+ * loss. Filing it under a kind that means something else makes the queue's
61
+ * own filters lie, and the kind chips are what an operator triages by.
62
+ */
63
+ | "protection_claim"
64
+ /**
65
+ * A cancelled order owes the buyer money and nothing can move it
66
+ * automatically — see `_internal/server/features/orders/cancellation-refund.ts`.
67
+ *
68
+ * Three situations produce it, and they share this kind because they share
69
+ * the operator's next action (send money, record the reference): the order
70
+ * was paid by cash / UPI-manual / EMI so there is no gateway transaction to
71
+ * reverse; it was cancelled after dispatch, so how much is owed is a human
72
+ * decision about who bears the outbound leg; or the gateway refund was
73
+ * attempted and failed.
74
+ *
75
+ * 🛑 Distinct from `refund_mismatch`, which means the gateway and our
76
+ * `refunds[]` DISAGREE about a refund that happened. Here nothing has
77
+ * happened and that is the point. Filing this under a kind that means
78
+ * something else is the shortcut I took once already with protection claims,
79
+ * and it is attractive precisely because a plausible kind exists.
80
+ *
81
+ * The amount is on the order too (`refundAmount` + `refundStatus: "pending"`,
82
+ * written in the same patch as the cancellation), so the case and the order
83
+ * cannot disagree about what is owed — and the order carries it even if this
84
+ * write fails.
85
+ */
86
+ | "manual_refund_due"
87
+ /**
88
+ * A buyer's `users/{uid}.pointsBalance` mirror disagrees with the sum of
89
+ * their `pointsLedger` entries.
90
+ *
91
+ * The ledger is append-only and therefore authoritative; the mirror exists
92
+ * only so a balance read is one document instead of a scan. So drift always
93
+ * means the mirror is wrong — and the reconciler repairs it. The case is
94
+ * raised anyway, because **a repaired mirror hides the write path that broke
95
+ * it.** Root Cause #102 is the same shape one domain over: a counter that
96
+ * drifted silently, where nothing errored because a wrong number is just a
97
+ * number.
98
+ *
99
+ * 🛑 Its own kind rather than `amount_mismatch`, which means the GATEWAY and
100
+ * our order total disagree. Nothing external is involved here; this is two of
101
+ * our own records disagreeing. The kind chips are what an operator triages
102
+ * by, and the third time this file has had to say so.
103
+ *
104
+ * `severity: "warning"` not `"error"`: the buyer's spendable balance is
105
+ * whatever the repair sets it to, so no money is at risk by the time anyone
106
+ * reads the case — but a recurring one means a writer is losing entries.
107
+ * Keyed on the USER, so a persistently broken mirror is one case with a
108
+ * rising `observedCount` rather than a new row every night.
109
+ */
110
+ | "ledger_drift";
111
+ /**
112
+ * Identical to `ReportStatus`, deliberately — see the header. `actioned` means
113
+ * a human did something; `dismissed` means a human decided nothing was wrong.
114
+ * Both require a `resolution`.
115
+ */
116
+ export type PaymentCaseStatus = "open" | "under-review" | "actioned" | "dismissed";
117
+ /**
118
+ * Three values, matching `adminNotifications`' own severity vocabulary so one
119
+ * maps onto the other without a translation table.
120
+ *
121
+ * 🛑 Severity only ever ESCALATES — see `openOrObserve`. A reconciler that
122
+ * re-finds a problem it has already reported must not be able to quietly
123
+ * downgrade it.
124
+ */
125
+ export type PaymentCaseSeverity = "info" | "warning" | "error";
126
+ export interface PaymentCaseDocument extends BaseDocument {
127
+ kind: PaymentCaseKind;
128
+ status: PaymentCaseStatus;
129
+ severity: PaymentCaseSeverity;
130
+ /** Human-readable one-liner. The row an operator scans. */
131
+ title: string;
132
+ /** What was observed, in enough detail to act without opening the gateway. */
133
+ detail: string;
134
+ /** Mirrors `ReportDocument` — what the case is ABOUT. */
135
+ entityType: "order" | "payment" | "refund" | "event" | "job" | "store" | "user";
136
+ entityId: string;
137
+ /**
138
+ * The dedupe key, which is ALSO the document id.
139
+ *
140
+ * 🛑 Stored as a field as well, redundantly, because a Firestore id is not
141
+ * queryable as data — `where("dedupeKey","==",…)` is sometimes what a caller
142
+ * has, and `orderBy(documentId())` has its own restrictions. The redundancy
143
+ * is one short string and it is never written twice: `openOrObserve` derives
144
+ * both from the same value.
145
+ */
146
+ dedupeKey: string;
147
+ /** How many times a reconciler has independently re-found this problem. */
148
+ observedCount: number;
149
+ lastObservedAt: Date;
150
+ /**
151
+ * An EXTERNAL hard deadline, never an SLA we invented.
152
+ *
153
+ * 🛑 This is the field that justifies the collection existing. For a dispute
154
+ * it is the gateway's own `respond_by`: miss it and we lose by default,
155
+ * irrespective of who was right. For a grievance it is statutory. Nothing
156
+ * else sets it, and a case with no `dueAt` is a case with no clock — which is
157
+ * most of them, and that is correct.
158
+ */
159
+ dueAt?: Date;
160
+ /** Decimal rupees. What this case could cost if it goes the wrong way. */
161
+ amountAtRisk?: number;
162
+ assignedTo?: string;
163
+ resolution?: string;
164
+ resolvedAt?: Date;
165
+ resolvedBy?: string;
166
+ /**
167
+ * Set by a reconciler that no longer observes the problem.
168
+ *
169
+ * 🛑 This is NOT a resolution and must never be rendered as one. The UI shows
170
+ * "looks resolved — confirm?" and the case stays `open`. The distinction:
171
+ * "the symptom went away" and "a human understands why" are different facts,
172
+ * and on money the second is the one that matters. A self-healed
173
+ * `missing_order` might mean the retry worked — or might mean somebody
174
+ * refunded it by hand and the order will never exist.
175
+ */
176
+ selfHealedAt?: Date;
177
+ /** Gateway / event / order cross-references, for the detail view's links. */
178
+ gatewayEventIds?: string[];
179
+ orderIds?: string[];
180
+ gatewayPaymentId?: string;
181
+ statusHistory?: StatusChangeEntry[];
182
+ statusHistoryTruncated?: number;
183
+ }
184
+ export declare const PAYMENT_CASE_FIELDS: {
185
+ readonly ID: "id";
186
+ readonly KIND: "kind";
187
+ readonly STATUS: "status";
188
+ readonly SEVERITY: "severity";
189
+ readonly TITLE: "title";
190
+ readonly DETAIL: "detail";
191
+ readonly ENTITY_TYPE: "entityType";
192
+ readonly ENTITY_ID: "entityId";
193
+ readonly DEDUPE_KEY: "dedupeKey";
194
+ readonly OBSERVED_COUNT: "observedCount";
195
+ readonly LAST_OBSERVED_AT: "lastObservedAt";
196
+ readonly DUE_AT: "dueAt";
197
+ readonly AMOUNT_AT_RISK: "amountAtRisk";
198
+ readonly ASSIGNED_TO: "assignedTo";
199
+ readonly RESOLUTION: "resolution";
200
+ readonly RESOLVED_AT: "resolvedAt";
201
+ readonly RESOLVED_BY: "resolvedBy";
202
+ readonly SELF_HEALED_AT: "selfHealedAt";
203
+ readonly GATEWAY_PAYMENT_ID: "gatewayPaymentId";
204
+ };
205
+ /** Severity rank, for the escalate-only rule. */
206
+ export declare const PAYMENT_CASE_SEVERITY_RANK: Record<PaymentCaseSeverity, number>;
207
+ /** A resolution must say something. Ten characters is the same floor the admin offer-cancel reason uses. */
208
+ export declare const PAYMENT_CASE_RESOLUTION_MIN = 10;
209
+ /**
210
+ * Statuses a case can be in while still needing attention.
211
+ *
212
+ * 🛑 Exported so the digest, the escalation query and the retention exclusion
213
+ * all read ONE definition. Three hand-written copies of "which statuses are
214
+ * open" is how a case stops appearing in one of three places.
215
+ */
216
+ export declare const PAYMENT_CASE_ACTIVE_STATUSES: readonly PaymentCaseStatus[];
217
+ export declare const PAYMENT_CASE_KINDS: PaymentCaseKind[];
218
+ export declare const PAYMENT_CASE_STATUSES: PaymentCaseStatus[];
219
+ /**
220
+ * Build the dedupe key, which becomes the document id.
221
+ *
222
+ * 🛑 The key must identify THE PROBLEM, not the observation — that is the whole
223
+ * mechanism. `missing_order:pay_abc123` is the same problem whether a
224
+ * reconciler notices it once or thirty times, so thirty runs produce ONE case
225
+ * and ONE notification. Including a timestamp or a run id here would produce
226
+ * thirty cases and make the queue unusable within a week, which is the failure
227
+ * mode that makes operators stop opening it.
228
+ */
229
+ export declare function createPaymentCaseId(kind: PaymentCaseKind, subjectId: string): string;
@@ -0,0 +1,105 @@
1
+ /**
2
+ * `paymentCases` — ONE operator queue for everything where money is at risk.
3
+ *
4
+ * ## Why one collection and not several
5
+ *
6
+ * A missing order, an unprocessed webhook, a chargeback, a refund mismatch and
7
+ * a dead job are different problems with the same audience: one person, once a
8
+ * day, asking "is anything wrong with the money". Three collections would mean
9
+ * three places to look and three chances to not look at one — and the one you
10
+ * forget is the one with the deadline.
11
+ *
12
+ * `kind` discriminates. Adding a seventh kind is a union edit, not a new
13
+ * collection.
14
+ *
15
+ * ## It mirrors `ReportDocument` on purpose
16
+ *
17
+ * `status` / `assignedTo` / `resolution` / `resolvedAt` / `entityType` /
18
+ * `entityId` are field-for-field the same as `store-extensions`'
19
+ * `ReportDocument`, so the admin list and detail views are a near-copy of the
20
+ * reports ones rather than a new UI. The four status values are identical too.
21
+ * Where it differs it is because a payment case has things a report does not: a
22
+ * **external deadline**, an **amount at risk**, and an **observation count**.
23
+ */
24
+ export const PAYMENT_CASES_COLLECTION = "paymentCases";
25
+ export const PAYMENT_CASE_FIELDS = {
26
+ ID: "id",
27
+ KIND: "kind",
28
+ STATUS: "status",
29
+ SEVERITY: "severity",
30
+ TITLE: "title",
31
+ DETAIL: "detail",
32
+ ENTITY_TYPE: "entityType",
33
+ ENTITY_ID: "entityId",
34
+ DEDUPE_KEY: "dedupeKey",
35
+ OBSERVED_COUNT: "observedCount",
36
+ LAST_OBSERVED_AT: "lastObservedAt",
37
+ DUE_AT: "dueAt",
38
+ AMOUNT_AT_RISK: "amountAtRisk",
39
+ ASSIGNED_TO: "assignedTo",
40
+ RESOLUTION: "resolution",
41
+ RESOLVED_AT: "resolvedAt",
42
+ RESOLVED_BY: "resolvedBy",
43
+ SELF_HEALED_AT: "selfHealedAt",
44
+ GATEWAY_PAYMENT_ID: "gatewayPaymentId",
45
+ };
46
+ /** Severity rank, for the escalate-only rule. */
47
+ export const PAYMENT_CASE_SEVERITY_RANK = {
48
+ info: 0,
49
+ warning: 1,
50
+ error: 2,
51
+ };
52
+ /** A resolution must say something. Ten characters is the same floor the admin offer-cancel reason uses. */
53
+ export const PAYMENT_CASE_RESOLUTION_MIN = 10;
54
+ /**
55
+ * Statuses a case can be in while still needing attention.
56
+ *
57
+ * 🛑 Exported so the digest, the escalation query and the retention exclusion
58
+ * all read ONE definition. Three hand-written copies of "which statuses are
59
+ * open" is how a case stops appearing in one of three places.
60
+ */
61
+ export const PAYMENT_CASE_ACTIVE_STATUSES = [
62
+ "open",
63
+ "under-review",
64
+ ];
65
+ /**
66
+ * Runtime companions, keyed `Record<Union, true>` so BOTH mistakes are compile
67
+ * errors: a union member missing here, and a key here that is not a member. An
68
+ * array literal catches neither — which is how ten independent enumerations of
69
+ * `ListingType` came to disagree (Root Cause #61).
70
+ */
71
+ const PAYMENT_CASE_KIND_MAP = {
72
+ missing_order: true,
73
+ unprocessed_event: true,
74
+ status_conflict: true,
75
+ dispute: true,
76
+ refund_mismatch: true,
77
+ amount_mismatch: true,
78
+ dead_job: true,
79
+ grievance: true,
80
+ shipping_unpriced: true,
81
+ protection_claim: true,
82
+ manual_refund_due: true,
83
+ ledger_drift: true,
84
+ };
85
+ export const PAYMENT_CASE_KINDS = Object.keys(PAYMENT_CASE_KIND_MAP);
86
+ const PAYMENT_CASE_STATUS_MAP = {
87
+ open: true,
88
+ "under-review": true,
89
+ actioned: true,
90
+ dismissed: true,
91
+ };
92
+ export const PAYMENT_CASE_STATUSES = Object.keys(PAYMENT_CASE_STATUS_MAP);
93
+ /**
94
+ * Build the dedupe key, which becomes the document id.
95
+ *
96
+ * 🛑 The key must identify THE PROBLEM, not the observation — that is the whole
97
+ * mechanism. `missing_order:pay_abc123` is the same problem whether a
98
+ * reconciler notices it once or thirty times, so thirty runs produce ONE case
99
+ * and ONE notification. Including a timestamp or a run id here would produce
100
+ * thirty cases and make the queue unusable within a week, which is the failure
101
+ * mode that makes operators stop opening it.
102
+ */
103
+ export function createPaymentCaseId(kind, subjectId) {
104
+ return `${kind}:${subjectId}`.replace(/[^A-Za-z0-9_.:-]/g, "_").slice(0, 1500);
105
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The contract for resolving a payment case — ONE schema, three readers.
3
+ *
4
+ * ## Why a schema and not just the repository's check
5
+ *
6
+ * `PaymentCasesRepository.resolve()` already refuses a resolution shorter than
7
+ * `PAYMENT_CASE_RESOLUTION_MIN`, and that check is load-bearing and stays. But
8
+ * a runtime throw from the repository reaches the operator as a failed request
9
+ * after they have typed and submitted — the note is gone and the error has no
10
+ * field to land on, so it renders as a banner. That is precisely the shape
11
+ * `ReviewDecisionModal` was built to replace on the moderation and report
12
+ * surfaces.
13
+ *
14
+ * So the same floor is declared here, where the modal, the route and the
15
+ * repository can all read it:
16
+ *
17
+ * · the MODAL parses before submitting, so the message lands on the textarea;
18
+ * · the ROUTE parses the body, so a caller bypassing the UI gets a 400 with
19
+ * `issues` rather than a 500 from a repository assertion;
20
+ * · the REPOSITORY keeps its own assertion, because it is the last line and
21
+ * a schema cannot be relied on by a caller that does not use it.
22
+ *
23
+ * Modelled field-for-field on `reportReviewFormSchema`, which exists for the
24
+ * identical reason on a collection `PaymentCaseDocument` deliberately mirrors.
25
+ *
26
+ * ## 🛑 `resolvedBy` and `resolvedAt` are NOT fields, and that is the point
27
+ *
28
+ * `reportReviewFormSchema`'s header records what happened when a client was
29
+ * allowed to send its own `resolvedAt`: `new Date()` does not survive
30
+ * `JSON.stringify`, so an ISO **string** was written into a field declared
31
+ * `Date`, and the collection ended up holding both shapes for one field.
32
+ *
33
+ * Here it would be worse than a type split. `resolve()` asserts
34
+ * `resolvedBy !== "system"` — that assertion is the whole mechanism keeping a
35
+ * case human-closed — and a client-supplied `resolvedBy` would let any caller
36
+ * name itself whatever it liked. The server stamps both from the session.
37
+ *
38
+ * EXPORTS:
39
+ * paymentCaseResolveFormSchema, paymentCaseResolveUpdateSchema,
40
+ * PAYMENT_CASE_REVIEWER_STATUSES, type PaymentCaseResolveFormValues
41
+ *
42
+ * @tag domain:payment-cases
43
+ * @tag layer:schema
44
+ * @tag pattern:none
45
+ * @tag access:isomorphic
46
+ * @tag consumers:admin/money-cases,/api/admin/payment-cases/[id]
47
+ * @tag sideEffects:none
48
+ */
49
+ import { z } from "zod";
50
+ /**
51
+ * The statuses a human review can set. `open` is the state a case is born in
52
+ * and nothing may set it back — a case that has been looked at has been looked
53
+ * at.
54
+ *
55
+ * `satisfies readonly PaymentCaseStatus[]` rather than restated, so a value
56
+ * outside the real union is a COMPILE error instead of a chip that silently
57
+ * matches nothing (Root Cause #33).
58
+ */
59
+ export declare const PAYMENT_CASE_REVIEWER_STATUSES: readonly ["under-review", "actioned", "dismissed"];
60
+ /**
61
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
62
+ * by schema instance and every zod wrapper returns a new one.
63
+ */
64
+ export declare const paymentCaseResolveFormSchema: z.ZodEffects<z.ZodObject<{
65
+ status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
66
+ resolution: z.ZodOptional<z.ZodString>;
67
+ }, "strict", z.ZodTypeAny, {
68
+ status: "under-review" | "actioned" | "dismissed";
69
+ resolution?: string | undefined;
70
+ }, {
71
+ status: "under-review" | "actioned" | "dismissed";
72
+ resolution?: string | undefined;
73
+ }>, {
74
+ status: "under-review" | "actioned" | "dismissed";
75
+ resolution?: string | undefined;
76
+ }, {
77
+ status: "under-review" | "actioned" | "dismissed";
78
+ resolution?: string | undefined;
79
+ }>;
80
+ export type PaymentCaseResolveFormValues = z.infer<typeof paymentCaseResolveFormSchema>;
81
+ /** Route contract — identical; resolving a case is one atomic decision. */
82
+ export declare const paymentCaseResolveUpdateSchema: z.ZodEffects<z.ZodObject<{
83
+ status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
84
+ resolution: z.ZodOptional<z.ZodString>;
85
+ }, "strict", z.ZodTypeAny, {
86
+ status: "under-review" | "actioned" | "dismissed";
87
+ resolution?: string | undefined;
88
+ }, {
89
+ status: "under-review" | "actioned" | "dismissed";
90
+ resolution?: string | undefined;
91
+ }>, {
92
+ status: "under-review" | "actioned" | "dismissed";
93
+ resolution?: string | undefined;
94
+ }, {
95
+ status: "under-review" | "actioned" | "dismissed";
96
+ resolution?: string | undefined;
97
+ }>;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * The contract for resolving a payment case — ONE schema, three readers.
3
+ *
4
+ * ## Why a schema and not just the repository's check
5
+ *
6
+ * `PaymentCasesRepository.resolve()` already refuses a resolution shorter than
7
+ * `PAYMENT_CASE_RESOLUTION_MIN`, and that check is load-bearing and stays. But
8
+ * a runtime throw from the repository reaches the operator as a failed request
9
+ * after they have typed and submitted — the note is gone and the error has no
10
+ * field to land on, so it renders as a banner. That is precisely the shape
11
+ * `ReviewDecisionModal` was built to replace on the moderation and report
12
+ * surfaces.
13
+ *
14
+ * So the same floor is declared here, where the modal, the route and the
15
+ * repository can all read it:
16
+ *
17
+ * · the MODAL parses before submitting, so the message lands on the textarea;
18
+ * · the ROUTE parses the body, so a caller bypassing the UI gets a 400 with
19
+ * `issues` rather than a 500 from a repository assertion;
20
+ * · the REPOSITORY keeps its own assertion, because it is the last line and
21
+ * a schema cannot be relied on by a caller that does not use it.
22
+ *
23
+ * Modelled field-for-field on `reportReviewFormSchema`, which exists for the
24
+ * identical reason on a collection `PaymentCaseDocument` deliberately mirrors.
25
+ *
26
+ * ## 🛑 `resolvedBy` and `resolvedAt` are NOT fields, and that is the point
27
+ *
28
+ * `reportReviewFormSchema`'s header records what happened when a client was
29
+ * allowed to send its own `resolvedAt`: `new Date()` does not survive
30
+ * `JSON.stringify`, so an ISO **string** was written into a field declared
31
+ * `Date`, and the collection ended up holding both shapes for one field.
32
+ *
33
+ * Here it would be worse than a type split. `resolve()` asserts
34
+ * `resolvedBy !== "system"` — that assertion is the whole mechanism keeping a
35
+ * case human-closed — and a client-supplied `resolvedBy` would let any caller
36
+ * name itself whatever it liked. The server stamps both from the session.
37
+ *
38
+ * EXPORTS:
39
+ * paymentCaseResolveFormSchema, paymentCaseResolveUpdateSchema,
40
+ * PAYMENT_CASE_REVIEWER_STATUSES, type PaymentCaseResolveFormValues
41
+ *
42
+ * @tag domain:payment-cases
43
+ * @tag layer:schema
44
+ * @tag pattern:none
45
+ * @tag access:isomorphic
46
+ * @tag consumers:admin/money-cases,/api/admin/payment-cases/[id]
47
+ * @tag sideEffects:none
48
+ */
49
+ import { z } from "zod";
50
+ import { annotate } from "../../shell/field-ui-meta.js";
51
+ import { PAYMENT_CASE_RESOLUTION_MIN, } from "./firestore.js";
52
+ /**
53
+ * The statuses a human review can set. `open` is the state a case is born in
54
+ * and nothing may set it back — a case that has been looked at has been looked
55
+ * at.
56
+ *
57
+ * `satisfies readonly PaymentCaseStatus[]` rather than restated, so a value
58
+ * outside the real union is a COMPILE error instead of a chip that silently
59
+ * matches nothing (Root Cause #33).
60
+ */
61
+ export const PAYMENT_CASE_REVIEWER_STATUSES = [
62
+ "under-review",
63
+ "actioned",
64
+ "dismissed",
65
+ ];
66
+ /**
67
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
68
+ * by schema instance and every zod wrapper returns a new one.
69
+ */
70
+ export const paymentCaseResolveFormSchema = z
71
+ .object({
72
+ status: annotate(z.enum(PAYMENT_CASE_REVIEWER_STATUSES), {
73
+ section: "review",
74
+ sectionLabel: "Case decision",
75
+ sectionRequired: true,
76
+ quick: true,
77
+ order: 1,
78
+ row: "pair",
79
+ }),
80
+ resolution: annotate(z.string().max(2000, "Keep the resolution under 2000 characters.").optional(), {
81
+ section: "review",
82
+ order: 2,
83
+ row: "full",
84
+ kind: "textarea",
85
+ help: "Required when actioning or dismissing — say what you did, and what you checked.",
86
+ }),
87
+ })
88
+ .strict()
89
+ .superRefine((v, ctx) => {
90
+ /*
91
+ * Taking a case for review needs no note; closing one does.
92
+ *
93
+ * 🛑 The floor is `PAYMENT_CASE_RESOLUTION_MIN`, imported rather than
94
+ * retyped, and it is higher than a non-empty check for a measured reason:
95
+ * the case queue's whole value is that a closed case explains itself to the
96
+ * next person, and "done", "ok" and "fixed" explain nothing. On money that
97
+ * matters more than elsewhere — a `missing_order` closed with "ok" leaves
98
+ * no way to tell "I refunded the buyer" from "I decided it was a duplicate".
99
+ *
100
+ * Trimmed before measuring, so ten spaces is not a resolution.
101
+ */
102
+ if (v.status === "under-review")
103
+ return;
104
+ const note = v.resolution?.trim() ?? "";
105
+ if (note.length < PAYMENT_CASE_RESOLUTION_MIN) {
106
+ ctx.addIssue({
107
+ code: z.ZodIssueCode.custom,
108
+ path: ["resolution"],
109
+ message: `Say what was done about this case — at least ${PAYMENT_CASE_RESOLUTION_MIN} characters.`,
110
+ });
111
+ }
112
+ });
113
+ /** Route contract — identical; resolving a case is one atomic decision. */
114
+ export const paymentCaseResolveUpdateSchema = paymentCaseResolveFormSchema;
@@ -74,7 +74,6 @@ export declare class PayoutRepository extends BaseRepository<PayoutDocument> {
74
74
  * encryption path with one extra step on top, rather than two parallel paths
75
75
  * that have to agree — which is what the hand-rolled override was.
76
76
  */
77
- /** Override mapDoc to auto-decrypt PII on every Firestore read */
78
77
  /**
79
78
  * Create a new payout request
80
79
  */
@@ -104,7 +104,6 @@ export class PayoutRepository extends BaseRepository {
104
104
  * `PayoutBankAccount` carries no secret field to encrypt. See the tombstone
105
105
  * in `security/pii-encrypt.ts`.
106
106
  */
107
- /** Override mapDoc to auto-decrypt PII on every Firestore read */
108
107
  /**
109
108
  * Create a new payout request
110
109
  */