@open-mercato/core 0.6.8-develop.6998.1.d2bc46c56c → 0.6.8-develop.7001.1.03608ab252

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 (651) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/warranty_claim/index.js +105 -0
  3. package/dist/generated/entities/warranty_claim/index.js.map +7 -0
  4. package/dist/generated/entities/warranty_claim_event/index.js +25 -0
  5. package/dist/generated/entities/warranty_claim_event/index.js.map +7 -0
  6. package/dist/generated/entities/warranty_claim_line/index.js +77 -0
  7. package/dist/generated/entities/warranty_claim_line/index.js.map +7 -0
  8. package/dist/generated/entities/warranty_claim_registration/index.js +43 -0
  9. package/dist/generated/entities/warranty_claim_registration/index.js.map +7 -0
  10. package/dist/generated/entities/warranty_claim_sequence/index.js +17 -0
  11. package/dist/generated/entities/warranty_claim_sequence/index.js.map +7 -0
  12. package/dist/generated/entities/warranty_claim_settings/index.js +43 -0
  13. package/dist/generated/entities/warranty_claim_settings/index.js.map +7 -0
  14. package/dist/generated/entities/warranty_claim_sla_signal/index.js +25 -0
  15. package/dist/generated/entities/warranty_claim_sla_signal/index.js.map +7 -0
  16. package/dist/generated/entities/warranty_troubleshooting_guide/index.js +25 -0
  17. package/dist/generated/entities/warranty_troubleshooting_guide/index.js.map +7 -0
  18. package/dist/generated/entities/warranty_vendor_policy/index.js +31 -0
  19. package/dist/generated/entities/warranty_vendor_policy/index.js.map +7 -0
  20. package/dist/generated/entities.ids.generated.js +12 -0
  21. package/dist/generated/entities.ids.generated.js.map +2 -2
  22. package/dist/generated/entity-fields-registry.js +200 -0
  23. package/dist/generated/entity-fields-registry.js.map +2 -2
  24. package/dist/helpers/integration/api.js +3 -2
  25. package/dist/helpers/integration/api.js.map +2 -2
  26. package/dist/helpers/integration/salesFixtures.js +13 -6
  27. package/dist/helpers/integration/salesFixtures.js.map +2 -2
  28. package/dist/modules/attachments/di.js +18 -0
  29. package/dist/modules/attachments/di.js.map +2 -2
  30. package/dist/modules/attachments/fields/attachment.js +186 -26
  31. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  32. package/dist/modules/attachments/lib/scoped-upload-service.js +202 -0
  33. package/dist/modules/attachments/lib/scoped-upload-service.js.map +7 -0
  34. package/dist/modules/attachments/lib/target-access-service.js +39 -0
  35. package/dist/modules/attachments/lib/target-access-service.js.map +7 -0
  36. package/dist/modules/auth/api/logout.js +37 -10
  37. package/dist/modules/auth/api/logout.js.map +2 -2
  38. package/dist/modules/auth/api/reset/confirm.js +7 -0
  39. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  40. package/dist/modules/auth/api/reset.js +7 -0
  41. package/dist/modules/auth/api/reset.js.map +2 -2
  42. package/dist/modules/auth/commands/users.js +13 -0
  43. package/dist/modules/auth/commands/users.js.map +2 -2
  44. package/dist/modules/auth/events.js +15 -0
  45. package/dist/modules/auth/events.js.map +2 -2
  46. package/dist/modules/customers/api/companies/route.js +1 -0
  47. package/dist/modules/customers/api/companies/route.js.map +2 -2
  48. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -2
  49. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  50. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -2
  51. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  52. package/dist/modules/customers/components/detail/assignableStaff.js +6 -69
  53. package/dist/modules/customers/components/detail/assignableStaff.js.map +2 -2
  54. package/dist/modules/customers/lib/assignableStaff.js +76 -0
  55. package/dist/modules/customers/lib/assignableStaff.js.map +7 -0
  56. package/dist/modules/data_sync/lib/batch-stream.js +56 -0
  57. package/dist/modules/data_sync/lib/batch-stream.js.map +7 -0
  58. package/dist/modules/data_sync/lib/sync-engine.js +165 -103
  59. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  60. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +4 -0
  61. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  62. package/dist/modules/inbox_ops/api/extract/route.js +4 -0
  63. package/dist/modules/inbox_ops/api/extract/route.js.map +2 -2
  64. package/dist/modules/inbox_ops/api/webhook/inbound.js +4 -0
  65. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  66. package/dist/modules/sales/commands/documents.js +8 -8
  67. package/dist/modules/sales/commands/documents.js.map +2 -2
  68. package/dist/modules/warranty_claims/acl.js +75 -0
  69. package/dist/modules/warranty_claims/acl.js.map +7 -0
  70. package/dist/modules/warranty_claims/ai-agents.js +161 -0
  71. package/dist/modules/warranty_claims/ai-agents.js.map +7 -0
  72. package/dist/modules/warranty_claims/ai-tools.js +591 -0
  73. package/dist/modules/warranty_claims/ai-tools.js.map +7 -0
  74. package/dist/modules/warranty_claims/api/ai/assess/route.js +304 -0
  75. package/dist/modules/warranty_claims/api/ai/assess/route.js.map +7 -0
  76. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js +127 -0
  77. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js.map +7 -0
  78. package/dist/modules/warranty_claims/api/ai/suggest/route.js +177 -0
  79. package/dist/modules/warranty_claims/api/ai/suggest/route.js.map +7 -0
  80. package/dist/modules/warranty_claims/api/assign/route.js +124 -0
  81. package/dist/modules/warranty_claims/api/assign/route.js.map +7 -0
  82. package/dist/modules/warranty_claims/api/assignees/route.js +97 -0
  83. package/dist/modules/warranty_claims/api/assignees/route.js.map +7 -0
  84. package/dist/modules/warranty_claims/api/credit-memo/route.js +152 -0
  85. package/dist/modules/warranty_claims/api/credit-memo/route.js.map +7 -0
  86. package/dist/modules/warranty_claims/api/entitlement/route.js +145 -0
  87. package/dist/modules/warranty_claims/api/entitlement/route.js.map +7 -0
  88. package/dist/modules/warranty_claims/api/events/route.js +199 -0
  89. package/dist/modules/warranty_claims/api/events/route.js.map +7 -0
  90. package/dist/modules/warranty_claims/api/external/claims/route.js +446 -0
  91. package/dist/modules/warranty_claims/api/external/claims/route.js.map +7 -0
  92. package/dist/modules/warranty_claims/api/lines/route.js +258 -0
  93. package/dist/modules/warranty_claims/api/lines/route.js.map +7 -0
  94. package/dist/modules/warranty_claims/api/openapi.js +27 -0
  95. package/dist/modules/warranty_claims/api/openapi.js.map +7 -0
  96. package/dist/modules/warranty_claims/api/portal/attachments/route.js +490 -0
  97. package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +7 -0
  98. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js +178 -0
  99. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js.map +7 -0
  100. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js +101 -0
  101. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js.map +7 -0
  102. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js +78 -0
  103. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js.map +7 -0
  104. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js +81 -0
  105. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js.map +7 -0
  106. package/dist/modules/warranty_claims/api/portal/claims/route.js +462 -0
  107. package/dist/modules/warranty_claims/api/portal/claims/route.js.map +7 -0
  108. package/dist/modules/warranty_claims/api/portal/events/route.js +228 -0
  109. package/dist/modules/warranty_claims/api/portal/events/route.js.map +7 -0
  110. package/dist/modules/warranty_claims/api/portal/options/route.js +91 -0
  111. package/dist/modules/warranty_claims/api/portal/options/route.js.map +7 -0
  112. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js +172 -0
  113. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js.map +7 -0
  114. package/dist/modules/warranty_claims/api/portal/orders/route.js +151 -0
  115. package/dist/modules/warranty_claims/api/portal/orders/route.js.map +7 -0
  116. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js +121 -0
  117. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js.map +7 -0
  118. package/dist/modules/warranty_claims/api/receiving/route.js +176 -0
  119. package/dist/modules/warranty_claims/api/receiving/route.js.map +7 -0
  120. package/dist/modules/warranty_claims/api/registrations/route.js +382 -0
  121. package/dist/modules/warranty_claims/api/registrations/route.js.map +7 -0
  122. package/dist/modules/warranty_claims/api/replacement-order/route.js +150 -0
  123. package/dist/modules/warranty_claims/api/replacement-order/route.js.map +7 -0
  124. package/dist/modules/warranty_claims/api/return-label/route.js +235 -0
  125. package/dist/modules/warranty_claims/api/return-label/route.js.map +7 -0
  126. package/dist/modules/warranty_claims/api/risk/route.js +101 -0
  127. package/dist/modules/warranty_claims/api/risk/route.js.map +7 -0
  128. package/dist/modules/warranty_claims/api/route.js +482 -0
  129. package/dist/modules/warranty_claims/api/route.js.map +7 -0
  130. package/dist/modules/warranty_claims/api/sales-return/route.js +151 -0
  131. package/dist/modules/warranty_claims/api/sales-return/route.js.map +7 -0
  132. package/dist/modules/warranty_claims/api/settings-general/route.js +195 -0
  133. package/dist/modules/warranty_claims/api/settings-general/route.js.map +7 -0
  134. package/dist/modules/warranty_claims/api/stats/route.js +199 -0
  135. package/dist/modules/warranty_claims/api/stats/route.js.map +7 -0
  136. package/dist/modules/warranty_claims/api/submit/route.js +120 -0
  137. package/dist/modules/warranty_claims/api/submit/route.js.map +7 -0
  138. package/dist/modules/warranty_claims/api/transition/route.js +126 -0
  139. package/dist/modules/warranty_claims/api/transition/route.js.map +7 -0
  140. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js +261 -0
  141. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js.map +7 -0
  142. package/dist/modules/warranty_claims/api/vendor-policies/route.js +311 -0
  143. package/dist/modules/warranty_claims/api/vendor-policies/route.js.map +7 -0
  144. package/dist/modules/warranty_claims/api/vendor-recovery/route.js +130 -0
  145. package/dist/modules/warranty_claims/api/vendor-recovery/route.js.map +7 -0
  146. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js +153 -0
  147. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js.map +7 -0
  148. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js +268 -0
  149. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js.map +7 -0
  150. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js +54 -0
  151. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js.map +7 -0
  152. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js +87 -0
  153. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js.map +7 -0
  154. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js +120 -0
  155. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js.map +7 -0
  156. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js +135 -0
  157. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js.map +7 -0
  158. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js +218 -0
  159. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js.map +7 -0
  160. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js +231 -0
  161. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js.map +7 -0
  162. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js +82 -0
  163. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js.map +7 -0
  164. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js +136 -0
  165. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js.map +7 -0
  166. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js +41 -0
  167. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js.map +7 -0
  168. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js +45 -0
  169. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js.map +7 -0
  170. package/dist/modules/warranty_claims/backend/components/claimSla.js +92 -0
  171. package/dist/modules/warranty_claims/backend/components/claimSla.js.map +7 -0
  172. package/dist/modules/warranty_claims/backend/components/orderLookup.js +81 -0
  173. package/dist/modules/warranty_claims/backend/components/orderLookup.js.map +7 -0
  174. package/dist/modules/warranty_claims/backend/components/productLookup.js +317 -0
  175. package/dist/modules/warranty_claims/backend/components/productLookup.js.map +7 -0
  176. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js +61 -0
  177. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js.map +7 -0
  178. package/dist/modules/warranty_claims/backend/page.js +1088 -0
  179. package/dist/modules/warranty_claims/backend/page.js.map +7 -0
  180. package/dist/modules/warranty_claims/backend/page.meta.js +16 -0
  181. package/dist/modules/warranty_claims/backend/page.meta.js.map +7 -0
  182. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js +427 -0
  183. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js.map +7 -0
  184. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js +16 -0
  185. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js.map +7 -0
  186. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js +2101 -0
  187. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js.map +7 -0
  188. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js +16 -0
  189. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js.map +7 -0
  190. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js +1249 -0
  191. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js.map +7 -0
  192. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js +16 -0
  193. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js.map +7 -0
  194. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js +110 -0
  195. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js.map +7 -0
  196. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js +17 -0
  197. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js.map +7 -0
  198. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js +49 -0
  199. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js.map +7 -0
  200. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js +17 -0
  201. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js.map +7 -0
  202. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +485 -0
  203. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +7 -0
  204. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js +19 -0
  205. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js.map +7 -0
  206. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js +253 -0
  207. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js.map +7 -0
  208. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js +1565 -0
  209. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js.map +7 -0
  210. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js +19 -0
  211. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js.map +7 -0
  212. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js +472 -0
  213. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js.map +7 -0
  214. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js +115 -0
  215. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js.map +7 -0
  216. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js +19 -0
  217. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js.map +7 -0
  218. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js +54 -0
  219. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js.map +7 -0
  220. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js +19 -0
  221. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js.map +7 -0
  222. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +414 -0
  223. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +7 -0
  224. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js +21 -0
  225. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js.map +7 -0
  226. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js +171 -0
  227. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js.map +7 -0
  228. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js +111 -0
  229. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js.map +7 -0
  230. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js +19 -0
  231. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js.map +7 -0
  232. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js +48 -0
  233. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js.map +7 -0
  234. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js +19 -0
  235. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js.map +7 -0
  236. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +429 -0
  237. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +7 -0
  238. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js +21 -0
  239. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js.map +7 -0
  240. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js +182 -0
  241. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js.map +7 -0
  242. package/dist/modules/warranty_claims/ce.js +48 -0
  243. package/dist/modules/warranty_claims/ce.js.map +7 -0
  244. package/dist/modules/warranty_claims/commands/claim-lines.js +911 -0
  245. package/dist/modules/warranty_claims/commands/claim-lines.js.map +7 -0
  246. package/dist/modules/warranty_claims/commands/claims.js +2577 -0
  247. package/dist/modules/warranty_claims/commands/claims.js.map +7 -0
  248. package/dist/modules/warranty_claims/commands/index.js +4 -0
  249. package/dist/modules/warranty_claims/commands/index.js.map +7 -0
  250. package/dist/modules/warranty_claims/commands/settings.js +169 -0
  251. package/dist/modules/warranty_claims/commands/settings.js.map +7 -0
  252. package/dist/modules/warranty_claims/commands/shared.js +162 -0
  253. package/dist/modules/warranty_claims/commands/shared.js.map +7 -0
  254. package/dist/modules/warranty_claims/data/constants.js +35 -0
  255. package/dist/modules/warranty_claims/data/constants.js.map +7 -0
  256. package/dist/modules/warranty_claims/data/enrichers.js +97 -0
  257. package/dist/modules/warranty_claims/data/enrichers.js.map +7 -0
  258. package/dist/modules/warranty_claims/data/entities.js +731 -0
  259. package/dist/modules/warranty_claims/data/entities.js.map +7 -0
  260. package/dist/modules/warranty_claims/data/validators.js +488 -0
  261. package/dist/modules/warranty_claims/data/validators.js.map +7 -0
  262. package/dist/modules/warranty_claims/di.js +29 -0
  263. package/dist/modules/warranty_claims/di.js.map +7 -0
  264. package/dist/modules/warranty_claims/encryption.js +28 -0
  265. package/dist/modules/warranty_claims/encryption.js.map +7 -0
  266. package/dist/modules/warranty_claims/events.js +81 -0
  267. package/dist/modules/warranty_claims/events.js.map +7 -0
  268. package/dist/modules/warranty_claims/extension-points.js +19 -0
  269. package/dist/modules/warranty_claims/extension-points.js.map +7 -0
  270. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js +825 -0
  271. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js.map +7 -0
  272. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js +11 -0
  273. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js.map +7 -0
  274. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js +1139 -0
  275. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js.map +7 -0
  276. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js +11 -0
  277. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js.map +7 -0
  278. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +253 -0
  279. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +7 -0
  280. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js +18 -0
  281. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js.map +7 -0
  282. package/dist/modules/warranty_claims/index.js +15 -0
  283. package/dist/modules/warranty_claims/index.js.map +7 -0
  284. package/dist/modules/warranty_claims/lib/aiAssist.js +496 -0
  285. package/dist/modules/warranty_claims/lib/aiAssist.js.map +7 -0
  286. package/dist/modules/warranty_claims/lib/apiIdsFilter.js +11 -0
  287. package/dist/modules/warranty_claims/lib/apiIdsFilter.js.map +7 -0
  288. package/dist/modules/warranty_claims/lib/assigneeNames.js +153 -0
  289. package/dist/modules/warranty_claims/lib/assigneeNames.js.map +7 -0
  290. package/dist/modules/warranty_claims/lib/attachmentVisibility.js +9 -0
  291. package/dist/modules/warranty_claims/lib/attachmentVisibility.js.map +7 -0
  292. package/dist/modules/warranty_claims/lib/bulkFeedback.js +8 -0
  293. package/dist/modules/warranty_claims/lib/bulkFeedback.js.map +7 -0
  294. package/dist/modules/warranty_claims/lib/businessHours.js +250 -0
  295. package/dist/modules/warranty_claims/lib/businessHours.js.map +7 -0
  296. package/dist/modules/warranty_claims/lib/businessHoursForm.js +146 -0
  297. package/dist/modules/warranty_claims/lib/businessHoursForm.js.map +7 -0
  298. package/dist/modules/warranty_claims/lib/claimTypeConfig.js +39 -0
  299. package/dist/modules/warranty_claims/lib/claimTypeConfig.js.map +7 -0
  300. package/dist/modules/warranty_claims/lib/decryptionSafety.js +17 -0
  301. package/dist/modules/warranty_claims/lib/decryptionSafety.js.map +7 -0
  302. package/dist/modules/warranty_claims/lib/deskFilters.js +88 -0
  303. package/dist/modules/warranty_claims/lib/deskFilters.js.map +7 -0
  304. package/dist/modules/warranty_claims/lib/dictionaries.js +157 -0
  305. package/dist/modules/warranty_claims/lib/dictionaries.js.map +7 -0
  306. package/dist/modules/warranty_claims/lib/dictionaryLabels.js +12 -0
  307. package/dist/modules/warranty_claims/lib/dictionaryLabels.js.map +7 -0
  308. package/dist/modules/warranty_claims/lib/emailIntake.js +87 -0
  309. package/dist/modules/warranty_claims/lib/emailIntake.js.map +7 -0
  310. package/dist/modules/warranty_claims/lib/escalation.js +58 -0
  311. package/dist/modules/warranty_claims/lib/escalation.js.map +7 -0
  312. package/dist/modules/warranty_claims/lib/externalIntake.js +233 -0
  313. package/dist/modules/warranty_claims/lib/externalIntake.js.map +7 -0
  314. package/dist/modules/warranty_claims/lib/grading.js +21 -0
  315. package/dist/modules/warranty_claims/lib/grading.js.map +7 -0
  316. package/dist/modules/warranty_claims/lib/listSegments.js +18 -0
  317. package/dist/modules/warranty_claims/lib/listSegments.js.map +7 -0
  318. package/dist/modules/warranty_claims/lib/orderOwnership.js +25 -0
  319. package/dist/modules/warranty_claims/lib/orderOwnership.js.map +7 -0
  320. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js +11 -0
  321. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js.map +7 -0
  322. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js +108 -0
  323. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js.map +7 -0
  324. package/dist/modules/warranty_claims/lib/portalClaimAccess.js +26 -0
  325. package/dist/modules/warranty_claims/lib/portalClaimAccess.js.map +7 -0
  326. package/dist/modules/warranty_claims/lib/quantity.js +19 -0
  327. package/dist/modules/warranty_claims/lib/quantity.js.map +7 -0
  328. package/dist/modules/warranty_claims/lib/risk.js +204 -0
  329. package/dist/modules/warranty_claims/lib/risk.js.map +7 -0
  330. package/dist/modules/warranty_claims/lib/settings.js +55 -0
  331. package/dist/modules/warranty_claims/lib/settings.js.map +7 -0
  332. package/dist/modules/warranty_claims/lib/stateMachine.js +88 -0
  333. package/dist/modules/warranty_claims/lib/stateMachine.js.map +7 -0
  334. package/dist/modules/warranty_claims/lib/timelineFilters.js +16 -0
  335. package/dist/modules/warranty_claims/lib/timelineFilters.js.map +7 -0
  336. package/dist/modules/warranty_claims/lib/triage.js +241 -0
  337. package/dist/modules/warranty_claims/lib/triage.js.map +7 -0
  338. package/dist/modules/warranty_claims/lib/troubleshooting.js +111 -0
  339. package/dist/modules/warranty_claims/lib/troubleshooting.js.map +7 -0
  340. package/dist/modules/warranty_claims/lib/tryResolve.js +11 -0
  341. package/dist/modules/warranty_claims/lib/tryResolve.js.map +7 -0
  342. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js +101 -0
  343. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js.map +7 -0
  344. package/dist/modules/warranty_claims/lib/warrantyPreview.js +18 -0
  345. package/dist/modules/warranty_claims/lib/warrantyPreview.js.map +7 -0
  346. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js +32 -0
  347. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js.map +7 -0
  348. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js +16 -0
  349. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js.map +7 -0
  350. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js +17 -0
  351. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js.map +7 -0
  352. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js +29 -0
  353. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js.map +7 -0
  354. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js +25 -0
  355. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js.map +7 -0
  356. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js +13 -0
  357. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js.map +7 -0
  358. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js +15 -0
  359. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js.map +7 -0
  360. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js +13 -0
  361. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js.map +7 -0
  362. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js +13 -0
  363. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js.map +7 -0
  364. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js +12 -0
  365. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js.map +7 -0
  366. package/dist/modules/warranty_claims/notifications.client.js +67 -0
  367. package/dist/modules/warranty_claims/notifications.client.js.map +7 -0
  368. package/dist/modules/warranty_claims/notifications.js +103 -0
  369. package/dist/modules/warranty_claims/notifications.js.map +7 -0
  370. package/dist/modules/warranty_claims/search.js +174 -0
  371. package/dist/modules/warranty_claims/search.js.map +7 -0
  372. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js +202 -0
  373. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js.map +7 -0
  374. package/dist/modules/warranty_claims/services/claimNumberGenerator.js +58 -0
  375. package/dist/modules/warranty_claims/services/claimNumberGenerator.js.map +7 -0
  376. package/dist/modules/warranty_claims/services/entitlementResolver.js +69 -0
  377. package/dist/modules/warranty_claims/services/entitlementResolver.js.map +7 -0
  378. package/dist/modules/warranty_claims/services/returnLabelProvider.js +14 -0
  379. package/dist/modules/warranty_claims/services/returnLabelProvider.js.map +7 -0
  380. package/dist/modules/warranty_claims/setup.js +121 -0
  381. package/dist/modules/warranty_claims/setup.js.map +7 -0
  382. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js +119 -0
  383. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js.map +7 -0
  384. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js +47 -0
  385. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js.map +7 -0
  386. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js +60 -0
  387. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js.map +7 -0
  388. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js +83 -0
  389. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js.map +7 -0
  390. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js +46 -0
  391. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js.map +7 -0
  392. package/dist/modules/warranty_claims/subscribers/email-to-claim.js +135 -0
  393. package/dist/modules/warranty_claims/subscribers/email-to-claim.js.map +7 -0
  394. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js +164 -0
  395. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js.map +7 -0
  396. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js +24 -0
  397. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js.map +7 -0
  398. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js +26 -0
  399. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js.map +7 -0
  400. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js +15 -0
  401. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js.map +7 -0
  402. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js +197 -0
  403. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js.map +7 -0
  404. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js +28 -0
  405. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js.map +7 -0
  406. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js +418 -0
  407. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js.map +7 -0
  408. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js +18 -0
  409. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js.map +7 -0
  410. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js +17 -0
  411. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js.map +7 -0
  412. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js +146 -0
  413. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js.map +7 -0
  414. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js +17 -0
  415. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js.map +7 -0
  416. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js +147 -0
  417. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js.map +7 -0
  418. package/dist/modules/warranty_claims/widgets/injection-table.js +38 -0
  419. package/dist/modules/warranty_claims/widgets/injection-table.js.map +7 -0
  420. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js +223 -0
  421. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js.map +7 -0
  422. package/dist/modules/warranty_claims/widgets/notifications/index.js +5 -0
  423. package/dist/modules/warranty_claims/widgets/notifications/index.js.map +7 -0
  424. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js +334 -0
  425. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js.map +7 -0
  426. package/generated/entities/warranty_claim/index.ts +51 -0
  427. package/generated/entities/warranty_claim_event/index.ts +11 -0
  428. package/generated/entities/warranty_claim_line/index.ts +37 -0
  429. package/generated/entities/warranty_claim_registration/index.ts +20 -0
  430. package/generated/entities/warranty_claim_sequence/index.ts +7 -0
  431. package/generated/entities/warranty_claim_settings/index.ts +20 -0
  432. package/generated/entities/warranty_claim_sla_signal/index.ts +11 -0
  433. package/generated/entities/warranty_troubleshooting_guide/index.ts +11 -0
  434. package/generated/entities/warranty_vendor_policy/index.ts +14 -0
  435. package/generated/entities.ids.generated.ts +12 -0
  436. package/generated/entity-fields-registry.ts +200 -0
  437. package/package.json +7 -7
  438. package/src/helpers/integration/api.ts +10 -3
  439. package/src/helpers/integration/salesFixtures.ts +17 -7
  440. package/src/modules/attachments/di.ts +30 -1
  441. package/src/modules/attachments/fields/attachment.tsx +215 -23
  442. package/src/modules/attachments/i18n/de.json +5 -0
  443. package/src/modules/attachments/i18n/en.json +5 -0
  444. package/src/modules/attachments/i18n/es.json +5 -0
  445. package/src/modules/attachments/i18n/ko.json +5 -0
  446. package/src/modules/attachments/i18n/pl.json +5 -0
  447. package/src/modules/attachments/lib/scoped-upload-service.ts +257 -0
  448. package/src/modules/attachments/lib/target-access-service.ts +57 -0
  449. package/src/modules/auth/api/logout.ts +46 -10
  450. package/src/modules/auth/api/reset/confirm.ts +7 -0
  451. package/src/modules/auth/api/reset.ts +7 -0
  452. package/src/modules/auth/commands/users.ts +22 -0
  453. package/src/modules/auth/events.ts +15 -0
  454. package/src/modules/customers/api/companies/route.ts +1 -0
  455. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +4 -2
  456. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +4 -2
  457. package/src/modules/customers/components/detail/assignableStaff.ts +14 -177
  458. package/src/modules/customers/lib/assignableStaff.ts +177 -0
  459. package/src/modules/data_sync/AGENTS.md +3 -0
  460. package/src/modules/data_sync/lib/batch-stream.ts +117 -0
  461. package/src/modules/data_sync/lib/sync-engine.ts +190 -115
  462. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +4 -0
  463. package/src/modules/inbox_ops/api/extract/route.ts +4 -0
  464. package/src/modules/inbox_ops/api/webhook/inbound.ts +4 -0
  465. package/src/modules/sales/commands/documents.ts +16 -8
  466. package/src/modules/warranty_claims/AGENTS.md +49 -0
  467. package/src/modules/warranty_claims/acl.ts +71 -0
  468. package/src/modules/warranty_claims/ai-agents.ts +189 -0
  469. package/src/modules/warranty_claims/ai-tools.ts +711 -0
  470. package/src/modules/warranty_claims/api/ai/assess/route.ts +371 -0
  471. package/src/modules/warranty_claims/api/ai/draft-reply/route.ts +149 -0
  472. package/src/modules/warranty_claims/api/ai/suggest/route.ts +190 -0
  473. package/src/modules/warranty_claims/api/assign/route.ts +142 -0
  474. package/src/modules/warranty_claims/api/assignees/route.ts +102 -0
  475. package/src/modules/warranty_claims/api/credit-memo/route.ts +191 -0
  476. package/src/modules/warranty_claims/api/entitlement/route.ts +224 -0
  477. package/src/modules/warranty_claims/api/events/route.ts +226 -0
  478. package/src/modules/warranty_claims/api/external/claims/route.ts +528 -0
  479. package/src/modules/warranty_claims/api/lines/route.ts +275 -0
  480. package/src/modules/warranty_claims/api/openapi.ts +28 -0
  481. package/src/modules/warranty_claims/api/portal/attachments/route.ts +547 -0
  482. package/src/modules/warranty_claims/api/portal/claims/[id]/route.ts +195 -0
  483. package/src/modules/warranty_claims/api/portal/claims/[id]/shared.ts +125 -0
  484. package/src/modules/warranty_claims/api/portal/claims/[id]/submit/route.ts +82 -0
  485. package/src/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.ts +87 -0
  486. package/src/modules/warranty_claims/api/portal/claims/route.ts +579 -0
  487. package/src/modules/warranty_claims/api/portal/events/route.ts +260 -0
  488. package/src/modules/warranty_claims/api/portal/options/route.ts +113 -0
  489. package/src/modules/warranty_claims/api/portal/orders/lines/route.ts +258 -0
  490. package/src/modules/warranty_claims/api/portal/orders/route.ts +206 -0
  491. package/src/modules/warranty_claims/api/portal/troubleshooting/route.ts +151 -0
  492. package/src/modules/warranty_claims/api/receiving/route.ts +215 -0
  493. package/src/modules/warranty_claims/api/registrations/route.ts +417 -0
  494. package/src/modules/warranty_claims/api/replacement-order/route.ts +188 -0
  495. package/src/modules/warranty_claims/api/return-label/route.ts +291 -0
  496. package/src/modules/warranty_claims/api/risk/route.ts +112 -0
  497. package/src/modules/warranty_claims/api/route.ts +543 -0
  498. package/src/modules/warranty_claims/api/sales-return/route.ts +183 -0
  499. package/src/modules/warranty_claims/api/settings-general/route.ts +230 -0
  500. package/src/modules/warranty_claims/api/stats/route.ts +306 -0
  501. package/src/modules/warranty_claims/api/submit/route.ts +146 -0
  502. package/src/modules/warranty_claims/api/transition/route.ts +144 -0
  503. package/src/modules/warranty_claims/api/troubleshooting-guides/route.ts +295 -0
  504. package/src/modules/warranty_claims/api/vendor-policies/route.ts +351 -0
  505. package/src/modules/warranty_claims/api/vendor-recovery/route.ts +148 -0
  506. package/src/modules/warranty_claims/api/vendor-recovery-suggestions/route.ts +167 -0
  507. package/src/modules/warranty_claims/backend/components/AiAssessButtons.tsx +389 -0
  508. package/src/modules/warranty_claims/backend/components/ClaimStageProgress.tsx +65 -0
  509. package/src/modules/warranty_claims/backend/components/ClaimStatusBadge.tsx +137 -0
  510. package/src/modules/warranty_claims/backend/components/ClaimsKpiStrip.tsx +169 -0
  511. package/src/modules/warranty_claims/backend/components/EntitlementLookupBadge.tsx +203 -0
  512. package/src/modules/warranty_claims/backend/components/ReceivingPanel.tsx +300 -0
  513. package/src/modules/warranty_claims/backend/components/ReturnLabelPanel.tsx +292 -0
  514. package/src/modules/warranty_claims/backend/components/TroubleshootingWalker.tsx +125 -0
  515. package/src/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.tsx +217 -0
  516. package/src/modules/warranty_claims/backend/components/WarrantyWorkspace.tsx +66 -0
  517. package/src/modules/warranty_claims/backend/components/claimReasonOptions.ts +57 -0
  518. package/src/modules/warranty_claims/backend/components/claimSla.tsx +127 -0
  519. package/src/modules/warranty_claims/backend/components/orderLookup.ts +109 -0
  520. package/src/modules/warranty_claims/backend/components/productLookup.tsx +433 -0
  521. package/src/modules/warranty_claims/backend/components/useUserDisplayNames.ts +66 -0
  522. package/src/modules/warranty_claims/backend/page.meta.ts +12 -0
  523. package/src/modules/warranty_claims/backend/page.tsx +1302 -0
  524. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.ts +12 -0
  525. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.tsx +531 -0
  526. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.ts +12 -0
  527. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.tsx +2599 -0
  528. package/src/modules/warranty_claims/backend/warranty_claims/create/page.meta.ts +12 -0
  529. package/src/modules/warranty_claims/backend/warranty_claims/create/page.tsx +1533 -0
  530. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.ts +13 -0
  531. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.tsx +136 -0
  532. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.ts +13 -0
  533. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.tsx +52 -0
  534. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.ts +15 -0
  535. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +555 -0
  536. package/src/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.tsx +295 -0
  537. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.meta.ts +15 -0
  538. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.tsx +1903 -0
  539. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.tsx +550 -0
  540. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.ts +15 -0
  541. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.tsx +141 -0
  542. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.ts +15 -0
  543. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.tsx +57 -0
  544. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.ts +17 -0
  545. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +477 -0
  546. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.tsx +214 -0
  547. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.ts +15 -0
  548. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.tsx +137 -0
  549. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.ts +15 -0
  550. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.tsx +51 -0
  551. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.ts +17 -0
  552. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +506 -0
  553. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.tsx +220 -0
  554. package/src/modules/warranty_claims/ce.ts +44 -0
  555. package/src/modules/warranty_claims/commands/claim-lines.ts +1082 -0
  556. package/src/modules/warranty_claims/commands/claims.ts +3364 -0
  557. package/src/modules/warranty_claims/commands/index.ts +3 -0
  558. package/src/modules/warranty_claims/commands/settings.ts +198 -0
  559. package/src/modules/warranty_claims/commands/shared.ts +212 -0
  560. package/src/modules/warranty_claims/data/constants.ts +37 -0
  561. package/src/modules/warranty_claims/data/enrichers.ts +165 -0
  562. package/src/modules/warranty_claims/data/entities.ts +663 -0
  563. package/src/modules/warranty_claims/data/validators.ts +634 -0
  564. package/src/modules/warranty_claims/di.ts +34 -0
  565. package/src/modules/warranty_claims/encryption.ts +26 -0
  566. package/src/modules/warranty_claims/events.ts +81 -0
  567. package/src/modules/warranty_claims/extension-points.ts +16 -0
  568. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.ts +9 -0
  569. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.tsx +1037 -0
  570. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.ts +9 -0
  571. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.tsx +1409 -0
  572. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.ts +16 -0
  573. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +304 -0
  574. package/src/modules/warranty_claims/i18n/de.json +1270 -0
  575. package/src/modules/warranty_claims/i18n/en.json +1270 -0
  576. package/src/modules/warranty_claims/i18n/es.json +1270 -0
  577. package/src/modules/warranty_claims/i18n/ko.json +1270 -0
  578. package/src/modules/warranty_claims/i18n/pl.json +1270 -0
  579. package/src/modules/warranty_claims/index.ts +13 -0
  580. package/src/modules/warranty_claims/lib/aiAssist.ts +677 -0
  581. package/src/modules/warranty_claims/lib/apiIdsFilter.ts +12 -0
  582. package/src/modules/warranty_claims/lib/assigneeNames.ts +184 -0
  583. package/src/modules/warranty_claims/lib/attachmentVisibility.ts +5 -0
  584. package/src/modules/warranty_claims/lib/bulkFeedback.ts +6 -0
  585. package/src/modules/warranty_claims/lib/businessHours.ts +333 -0
  586. package/src/modules/warranty_claims/lib/businessHoursForm.ts +206 -0
  587. package/src/modules/warranty_claims/lib/claimTypeConfig.ts +49 -0
  588. package/src/modules/warranty_claims/lib/decryptionSafety.ts +19 -0
  589. package/src/modules/warranty_claims/lib/deskFilters.ts +131 -0
  590. package/src/modules/warranty_claims/lib/dictionaries.ts +212 -0
  591. package/src/modules/warranty_claims/lib/dictionaryLabels.ts +16 -0
  592. package/src/modules/warranty_claims/lib/emailIntake.ts +123 -0
  593. package/src/modules/warranty_claims/lib/escalation.ts +83 -0
  594. package/src/modules/warranty_claims/lib/externalIntake.ts +362 -0
  595. package/src/modules/warranty_claims/lib/grading.ts +23 -0
  596. package/src/modules/warranty_claims/lib/listSegments.ts +19 -0
  597. package/src/modules/warranty_claims/lib/orderOwnership.ts +58 -0
  598. package/src/modules/warranty_claims/lib/portalAttachmentUpload.ts +11 -0
  599. package/src/modules/warranty_claims/lib/portalAttachmentValidation.ts +115 -0
  600. package/src/modules/warranty_claims/lib/portalClaimAccess.ts +37 -0
  601. package/src/modules/warranty_claims/lib/quantity.ts +15 -0
  602. package/src/modules/warranty_claims/lib/risk.ts +371 -0
  603. package/src/modules/warranty_claims/lib/settings.ts +76 -0
  604. package/src/modules/warranty_claims/lib/stateMachine.ts +130 -0
  605. package/src/modules/warranty_claims/lib/timelineFilters.ts +22 -0
  606. package/src/modules/warranty_claims/lib/triage.ts +366 -0
  607. package/src/modules/warranty_claims/lib/troubleshooting.ts +157 -0
  608. package/src/modules/warranty_claims/lib/tryResolve.ts +7 -0
  609. package/src/modules/warranty_claims/lib/vendorPolicyRecovery.ts +182 -0
  610. package/src/modules/warranty_claims/lib/warrantyPreview.ts +20 -0
  611. package/src/modules/warranty_claims/migrations/.snapshot-open-mercato.json +3525 -0
  612. package/src/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.ts +38 -0
  613. package/src/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.ts +17 -0
  614. package/src/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.ts +17 -0
  615. package/src/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.ts +37 -0
  616. package/src/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.ts +25 -0
  617. package/src/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.ts +13 -0
  618. package/src/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.ts +15 -0
  619. package/src/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.ts +13 -0
  620. package/src/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.ts +13 -0
  621. package/src/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.ts +11 -0
  622. package/src/modules/warranty_claims/notifications.client.ts +78 -0
  623. package/src/modules/warranty_claims/notifications.ts +101 -0
  624. package/src/modules/warranty_claims/search.ts +199 -0
  625. package/src/modules/warranty_claims/services/adjudicationEvaluator.ts +344 -0
  626. package/src/modules/warranty_claims/services/claimNumberGenerator.ts +69 -0
  627. package/src/modules/warranty_claims/services/entitlementResolver.ts +102 -0
  628. package/src/modules/warranty_claims/services/returnLabelProvider.ts +30 -0
  629. package/src/modules/warranty_claims/setup.ts +154 -0
  630. package/src/modules/warranty_claims/subscribers/auto-vendor-recovery.ts +140 -0
  631. package/src/modules/warranty_claims/subscribers/claim-assigned-notification.ts +54 -0
  632. package/src/modules/warranty_claims/subscribers/claim-customer-reply-notification.ts +68 -0
  633. package/src/modules/warranty_claims/subscribers/claim-status-notification.ts +100 -0
  634. package/src/modules/warranty_claims/subscribers/claim-submitted-notification.ts +53 -0
  635. package/src/modules/warranty_claims/subscribers/email-to-claim.ts +175 -0
  636. package/src/modules/warranty_claims/subscribers/return-shipment-tracking.ts +226 -0
  637. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.ts +28 -0
  638. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.ts +31 -0
  639. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/config.ts +15 -0
  640. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.tsx +237 -0
  641. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.ts +27 -0
  642. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.tsx +527 -0
  643. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.ts +37 -0
  644. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.ts +21 -0
  645. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab.tsx +210 -0
  646. package/src/modules/warranty_claims/widgets/injection/order-claims-tab/widget.ts +21 -0
  647. package/src/modules/warranty_claims/widgets/injection/order-claims-tab.tsx +210 -0
  648. package/src/modules/warranty_claims/widgets/injection-table.ts +36 -0
  649. package/src/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.tsx +253 -0
  650. package/src/modules/warranty_claims/widgets/notifications/index.ts +1 -0
  651. package/src/modules/warranty_claims/workers/sla-escalation-sweep.ts +450 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/businessHoursForm.ts"],
4
+ "sourcesContent": ["import type { BusinessWeekday } from './businessHours'\n\nexport type BusinessHoursIntervalRow = {\n key: string\n start: string\n end: string\n}\n\nexport type BusinessHoursDayRow = {\n weekday: BusinessWeekday\n enabled: boolean\n intervals: BusinessHoursIntervalRow[]\n}\n\nexport type BusinessHoursHolidayRow = {\n key: string\n date: string\n}\n\nexport type BusinessHoursFormValue = {\n timezone: string\n days: BusinessHoursDayRow[]\n holidays: BusinessHoursHolidayRow[]\n extras: Record<string, unknown>\n raw: string\n rawDirty: boolean\n}\n\nexport type BusinessHoursValidationMessages = {\n error: {\n window: string\n holiday: string\n }\n}\n\nexport type BusinessHoursValidation =\n | { ok: true; value: Record<string, unknown> | null }\n | { ok: false; reason: 'json' }\n | { ok: false; reason: 'rows'; rowErrors: Record<string, string> }\n\nconst BUSINESS_HOURS_WEEKDAYS: readonly BusinessWeekday[] = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\nconst BUSINESS_HOURS_DAY_MINUTES = 24 * 60\nconst BUSINESS_HOURS_DEFAULT_START = '09:00'\nconst BUSINESS_HOURS_DEFAULT_END = '17:00'\nconst BUSINESS_HOURS_HOLIDAY_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function stringifyJsonValue(value: Record<string, unknown> | unknown[] | null): string {\n if (value === null) return ''\n const serialized = JSON.stringify(value, null, 2)\n return typeof serialized === 'string' ? serialized : ''\n}\n\nlet businessHoursRowSeq = 0\n\nexport function nextBusinessHoursRowKey(): string {\n businessHoursRowSeq += 1\n return `business-hours-${businessHoursRowSeq}`\n}\n\nexport function businessHoursTimeToMinutes(value: string): number | null {\n const match = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec(value.trim())\n if (!match) return null\n const hour = Number(match[1])\n const minute = Number(match[2])\n const second = match[3] ? Number(match[3]) : 0\n if (minute > 59 || second !== 0) return null\n if (hour === 24 && minute === 0) return BUSINESS_HOURS_DAY_MINUTES\n if (hour > 23) return null\n return hour * 60 + minute\n}\n\nexport function formatBusinessHoursTime(minutes: number): string {\n if (minutes === BUSINESS_HOURS_DAY_MINUTES) return '24:00'\n const hour = Math.floor(minutes / 60)\n const minute = minutes % 60\n return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`\n}\n\nexport function businessHoursEndTimeToMinutes(value: string): number | null {\n const minutes = businessHoursTimeToMinutes(value)\n if (minutes === 0) return BUSINESS_HOURS_DAY_MINUTES\n return minutes\n}\n\nexport function formatBusinessHoursEndTimeForInput(minutes: number): string {\n if (minutes === BUSINESS_HOURS_DAY_MINUTES) return '00:00'\n return formatBusinessHoursTime(minutes)\n}\n\nexport function normalizeBusinessHoursEndTime(value: string): string {\n return businessHoursEndTimeToMinutes(value) === BUSINESS_HOURS_DAY_MINUTES ? '24:00' : value\n}\n\nexport function createBusinessHoursIntervalRow(\n start = BUSINESS_HOURS_DEFAULT_START,\n end = BUSINESS_HOURS_DEFAULT_END,\n): BusinessHoursIntervalRow {\n return { key: nextBusinessHoursRowKey(), start, end }\n}\n\nexport function parseBusinessHoursIntervalRows(value: unknown): BusinessHoursIntervalRow[] {\n if (!Array.isArray(value)) return []\n const intervals: Array<{ startMinutes: number; endMinutes: number }> = []\n for (const rawInterval of value) {\n if (!isRecord(rawInterval)) continue\n const startMinutes = typeof rawInterval.start === 'string' ? businessHoursTimeToMinutes(rawInterval.start) : null\n const endMinutes = typeof rawInterval.end === 'string' ? businessHoursEndTimeToMinutes(rawInterval.end) : null\n if (startMinutes === null || endMinutes === null || endMinutes <= startMinutes) continue\n intervals.push({ startMinutes, endMinutes })\n }\n return intervals\n .sort((left, right) => left.startMinutes - right.startMinutes)\n .map((interval) => createBusinessHoursIntervalRow(\n formatBusinessHoursTime(interval.startMinutes),\n formatBusinessHoursEndTimeForInput(interval.endMinutes),\n ))\n}\n\nexport function buildBusinessHoursFormValue(record: Record<string, unknown> | null): BusinessHoursFormValue {\n const source = isRecord(record) ? record : null\n const rawWeek = source && isRecord(source.week) ? source.week : null\n const days = BUSINESS_HOURS_WEEKDAYS.map((weekday) => {\n const intervals = rawWeek ? parseBusinessHoursIntervalRows(rawWeek[weekday]) : []\n return {\n weekday,\n enabled: intervals.length > 0,\n intervals: intervals.length ? intervals : [createBusinessHoursIntervalRow()],\n }\n })\n const holidays = Array.isArray(source?.holidays)\n ? source.holidays\n .filter((item): item is string => typeof item === 'string' && BUSINESS_HOURS_HOLIDAY_PATTERN.test(item))\n .map((date) => ({ key: nextBusinessHoursRowKey(), date }))\n : []\n const extras: Record<string, unknown> = {}\n if (source) {\n for (const [key, entry] of Object.entries(source)) {\n if (key === 'timezone' || key === 'week' || key === 'holidays') continue\n extras[key] = entry\n }\n }\n return {\n timezone: typeof source?.timezone === 'string' ? source.timezone.trim() : '',\n days,\n holidays,\n extras,\n raw: stringifyJsonValue(source),\n rawDirty: false,\n }\n}\n\nexport function serializeBusinessHoursRecord(value: BusinessHoursFormValue): Record<string, unknown> | null {\n const result: Record<string, unknown> = { ...value.extras }\n const timezone = value.timezone.trim()\n if (timezone) result.timezone = timezone\n const week: Partial<Record<BusinessWeekday, Array<{ start: string; end: string }>>> = {}\n for (const day of value.days) {\n if (!day.enabled) continue\n const intervals = day.intervals\n .map((interval) => ({ start: interval.start.trim(), end: normalizeBusinessHoursEndTime(interval.end.trim()) }))\n .filter((interval) => interval.start.length > 0 || interval.end.length > 0)\n if (intervals.length) week[day.weekday] = intervals\n }\n if (Object.keys(week).length) result.week = week\n const holidays = Array.from(new Set(\n value.holidays\n .map((row) => row.date.trim())\n .filter((date) => BUSINESS_HOURS_HOLIDAY_PATTERN.test(date)),\n ))\n if (holidays.length) result.holidays = holidays\n return Object.keys(result).length ? result : null\n}\n\nexport function validateBusinessHoursValue(\n value: BusinessHoursFormValue,\n translations: BusinessHoursValidationMessages,\n): BusinessHoursValidation {\n if (value.rawDirty) return { ok: false, reason: 'json' }\n const rowErrors: Record<string, string> = {}\n for (const day of value.days) {\n if (!day.enabled) continue\n for (const interval of day.intervals) {\n const startMinutes = businessHoursTimeToMinutes(interval.start)\n const endMinutes = businessHoursEndTimeToMinutes(interval.end)\n if (\n startMinutes === null ||\n endMinutes === null ||\n startMinutes >= BUSINESS_HOURS_DAY_MINUTES ||\n endMinutes <= startMinutes\n ) {\n rowErrors[interval.key] = translations.error.window\n }\n }\n }\n for (const holiday of value.holidays) {\n if (!BUSINESS_HOURS_HOLIDAY_PATTERN.test(holiday.date.trim())) {\n rowErrors[holiday.key] = translations.error.holiday\n }\n }\n if (Object.keys(rowErrors).length) return { ok: false, reason: 'rows', rowErrors }\n return { ok: true, value: serializeBusinessHoursRecord(value) }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
2
+ const CLAIM_TYPE_UI_CONFIG = {
3
+ warranty: {
4
+ lineHeaderKey: "warranty_claims.form.lineHeader.warranty",
5
+ allowedDispositions: ["repair", "replace", "credit", "refund", "return_to_vendor", "scrap", "field_destroy", "restock", "deny"]
6
+ },
7
+ return: {
8
+ lineHeaderKey: "warranty_claims.form.lineHeader.return",
9
+ allowedDispositions: ["restock", "refund", "replace", "credit", "deny"]
10
+ },
11
+ core_return: {
12
+ lineHeaderKey: "warranty_claims.form.lineHeader.core_return",
13
+ allowedDispositions: ["credit", "refund", "restock", "return_to_vendor", "scrap", "deny"]
14
+ },
15
+ vendor_recovery: {
16
+ lineHeaderKey: "warranty_claims.form.lineHeader.vendor_recovery",
17
+ allowedDispositions: ["return_to_vendor", "credit", "replace", "deny"]
18
+ }
19
+ };
20
+ function resolveClaimTypeUiConfig(claimType) {
21
+ return CLAIM_TYPE_UI_CONFIG[claimType ?? "warranty"] ?? CLAIM_TYPE_UI_CONFIG.warranty;
22
+ }
23
+ const FINANCIAL_ADJUSTMENT_CLAIM_TYPES = /* @__PURE__ */ new Set(["return", "core_return"]);
24
+ function claimTypeAllowsLineFinancialAdjustments(claimType) {
25
+ return FINANCIAL_ADJUSTMENT_CLAIM_TYPES.has(claimType ?? "warranty");
26
+ }
27
+ function assertDispositionAllowedForType(claimType, disposition) {
28
+ if (!disposition) return;
29
+ if (!resolveClaimTypeUiConfig(claimType).allowedDispositions.includes(disposition)) {
30
+ throw new CrudHttpError(400, { error: "warranty_claims.errors.dispositionTypeConflict" });
31
+ }
32
+ }
33
+ export {
34
+ CLAIM_TYPE_UI_CONFIG,
35
+ assertDispositionAllowedForType,
36
+ claimTypeAllowsLineFinancialAdjustments,
37
+ resolveClaimTypeUiConfig
38
+ };
39
+ //# sourceMappingURL=claimTypeConfig.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/claimTypeConfig.ts"],
4
+ "sourcesContent": ["import { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { WarrantyClaimType } from '../data/validators'\n\nexport type ClaimTypeUiConfig = {\n lineHeaderKey: string\n allowedDispositions: string[]\n}\n\nexport const CLAIM_TYPE_UI_CONFIG: Record<WarrantyClaimType, ClaimTypeUiConfig> = {\n warranty: {\n lineHeaderKey: 'warranty_claims.form.lineHeader.warranty',\n allowedDispositions: ['repair', 'replace', 'credit', 'refund', 'return_to_vendor', 'scrap', 'field_destroy', 'restock', 'deny'],\n },\n return: {\n lineHeaderKey: 'warranty_claims.form.lineHeader.return',\n allowedDispositions: ['restock', 'refund', 'replace', 'credit', 'deny'],\n },\n core_return: {\n lineHeaderKey: 'warranty_claims.form.lineHeader.core_return',\n allowedDispositions: ['credit', 'refund', 'restock', 'return_to_vendor', 'scrap', 'deny'],\n },\n vendor_recovery: {\n lineHeaderKey: 'warranty_claims.form.lineHeader.vendor_recovery',\n allowedDispositions: ['return_to_vendor', 'credit', 'replace', 'deny'],\n },\n}\n\nexport function resolveClaimTypeUiConfig(claimType: string | null | undefined): ClaimTypeUiConfig {\n return (CLAIM_TYPE_UI_CONFIG as Record<string, ClaimTypeUiConfig>)[claimType ?? 'warranty'] ?? CLAIM_TYPE_UI_CONFIG.warranty\n}\n\n// Restocking fees and core charge/credit only apply to return and core-return claims. Warranty\n// and vendor-recovery claims settle on the credit amount alone, so these adjustment fields must\n// neither be edited nor rolled into the header totals for those types (LINE-05).\nconst FINANCIAL_ADJUSTMENT_CLAIM_TYPES = new Set<WarrantyClaimType>(['return', 'core_return'])\n\nexport function claimTypeAllowsLineFinancialAdjustments(claimType: string | null | undefined): boolean {\n return FINANCIAL_ADJUSTMENT_CLAIM_TYPES.has((claimType ?? 'warranty') as WarrantyClaimType)\n}\n\nexport function assertDispositionAllowedForType(\n claimType: string | null | undefined,\n disposition: string | null | undefined,\n): void {\n if (!disposition) return\n if (!resolveClaimTypeUiConfig(claimType).allowedDispositions.includes(disposition)) {\n throw new CrudHttpError(400, { error: 'warranty_claims.errors.dispositionTypeConflict' })\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,qBAAqB;AAQvB,MAAM,uBAAqE;AAAA,EAChF,UAAU;AAAA,IACR,eAAe;AAAA,IACf,qBAAqB,CAAC,UAAU,WAAW,UAAU,UAAU,oBAAoB,SAAS,iBAAiB,WAAW,MAAM;AAAA,EAChI;AAAA,EACA,QAAQ;AAAA,IACN,eAAe;AAAA,IACf,qBAAqB,CAAC,WAAW,UAAU,WAAW,UAAU,MAAM;AAAA,EACxE;AAAA,EACA,aAAa;AAAA,IACX,eAAe;AAAA,IACf,qBAAqB,CAAC,UAAU,UAAU,WAAW,oBAAoB,SAAS,MAAM;AAAA,EAC1F;AAAA,EACA,iBAAiB;AAAA,IACf,eAAe;AAAA,IACf,qBAAqB,CAAC,oBAAoB,UAAU,WAAW,MAAM;AAAA,EACvE;AACF;AAEO,SAAS,yBAAyB,WAAyD;AAChG,SAAQ,qBAA2D,aAAa,UAAU,KAAK,qBAAqB;AACtH;AAKA,MAAM,mCAAmC,oBAAI,IAAuB,CAAC,UAAU,aAAa,CAAC;AAEtF,SAAS,wCAAwC,WAA+C;AACrG,SAAO,iCAAiC,IAAK,aAAa,UAAgC;AAC5F;AAEO,SAAS,gCACd,WACA,aACM;AACN,MAAI,CAAC,YAAa;AAClB,MAAI,CAAC,yBAAyB,SAAS,EAAE,oBAAoB,SAAS,WAAW,GAAG;AAClF,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,iDAAiD,CAAC;AAAA,EAC1F;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ const BASE64_PART = /^[A-Za-z0-9+/]+={0,2}$/;
2
+ function isPotentialEncryptedPayload(value) {
3
+ if (typeof value !== "string") return false;
4
+ const parts = value.split(":");
5
+ if (parts.length !== 4 || parts[3] !== "v1") return false;
6
+ const [iv, ciphertext, tag] = parts;
7
+ return iv.length === 16 && ciphertext.length > 0 && tag.length === 24 && BASE64_PART.test(iv) && BASE64_PART.test(ciphertext) && BASE64_PART.test(tag);
8
+ }
9
+ function readSafeDecryptedString(value) {
10
+ if (typeof value !== "string" || !value.trim().length || isPotentialEncryptedPayload(value)) return null;
11
+ return value.trim();
12
+ }
13
+ export {
14
+ isPotentialEncryptedPayload,
15
+ readSafeDecryptedString
16
+ };
17
+ //# sourceMappingURL=decryptionSafety.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/decryptionSafety.ts"],
4
+ "sourcesContent": ["const BASE64_PART = /^[A-Za-z0-9+/]+={0,2}$/\n\nexport function isPotentialEncryptedPayload(value: unknown): boolean {\n if (typeof value !== 'string') return false\n const parts = value.split(':')\n if (parts.length !== 4 || parts[3] !== 'v1') return false\n const [iv, ciphertext, tag] = parts\n return iv.length === 16\n && ciphertext.length > 0\n && tag.length === 24\n && BASE64_PART.test(iv)\n && BASE64_PART.test(ciphertext)\n && BASE64_PART.test(tag)\n}\n\nexport function readSafeDecryptedString(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim().length || isPotentialEncryptedPayload(value)) return null\n return value.trim()\n}\n"],
5
+ "mappings": "AAAA,MAAM,cAAc;AAEb,SAAS,4BAA4B,OAAyB;AACnE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,KAAM,QAAO;AACpD,QAAM,CAAC,IAAI,YAAY,GAAG,IAAI;AAC9B,SAAO,GAAG,WAAW,MAChB,WAAW,SAAS,KACpB,IAAI,WAAW,MACf,YAAY,KAAK,EAAE,KACnB,YAAY,KAAK,UAAU,KAC3B,YAAY,KAAK,GAAG;AAC3B;AAEO,SAAS,wBAAwB,OAA+B;AACrE,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAE,UAAU,4BAA4B,KAAK,EAAG,QAAO;AACpG,SAAO,MAAM,KAAK;AACpB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,88 @@
1
+ import { sql } from "kysely";
2
+ import { mergeIdFilter } from "@open-mercato/shared/lib/crud/ids";
3
+ const SLA_EXCLUDED_STATUSES = ["resolved", "closed", "rejected", "cancelled", "draft"];
4
+ const SLA_AT_RISK_EXCLUDED_STATUSES = SLA_EXCLUDED_STATUSES;
5
+ const SLA_AT_RISK_MATCH_LIMIT = 500;
6
+ const SLA_AT_RISK_DEFAULT_THRESHOLD_PCT = 75;
7
+ const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
8
+ const CLAIM_ID_NO_MATCH_FILTER = { $eq: "00000000-0000-0000-0000-000000000000" };
9
+ function normalizeSlaAtRiskThresholdPct(value) {
10
+ const parsed = typeof value === "number" ? value : Number(value);
11
+ if (!Number.isFinite(parsed)) return SLA_AT_RISK_DEFAULT_THRESHOLD_PCT;
12
+ return Math.min(Math.max(parsed, 0), 100);
13
+ }
14
+ function applySlaAtRiskConditions(query, thresholdPct, now) {
15
+ const pct = normalizeSlaAtRiskThresholdPct(thresholdPct);
16
+ return query.where("sla_due_at", ">", now).where("sla_paused_at", "is", null).where("status", "not in", [...SLA_EXCLUDED_STATUSES]).where("submitted_at", "is not", null).where(sql`sla_due_at > submitted_at`).where(sql`extract(epoch from (${now}::timestamptz - submitted_at)) * 100 >= extract(epoch from (sla_due_at - submitted_at)) * ${pct}`);
17
+ }
18
+ async function findSlaAtRiskClaimIds(em, scope, thresholdPct, now = /* @__PURE__ */ new Date()) {
19
+ const db = em.getKysely();
20
+ let query = applySlaAtRiskConditions(
21
+ db.selectFrom("warranty_claims").select("id").where("tenant_id", "=", scope.tenantId).where("deleted_at", "is", null),
22
+ thresholdPct,
23
+ now
24
+ );
25
+ if (scope.selectedOrganizationId) {
26
+ query = query.where("organization_id", "=", scope.selectedOrganizationId);
27
+ } else if (scope.visibleOrganizationIds && scope.visibleOrganizationIds.length) {
28
+ query = query.where("organization_id", "in", scope.visibleOrganizationIds);
29
+ }
30
+ const rows = await query.limit(SLA_AT_RISK_MATCH_LIMIT).execute();
31
+ return rows.map((row) => row.id);
32
+ }
33
+ function narrowFiltersToClaimIds(filters, claimIds) {
34
+ if (!claimIds.length) {
35
+ filters.id = { ...CLAIM_ID_NO_MATCH_FILTER };
36
+ return;
37
+ }
38
+ const merged = mergeIdFilter(filters, claimIds);
39
+ const mergedId = merged.id;
40
+ const mergedIn = mergedId && typeof mergedId === "object" && !Array.isArray(mergedId) ? mergedId.$in : void 0;
41
+ if (Array.isArray(mergedIn) && mergedIn.length === 0) {
42
+ filters.id = { ...CLAIM_ID_NO_MATCH_FILTER };
43
+ return;
44
+ }
45
+ filters.id = mergedId ?? { $in: claimIds };
46
+ }
47
+ function buildAttentionFilter(atRiskClaimIds, now = /* @__PURE__ */ new Date()) {
48
+ const branches = [
49
+ { awaiting_staff_reply: { $eq: true } },
50
+ {
51
+ sla_due_at: { $lt: now },
52
+ sla_paused_at: { $exists: false },
53
+ submitted_at: { $exists: true },
54
+ status: { $nin: [...SLA_EXCLUDED_STATUSES] }
55
+ }
56
+ ];
57
+ if (atRiskClaimIds.length) branches.push({ id: { $in: atRiskClaimIds } });
58
+ return { $or: branches };
59
+ }
60
+ function parseIsoDateBoundary(value, boundary) {
61
+ if (!ISO_DATE_PATTERN.test(value)) return null;
62
+ const suffix = boundary === "start" ? "T00:00:00.000Z" : "T23:59:59.999Z";
63
+ const parsed = /* @__PURE__ */ new Date(`${value}${suffix}`);
64
+ if (Number.isNaN(parsed.getTime())) return null;
65
+ return parsed.toISOString().slice(0, 10) === value ? parsed : null;
66
+ }
67
+ function buildDateRangeFilter(from, to) {
68
+ const range = {};
69
+ const fromDate = from ? parseIsoDateBoundary(from, "start") : null;
70
+ const toDate = to ? parseIsoDateBoundary(to, "end") : null;
71
+ if (fromDate) range.$gte = fromDate;
72
+ if (toDate) range.$lte = toDate;
73
+ return Object.keys(range).length ? range : null;
74
+ }
75
+ export {
76
+ ISO_DATE_PATTERN,
77
+ SLA_AT_RISK_DEFAULT_THRESHOLD_PCT,
78
+ SLA_AT_RISK_EXCLUDED_STATUSES,
79
+ SLA_AT_RISK_MATCH_LIMIT,
80
+ SLA_EXCLUDED_STATUSES,
81
+ applySlaAtRiskConditions,
82
+ buildAttentionFilter,
83
+ buildDateRangeFilter,
84
+ findSlaAtRiskClaimIds,
85
+ narrowFiltersToClaimIds,
86
+ normalizeSlaAtRiskThresholdPct
87
+ };
88
+ //# sourceMappingURL=deskFilters.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/deskFilters.ts"],
4
+ "sourcesContent": ["import { sql, type SelectQueryBuilder } from 'kysely'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { Where } from '@open-mercato/shared/lib/query/types'\nimport { mergeIdFilter } from '@open-mercato/shared/lib/crud/ids'\n\nexport const SLA_EXCLUDED_STATUSES = ['resolved', 'closed', 'rejected', 'cancelled', 'draft'] as const\nexport const SLA_AT_RISK_EXCLUDED_STATUSES = SLA_EXCLUDED_STATUSES\nexport const SLA_AT_RISK_MATCH_LIMIT = 500\nexport const SLA_AT_RISK_DEFAULT_THRESHOLD_PCT = 75\n\nexport const ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/\n\nconst CLAIM_ID_NO_MATCH_FILTER = { $eq: '00000000-0000-0000-0000-000000000000' }\n\nexport type WarrantyClaimsSlaTable = {\n id: string\n tenant_id: string\n organization_id: string\n status: string\n deleted_at: Date | null\n sla_due_at: Date | null\n sla_paused_at: Date | null\n submitted_at: Date | null\n}\n\nexport type WarrantyClaimsSlaDb = {\n warranty_claims: WarrantyClaimsSlaTable\n}\n\nexport type SlaAtRiskLookupScope = {\n tenantId: string\n selectedOrganizationId: string | null\n visibleOrganizationIds: string[] | null\n}\n\nexport function normalizeSlaAtRiskThresholdPct(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(parsed)) return SLA_AT_RISK_DEFAULT_THRESHOLD_PCT\n return Math.min(Math.max(parsed, 0), 100)\n}\n\nexport function applySlaAtRiskConditions<O>(\n query: SelectQueryBuilder<WarrantyClaimsSlaDb, 'warranty_claims', O>,\n thresholdPct: number,\n now: Date,\n): SelectQueryBuilder<WarrantyClaimsSlaDb, 'warranty_claims', O> {\n const pct = normalizeSlaAtRiskThresholdPct(thresholdPct)\n return query\n .where('sla_due_at', '>', now)\n .where('sla_paused_at', 'is', null)\n .where('status', 'not in', [...SLA_EXCLUDED_STATUSES])\n .where('submitted_at', 'is not', null)\n .where(sql<boolean>`sla_due_at > submitted_at`)\n .where(sql<boolean>`extract(epoch from (${now}::timestamptz - submitted_at)) * 100 >= extract(epoch from (sla_due_at - submitted_at)) * ${pct}`)\n}\n\nexport async function findSlaAtRiskClaimIds(\n em: EntityManager,\n scope: SlaAtRiskLookupScope,\n thresholdPct: number,\n now: Date = new Date(),\n): Promise<string[]> {\n const db = em.getKysely<WarrantyClaimsSlaDb>()\n let query = applySlaAtRiskConditions(\n db\n .selectFrom('warranty_claims')\n .select('id')\n .where('tenant_id', '=', scope.tenantId)\n .where('deleted_at', 'is', null),\n thresholdPct,\n now,\n )\n if (scope.selectedOrganizationId) {\n query = query.where('organization_id', '=', scope.selectedOrganizationId)\n } else if (scope.visibleOrganizationIds && scope.visibleOrganizationIds.length) {\n query = query.where('organization_id', 'in', scope.visibleOrganizationIds)\n }\n const rows = await query.limit(SLA_AT_RISK_MATCH_LIMIT).execute()\n return rows.map((row) => row.id)\n}\n\nexport function narrowFiltersToClaimIds(filters: Record<string, unknown>, claimIds: string[]): void {\n if (!claimIds.length) {\n filters.id = { ...CLAIM_ID_NO_MATCH_FILTER }\n return\n }\n const merged = mergeIdFilter(filters as Where<Record<string, unknown>>, claimIds) as Record<string, unknown>\n const mergedId = merged.id\n const mergedIn = mergedId && typeof mergedId === 'object' && !Array.isArray(mergedId)\n ? (mergedId as Record<string, unknown>).$in\n : undefined\n if (Array.isArray(mergedIn) && mergedIn.length === 0) {\n filters.id = { ...CLAIM_ID_NO_MATCH_FILTER }\n return\n }\n filters.id = mergedId ?? { $in: claimIds }\n}\n\nexport function buildAttentionFilter(atRiskClaimIds: string[], now: Date = new Date()): Record<string, unknown> {\n const branches: Record<string, unknown>[] = [\n { awaiting_staff_reply: { $eq: true } },\n {\n sla_due_at: { $lt: now },\n sla_paused_at: { $exists: false },\n submitted_at: { $exists: true },\n status: { $nin: [...SLA_EXCLUDED_STATUSES] },\n },\n ]\n if (atRiskClaimIds.length) branches.push({ id: { $in: atRiskClaimIds } })\n return { $or: branches }\n}\n\nfunction parseIsoDateBoundary(value: string, boundary: 'start' | 'end'): Date | null {\n if (!ISO_DATE_PATTERN.test(value)) return null\n const suffix = boundary === 'start' ? 'T00:00:00.000Z' : 'T23:59:59.999Z'\n const parsed = new Date(`${value}${suffix}`)\n if (Number.isNaN(parsed.getTime())) return null\n return parsed.toISOString().slice(0, 10) === value ? parsed : null\n}\n\nexport function buildDateRangeFilter(\n from: string | undefined,\n to: string | undefined,\n): Record<string, Date> | null {\n const range: Record<string, Date> = {}\n const fromDate = from ? parseIsoDateBoundary(from, 'start') : null\n const toDate = to ? parseIsoDateBoundary(to, 'end') : null\n if (fromDate) range.$gte = fromDate\n if (toDate) range.$lte = toDate\n return Object.keys(range).length ? range : null\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,157 @@
1
+ import { Dictionary, DictionaryEntry } from "@open-mercato/core/modules/dictionaries/data/entities";
2
+ import {
3
+ normalizeDictionaryValue,
4
+ sanitizeDictionaryColor,
5
+ sanitizeDictionaryIcon
6
+ } from "@open-mercato/core/modules/dictionaries/lib/utils";
7
+ const DEFINITIONS = {
8
+ "warranty-claim-fault-code": {
9
+ key: "warranty_claims.warranty_claim_fault_code",
10
+ name: "Warranty claim fault codes",
11
+ singular: "Warranty claim fault code",
12
+ description: "Configurable fault codes used on warranty claim lines.",
13
+ resourceKind: "warranty_claims.warranty-claim-fault-code",
14
+ commandPrefix: "warranty_claims.warranty-claim-fault-codes"
15
+ },
16
+ "warranty-claim-reason": {
17
+ key: "warranty_claims.warranty_claim_reason",
18
+ name: "Warranty claim reasons",
19
+ singular: "Warranty claim reason",
20
+ description: "Configurable reasons used when creating warranty and return claims.",
21
+ resourceKind: "warranty_claims.warranty-claim-reason",
22
+ commandPrefix: "warranty_claims.warranty-claim-reasons"
23
+ },
24
+ "warranty-claim-rejection-reason": {
25
+ key: "warranty_claims.warranty_claim_rejection_reason",
26
+ name: "Warranty claim rejection reasons",
27
+ singular: "Warranty claim rejection reason",
28
+ description: "Configurable reasons used when rejecting warranty and return claims.",
29
+ resourceKind: "warranty_claims.warranty-claim-rejection-reason",
30
+ commandPrefix: "warranty_claims.warranty-claim-rejection-reasons"
31
+ }
32
+ };
33
+ const FAULT_CODE_DEFAULTS = [
34
+ { value: "defective", label: "Defective", color: "#ef4444", icon: "lucide:triangle-alert" },
35
+ { value: "damaged-in-transit", label: "Damaged in transit", color: "#f59e0b", icon: "lucide:truck" },
36
+ { value: "wrong-item", label: "Wrong item", color: "#6366f1", icon: "lucide:package-x" },
37
+ { value: "worn", label: "Worn", color: "#94a3b8", icon: "lucide:rotate-ccw" },
38
+ { value: "doa", label: "Dead on arrival", color: "#dc2626", icon: "lucide:zap-off" }
39
+ ];
40
+ const CLAIM_REASON_DEFAULTS = [
41
+ { value: "warranty-defect", label: "Warranty defect", color: "#ef4444", icon: "lucide:shield-alert" },
42
+ { value: "customer-remorse", label: "Customer remorse", color: "#94a3b8", icon: "lucide:undo-2" },
43
+ { value: "wrong-order", label: "Wrong order", color: "#6366f1", icon: "lucide:list-x" },
44
+ { value: "core-exchange", label: "Core exchange", color: "#0d9488", icon: "lucide:repeat-2" },
45
+ { value: "vendor-recall", label: "Vendor recall", color: "#f59e0b", icon: "lucide:megaphone" }
46
+ ];
47
+ const REJECTION_REASON_DEFAULTS = [
48
+ { value: "out-of-warranty", label: "Out of warranty", color: "#ef4444", icon: "lucide:calendar-x" },
49
+ { value: "no-proof-of-purchase", label: "No proof of purchase", color: "#f59e0b", icon: "lucide:receipt" },
50
+ { value: "physical-abuse", label: "Physical abuse", color: "#dc2626", icon: "lucide:hammer" },
51
+ { value: "not-our-product", label: "Not our product", color: "#6366f1", icon: "lucide:package-search" },
52
+ { value: "duplicate-claim", label: "Duplicate claim", color: "#94a3b8", icon: "lucide:copy-x" }
53
+ ];
54
+ function getWarrantyClaimDictionaryDefinition(kind) {
55
+ return DEFINITIONS[kind];
56
+ }
57
+ async function loadWarrantyClaimDictionaryOptions(em, scope, kind) {
58
+ const def = getWarrantyClaimDictionaryDefinition(kind);
59
+ const dictionary = await em.findOne(Dictionary, {
60
+ tenantId: scope.tenantId,
61
+ organizationId: scope.organizationId,
62
+ key: def.key,
63
+ isActive: true,
64
+ deletedAt: null
65
+ });
66
+ if (!dictionary) return [];
67
+ const entries = await em.find(
68
+ DictionaryEntry,
69
+ { dictionary, tenantId: scope.tenantId, organizationId: scope.organizationId },
70
+ { orderBy: { position: "asc", label: "asc" } }
71
+ );
72
+ return entries.map((entry) => ({ value: entry.value, label: entry.label }));
73
+ }
74
+ async function ensureWarrantyClaimDictionary(params) {
75
+ const { em, tenantId, organizationId, kind } = params;
76
+ const def = getWarrantyClaimDictionaryDefinition(kind);
77
+ let dictionary = await em.findOne(Dictionary, {
78
+ tenantId,
79
+ organizationId,
80
+ key: def.key,
81
+ deletedAt: null
82
+ });
83
+ if (!dictionary) {
84
+ dictionary = em.create(Dictionary, {
85
+ tenantId,
86
+ organizationId,
87
+ key: def.key,
88
+ name: def.name,
89
+ description: def.description,
90
+ isSystem: true,
91
+ isActive: true,
92
+ managerVisibility: "hidden",
93
+ createdAt: /* @__PURE__ */ new Date(),
94
+ updatedAt: /* @__PURE__ */ new Date()
95
+ });
96
+ em.persist(dictionary);
97
+ await em.flush();
98
+ }
99
+ return dictionary;
100
+ }
101
+ async function ensureWarrantyClaimDictionaryEntry(em, scope, kind, seed) {
102
+ const value = seed.value?.trim();
103
+ if (!value) return null;
104
+ const dictionary = await ensureWarrantyClaimDictionary({
105
+ em,
106
+ tenantId: scope.tenantId,
107
+ organizationId: scope.organizationId,
108
+ kind
109
+ });
110
+ const normalizedValue = normalizeDictionaryValue(value);
111
+ const color = seed.color === void 0 ? void 0 : sanitizeDictionaryColor(seed.color);
112
+ const icon = seed.icon === void 0 ? void 0 : sanitizeDictionaryIcon(seed.icon);
113
+ const existing = await em.findOne(DictionaryEntry, {
114
+ dictionary,
115
+ tenantId: scope.tenantId,
116
+ organizationId: scope.organizationId,
117
+ normalizedValue
118
+ });
119
+ if (existing) return existing;
120
+ const now = /* @__PURE__ */ new Date();
121
+ const entry = em.create(DictionaryEntry, {
122
+ dictionary,
123
+ organizationId: scope.organizationId,
124
+ tenantId: scope.tenantId,
125
+ value,
126
+ label: seed.label?.trim() || value,
127
+ normalizedValue,
128
+ color: color ?? null,
129
+ icon: icon ?? null,
130
+ createdAt: now,
131
+ updatedAt: now
132
+ });
133
+ em.persist(entry);
134
+ return entry;
135
+ }
136
+ async function seedWarrantyClaimDictionary(em, scope, kind, defaults) {
137
+ for (const seed of defaults) {
138
+ await ensureWarrantyClaimDictionaryEntry(em, scope, kind, seed);
139
+ }
140
+ }
141
+ async function seedWarrantyClaimDictionaries(em, scope) {
142
+ await seedWarrantyClaimDictionary(em, scope, "warranty-claim-fault-code", FAULT_CODE_DEFAULTS);
143
+ await seedWarrantyClaimDictionary(em, scope, "warranty-claim-reason", CLAIM_REASON_DEFAULTS);
144
+ await seedWarrantyClaimDictionary(
145
+ em,
146
+ scope,
147
+ "warranty-claim-rejection-reason",
148
+ REJECTION_REASON_DEFAULTS
149
+ );
150
+ }
151
+ export {
152
+ ensureWarrantyClaimDictionary,
153
+ getWarrantyClaimDictionaryDefinition,
154
+ loadWarrantyClaimDictionaryOptions,
155
+ seedWarrantyClaimDictionaries
156
+ };
157
+ //# sourceMappingURL=dictionaries.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/dictionaries.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { Dictionary, DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport {\n normalizeDictionaryValue,\n sanitizeDictionaryColor,\n sanitizeDictionaryIcon,\n} from '@open-mercato/core/modules/dictionaries/lib/utils'\nimport type { WarrantyClaimDictionaryKind } from '../data/constants'\n\ntype WarrantyClaimDictionaryDefinition = {\n key: string\n name: string\n singular: string\n description: string\n resourceKind: string\n commandPrefix: string\n}\n\ntype WarrantyClaimDictionarySeed = {\n value: string\n label: string\n color?: string | null\n icon?: string | null\n}\n\ntype SeedScope = {\n tenantId: string\n organizationId: string\n}\n\nconst DEFINITIONS: Record<WarrantyClaimDictionaryKind, WarrantyClaimDictionaryDefinition> = {\n 'warranty-claim-fault-code': {\n key: 'warranty_claims.warranty_claim_fault_code',\n name: 'Warranty claim fault codes',\n singular: 'Warranty claim fault code',\n description: 'Configurable fault codes used on warranty claim lines.',\n resourceKind: 'warranty_claims.warranty-claim-fault-code',\n commandPrefix: 'warranty_claims.warranty-claim-fault-codes',\n },\n 'warranty-claim-reason': {\n key: 'warranty_claims.warranty_claim_reason',\n name: 'Warranty claim reasons',\n singular: 'Warranty claim reason',\n description: 'Configurable reasons used when creating warranty and return claims.',\n resourceKind: 'warranty_claims.warranty-claim-reason',\n commandPrefix: 'warranty_claims.warranty-claim-reasons',\n },\n 'warranty-claim-rejection-reason': {\n key: 'warranty_claims.warranty_claim_rejection_reason',\n name: 'Warranty claim rejection reasons',\n singular: 'Warranty claim rejection reason',\n description: 'Configurable reasons used when rejecting warranty and return claims.',\n resourceKind: 'warranty_claims.warranty-claim-rejection-reason',\n commandPrefix: 'warranty_claims.warranty-claim-rejection-reasons',\n },\n}\n\nconst FAULT_CODE_DEFAULTS: WarrantyClaimDictionarySeed[] = [\n { value: 'defective', label: 'Defective', color: '#ef4444', icon: 'lucide:triangle-alert' },\n { value: 'damaged-in-transit', label: 'Damaged in transit', color: '#f59e0b', icon: 'lucide:truck' },\n { value: 'wrong-item', label: 'Wrong item', color: '#6366f1', icon: 'lucide:package-x' },\n { value: 'worn', label: 'Worn', color: '#94a3b8', icon: 'lucide:rotate-ccw' },\n { value: 'doa', label: 'Dead on arrival', color: '#dc2626', icon: 'lucide:zap-off' },\n]\n\nconst CLAIM_REASON_DEFAULTS: WarrantyClaimDictionarySeed[] = [\n { value: 'warranty-defect', label: 'Warranty defect', color: '#ef4444', icon: 'lucide:shield-alert' },\n { value: 'customer-remorse', label: 'Customer remorse', color: '#94a3b8', icon: 'lucide:undo-2' },\n { value: 'wrong-order', label: 'Wrong order', color: '#6366f1', icon: 'lucide:list-x' },\n { value: 'core-exchange', label: 'Core exchange', color: '#0d9488', icon: 'lucide:repeat-2' },\n { value: 'vendor-recall', label: 'Vendor recall', color: '#f59e0b', icon: 'lucide:megaphone' },\n]\n\nconst REJECTION_REASON_DEFAULTS: WarrantyClaimDictionarySeed[] = [\n { value: 'out-of-warranty', label: 'Out of warranty', color: '#ef4444', icon: 'lucide:calendar-x' },\n { value: 'no-proof-of-purchase', label: 'No proof of purchase', color: '#f59e0b', icon: 'lucide:receipt' },\n { value: 'physical-abuse', label: 'Physical abuse', color: '#dc2626', icon: 'lucide:hammer' },\n { value: 'not-our-product', label: 'Not our product', color: '#6366f1', icon: 'lucide:package-search' },\n { value: 'duplicate-claim', label: 'Duplicate claim', color: '#94a3b8', icon: 'lucide:copy-x' },\n]\n\nexport function getWarrantyClaimDictionaryDefinition(\n kind: WarrantyClaimDictionaryKind\n): WarrantyClaimDictionaryDefinition {\n return DEFINITIONS[kind]\n}\n\nexport type WarrantyClaimDictionaryOption = {\n value: string\n label: string\n}\n\nexport async function loadWarrantyClaimDictionaryOptions(\n em: EntityManager,\n scope: SeedScope,\n kind: WarrantyClaimDictionaryKind\n): Promise<WarrantyClaimDictionaryOption[]> {\n const def = getWarrantyClaimDictionaryDefinition(kind)\n const dictionary = await em.findOne(Dictionary, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n key: def.key,\n isActive: true,\n deletedAt: null,\n })\n if (!dictionary) return []\n const entries = await em.find(\n DictionaryEntry,\n { dictionary, tenantId: scope.tenantId, organizationId: scope.organizationId },\n { orderBy: { position: 'asc', label: 'asc' } }\n )\n return entries.map((entry) => ({ value: entry.value, label: entry.label }))\n}\n\nexport async function ensureWarrantyClaimDictionary(params: {\n em: EntityManager\n tenantId: string\n organizationId: string\n kind: WarrantyClaimDictionaryKind\n}): Promise<Dictionary> {\n const { em, tenantId, organizationId, kind } = params\n const def = getWarrantyClaimDictionaryDefinition(kind)\n let dictionary = await em.findOne(Dictionary, {\n tenantId,\n organizationId,\n key: def.key,\n deletedAt: null,\n })\n if (!dictionary) {\n dictionary = em.create(Dictionary, {\n tenantId,\n organizationId,\n key: def.key,\n name: def.name,\n description: def.description,\n isSystem: true,\n isActive: true,\n managerVisibility: 'hidden',\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(dictionary)\n await em.flush()\n }\n return dictionary\n}\n\nasync function ensureWarrantyClaimDictionaryEntry(\n em: EntityManager,\n scope: SeedScope,\n kind: WarrantyClaimDictionaryKind,\n seed: WarrantyClaimDictionarySeed\n): Promise<DictionaryEntry | null> {\n const value = seed.value?.trim()\n if (!value) return null\n const dictionary = await ensureWarrantyClaimDictionary({\n em,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n kind,\n })\n const normalizedValue = normalizeDictionaryValue(value)\n const color = seed.color === undefined ? undefined : sanitizeDictionaryColor(seed.color)\n const icon = seed.icon === undefined ? undefined : sanitizeDictionaryIcon(seed.icon)\n const existing = await em.findOne(DictionaryEntry, {\n dictionary,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n normalizedValue,\n })\n if (existing) return existing\n const now = new Date()\n const entry = em.create(DictionaryEntry, {\n dictionary,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n value,\n label: seed.label?.trim() || value,\n normalizedValue,\n color: color ?? null,\n icon: icon ?? null,\n createdAt: now,\n updatedAt: now,\n })\n em.persist(entry)\n return entry\n}\n\nasync function seedWarrantyClaimDictionary(\n em: EntityManager,\n scope: SeedScope,\n kind: WarrantyClaimDictionaryKind,\n defaults: WarrantyClaimDictionarySeed[]\n): Promise<void> {\n for (const seed of defaults) {\n await ensureWarrantyClaimDictionaryEntry(em, scope, kind, seed)\n }\n}\n\nexport async function seedWarrantyClaimDictionaries(\n em: EntityManager,\n scope: SeedScope\n): Promise<void> {\n await seedWarrantyClaimDictionary(em, scope, 'warranty-claim-fault-code', FAULT_CODE_DEFAULTS)\n await seedWarrantyClaimDictionary(em, scope, 'warranty-claim-reason', CLAIM_REASON_DEFAULTS)\n await seedWarrantyClaimDictionary(\n em,\n scope,\n 'warranty-claim-rejection-reason',\n REJECTION_REASON_DEFAULTS\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ const PREFIX = {
2
+ reason: "warranty_claims.reasonOption",
3
+ fault: "warranty_claims.faultOption",
4
+ rejection: "warranty_claims.rejectionOption"
5
+ };
6
+ function localizeDictionaryLabel(t, kind, value, fallbackLabel) {
7
+ return t(`${PREFIX[kind]}.${value}`, fallbackLabel);
8
+ }
9
+ export {
10
+ localizeDictionaryLabel
11
+ };
12
+ //# sourceMappingURL=dictionaryLabels.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/dictionaryLabels.ts"],
4
+ "sourcesContent": ["export type DictionaryLabelKind = 'reason' | 'fault' | 'rejection'\n\nconst PREFIX: Record<DictionaryLabelKind, string> = {\n reason: 'warranty_claims.reasonOption',\n fault: 'warranty_claims.faultOption',\n rejection: 'warranty_claims.rejectionOption',\n}\n\nexport function localizeDictionaryLabel(\n t: (key: string, fallback?: string) => string,\n kind: DictionaryLabelKind,\n value: string,\n fallbackLabel: string,\n): string {\n return t(`${PREFIX[kind]}.${value}`, fallbackLabel)\n}\n"],
5
+ "mappings": "AAEA,MAAM,SAA8C;AAAA,EAClD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AACb;AAEO,SAAS,wBACd,GACA,MACA,OACA,eACQ;AACR,SAAO,EAAE,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,aAAa;AACpD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,87 @@
1
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { WarrantyClaim } from "../data/entities.js";
3
+ import { isUniqueViolation } from "./externalIntake.js";
4
+ function normalizeRequired(value, fieldName) {
5
+ const normalized = value.trim();
6
+ if (!normalized) throw new Error(`[internal] ${fieldName} is required for warranty claim email intake`);
7
+ return normalized;
8
+ }
9
+ function trimOptional(value) {
10
+ if (typeof value !== "string") return null;
11
+ const normalized = value.trim();
12
+ return normalized.length > 0 ? normalized : null;
13
+ }
14
+ function buildNotes(subject, body) {
15
+ const parts = [];
16
+ if (subject) parts.push(`Subject: ${subject}`);
17
+ if (body) parts.push(body);
18
+ const notes = parts.join("\n\n").trim();
19
+ return notes.length > 0 ? notes.slice(0, 8e3) : null;
20
+ }
21
+ async function loadClaimByIntakeMessageRef(em, scope, intakeMessageRef) {
22
+ return findOneWithDecryption(
23
+ em,
24
+ WarrantyClaim,
25
+ {
26
+ tenantId: scope.tenantId,
27
+ organizationId: scope.organizationId,
28
+ intakeMessageRef,
29
+ deletedAt: null
30
+ },
31
+ {},
32
+ scope
33
+ );
34
+ }
35
+ function buildCommandCtx(container, scope) {
36
+ return {
37
+ container,
38
+ auth: null,
39
+ organizationScope: null,
40
+ selectedOrganizationId: scope.organizationId,
41
+ organizationIds: [scope.organizationId],
42
+ syncOrigin: "warranty_claims.email_intake",
43
+ systemActor: true
44
+ };
45
+ }
46
+ async function createOrGetClaimFromInboundMessage(args) {
47
+ const contactEmail = normalizeRequired(args.contactEmail, "contactEmail");
48
+ const intakeMessageRef = normalizeRequired(args.intakeMessageRef, "intakeMessageRef");
49
+ const existing = await loadClaimByIntakeMessageRef(args.em, args.scope, intakeMessageRef);
50
+ if (existing) return { claimId: existing.id, created: false };
51
+ const commandBus = args.container.resolve("commandBus");
52
+ const commandCtx = buildCommandCtx(args.container, args.scope);
53
+ const subject = trimOptional(args.subject);
54
+ const body = trimOptional(args.body);
55
+ const createInput = {
56
+ tenantId: args.scope.tenantId,
57
+ organizationId: args.scope.organizationId,
58
+ claimType: "warranty",
59
+ channel: "api",
60
+ priority: "normal",
61
+ customerId: null,
62
+ customerName: trimOptional(args.customerName) ?? contactEmail,
63
+ contactEmail,
64
+ intakeMessageRef,
65
+ notes: buildNotes(subject, body)
66
+ };
67
+ try {
68
+ const { result } = await commandBus.execute(
69
+ "warranty_claims.claim.create",
70
+ { input: createInput, ctx: commandCtx }
71
+ );
72
+ if (!result?.claimId) {
73
+ throw new Error("[internal] warranty claim email intake create failed");
74
+ }
75
+ return { claimId: result.claimId, created: true };
76
+ } catch (err) {
77
+ if (isUniqueViolation(err)) {
78
+ const winner = await loadClaimByIntakeMessageRef(args.em, args.scope, intakeMessageRef);
79
+ if (winner) return { claimId: winner.id, created: false };
80
+ }
81
+ throw err;
82
+ }
83
+ }
84
+ export {
85
+ createOrGetClaimFromInboundMessage
86
+ };
87
+ //# sourceMappingURL=emailIntake.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/emailIntake.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport type { CommandBus, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { WarrantyClaim } from '../data/entities'\nimport type { ClaimCreateInput } from '../data/validators'\nimport { isUniqueViolation } from './externalIntake'\n\ntype EmailIntakeScope = {\n tenantId: string\n organizationId: string\n}\n\nexport type CreateOrGetClaimFromInboundMessageArgs = {\n em: EntityManager\n container: AwilixContainer\n scope: EmailIntakeScope\n contactEmail: string\n customerName?: string | null\n subject?: string | null\n body?: string | null\n intakeMessageRef: string\n}\n\nexport type EmailIntakeResult = {\n claimId: string\n created: boolean\n}\n\nfunction normalizeRequired(value: string, fieldName: string): string {\n const normalized = value.trim()\n if (!normalized) throw new Error(`[internal] ${fieldName} is required for warranty claim email intake`)\n return normalized\n}\n\nfunction trimOptional(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const normalized = value.trim()\n return normalized.length > 0 ? normalized : null\n}\n\nfunction buildNotes(subject: string | null, body: string | null): string | null {\n const parts: string[] = []\n if (subject) parts.push(`Subject: ${subject}`)\n if (body) parts.push(body)\n const notes = parts.join('\\n\\n').trim()\n return notes.length > 0 ? notes.slice(0, 8000) : null\n}\n\nasync function loadClaimByIntakeMessageRef(\n em: EntityManager,\n scope: EmailIntakeScope,\n intakeMessageRef: string,\n): Promise<WarrantyClaim | null> {\n return findOneWithDecryption(\n em,\n WarrantyClaim,\n {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n intakeMessageRef,\n deletedAt: null,\n },\n {},\n scope,\n )\n}\n\nfunction buildCommandCtx(container: AwilixContainer, scope: EmailIntakeScope): CommandRuntimeContext {\n return {\n container,\n auth: null,\n organizationScope: null,\n selectedOrganizationId: scope.organizationId,\n organizationIds: [scope.organizationId],\n syncOrigin: 'warranty_claims.email_intake',\n systemActor: true,\n }\n}\n\nexport async function createOrGetClaimFromInboundMessage(\n args: CreateOrGetClaimFromInboundMessageArgs,\n): Promise<EmailIntakeResult> {\n const contactEmail = normalizeRequired(args.contactEmail, 'contactEmail')\n const intakeMessageRef = normalizeRequired(args.intakeMessageRef, 'intakeMessageRef')\n\n const existing = await loadClaimByIntakeMessageRef(args.em, args.scope, intakeMessageRef)\n if (existing) return { claimId: existing.id, created: false }\n\n const commandBus = args.container.resolve<CommandBus>('commandBus')\n const commandCtx = buildCommandCtx(args.container, args.scope)\n const subject = trimOptional(args.subject)\n const body = trimOptional(args.body)\n const createInput: ClaimCreateInput = {\n tenantId: args.scope.tenantId,\n organizationId: args.scope.organizationId,\n claimType: 'warranty',\n channel: 'api',\n priority: 'normal',\n customerId: null,\n customerName: trimOptional(args.customerName) ?? contactEmail,\n contactEmail,\n intakeMessageRef,\n notes: buildNotes(subject, body),\n }\n\n try {\n const { result } = await commandBus.execute<ClaimCreateInput, { claimId: string }>(\n 'warranty_claims.claim.create',\n { input: createInput, ctx: commandCtx },\n )\n if (!result?.claimId) {\n throw new Error('[internal] warranty claim email intake create failed')\n }\n return { claimId: result.claimId, created: true }\n } catch (err) {\n if (isUniqueViolation(err)) {\n const winner = await loadClaimByIntakeMessageRef(args.em, args.scope, intakeMessageRef)\n if (winner) return { claimId: winner.id, created: false }\n }\n throw err\n }\n}\n"],
5
+ "mappings": "AAGA,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAuBlC,SAAS,kBAAkB,OAAe,WAA2B;AACnE,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,cAAc,SAAS,8CAA8C;AACtG,SAAO;AACT;AAEA,SAAS,aAAa,OAAiD;AACrE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAS,WAAW,SAAwB,MAAoC;AAC9E,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAS,OAAM,KAAK,YAAY,OAAO,EAAE;AAC7C,MAAI,KAAM,OAAM,KAAK,IAAI;AACzB,QAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK;AACtC,SAAO,MAAM,SAAS,IAAI,MAAM,MAAM,GAAG,GAAI,IAAI;AACnD;AAEA,eAAe,4BACb,IACA,OACA,kBAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,WAA4B,OAAgD;AACnG,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,wBAAwB,MAAM;AAAA,IAC9B,iBAAiB,CAAC,MAAM,cAAc;AAAA,IACtC,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACF;AAEA,eAAsB,mCACpB,MAC4B;AAC5B,QAAM,eAAe,kBAAkB,KAAK,cAAc,cAAc;AACxE,QAAM,mBAAmB,kBAAkB,KAAK,kBAAkB,kBAAkB;AAEpF,QAAM,WAAW,MAAM,4BAA4B,KAAK,IAAI,KAAK,OAAO,gBAAgB;AACxF,MAAI,SAAU,QAAO,EAAE,SAAS,SAAS,IAAI,SAAS,MAAM;AAE5D,QAAM,aAAa,KAAK,UAAU,QAAoB,YAAY;AAClE,QAAM,aAAa,gBAAgB,KAAK,WAAW,KAAK,KAAK;AAC7D,QAAM,UAAU,aAAa,KAAK,OAAO;AACzC,QAAM,OAAO,aAAa,KAAK,IAAI;AACnC,QAAM,cAAgC;AAAA,IACpC,UAAU,KAAK,MAAM;AAAA,IACrB,gBAAgB,KAAK,MAAM;AAAA,IAC3B,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc,aAAa,KAAK,YAAY,KAAK;AAAA,IACjD;AAAA,IACA;AAAA,IACA,OAAO,WAAW,SAAS,IAAI;AAAA,EACjC;AAEA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,WAAW;AAAA,MAClC;AAAA,MACA,EAAE,OAAO,aAAa,KAAK,WAAW;AAAA,IACxC;AACA,QAAI,CAAC,QAAQ,SAAS;AACpB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS,KAAK;AAAA,EAClD,SAAS,KAAK;AACZ,QAAI,kBAAkB,GAAG,GAAG;AAC1B,YAAM,SAAS,MAAM,4BAA4B,KAAK,IAAI,KAAK,OAAO,gBAAgB;AACtF,UAAI,OAAQ,QAAO,EAAE,SAAS,OAAO,IAAI,SAAS,MAAM;AAAA,IAC1D;AACA,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,58 @@
1
+ const SLA_TERMINAL_STATUSES = /* @__PURE__ */ new Set([
2
+ "resolved",
3
+ "closed",
4
+ "cancelled",
5
+ "rejected"
6
+ ]);
7
+ function toRecord(value) {
8
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
9
+ }
10
+ function parseAction(value) {
11
+ return value === "notify" || value === "reassign" ? value : null;
12
+ }
13
+ function parseAtPct(value) {
14
+ const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
15
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
16
+ }
17
+ function parseUserId(value) {
18
+ if (typeof value !== "string") return void 0;
19
+ const trimmed = value.trim();
20
+ return trimmed.length > 0 ? trimmed : void 0;
21
+ }
22
+ function parseEscalationTiers(raw) {
23
+ if (!Array.isArray(raw)) return [];
24
+ const tiers = [];
25
+ for (const item of raw) {
26
+ const record = toRecord(item);
27
+ if (!record) continue;
28
+ const atPct = parseAtPct(record.atPct);
29
+ const action = parseAction(record.action);
30
+ if (atPct === null || action === null) continue;
31
+ const toUserId = parseUserId(record.toUserId);
32
+ if (action === "reassign" && !toUserId) continue;
33
+ tiers.push(toUserId ? { atPct, action, toUserId } : { atPct, action });
34
+ }
35
+ return tiers.sort((left, right) => left.atPct - right.atPct);
36
+ }
37
+ function tiersToFire(progressPct, currentLevel, tiers) {
38
+ if (!Number.isFinite(progressPct)) return [];
39
+ const normalizedLevel = Number.isFinite(currentLevel) ? Math.max(0, Math.floor(currentLevel)) : 0;
40
+ return tiers.map((tier, index) => ({ tierIndex: index + 1, tier })).filter((entry) => entry.tier.atPct <= progressPct && entry.tierIndex > normalizedLevel);
41
+ }
42
+ function isSlaEscalationTerminalStatus(status) {
43
+ return SLA_TERMINAL_STATUSES.has(status);
44
+ }
45
+ function isSlaEscalationCandidate(claim) {
46
+ if (isSlaEscalationTerminalStatus(claim.status)) return false;
47
+ if (claim.slaPausedAt !== null && claim.slaPausedAt !== void 0) return false;
48
+ if (claim.slaDueAt === null || claim.slaDueAt === void 0) return false;
49
+ if (claim.submittedAt === null || claim.submittedAt === void 0) return false;
50
+ return true;
51
+ }
52
+ export {
53
+ isSlaEscalationCandidate,
54
+ isSlaEscalationTerminalStatus,
55
+ parseEscalationTiers,
56
+ tiersToFire
57
+ };
58
+ //# sourceMappingURL=escalation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/warranty_claims/lib/escalation.ts"],
4
+ "sourcesContent": ["import type { WarrantyClaimStatus } from '../data/validators'\n\nexport type EscalationTier = {\n atPct: number\n action: 'notify' | 'reassign'\n toUserId?: string\n}\n\nexport type SlaEscalationCandidateInput = {\n status: WarrantyClaimStatus\n slaPausedAt?: Date | string | null\n slaDueAt?: Date | string | null\n submittedAt?: Date | string | null\n}\n\nconst SLA_TERMINAL_STATUSES = new Set<WarrantyClaimStatus>([\n 'resolved',\n 'closed',\n 'cancelled',\n 'rejected',\n])\n\nfunction toRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : null\n}\n\nfunction parseAction(value: unknown): EscalationTier['action'] | null {\n return value === 'notify' || value === 'reassign' ? value : null\n}\n\nfunction parseAtPct(value: unknown): number | null {\n const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null\n}\n\nfunction parseUserId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nexport function parseEscalationTiers(raw: unknown): EscalationTier[] {\n if (!Array.isArray(raw)) return []\n const tiers: EscalationTier[] = []\n\n for (const item of raw) {\n const record = toRecord(item)\n if (!record) continue\n const atPct = parseAtPct(record.atPct)\n const action = parseAction(record.action)\n if (atPct === null || action === null) continue\n\n const toUserId = parseUserId(record.toUserId)\n if (action === 'reassign' && !toUserId) continue\n tiers.push(toUserId ? { atPct, action, toUserId } : { atPct, action })\n }\n\n return tiers.sort((left, right) => left.atPct - right.atPct)\n}\n\nexport function tiersToFire(\n progressPct: number,\n currentLevel: number,\n tiers: EscalationTier[],\n): { tierIndex: number; tier: EscalationTier }[] {\n if (!Number.isFinite(progressPct)) return []\n const normalizedLevel = Number.isFinite(currentLevel) ? Math.max(0, Math.floor(currentLevel)) : 0\n return tiers\n .map((tier, index) => ({ tierIndex: index + 1, tier }))\n .filter((entry) => entry.tier.atPct <= progressPct && entry.tierIndex > normalizedLevel)\n}\n\nexport function isSlaEscalationTerminalStatus(status: WarrantyClaimStatus): boolean {\n return SLA_TERMINAL_STATUSES.has(status)\n}\n\nexport function isSlaEscalationCandidate(claim: SlaEscalationCandidateInput): boolean {\n if (isSlaEscalationTerminalStatus(claim.status)) return false\n if (claim.slaPausedAt !== null && claim.slaPausedAt !== undefined) return false\n if (claim.slaDueAt === null || claim.slaDueAt === undefined) return false\n if (claim.submittedAt === null || claim.submittedAt === undefined) return false\n return true\n}\n"],
5
+ "mappings": "AAeA,MAAM,wBAAwB,oBAAI,IAAyB;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,SAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAC1G;AAEA,SAAS,YAAY,OAAiD;AACpE,SAAO,UAAU,YAAY,UAAU,aAAa,QAAQ;AAC9D;AAEA,SAAS,WAAW,OAA+B;AACjD,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI,OAAO;AACtG,SAAO,OAAO,SAAS,MAAM,KAAK,UAAU,IAAI,SAAS;AAC3D;AAEA,SAAS,YAAY,OAAoC;AACvD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,SAAS,qBAAqB,KAAgC;AACnE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,QAA0B,CAAC;AAEjC,aAAW,QAAQ,KAAK;AACtB,UAAM,SAAS,SAAS,IAAI;AAC5B,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,UAAM,SAAS,YAAY,OAAO,MAAM;AACxC,QAAI,UAAU,QAAQ,WAAW,KAAM;AAEvC,UAAM,WAAW,YAAY,OAAO,QAAQ;AAC5C,QAAI,WAAW,cAAc,CAAC,SAAU;AACxC,UAAM,KAAK,WAAW,EAAE,OAAO,QAAQ,SAAS,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EACvE;AAEA,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;AAC7D;AAEO,SAAS,YACd,aACA,cACA,OAC+C;AAC/C,MAAI,CAAC,OAAO,SAAS,WAAW,EAAG,QAAO,CAAC;AAC3C,QAAM,kBAAkB,OAAO,SAAS,YAAY,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,CAAC,IAAI;AAChG,SAAO,MACJ,IAAI,CAAC,MAAM,WAAW,EAAE,WAAW,QAAQ,GAAG,KAAK,EAAE,EACrD,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,eAAe,MAAM,YAAY,eAAe;AAC3F;AAEO,SAAS,8BAA8B,QAAsC;AAClF,SAAO,sBAAsB,IAAI,MAAM;AACzC;AAEO,SAAS,yBAAyB,OAA6C;AACpF,MAAI,8BAA8B,MAAM,MAAM,EAAG,QAAO;AACxD,MAAI,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB,OAAW,QAAO;AAC1E,MAAI,MAAM,aAAa,QAAQ,MAAM,aAAa,OAAW,QAAO;AACpE,MAAI,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB,OAAW,QAAO;AAC1E,SAAO;AACT;",
6
+ "names": []
7
+ }