@open-mercato/core 0.6.8-develop.6998.1.d2bc46c56c → 0.6.8-develop.7000.1.0ae682bad1

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 (636) 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/customers/api/companies/route.js +1 -0
  37. package/dist/modules/customers/api/companies/route.js.map +2 -2
  38. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -2
  39. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  40. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -2
  41. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  42. package/dist/modules/customers/components/detail/assignableStaff.js +6 -69
  43. package/dist/modules/customers/components/detail/assignableStaff.js.map +2 -2
  44. package/dist/modules/customers/lib/assignableStaff.js +76 -0
  45. package/dist/modules/customers/lib/assignableStaff.js.map +7 -0
  46. package/dist/modules/data_sync/lib/batch-stream.js +56 -0
  47. package/dist/modules/data_sync/lib/batch-stream.js.map +7 -0
  48. package/dist/modules/data_sync/lib/sync-engine.js +165 -103
  49. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  50. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +4 -0
  51. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  52. package/dist/modules/inbox_ops/api/extract/route.js +4 -0
  53. package/dist/modules/inbox_ops/api/extract/route.js.map +2 -2
  54. package/dist/modules/inbox_ops/api/webhook/inbound.js +4 -0
  55. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  56. package/dist/modules/sales/commands/documents.js +8 -8
  57. package/dist/modules/sales/commands/documents.js.map +2 -2
  58. package/dist/modules/warranty_claims/acl.js +75 -0
  59. package/dist/modules/warranty_claims/acl.js.map +7 -0
  60. package/dist/modules/warranty_claims/ai-agents.js +161 -0
  61. package/dist/modules/warranty_claims/ai-agents.js.map +7 -0
  62. package/dist/modules/warranty_claims/ai-tools.js +591 -0
  63. package/dist/modules/warranty_claims/ai-tools.js.map +7 -0
  64. package/dist/modules/warranty_claims/api/ai/assess/route.js +304 -0
  65. package/dist/modules/warranty_claims/api/ai/assess/route.js.map +7 -0
  66. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js +127 -0
  67. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js.map +7 -0
  68. package/dist/modules/warranty_claims/api/ai/suggest/route.js +177 -0
  69. package/dist/modules/warranty_claims/api/ai/suggest/route.js.map +7 -0
  70. package/dist/modules/warranty_claims/api/assign/route.js +124 -0
  71. package/dist/modules/warranty_claims/api/assign/route.js.map +7 -0
  72. package/dist/modules/warranty_claims/api/assignees/route.js +97 -0
  73. package/dist/modules/warranty_claims/api/assignees/route.js.map +7 -0
  74. package/dist/modules/warranty_claims/api/credit-memo/route.js +152 -0
  75. package/dist/modules/warranty_claims/api/credit-memo/route.js.map +7 -0
  76. package/dist/modules/warranty_claims/api/entitlement/route.js +145 -0
  77. package/dist/modules/warranty_claims/api/entitlement/route.js.map +7 -0
  78. package/dist/modules/warranty_claims/api/events/route.js +199 -0
  79. package/dist/modules/warranty_claims/api/events/route.js.map +7 -0
  80. package/dist/modules/warranty_claims/api/external/claims/route.js +446 -0
  81. package/dist/modules/warranty_claims/api/external/claims/route.js.map +7 -0
  82. package/dist/modules/warranty_claims/api/lines/route.js +258 -0
  83. package/dist/modules/warranty_claims/api/lines/route.js.map +7 -0
  84. package/dist/modules/warranty_claims/api/openapi.js +27 -0
  85. package/dist/modules/warranty_claims/api/openapi.js.map +7 -0
  86. package/dist/modules/warranty_claims/api/portal/attachments/route.js +490 -0
  87. package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +7 -0
  88. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js +178 -0
  89. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js.map +7 -0
  90. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js +101 -0
  91. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js.map +7 -0
  92. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js +78 -0
  93. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js.map +7 -0
  94. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js +81 -0
  95. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js.map +7 -0
  96. package/dist/modules/warranty_claims/api/portal/claims/route.js +462 -0
  97. package/dist/modules/warranty_claims/api/portal/claims/route.js.map +7 -0
  98. package/dist/modules/warranty_claims/api/portal/events/route.js +228 -0
  99. package/dist/modules/warranty_claims/api/portal/events/route.js.map +7 -0
  100. package/dist/modules/warranty_claims/api/portal/options/route.js +91 -0
  101. package/dist/modules/warranty_claims/api/portal/options/route.js.map +7 -0
  102. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js +172 -0
  103. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js.map +7 -0
  104. package/dist/modules/warranty_claims/api/portal/orders/route.js +151 -0
  105. package/dist/modules/warranty_claims/api/portal/orders/route.js.map +7 -0
  106. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js +121 -0
  107. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js.map +7 -0
  108. package/dist/modules/warranty_claims/api/receiving/route.js +176 -0
  109. package/dist/modules/warranty_claims/api/receiving/route.js.map +7 -0
  110. package/dist/modules/warranty_claims/api/registrations/route.js +382 -0
  111. package/dist/modules/warranty_claims/api/registrations/route.js.map +7 -0
  112. package/dist/modules/warranty_claims/api/replacement-order/route.js +150 -0
  113. package/dist/modules/warranty_claims/api/replacement-order/route.js.map +7 -0
  114. package/dist/modules/warranty_claims/api/return-label/route.js +235 -0
  115. package/dist/modules/warranty_claims/api/return-label/route.js.map +7 -0
  116. package/dist/modules/warranty_claims/api/risk/route.js +101 -0
  117. package/dist/modules/warranty_claims/api/risk/route.js.map +7 -0
  118. package/dist/modules/warranty_claims/api/route.js +482 -0
  119. package/dist/modules/warranty_claims/api/route.js.map +7 -0
  120. package/dist/modules/warranty_claims/api/sales-return/route.js +151 -0
  121. package/dist/modules/warranty_claims/api/sales-return/route.js.map +7 -0
  122. package/dist/modules/warranty_claims/api/settings-general/route.js +195 -0
  123. package/dist/modules/warranty_claims/api/settings-general/route.js.map +7 -0
  124. package/dist/modules/warranty_claims/api/stats/route.js +199 -0
  125. package/dist/modules/warranty_claims/api/stats/route.js.map +7 -0
  126. package/dist/modules/warranty_claims/api/submit/route.js +120 -0
  127. package/dist/modules/warranty_claims/api/submit/route.js.map +7 -0
  128. package/dist/modules/warranty_claims/api/transition/route.js +126 -0
  129. package/dist/modules/warranty_claims/api/transition/route.js.map +7 -0
  130. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js +261 -0
  131. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js.map +7 -0
  132. package/dist/modules/warranty_claims/api/vendor-policies/route.js +311 -0
  133. package/dist/modules/warranty_claims/api/vendor-policies/route.js.map +7 -0
  134. package/dist/modules/warranty_claims/api/vendor-recovery/route.js +130 -0
  135. package/dist/modules/warranty_claims/api/vendor-recovery/route.js.map +7 -0
  136. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js +153 -0
  137. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js.map +7 -0
  138. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js +268 -0
  139. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js.map +7 -0
  140. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js +54 -0
  141. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js.map +7 -0
  142. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js +87 -0
  143. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js.map +7 -0
  144. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js +120 -0
  145. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js.map +7 -0
  146. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js +135 -0
  147. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js.map +7 -0
  148. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js +218 -0
  149. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js.map +7 -0
  150. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js +231 -0
  151. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js.map +7 -0
  152. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js +82 -0
  153. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js.map +7 -0
  154. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js +136 -0
  155. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js.map +7 -0
  156. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js +41 -0
  157. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js.map +7 -0
  158. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js +45 -0
  159. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js.map +7 -0
  160. package/dist/modules/warranty_claims/backend/components/claimSla.js +92 -0
  161. package/dist/modules/warranty_claims/backend/components/claimSla.js.map +7 -0
  162. package/dist/modules/warranty_claims/backend/components/orderLookup.js +81 -0
  163. package/dist/modules/warranty_claims/backend/components/orderLookup.js.map +7 -0
  164. package/dist/modules/warranty_claims/backend/components/productLookup.js +317 -0
  165. package/dist/modules/warranty_claims/backend/components/productLookup.js.map +7 -0
  166. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js +61 -0
  167. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js.map +7 -0
  168. package/dist/modules/warranty_claims/backend/page.js +1088 -0
  169. package/dist/modules/warranty_claims/backend/page.js.map +7 -0
  170. package/dist/modules/warranty_claims/backend/page.meta.js +16 -0
  171. package/dist/modules/warranty_claims/backend/page.meta.js.map +7 -0
  172. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js +427 -0
  173. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js.map +7 -0
  174. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js +16 -0
  175. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js.map +7 -0
  176. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js +2101 -0
  177. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js.map +7 -0
  178. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js +16 -0
  179. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js.map +7 -0
  180. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js +1249 -0
  181. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js.map +7 -0
  182. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js +16 -0
  183. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js.map +7 -0
  184. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js +110 -0
  185. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js.map +7 -0
  186. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js +17 -0
  187. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js.map +7 -0
  188. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js +49 -0
  189. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js.map +7 -0
  190. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js +17 -0
  191. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js.map +7 -0
  192. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +485 -0
  193. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +7 -0
  194. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js +19 -0
  195. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js.map +7 -0
  196. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js +253 -0
  197. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js.map +7 -0
  198. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js +1565 -0
  199. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js.map +7 -0
  200. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js +19 -0
  201. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js.map +7 -0
  202. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js +472 -0
  203. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js.map +7 -0
  204. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js +115 -0
  205. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js.map +7 -0
  206. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js +19 -0
  207. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js.map +7 -0
  208. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js +54 -0
  209. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js.map +7 -0
  210. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js +19 -0
  211. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js.map +7 -0
  212. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +414 -0
  213. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +7 -0
  214. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js +21 -0
  215. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js.map +7 -0
  216. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js +171 -0
  217. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js.map +7 -0
  218. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js +111 -0
  219. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js.map +7 -0
  220. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js +19 -0
  221. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js.map +7 -0
  222. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js +48 -0
  223. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js.map +7 -0
  224. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js +19 -0
  225. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js.map +7 -0
  226. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +429 -0
  227. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +7 -0
  228. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js +21 -0
  229. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js.map +7 -0
  230. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js +182 -0
  231. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js.map +7 -0
  232. package/dist/modules/warranty_claims/ce.js +48 -0
  233. package/dist/modules/warranty_claims/ce.js.map +7 -0
  234. package/dist/modules/warranty_claims/commands/claim-lines.js +911 -0
  235. package/dist/modules/warranty_claims/commands/claim-lines.js.map +7 -0
  236. package/dist/modules/warranty_claims/commands/claims.js +2577 -0
  237. package/dist/modules/warranty_claims/commands/claims.js.map +7 -0
  238. package/dist/modules/warranty_claims/commands/index.js +4 -0
  239. package/dist/modules/warranty_claims/commands/index.js.map +7 -0
  240. package/dist/modules/warranty_claims/commands/settings.js +169 -0
  241. package/dist/modules/warranty_claims/commands/settings.js.map +7 -0
  242. package/dist/modules/warranty_claims/commands/shared.js +162 -0
  243. package/dist/modules/warranty_claims/commands/shared.js.map +7 -0
  244. package/dist/modules/warranty_claims/data/constants.js +35 -0
  245. package/dist/modules/warranty_claims/data/constants.js.map +7 -0
  246. package/dist/modules/warranty_claims/data/enrichers.js +97 -0
  247. package/dist/modules/warranty_claims/data/enrichers.js.map +7 -0
  248. package/dist/modules/warranty_claims/data/entities.js +731 -0
  249. package/dist/modules/warranty_claims/data/entities.js.map +7 -0
  250. package/dist/modules/warranty_claims/data/validators.js +488 -0
  251. package/dist/modules/warranty_claims/data/validators.js.map +7 -0
  252. package/dist/modules/warranty_claims/di.js +29 -0
  253. package/dist/modules/warranty_claims/di.js.map +7 -0
  254. package/dist/modules/warranty_claims/encryption.js +28 -0
  255. package/dist/modules/warranty_claims/encryption.js.map +7 -0
  256. package/dist/modules/warranty_claims/events.js +81 -0
  257. package/dist/modules/warranty_claims/events.js.map +7 -0
  258. package/dist/modules/warranty_claims/extension-points.js +19 -0
  259. package/dist/modules/warranty_claims/extension-points.js.map +7 -0
  260. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js +825 -0
  261. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js.map +7 -0
  262. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js +11 -0
  263. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js.map +7 -0
  264. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js +1139 -0
  265. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js.map +7 -0
  266. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js +11 -0
  267. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js.map +7 -0
  268. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +253 -0
  269. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +7 -0
  270. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js +18 -0
  271. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js.map +7 -0
  272. package/dist/modules/warranty_claims/index.js +15 -0
  273. package/dist/modules/warranty_claims/index.js.map +7 -0
  274. package/dist/modules/warranty_claims/lib/aiAssist.js +496 -0
  275. package/dist/modules/warranty_claims/lib/aiAssist.js.map +7 -0
  276. package/dist/modules/warranty_claims/lib/apiIdsFilter.js +11 -0
  277. package/dist/modules/warranty_claims/lib/apiIdsFilter.js.map +7 -0
  278. package/dist/modules/warranty_claims/lib/assigneeNames.js +153 -0
  279. package/dist/modules/warranty_claims/lib/assigneeNames.js.map +7 -0
  280. package/dist/modules/warranty_claims/lib/attachmentVisibility.js +9 -0
  281. package/dist/modules/warranty_claims/lib/attachmentVisibility.js.map +7 -0
  282. package/dist/modules/warranty_claims/lib/bulkFeedback.js +8 -0
  283. package/dist/modules/warranty_claims/lib/bulkFeedback.js.map +7 -0
  284. package/dist/modules/warranty_claims/lib/businessHours.js +250 -0
  285. package/dist/modules/warranty_claims/lib/businessHours.js.map +7 -0
  286. package/dist/modules/warranty_claims/lib/businessHoursForm.js +146 -0
  287. package/dist/modules/warranty_claims/lib/businessHoursForm.js.map +7 -0
  288. package/dist/modules/warranty_claims/lib/claimTypeConfig.js +39 -0
  289. package/dist/modules/warranty_claims/lib/claimTypeConfig.js.map +7 -0
  290. package/dist/modules/warranty_claims/lib/decryptionSafety.js +17 -0
  291. package/dist/modules/warranty_claims/lib/decryptionSafety.js.map +7 -0
  292. package/dist/modules/warranty_claims/lib/deskFilters.js +88 -0
  293. package/dist/modules/warranty_claims/lib/deskFilters.js.map +7 -0
  294. package/dist/modules/warranty_claims/lib/dictionaries.js +157 -0
  295. package/dist/modules/warranty_claims/lib/dictionaries.js.map +7 -0
  296. package/dist/modules/warranty_claims/lib/dictionaryLabels.js +12 -0
  297. package/dist/modules/warranty_claims/lib/dictionaryLabels.js.map +7 -0
  298. package/dist/modules/warranty_claims/lib/emailIntake.js +87 -0
  299. package/dist/modules/warranty_claims/lib/emailIntake.js.map +7 -0
  300. package/dist/modules/warranty_claims/lib/escalation.js +58 -0
  301. package/dist/modules/warranty_claims/lib/escalation.js.map +7 -0
  302. package/dist/modules/warranty_claims/lib/externalIntake.js +233 -0
  303. package/dist/modules/warranty_claims/lib/externalIntake.js.map +7 -0
  304. package/dist/modules/warranty_claims/lib/grading.js +21 -0
  305. package/dist/modules/warranty_claims/lib/grading.js.map +7 -0
  306. package/dist/modules/warranty_claims/lib/listSegments.js +18 -0
  307. package/dist/modules/warranty_claims/lib/listSegments.js.map +7 -0
  308. package/dist/modules/warranty_claims/lib/orderOwnership.js +25 -0
  309. package/dist/modules/warranty_claims/lib/orderOwnership.js.map +7 -0
  310. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js +11 -0
  311. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js.map +7 -0
  312. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js +108 -0
  313. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js.map +7 -0
  314. package/dist/modules/warranty_claims/lib/portalClaimAccess.js +26 -0
  315. package/dist/modules/warranty_claims/lib/portalClaimAccess.js.map +7 -0
  316. package/dist/modules/warranty_claims/lib/quantity.js +19 -0
  317. package/dist/modules/warranty_claims/lib/quantity.js.map +7 -0
  318. package/dist/modules/warranty_claims/lib/risk.js +204 -0
  319. package/dist/modules/warranty_claims/lib/risk.js.map +7 -0
  320. package/dist/modules/warranty_claims/lib/settings.js +55 -0
  321. package/dist/modules/warranty_claims/lib/settings.js.map +7 -0
  322. package/dist/modules/warranty_claims/lib/stateMachine.js +88 -0
  323. package/dist/modules/warranty_claims/lib/stateMachine.js.map +7 -0
  324. package/dist/modules/warranty_claims/lib/timelineFilters.js +16 -0
  325. package/dist/modules/warranty_claims/lib/timelineFilters.js.map +7 -0
  326. package/dist/modules/warranty_claims/lib/triage.js +241 -0
  327. package/dist/modules/warranty_claims/lib/triage.js.map +7 -0
  328. package/dist/modules/warranty_claims/lib/troubleshooting.js +111 -0
  329. package/dist/modules/warranty_claims/lib/troubleshooting.js.map +7 -0
  330. package/dist/modules/warranty_claims/lib/tryResolve.js +11 -0
  331. package/dist/modules/warranty_claims/lib/tryResolve.js.map +7 -0
  332. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js +101 -0
  333. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js.map +7 -0
  334. package/dist/modules/warranty_claims/lib/warrantyPreview.js +18 -0
  335. package/dist/modules/warranty_claims/lib/warrantyPreview.js.map +7 -0
  336. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js +32 -0
  337. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js.map +7 -0
  338. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js +16 -0
  339. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js.map +7 -0
  340. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js +17 -0
  341. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js.map +7 -0
  342. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js +29 -0
  343. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js.map +7 -0
  344. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js +25 -0
  345. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js.map +7 -0
  346. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js +13 -0
  347. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js.map +7 -0
  348. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js +15 -0
  349. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js.map +7 -0
  350. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js +13 -0
  351. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js.map +7 -0
  352. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js +13 -0
  353. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js.map +7 -0
  354. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js +12 -0
  355. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js.map +7 -0
  356. package/dist/modules/warranty_claims/notifications.client.js +67 -0
  357. package/dist/modules/warranty_claims/notifications.client.js.map +7 -0
  358. package/dist/modules/warranty_claims/notifications.js +103 -0
  359. package/dist/modules/warranty_claims/notifications.js.map +7 -0
  360. package/dist/modules/warranty_claims/search.js +174 -0
  361. package/dist/modules/warranty_claims/search.js.map +7 -0
  362. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js +202 -0
  363. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js.map +7 -0
  364. package/dist/modules/warranty_claims/services/claimNumberGenerator.js +58 -0
  365. package/dist/modules/warranty_claims/services/claimNumberGenerator.js.map +7 -0
  366. package/dist/modules/warranty_claims/services/entitlementResolver.js +69 -0
  367. package/dist/modules/warranty_claims/services/entitlementResolver.js.map +7 -0
  368. package/dist/modules/warranty_claims/services/returnLabelProvider.js +14 -0
  369. package/dist/modules/warranty_claims/services/returnLabelProvider.js.map +7 -0
  370. package/dist/modules/warranty_claims/setup.js +121 -0
  371. package/dist/modules/warranty_claims/setup.js.map +7 -0
  372. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js +119 -0
  373. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js.map +7 -0
  374. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js +47 -0
  375. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js.map +7 -0
  376. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js +60 -0
  377. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js.map +7 -0
  378. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js +83 -0
  379. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js.map +7 -0
  380. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js +46 -0
  381. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js.map +7 -0
  382. package/dist/modules/warranty_claims/subscribers/email-to-claim.js +135 -0
  383. package/dist/modules/warranty_claims/subscribers/email-to-claim.js.map +7 -0
  384. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js +164 -0
  385. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js.map +7 -0
  386. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js +24 -0
  387. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js.map +7 -0
  388. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js +26 -0
  389. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js.map +7 -0
  390. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js +15 -0
  391. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js.map +7 -0
  392. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js +197 -0
  393. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js.map +7 -0
  394. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js +28 -0
  395. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js.map +7 -0
  396. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js +418 -0
  397. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js.map +7 -0
  398. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js +18 -0
  399. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js.map +7 -0
  400. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js +17 -0
  401. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js.map +7 -0
  402. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js +146 -0
  403. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js.map +7 -0
  404. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js +17 -0
  405. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js.map +7 -0
  406. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js +147 -0
  407. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js.map +7 -0
  408. package/dist/modules/warranty_claims/widgets/injection-table.js +38 -0
  409. package/dist/modules/warranty_claims/widgets/injection-table.js.map +7 -0
  410. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js +223 -0
  411. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js.map +7 -0
  412. package/dist/modules/warranty_claims/widgets/notifications/index.js +5 -0
  413. package/dist/modules/warranty_claims/widgets/notifications/index.js.map +7 -0
  414. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js +334 -0
  415. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js.map +7 -0
  416. package/generated/entities/warranty_claim/index.ts +51 -0
  417. package/generated/entities/warranty_claim_event/index.ts +11 -0
  418. package/generated/entities/warranty_claim_line/index.ts +37 -0
  419. package/generated/entities/warranty_claim_registration/index.ts +20 -0
  420. package/generated/entities/warranty_claim_sequence/index.ts +7 -0
  421. package/generated/entities/warranty_claim_settings/index.ts +20 -0
  422. package/generated/entities/warranty_claim_sla_signal/index.ts +11 -0
  423. package/generated/entities/warranty_troubleshooting_guide/index.ts +11 -0
  424. package/generated/entities/warranty_vendor_policy/index.ts +14 -0
  425. package/generated/entities.ids.generated.ts +12 -0
  426. package/generated/entity-fields-registry.ts +200 -0
  427. package/package.json +7 -7
  428. package/src/helpers/integration/api.ts +10 -3
  429. package/src/helpers/integration/salesFixtures.ts +17 -7
  430. package/src/modules/attachments/di.ts +30 -1
  431. package/src/modules/attachments/fields/attachment.tsx +215 -23
  432. package/src/modules/attachments/i18n/de.json +5 -0
  433. package/src/modules/attachments/i18n/en.json +5 -0
  434. package/src/modules/attachments/i18n/es.json +5 -0
  435. package/src/modules/attachments/i18n/ko.json +5 -0
  436. package/src/modules/attachments/i18n/pl.json +5 -0
  437. package/src/modules/attachments/lib/scoped-upload-service.ts +257 -0
  438. package/src/modules/attachments/lib/target-access-service.ts +57 -0
  439. package/src/modules/customers/api/companies/route.ts +1 -0
  440. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +4 -2
  441. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +4 -2
  442. package/src/modules/customers/components/detail/assignableStaff.ts +14 -177
  443. package/src/modules/customers/lib/assignableStaff.ts +177 -0
  444. package/src/modules/data_sync/AGENTS.md +3 -0
  445. package/src/modules/data_sync/lib/batch-stream.ts +117 -0
  446. package/src/modules/data_sync/lib/sync-engine.ts +190 -115
  447. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +4 -0
  448. package/src/modules/inbox_ops/api/extract/route.ts +4 -0
  449. package/src/modules/inbox_ops/api/webhook/inbound.ts +4 -0
  450. package/src/modules/sales/commands/documents.ts +16 -8
  451. package/src/modules/warranty_claims/AGENTS.md +49 -0
  452. package/src/modules/warranty_claims/acl.ts +71 -0
  453. package/src/modules/warranty_claims/ai-agents.ts +189 -0
  454. package/src/modules/warranty_claims/ai-tools.ts +711 -0
  455. package/src/modules/warranty_claims/api/ai/assess/route.ts +371 -0
  456. package/src/modules/warranty_claims/api/ai/draft-reply/route.ts +149 -0
  457. package/src/modules/warranty_claims/api/ai/suggest/route.ts +190 -0
  458. package/src/modules/warranty_claims/api/assign/route.ts +142 -0
  459. package/src/modules/warranty_claims/api/assignees/route.ts +102 -0
  460. package/src/modules/warranty_claims/api/credit-memo/route.ts +191 -0
  461. package/src/modules/warranty_claims/api/entitlement/route.ts +224 -0
  462. package/src/modules/warranty_claims/api/events/route.ts +226 -0
  463. package/src/modules/warranty_claims/api/external/claims/route.ts +528 -0
  464. package/src/modules/warranty_claims/api/lines/route.ts +275 -0
  465. package/src/modules/warranty_claims/api/openapi.ts +28 -0
  466. package/src/modules/warranty_claims/api/portal/attachments/route.ts +547 -0
  467. package/src/modules/warranty_claims/api/portal/claims/[id]/route.ts +195 -0
  468. package/src/modules/warranty_claims/api/portal/claims/[id]/shared.ts +125 -0
  469. package/src/modules/warranty_claims/api/portal/claims/[id]/submit/route.ts +82 -0
  470. package/src/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.ts +87 -0
  471. package/src/modules/warranty_claims/api/portal/claims/route.ts +579 -0
  472. package/src/modules/warranty_claims/api/portal/events/route.ts +260 -0
  473. package/src/modules/warranty_claims/api/portal/options/route.ts +113 -0
  474. package/src/modules/warranty_claims/api/portal/orders/lines/route.ts +258 -0
  475. package/src/modules/warranty_claims/api/portal/orders/route.ts +206 -0
  476. package/src/modules/warranty_claims/api/portal/troubleshooting/route.ts +151 -0
  477. package/src/modules/warranty_claims/api/receiving/route.ts +215 -0
  478. package/src/modules/warranty_claims/api/registrations/route.ts +417 -0
  479. package/src/modules/warranty_claims/api/replacement-order/route.ts +188 -0
  480. package/src/modules/warranty_claims/api/return-label/route.ts +291 -0
  481. package/src/modules/warranty_claims/api/risk/route.ts +112 -0
  482. package/src/modules/warranty_claims/api/route.ts +543 -0
  483. package/src/modules/warranty_claims/api/sales-return/route.ts +183 -0
  484. package/src/modules/warranty_claims/api/settings-general/route.ts +230 -0
  485. package/src/modules/warranty_claims/api/stats/route.ts +306 -0
  486. package/src/modules/warranty_claims/api/submit/route.ts +146 -0
  487. package/src/modules/warranty_claims/api/transition/route.ts +144 -0
  488. package/src/modules/warranty_claims/api/troubleshooting-guides/route.ts +295 -0
  489. package/src/modules/warranty_claims/api/vendor-policies/route.ts +351 -0
  490. package/src/modules/warranty_claims/api/vendor-recovery/route.ts +148 -0
  491. package/src/modules/warranty_claims/api/vendor-recovery-suggestions/route.ts +167 -0
  492. package/src/modules/warranty_claims/backend/components/AiAssessButtons.tsx +389 -0
  493. package/src/modules/warranty_claims/backend/components/ClaimStageProgress.tsx +65 -0
  494. package/src/modules/warranty_claims/backend/components/ClaimStatusBadge.tsx +137 -0
  495. package/src/modules/warranty_claims/backend/components/ClaimsKpiStrip.tsx +169 -0
  496. package/src/modules/warranty_claims/backend/components/EntitlementLookupBadge.tsx +203 -0
  497. package/src/modules/warranty_claims/backend/components/ReceivingPanel.tsx +300 -0
  498. package/src/modules/warranty_claims/backend/components/ReturnLabelPanel.tsx +292 -0
  499. package/src/modules/warranty_claims/backend/components/TroubleshootingWalker.tsx +125 -0
  500. package/src/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.tsx +217 -0
  501. package/src/modules/warranty_claims/backend/components/WarrantyWorkspace.tsx +66 -0
  502. package/src/modules/warranty_claims/backend/components/claimReasonOptions.ts +57 -0
  503. package/src/modules/warranty_claims/backend/components/claimSla.tsx +127 -0
  504. package/src/modules/warranty_claims/backend/components/orderLookup.ts +109 -0
  505. package/src/modules/warranty_claims/backend/components/productLookup.tsx +433 -0
  506. package/src/modules/warranty_claims/backend/components/useUserDisplayNames.ts +66 -0
  507. package/src/modules/warranty_claims/backend/page.meta.ts +12 -0
  508. package/src/modules/warranty_claims/backend/page.tsx +1302 -0
  509. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.ts +12 -0
  510. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.tsx +531 -0
  511. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.ts +12 -0
  512. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.tsx +2599 -0
  513. package/src/modules/warranty_claims/backend/warranty_claims/create/page.meta.ts +12 -0
  514. package/src/modules/warranty_claims/backend/warranty_claims/create/page.tsx +1533 -0
  515. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.ts +13 -0
  516. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.tsx +136 -0
  517. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.ts +13 -0
  518. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.tsx +52 -0
  519. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.ts +15 -0
  520. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +555 -0
  521. package/src/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.tsx +295 -0
  522. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.meta.ts +15 -0
  523. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.tsx +1903 -0
  524. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.tsx +550 -0
  525. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.ts +15 -0
  526. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.tsx +141 -0
  527. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.ts +15 -0
  528. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.tsx +57 -0
  529. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.ts +17 -0
  530. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +477 -0
  531. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.tsx +214 -0
  532. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.ts +15 -0
  533. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.tsx +137 -0
  534. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.ts +15 -0
  535. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.tsx +51 -0
  536. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.ts +17 -0
  537. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +506 -0
  538. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.tsx +220 -0
  539. package/src/modules/warranty_claims/ce.ts +44 -0
  540. package/src/modules/warranty_claims/commands/claim-lines.ts +1082 -0
  541. package/src/modules/warranty_claims/commands/claims.ts +3364 -0
  542. package/src/modules/warranty_claims/commands/index.ts +3 -0
  543. package/src/modules/warranty_claims/commands/settings.ts +198 -0
  544. package/src/modules/warranty_claims/commands/shared.ts +212 -0
  545. package/src/modules/warranty_claims/data/constants.ts +37 -0
  546. package/src/modules/warranty_claims/data/enrichers.ts +165 -0
  547. package/src/modules/warranty_claims/data/entities.ts +663 -0
  548. package/src/modules/warranty_claims/data/validators.ts +634 -0
  549. package/src/modules/warranty_claims/di.ts +34 -0
  550. package/src/modules/warranty_claims/encryption.ts +26 -0
  551. package/src/modules/warranty_claims/events.ts +81 -0
  552. package/src/modules/warranty_claims/extension-points.ts +16 -0
  553. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.ts +9 -0
  554. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.tsx +1037 -0
  555. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.ts +9 -0
  556. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.tsx +1409 -0
  557. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.ts +16 -0
  558. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +304 -0
  559. package/src/modules/warranty_claims/i18n/de.json +1270 -0
  560. package/src/modules/warranty_claims/i18n/en.json +1270 -0
  561. package/src/modules/warranty_claims/i18n/es.json +1270 -0
  562. package/src/modules/warranty_claims/i18n/ko.json +1270 -0
  563. package/src/modules/warranty_claims/i18n/pl.json +1270 -0
  564. package/src/modules/warranty_claims/index.ts +13 -0
  565. package/src/modules/warranty_claims/lib/aiAssist.ts +677 -0
  566. package/src/modules/warranty_claims/lib/apiIdsFilter.ts +12 -0
  567. package/src/modules/warranty_claims/lib/assigneeNames.ts +184 -0
  568. package/src/modules/warranty_claims/lib/attachmentVisibility.ts +5 -0
  569. package/src/modules/warranty_claims/lib/bulkFeedback.ts +6 -0
  570. package/src/modules/warranty_claims/lib/businessHours.ts +333 -0
  571. package/src/modules/warranty_claims/lib/businessHoursForm.ts +206 -0
  572. package/src/modules/warranty_claims/lib/claimTypeConfig.ts +49 -0
  573. package/src/modules/warranty_claims/lib/decryptionSafety.ts +19 -0
  574. package/src/modules/warranty_claims/lib/deskFilters.ts +131 -0
  575. package/src/modules/warranty_claims/lib/dictionaries.ts +212 -0
  576. package/src/modules/warranty_claims/lib/dictionaryLabels.ts +16 -0
  577. package/src/modules/warranty_claims/lib/emailIntake.ts +123 -0
  578. package/src/modules/warranty_claims/lib/escalation.ts +83 -0
  579. package/src/modules/warranty_claims/lib/externalIntake.ts +362 -0
  580. package/src/modules/warranty_claims/lib/grading.ts +23 -0
  581. package/src/modules/warranty_claims/lib/listSegments.ts +19 -0
  582. package/src/modules/warranty_claims/lib/orderOwnership.ts +58 -0
  583. package/src/modules/warranty_claims/lib/portalAttachmentUpload.ts +11 -0
  584. package/src/modules/warranty_claims/lib/portalAttachmentValidation.ts +115 -0
  585. package/src/modules/warranty_claims/lib/portalClaimAccess.ts +37 -0
  586. package/src/modules/warranty_claims/lib/quantity.ts +15 -0
  587. package/src/modules/warranty_claims/lib/risk.ts +371 -0
  588. package/src/modules/warranty_claims/lib/settings.ts +76 -0
  589. package/src/modules/warranty_claims/lib/stateMachine.ts +130 -0
  590. package/src/modules/warranty_claims/lib/timelineFilters.ts +22 -0
  591. package/src/modules/warranty_claims/lib/triage.ts +366 -0
  592. package/src/modules/warranty_claims/lib/troubleshooting.ts +157 -0
  593. package/src/modules/warranty_claims/lib/tryResolve.ts +7 -0
  594. package/src/modules/warranty_claims/lib/vendorPolicyRecovery.ts +182 -0
  595. package/src/modules/warranty_claims/lib/warrantyPreview.ts +20 -0
  596. package/src/modules/warranty_claims/migrations/.snapshot-open-mercato.json +3525 -0
  597. package/src/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.ts +38 -0
  598. package/src/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.ts +17 -0
  599. package/src/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.ts +17 -0
  600. package/src/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.ts +37 -0
  601. package/src/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.ts +25 -0
  602. package/src/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.ts +13 -0
  603. package/src/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.ts +15 -0
  604. package/src/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.ts +13 -0
  605. package/src/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.ts +13 -0
  606. package/src/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.ts +11 -0
  607. package/src/modules/warranty_claims/notifications.client.ts +78 -0
  608. package/src/modules/warranty_claims/notifications.ts +101 -0
  609. package/src/modules/warranty_claims/search.ts +199 -0
  610. package/src/modules/warranty_claims/services/adjudicationEvaluator.ts +344 -0
  611. package/src/modules/warranty_claims/services/claimNumberGenerator.ts +69 -0
  612. package/src/modules/warranty_claims/services/entitlementResolver.ts +102 -0
  613. package/src/modules/warranty_claims/services/returnLabelProvider.ts +30 -0
  614. package/src/modules/warranty_claims/setup.ts +154 -0
  615. package/src/modules/warranty_claims/subscribers/auto-vendor-recovery.ts +140 -0
  616. package/src/modules/warranty_claims/subscribers/claim-assigned-notification.ts +54 -0
  617. package/src/modules/warranty_claims/subscribers/claim-customer-reply-notification.ts +68 -0
  618. package/src/modules/warranty_claims/subscribers/claim-status-notification.ts +100 -0
  619. package/src/modules/warranty_claims/subscribers/claim-submitted-notification.ts +53 -0
  620. package/src/modules/warranty_claims/subscribers/email-to-claim.ts +175 -0
  621. package/src/modules/warranty_claims/subscribers/return-shipment-tracking.ts +226 -0
  622. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.ts +28 -0
  623. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.ts +31 -0
  624. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/config.ts +15 -0
  625. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.tsx +237 -0
  626. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.ts +27 -0
  627. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.tsx +527 -0
  628. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.ts +37 -0
  629. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.ts +21 -0
  630. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab.tsx +210 -0
  631. package/src/modules/warranty_claims/widgets/injection/order-claims-tab/widget.ts +21 -0
  632. package/src/modules/warranty_claims/widgets/injection/order-claims-tab.tsx +210 -0
  633. package/src/modules/warranty_claims/widgets/injection-table.ts +36 -0
  634. package/src/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.tsx +253 -0
  635. package/src/modules/warranty_claims/widgets/notifications/index.ts +1 -0
  636. package/src/modules/warranty_claims/workers/sla-escalation-sweep.ts +450 -0
@@ -0,0 +1,634 @@
1
+ import { z } from 'zod'
2
+ import { parseGuideSteps } from '../lib/troubleshooting'
3
+
4
+ const uuid = () => z.string().uuid()
5
+
6
+ const emptyStringToNull = (value: unknown): unknown => {
7
+ if (typeof value !== 'string') return value
8
+ const trimmed = value.trim()
9
+ return trimmed.length ? trimmed : null
10
+ }
11
+
12
+ const clearableString = (max: number) =>
13
+ z.preprocess(emptyStringToNull, z.string().trim().max(max).nullable().optional())
14
+
15
+ const clearableEmail = (max: number) =>
16
+ z.preprocess(emptyStringToNull, z.string().trim().email('warranty_claims.errors.invalidEmail').max(max).nullable().optional())
17
+
18
+ const optionalString = (max: number) => z.string().trim().max(max).optional()
19
+ const requiredOptionalString = (max: number) =>
20
+ z.preprocess(emptyStringToNull, z.string().trim().min(1).max(max).optional())
21
+ const httpUrlString = (max: number) =>
22
+ z.preprocess(
23
+ emptyStringToNull,
24
+ z.string().trim().min(1).max(max).url('warranty_claims.errors.returnLabelUrlInvalid').refine(
25
+ (value) => value.startsWith('https://') || value.startsWith('http://'),
26
+ { message: 'warranty_claims.errors.returnLabelUrlInvalid' },
27
+ ).nullable().optional(),
28
+ )
29
+ const requiredString = (max: number) =>
30
+ z.preprocess(emptyStringToNull, z.string().trim().min(1).max(max))
31
+ const positiveDecimal = () => z.coerce.number().positive().max(999_999_999)
32
+ const nullableDecimal = () =>
33
+ z.preprocess(emptyStringToNull, z.coerce.number().min(0, 'warranty_claims.errors.decimalNonNegative').max(999_999_999).nullable().optional())
34
+ const nullableIsoDateString = () => z.preprocess(emptyStringToNull, z.string().datetime().nullable().optional())
35
+ const jsonObjectSchema = z.record(z.string(), z.unknown())
36
+ const optimisticLockTokenSchema = z.union([z.string().datetime(), z.date()]).nullable().optional()
37
+
38
+ const scopedSchema = z.object({
39
+ organizationId: uuid(),
40
+ tenantId: uuid(),
41
+ })
42
+
43
+ const hasOwn = (input: object, key: string): boolean => Object.prototype.hasOwnProperty.call(input, key)
44
+
45
+ export const CLAIM_STATUSES = [
46
+ 'draft',
47
+ 'submitted',
48
+ 'in_review',
49
+ 'info_requested',
50
+ 'approved',
51
+ 'awaiting_return',
52
+ 'received',
53
+ 'inspecting',
54
+ 'resolved',
55
+ 'rejected',
56
+ 'closed',
57
+ 'cancelled',
58
+ ] as const
59
+
60
+ export const CLAIM_TYPES = ['warranty', 'return', 'core_return', 'vendor_recovery'] as const
61
+
62
+ export const CLAIM_DISPOSITIONS = [
63
+ 'restock',
64
+ 'repair',
65
+ 'replace',
66
+ 'credit',
67
+ 'refund',
68
+ 'field_destroy',
69
+ 'scrap',
70
+ 'return_to_vendor',
71
+ 'deny',
72
+ ] as const
73
+
74
+ export const CLAIM_LINE_STATUSES = [
75
+ 'pending',
76
+ 'approved',
77
+ 'rejected',
78
+ 'received',
79
+ 'inspected',
80
+ 'resolved',
81
+ ] as const
82
+
83
+ export const CLAIM_PRIORITIES = ['low', 'normal', 'high', 'urgent'] as const
84
+ export const CLAIM_CHANNELS = ['portal', 'staff', 'api'] as const
85
+ export const CLAIM_WARRANTY_STATUSES = ['in_warranty', 'out_of_warranty', 'unknown'] as const
86
+ export const CLAIM_EVENT_KINDS = ['status_changed', 'comment', 'assignment', 'system'] as const
87
+ export const CLAIM_EVENT_VISIBILITIES = ['internal', 'customer'] as const
88
+ export const CLAIM_CONDITION_GRADES = ['A', 'B', 'C', 'D'] as const
89
+ export const CLAIM_QUARANTINE_STATUSES = ['none', 'held', 'released'] as const
90
+ export const REGISTRATION_COVERAGE_TYPES = ['standard', 'extended', 'none'] as const
91
+ export const REGISTRATION_SOURCES = ['order', 'manual', 'third_party'] as const
92
+
93
+ export type WarrantyClaimStatus = (typeof CLAIM_STATUSES)[number]
94
+ export type WarrantyClaimType = (typeof CLAIM_TYPES)[number]
95
+ export type WarrantyClaimDisposition = (typeof CLAIM_DISPOSITIONS)[number]
96
+ export type WarrantyClaimLineStatus = (typeof CLAIM_LINE_STATUSES)[number]
97
+ export type WarrantyClaimPriority = (typeof CLAIM_PRIORITIES)[number]
98
+ export type WarrantyClaimChannel = (typeof CLAIM_CHANNELS)[number]
99
+ export type WarrantyClaimWarrantyStatus = (typeof CLAIM_WARRANTY_STATUSES)[number]
100
+ export type WarrantyClaimEventKind = (typeof CLAIM_EVENT_KINDS)[number]
101
+ export type WarrantyClaimEventVisibility = (typeof CLAIM_EVENT_VISIBILITIES)[number]
102
+ export type WarrantyClaimConditionGrade = (typeof CLAIM_CONDITION_GRADES)[number]
103
+ export type WarrantyClaimQuarantineStatus = (typeof CLAIM_QUARANTINE_STATUSES)[number]
104
+ export type WarrantyClaimRegistrationCoverageType = (typeof REGISTRATION_COVERAGE_TYPES)[number]
105
+ export type WarrantyClaimRegistrationSource = (typeof REGISTRATION_SOURCES)[number]
106
+
107
+ export const claimStatusSchema = z.enum(CLAIM_STATUSES)
108
+ export const claimTypeSchema = z.enum(CLAIM_TYPES)
109
+ export const claimDispositionSchema = z.enum(CLAIM_DISPOSITIONS)
110
+ export const claimLineStatusSchema = z.enum(CLAIM_LINE_STATUSES)
111
+ export const claimPrioritySchema = z.enum(CLAIM_PRIORITIES)
112
+ export const claimChannelSchema = z.enum(CLAIM_CHANNELS)
113
+ export const claimWarrantyStatusSchema = z.enum(CLAIM_WARRANTY_STATUSES)
114
+ export const claimEventKindSchema = z.enum(CLAIM_EVENT_KINDS)
115
+ export const claimEventVisibilitySchema = z.enum(CLAIM_EVENT_VISIBILITIES)
116
+ export const claimConditionGradeSchema = z.enum(CLAIM_CONDITION_GRADES)
117
+ export const claimQuarantineStatusSchema = z.enum(CLAIM_QUARANTINE_STATUSES)
118
+ export const registrationCoverageTypeSchema = z.enum(REGISTRATION_COVERAGE_TYPES)
119
+ export const registrationSourceSchema = z.enum(REGISTRATION_SOURCES)
120
+
121
+ export const CLAIM_INTAKE_UPDATE_FIELDS = [
122
+ 'customerId',
123
+ 'customerName',
124
+ 'orderId',
125
+ 'reasonCode',
126
+ 'priority',
127
+ 'notes',
128
+ ] as const
129
+
130
+ export const CLAIM_FULFILLMENT_UPDATE_FIELDS = [
131
+ 'advanceReplacement',
132
+ 'replacementOrderId',
133
+ 'advanceShippedAt',
134
+ 'salesReturnId',
135
+ 'creditMemoId',
136
+ 'vendorName',
137
+ 'vendorRef',
138
+ 'resolutionSummary',
139
+ ] as const
140
+
141
+ const claimLineFields = {
142
+ lineNo: z.coerce.number().int().min(1).max(10000).optional(),
143
+ productId: uuid().nullable().optional(),
144
+ variantId: uuid().nullable().optional(),
145
+ sku: clearableString(191),
146
+ productName: clearableString(300),
147
+ orderLineId: uuid().nullable().optional(),
148
+ serialNumber: clearableString(191),
149
+ lotNumber: clearableString(191),
150
+ purchaseDate: z.coerce.date().nullable().optional(),
151
+ warrantyMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
152
+ warrantyExpiresAt: z.coerce.date().nullable().optional(),
153
+ warrantyStatus: claimWarrantyStatusSchema.optional(),
154
+ faultCode: clearableString(120),
155
+ faultDescription: clearableString(4000),
156
+ qtyClaimed: positiveDecimal().optional(),
157
+ qtyApproved: nullableDecimal(),
158
+ qtyReceived: nullableDecimal(),
159
+ conditionOnReceipt: clearableString(1000),
160
+ inspectionNotes: clearableString(4000),
161
+ disposition: claimDispositionSchema.nullable().optional(),
162
+ creditAmount: nullableDecimal(),
163
+ restockingFee: nullableDecimal(),
164
+ coreChargeAmount: nullableDecimal(),
165
+ coreCreditAmount: nullableDecimal(),
166
+ vendorName: clearableString(300),
167
+ }
168
+
169
+ /**
170
+ * Receiving/assessment state owned by the dedicated `warranty_claims.claim_line.receive`,
171
+ * `.release_quarantine`, and `.set_assessment` commands. Kept out of
172
+ * `claimLineUpdateSchema` so a plain line update cannot stomp state those commands own
173
+ * (quarantine policy, timeline events, quarantine notifications).
174
+ */
175
+ const claimLineReceivingStateFields = {
176
+ conditionGrade: claimConditionGradeSchema.nullable().optional(),
177
+ quarantineStatus: claimQuarantineStatusSchema.optional(),
178
+ assessmentPayload: jsonObjectSchema.nullable().optional(),
179
+ }
180
+
181
+ const settingsCurrencyCodeSchema = z.preprocess(
182
+ emptyStringToNull,
183
+ z.string().trim().toUpperCase().regex(/^[A-Z]{3}$/, 'warranty_claims.errors.currencyCodeFormat').nullable().optional(),
184
+ )
185
+
186
+ const settingsAmountSchema = z.preprocess(
187
+ emptyStringToNull,
188
+ z.coerce.number().min(0).nullable().optional(),
189
+ )
190
+
191
+ export const warrantyClaimSettingsUpdateSchema = z
192
+ .object({
193
+ slaHours: z.coerce.number().int().min(1).max(8760).optional(),
194
+ slaPauseOnInfoRequested: z.boolean().optional(),
195
+ slaAtRiskThresholdPct: z.coerce.number().int().min(1).max(100).optional(),
196
+ autoApproveEnabled: z.boolean().optional(),
197
+ autoApproveMaxAmount: settingsAmountSchema,
198
+ autoApproveCurrencyCode: settingsCurrencyCodeSchema,
199
+ autoApproveRequireInWarranty: z.boolean().optional(),
200
+ defaultWarrantyMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
201
+ businessHours: jsonObjectSchema.nullable().optional(),
202
+ escalationTiers: z.array(jsonObjectSchema).nullable().optional(),
203
+ adjudicationUseRules: z.boolean().optional(),
204
+ quarantineGrades: z.array(z.string().trim().min(1).max(20)).nullable().optional(),
205
+ returnLabelProvider: clearableString(120),
206
+ returnWindowDays: z.coerce.number().int().min(1).max(3650).nullable().optional(),
207
+ })
208
+ .strict()
209
+
210
+ export const warrantyClaimSettingsSaveSchema = scopedSchema.merge(warrantyClaimSettingsUpdateSchema).strict()
211
+
212
+ export const claimInitialLineCreateSchema = z.object({
213
+ ...claimLineFields,
214
+ ...claimLineReceivingStateFields,
215
+ }).strict().superRefine((line, ctx) => {
216
+ const qtyClaimed = line.qtyClaimed ?? 1
217
+ if (typeof line.qtyApproved === 'number' && line.qtyApproved > qtyClaimed) {
218
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'warranty_claims.errors.qtyApprovedExceedsClaimed', path: ['qtyApproved'] })
219
+ }
220
+ if (typeof line.qtyReceived === 'number' && line.qtyReceived > qtyClaimed) {
221
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'warranty_claims.errors.qtyReceivedExceedsClaimed', path: ['qtyReceived'] })
222
+ }
223
+ })
224
+
225
+ export const claimCreateSchema = scopedSchema
226
+ .extend({
227
+ claimType: claimTypeSchema,
228
+ channel: claimChannelSchema.optional(),
229
+ priority: claimPrioritySchema.optional(),
230
+ customerId: uuid().nullable().optional(),
231
+ customerName: clearableString(300),
232
+ externalRef: clearableString(190),
233
+ intakeMessageRef: clearableString(998),
234
+ contactEmail: clearableString(320),
235
+ vendorName: clearableString(300),
236
+ vendorRef: clearableString(191),
237
+ orderId: uuid().nullable().optional(),
238
+ // Display-only order reference for claims without a linked sales order (e.g. portal
239
+ // "my order isn't listed"). A linked order's number is derived from the order itself.
240
+ orderNumber: clearableString(190),
241
+ salesReturnId: uuid().nullable().optional(),
242
+ replacementOrderId: uuid().nullable().optional(),
243
+ advanceReplacement: z.boolean().optional(),
244
+ advanceShippedAt: z.coerce.date().nullable().optional(),
245
+ reasonCode: clearableString(120),
246
+ rejectionReasonCode: clearableString(120),
247
+ resolutionSummary: clearableString(4000),
248
+ notes: clearableString(8000),
249
+ currencyCode: z
250
+ .string()
251
+ .trim()
252
+ .toUpperCase()
253
+ .regex(/^[A-Z]{3}$/, 'warranty_claims.errors.currencyCodeFormat')
254
+ .nullable()
255
+ .optional(),
256
+ lines: z.array(claimInitialLineCreateSchema).max(200).optional(),
257
+ })
258
+ .strict()
259
+ .superRefine((input, ctx) => {
260
+ if (input.claimType === 'vendor_recovery') {
261
+ ctx.addIssue({
262
+ code: z.ZodIssueCode.custom,
263
+ message: '[internal] Vendor recovery claims are created only via the vendor-recovery action',
264
+ path: ['claimType'],
265
+ })
266
+ }
267
+ })
268
+
269
+ const claimUpdateFields = z.object({
270
+ customerId: uuid().nullable().optional(),
271
+ customerName: clearableString(300),
272
+ orderId: uuid().nullable().optional(),
273
+ reasonCode: clearableString(120),
274
+ priority: claimPrioritySchema.optional(),
275
+ notes: clearableString(8000),
276
+ advanceReplacement: z.boolean().optional(),
277
+ replacementOrderId: uuid().nullable().optional(),
278
+ advanceShippedAt: z.coerce.date().nullable().optional(),
279
+ salesReturnId: uuid().nullable().optional(),
280
+ creditMemoId: uuid().nullable().optional(),
281
+ vendorName: clearableString(300),
282
+ vendorRef: clearableString(191),
283
+ resolutionSummary: clearableString(4000),
284
+ })
285
+
286
+ export const claimUpdateSchema = z
287
+ .object({ id: uuid() })
288
+ .merge(scopedSchema.partial())
289
+ .merge(claimUpdateFields.partial())
290
+ .strict()
291
+
292
+ export const claimLineCreateSchema = scopedSchema
293
+ .extend({
294
+ claimId: uuid(),
295
+ ...claimLineFields,
296
+ ...claimLineReceivingStateFields,
297
+ })
298
+ .strict()
299
+
300
+ export const claimLineUpdateSchema = z
301
+ .object({
302
+ id: uuid(),
303
+ claimId: uuid().optional(),
304
+ })
305
+ .merge(scopedSchema.partial())
306
+ .merge(z.object({
307
+ ...claimLineFields,
308
+ lineStatus: claimLineStatusSchema.optional(),
309
+ }).partial())
310
+ .strict()
311
+ .superRefine((line, ctx) => {
312
+ const qtyClaimed = hasOwn(line, 'qtyClaimed') && typeof line.qtyClaimed === 'number' ? line.qtyClaimed : null
313
+ if (qtyClaimed !== null && hasOwn(line, 'qtyApproved') && typeof line.qtyApproved === 'number' && line.qtyApproved > qtyClaimed) {
314
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'warranty_claims.errors.qtyApprovedExceedsClaimed', path: ['qtyApproved'] })
315
+ }
316
+ if (qtyClaimed !== null && hasOwn(line, 'qtyReceived') && typeof line.qtyReceived === 'number' && line.qtyReceived > qtyClaimed) {
317
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'warranty_claims.errors.qtyReceivedExceedsClaimed', path: ['qtyReceived'] })
318
+ }
319
+ })
320
+
321
+ export const claimLineReceiveSchema = scopedSchema
322
+ .extend({
323
+ id: uuid(),
324
+ conditionGrade: claimConditionGradeSchema,
325
+ inspectionNotes: clearableString(4000),
326
+ updatedAt: optimisticLockTokenSchema,
327
+ })
328
+ .strict()
329
+
330
+ export const claimLineReleaseQuarantineSchema = scopedSchema
331
+ .extend({
332
+ id: uuid(),
333
+ updatedAt: optimisticLockTokenSchema,
334
+ })
335
+ .strict()
336
+
337
+ export const transitionClaimInputSchema = z
338
+ .object({
339
+ id: uuid(),
340
+ toStatus: claimStatusSchema,
341
+ rejectionReasonCode: clearableString(120),
342
+ resolutionSummary: clearableString(4000),
343
+ systemNote: z.string().regex(/^warranty_claims\.[A-Za-z0-9_.]+$/).max(200).optional(),
344
+ actorCustomerId: uuid().optional(),
345
+ })
346
+ .strict()
347
+
348
+ export const assignClaimInputSchema = z
349
+ .object({
350
+ id: uuid(),
351
+ assigneeUserId: uuid().nullable(),
352
+ })
353
+ .strict()
354
+
355
+ export const commentClaimInputSchema = z
356
+ .object({
357
+ claimId: uuid(),
358
+ body: z.string().trim().min(1).max(8000),
359
+ visibility: claimEventVisibilitySchema.default('internal'),
360
+ actorCustomerId: uuid().optional(),
361
+ })
362
+ .strict()
363
+
364
+ export const vendorRecoveryInputSchema = z
365
+ .object({
366
+ claimId: uuid(),
367
+ organizationId: uuid().optional(),
368
+ tenantId: uuid().optional(),
369
+ lineIds: z.array(uuid()).min(1).max(200),
370
+ vendorName: z.string().trim().min(1).max(300),
371
+ vendorRef: clearableString(191),
372
+ })
373
+ .strict()
374
+
375
+ export const claimCreateSalesReturnSchema = scopedSchema
376
+ .extend({
377
+ id: uuid(),
378
+ updatedAt: optimisticLockTokenSchema,
379
+ })
380
+ .strict()
381
+
382
+ export const claimCreateCreditMemoSchema = scopedSchema
383
+ .extend({
384
+ id: uuid(),
385
+ updatedAt: optimisticLockTokenSchema,
386
+ })
387
+ .strict()
388
+
389
+ export const claimCreateReplacementOrderSchema = scopedSchema
390
+ .extend({
391
+ id: uuid(),
392
+ pricing: z.enum(['zero', 'original']).default('zero'),
393
+ updatedAt: optimisticLockTokenSchema,
394
+ })
395
+ .strict()
396
+
397
+ export const claimSetReturnLabelSchema = scopedSchema
398
+ .extend({
399
+ id: uuid(),
400
+ labelUrl: httpUrlString(2048),
401
+ trackingNumber: requiredOptionalString(191),
402
+ carrier: requiredOptionalString(120),
403
+ updatedAt: optimisticLockTokenSchema,
404
+ })
405
+ .strict()
406
+ .refine(
407
+ (input) => Boolean(input.labelUrl || input.trackingNumber || input.carrier),
408
+ { message: 'At least one return-label field is required' },
409
+ )
410
+
411
+ const portalClaimLineInputSchema = z
412
+ .object({
413
+ orderLineId: uuid().nullable().optional(),
414
+ productId: uuid().nullable().optional(),
415
+ sku: clearableString(191),
416
+ productName: clearableString(191),
417
+ serialNumber: clearableString(191),
418
+ faultCode: clearableString(120),
419
+ faultDescription: z.string().trim().min(1).max(4000),
420
+ qtyClaimed: positiveDecimal().optional(),
421
+ // Warranty basis carried from the selected order line so entitlement is preserved (WQA-004).
422
+ purchaseDate: z.coerce.date().nullable().optional(),
423
+ warrantyMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
424
+ })
425
+ .strict()
426
+
427
+ export const portalIntakeInputSchema = z
428
+ .object({
429
+ orderId: uuid().nullable().optional(),
430
+ // Free-text "my order isn't listed" reference. Kept separate from `orderId` (a UUID) so a
431
+ // typed purchase-order string is no longer rejected as an invalid UUID (WQA-002).
432
+ orderReference: clearableString(190),
433
+ reasonCode: z.string().trim().min(1).max(120),
434
+ notes: clearableString(8000),
435
+ lines: z.array(portalClaimLineInputSchema).min(1).max(200),
436
+ })
437
+ .strict()
438
+
439
+ export const externalClaimLineInputSchema = z
440
+ .object({
441
+ productId: uuid().nullable().optional(),
442
+ sku: clearableString(191),
443
+ productName: clearableString(191),
444
+ serialNumber: clearableString(191),
445
+ faultCode: clearableString(120),
446
+ faultDescription: z.string().trim().min(1).max(4000),
447
+ qtyClaimed: positiveDecimal().optional(),
448
+ purchaseDate: z.coerce.date().nullable().optional(),
449
+ warrantyMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
450
+ })
451
+ .strict()
452
+
453
+ export const externalClaimIntakeSchema = z
454
+ .object({
455
+ externalRef: z.string().trim().min(1).max(190),
456
+ orderId: uuid().nullable().optional(),
457
+ orderNumber: clearableString(120),
458
+ customerId: uuid().nullable().optional(),
459
+ contactName: clearableString(191),
460
+ contactEmail: clearableString(320),
461
+ reasonCode: clearableString(120),
462
+ notes: clearableString(8000),
463
+ lines: z.array(externalClaimLineInputSchema).min(1).max(200),
464
+ })
465
+ .strict()
466
+ .refine(
467
+ (value) => Boolean(value.orderId || value.orderNumber || value.customerId || value.contactEmail),
468
+ { message: '[internal] contactEmail is required when no order or customer reference is provided', path: ['contactEmail'] },
469
+ )
470
+
471
+ export const externalClaimLookupQuerySchema = z
472
+ .object({
473
+ id: uuid().optional(),
474
+ claimNumber: z.string().trim().min(1).max(60).optional(),
475
+ externalRef: z.string().trim().min(1).max(190).optional(),
476
+ })
477
+ .strict()
478
+ .refine((value) => Boolean(value.id || value.claimNumber || value.externalRef), {
479
+ message: '[internal] one of id, claimNumber, externalRef is required',
480
+ })
481
+
482
+ const registrationFields = {
483
+ serialNumber: requiredOptionalString(191),
484
+ productId: uuid().nullable().optional(),
485
+ variantId: uuid().nullable().optional(),
486
+ sku: clearableString(191),
487
+ productName: clearableString(300),
488
+ customerId: uuid().nullable().optional(),
489
+ orderId: uuid().nullable().optional(),
490
+ purchaseDate: nullableIsoDateString(),
491
+ warrantyMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
492
+ warrantyExpiresAt: nullableIsoDateString(),
493
+ coverageType: registrationCoverageTypeSchema.nullable().optional(),
494
+ source: registrationSourceSchema.nullable().optional(),
495
+ proofAttachmentId: uuid().nullable().optional(),
496
+ notes: clearableString(8000),
497
+ }
498
+
499
+ export const registrationCreateSchema = scopedSchema
500
+ .extend(registrationFields)
501
+ .extend({ serialNumber: requiredString(191) })
502
+ .strict()
503
+
504
+ export const registrationUpdateSchema = z
505
+ .object({ id: uuid() })
506
+ .merge(scopedSchema.partial())
507
+ .merge(z.object(registrationFields).partial())
508
+ .strict()
509
+
510
+ export const registrationDeleteSchema = scopedSchema
511
+ .extend({ id: uuid() })
512
+ .strict()
513
+
514
+ const recoveryRatePctSchema = z
515
+ .union([
516
+ z.number(),
517
+ z.string().trim().regex(/^\d+(\.\d{1,2})?$/, 'warranty_claims.errors.recoveryRateFormat'),
518
+ ])
519
+ .transform((value) => Number(value))
520
+ .refine((value) => value >= 0 && value <= 100, {
521
+ message: 'warranty_claims.errors.recoveryRateRange',
522
+ })
523
+ .nullable()
524
+ .optional()
525
+
526
+ const vendorPolicyFields = {
527
+ vendorRef: clearableString(191),
528
+ coverageMonths: z.coerce.number().int().min(0).max(600).nullable().optional(),
529
+ claimableReasonCodes: z.array(z.string().trim().min(1).max(120)).nullable().optional(),
530
+ recoveryRatePct: recoveryRatePctSchema,
531
+ contactEmail: clearableEmail(320),
532
+ autoGenerateRecovery: z.boolean().optional(),
533
+ isActive: z.boolean().optional(),
534
+ }
535
+
536
+ export const vendorPolicyCreateSchema = scopedSchema
537
+ .extend({
538
+ vendorName: z.string().trim().min(1).max(300),
539
+ ...vendorPolicyFields,
540
+ })
541
+ .strict()
542
+
543
+ export const vendorPolicyUpdateSchema = z
544
+ .object({ id: uuid() })
545
+ .merge(scopedSchema.partial())
546
+ .merge(
547
+ z.object({
548
+ vendorName: z.string().trim().min(1).max(300).optional(),
549
+ ...vendorPolicyFields,
550
+ }).partial()
551
+ )
552
+ .strict()
553
+
554
+ export const vendorPolicyDeleteSchema = scopedSchema
555
+ .extend({ id: uuid() })
556
+ .strict()
557
+
558
+ const troubleshootingStepsSchema = z.unknown().nullable().optional().superRefine((value, ctx) => {
559
+ if (value === undefined || value === null) return
560
+ if (parseGuideSteps(value)) return
561
+ ctx.addIssue({
562
+ code: z.ZodIssueCode.custom,
563
+ message: 'warranty_claims.errors.invalidTroubleshootingSteps',
564
+ })
565
+ })
566
+
567
+ const troubleshootingGuideFields = {
568
+ claimType: claimTypeSchema.nullable().optional(),
569
+ reasonCode: clearableString(120),
570
+ steps: troubleshootingStepsSchema,
571
+ isActive: z.boolean().optional(),
572
+ }
573
+
574
+ export const troubleshootingGuideCreateSchema = scopedSchema
575
+ .extend({
576
+ title: z.string().trim().min(1).max(300),
577
+ ...troubleshootingGuideFields,
578
+ })
579
+ .strict()
580
+
581
+ export const troubleshootingGuideUpdateSchema = z
582
+ .object({ id: uuid() })
583
+ .merge(scopedSchema.partial())
584
+ .merge(
585
+ z.object({
586
+ title: z.string().trim().min(1).max(300).optional(),
587
+ ...troubleshootingGuideFields,
588
+ }).partial()
589
+ )
590
+ .strict()
591
+
592
+ export const troubleshootingGuideDeleteSchema = scopedSchema
593
+ .extend({ id: uuid() })
594
+ .strict()
595
+
596
+ export type ClaimCreateInput = z.infer<typeof claimCreateSchema>
597
+ export type ClaimUpdateInput = z.infer<typeof claimUpdateSchema>
598
+ export type ClaimInitialLineCreateInput = z.infer<typeof claimInitialLineCreateSchema>
599
+ export type ClaimLineCreateInput = z.infer<typeof claimLineCreateSchema>
600
+ export type ClaimLineUpdateInput = z.infer<typeof claimLineUpdateSchema>
601
+ export type ClaimLineReceiveInput = z.infer<typeof claimLineReceiveSchema>
602
+ export type ClaimLineReleaseQuarantineInput = z.infer<typeof claimLineReleaseQuarantineSchema>
603
+ export type WarrantyClaimSettingsUpdateInput = z.infer<typeof warrantyClaimSettingsUpdateSchema>
604
+ export type WarrantyClaimSettingsSaveInput = z.infer<typeof warrantyClaimSettingsSaveSchema>
605
+ export type TransitionClaimInput = z.infer<typeof transitionClaimInputSchema>
606
+ export type AssignClaimInput = z.infer<typeof assignClaimInputSchema>
607
+ export type CommentClaimInput = z.infer<typeof commentClaimInputSchema>
608
+ export type VendorRecoveryInput = z.infer<typeof vendorRecoveryInputSchema>
609
+ export type ClaimSetReturnLabelInput = z.infer<typeof claimSetReturnLabelSchema>
610
+ export type ClaimCreateSalesReturnInput = z.infer<typeof claimCreateSalesReturnSchema>
611
+ export type ClaimCreateCreditMemoInput = z.infer<typeof claimCreateCreditMemoSchema>
612
+ export type ClaimCreateReplacementOrderInput = z.infer<typeof claimCreateReplacementOrderSchema>
613
+ export type PortalIntakeInput = z.infer<typeof portalIntakeInputSchema>
614
+ export type ExternalClaimLineInput = z.infer<typeof externalClaimLineInputSchema>
615
+ export type ExternalClaimIntakeInput = z.infer<typeof externalClaimIntakeSchema>
616
+ export type ExternalClaimLookupQuery = z.infer<typeof externalClaimLookupQuerySchema>
617
+ export type RegistrationCreateInput = z.infer<typeof registrationCreateSchema>
618
+ export type RegistrationUpdateInput = z.infer<typeof registrationUpdateSchema>
619
+ export type RegistrationDeleteInput = z.infer<typeof registrationDeleteSchema>
620
+ export type WarrantyClaimRegistrationCreateInput = RegistrationCreateInput
621
+ export type WarrantyClaimRegistrationUpdateInput = RegistrationUpdateInput
622
+ export type WarrantyClaimRegistrationDeleteInput = RegistrationDeleteInput
623
+ export type VendorPolicyCreateInput = z.infer<typeof vendorPolicyCreateSchema>
624
+ export type VendorPolicyUpdateInput = z.infer<typeof vendorPolicyUpdateSchema>
625
+ export type VendorPolicyDeleteInput = z.infer<typeof vendorPolicyDeleteSchema>
626
+ export type WarrantyVendorPolicyCreateInput = VendorPolicyCreateInput
627
+ export type WarrantyVendorPolicyUpdateInput = VendorPolicyUpdateInput
628
+ export type WarrantyVendorPolicyDeleteInput = VendorPolicyDeleteInput
629
+ export type TroubleshootingGuideCreateInput = z.infer<typeof troubleshootingGuideCreateSchema>
630
+ export type TroubleshootingGuideUpdateInput = z.infer<typeof troubleshootingGuideUpdateSchema>
631
+ export type TroubleshootingGuideDeleteInput = z.infer<typeof troubleshootingGuideDeleteSchema>
632
+ export type WarrantyTroubleshootingGuideCreateInput = TroubleshootingGuideCreateInput
633
+ export type WarrantyTroubleshootingGuideUpdateInput = TroubleshootingGuideUpdateInput
634
+ export type WarrantyTroubleshootingGuideDeleteInput = TroubleshootingGuideDeleteInput
@@ -0,0 +1,34 @@
1
+ import { asFunction, asValue } from 'awilix'
2
+ import type { EntityManager } from '@mikro-orm/postgresql'
3
+ import type { AppContainer } from '@open-mercato/shared/lib/di/container'
4
+ import { WarrantyClaimNumberGenerator } from './services/claimNumberGenerator'
5
+ import { createWarrantyAdjudicationEvaluator } from './services/adjudicationEvaluator'
6
+ import { createWarrantyEntitlementResolver } from './services/entitlementResolver'
7
+ import { createWarrantyReturnLabelProvider } from './services/returnLabelProvider'
8
+ import {
9
+ WarrantyClaim,
10
+ WarrantyClaimEvent,
11
+ WarrantyClaimLine,
12
+ WarrantyClaimSequence,
13
+ } from './data/entities'
14
+
15
+ type AppCradle = AppContainer['cradle'] & {
16
+ em: EntityManager
17
+ }
18
+
19
+ export function register(container: AppContainer) {
20
+ container.register({
21
+ warrantyClaimNumberGenerator: asFunction(({ em }: AppCradle) => {
22
+ return new WarrantyClaimNumberGenerator(em)
23
+ })
24
+ .singleton()
25
+ .proxy(),
26
+ warrantyEntitlementResolver: asFunction(() => createWarrantyEntitlementResolver()).singleton(),
27
+ warrantyReturnLabelProvider: asFunction(() => createWarrantyReturnLabelProvider()).singleton(),
28
+ warrantyAdjudicationEvaluator: asFunction(() => createWarrantyAdjudicationEvaluator()).singleton(),
29
+ WarrantyClaim: asValue(WarrantyClaim),
30
+ WarrantyClaimLine: asValue(WarrantyClaimLine),
31
+ WarrantyClaimEvent: asValue(WarrantyClaimEvent),
32
+ WarrantyClaimSequence: asValue(WarrantyClaimSequence),
33
+ })
34
+ }
@@ -0,0 +1,26 @@
1
+ import type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'
2
+
3
+ export const defaultEncryptionMaps: ModuleEncryptionMap[] = [
4
+ {
5
+ entityId: 'warranty_claims:warranty_claim',
6
+ fields: [{ field: 'notes' }, { field: 'resolution_summary' }, { field: 'contact_email' }],
7
+ },
8
+ {
9
+ entityId: 'warranty_claims:warranty_claim_line',
10
+ fields: [{ field: 'fault_description' }, { field: 'inspection_notes' }],
11
+ },
12
+ {
13
+ entityId: 'warranty_claims:warranty_claim_event',
14
+ fields: [{ field: 'body' }],
15
+ },
16
+ {
17
+ entityId: 'warranty_claims:warranty_claim_registration',
18
+ fields: [{ field: 'notes' }],
19
+ },
20
+ {
21
+ entityId: 'warranty_claims:warranty_vendor_policy',
22
+ fields: [{ field: 'contact_email' }],
23
+ },
24
+ ]
25
+
26
+ export default defaultEncryptionMaps