@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.
- package/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/warranty_claim/index.js +105 -0
- package/dist/generated/entities/warranty_claim/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_event/index.js +25 -0
- package/dist/generated/entities/warranty_claim_event/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_line/index.js +77 -0
- package/dist/generated/entities/warranty_claim_line/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_registration/index.js +43 -0
- package/dist/generated/entities/warranty_claim_registration/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_sequence/index.js +17 -0
- package/dist/generated/entities/warranty_claim_sequence/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_settings/index.js +43 -0
- package/dist/generated/entities/warranty_claim_settings/index.js.map +7 -0
- package/dist/generated/entities/warranty_claim_sla_signal/index.js +25 -0
- package/dist/generated/entities/warranty_claim_sla_signal/index.js.map +7 -0
- package/dist/generated/entities/warranty_troubleshooting_guide/index.js +25 -0
- package/dist/generated/entities/warranty_troubleshooting_guide/index.js.map +7 -0
- package/dist/generated/entities/warranty_vendor_policy/index.js +31 -0
- package/dist/generated/entities/warranty_vendor_policy/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +12 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +200 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/api.js +3 -2
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/salesFixtures.js +13 -6
- package/dist/helpers/integration/salesFixtures.js.map +2 -2
- package/dist/modules/attachments/di.js +18 -0
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +186 -26
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js +202 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +7 -0
- package/dist/modules/attachments/lib/target-access-service.js +39 -0
- package/dist/modules/attachments/lib/target-access-service.js.map +7 -0
- package/dist/modules/auth/api/logout.js +37 -10
- package/dist/modules/auth/api/logout.js.map +2 -2
- package/dist/modules/auth/api/reset/confirm.js +7 -0
- package/dist/modules/auth/api/reset/confirm.js.map +2 -2
- package/dist/modules/auth/api/reset.js +7 -0
- package/dist/modules/auth/api/reset.js.map +2 -2
- package/dist/modules/auth/commands/users.js +13 -0
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/auth/events.js +15 -0
- package/dist/modules/auth/events.js.map +2 -2
- package/dist/modules/customers/api/companies/route.js +1 -0
- package/dist/modules/customers/api/companies/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/components/detail/assignableStaff.js +6 -69
- package/dist/modules/customers/components/detail/assignableStaff.js.map +2 -2
- package/dist/modules/customers/lib/assignableStaff.js +76 -0
- package/dist/modules/customers/lib/assignableStaff.js.map +7 -0
- package/dist/modules/data_sync/lib/batch-stream.js +56 -0
- package/dist/modules/data_sync/lib/batch-stream.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +165 -103
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +4 -0
- package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/extract/route.js +4 -0
- package/dist/modules/inbox_ops/api/extract/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/webhook/inbound.js +4 -0
- package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +8 -8
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/warranty_claims/acl.js +75 -0
- package/dist/modules/warranty_claims/acl.js.map +7 -0
- package/dist/modules/warranty_claims/ai-agents.js +161 -0
- package/dist/modules/warranty_claims/ai-agents.js.map +7 -0
- package/dist/modules/warranty_claims/ai-tools.js +591 -0
- package/dist/modules/warranty_claims/ai-tools.js.map +7 -0
- package/dist/modules/warranty_claims/api/ai/assess/route.js +304 -0
- package/dist/modules/warranty_claims/api/ai/assess/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/ai/draft-reply/route.js +127 -0
- package/dist/modules/warranty_claims/api/ai/draft-reply/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/ai/suggest/route.js +177 -0
- package/dist/modules/warranty_claims/api/ai/suggest/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/assign/route.js +124 -0
- package/dist/modules/warranty_claims/api/assign/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/assignees/route.js +97 -0
- package/dist/modules/warranty_claims/api/assignees/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/credit-memo/route.js +152 -0
- package/dist/modules/warranty_claims/api/credit-memo/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/entitlement/route.js +145 -0
- package/dist/modules/warranty_claims/api/entitlement/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/events/route.js +199 -0
- package/dist/modules/warranty_claims/api/events/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/external/claims/route.js +446 -0
- package/dist/modules/warranty_claims/api/external/claims/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/lines/route.js +258 -0
- package/dist/modules/warranty_claims/api/lines/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/openapi.js +27 -0
- package/dist/modules/warranty_claims/api/openapi.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +490 -0
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js +178 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js +101 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js +78 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js +81 -0
- package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/claims/route.js +462 -0
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/events/route.js +228 -0
- package/dist/modules/warranty_claims/api/portal/events/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/options/route.js +91 -0
- package/dist/modules/warranty_claims/api/portal/options/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/orders/lines/route.js +172 -0
- package/dist/modules/warranty_claims/api/portal/orders/lines/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/orders/route.js +151 -0
- package/dist/modules/warranty_claims/api/portal/orders/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js +121 -0
- package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/receiving/route.js +176 -0
- package/dist/modules/warranty_claims/api/receiving/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/registrations/route.js +382 -0
- package/dist/modules/warranty_claims/api/registrations/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/replacement-order/route.js +150 -0
- package/dist/modules/warranty_claims/api/replacement-order/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/return-label/route.js +235 -0
- package/dist/modules/warranty_claims/api/return-label/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/risk/route.js +101 -0
- package/dist/modules/warranty_claims/api/risk/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/route.js +482 -0
- package/dist/modules/warranty_claims/api/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/sales-return/route.js +151 -0
- package/dist/modules/warranty_claims/api/sales-return/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/settings-general/route.js +195 -0
- package/dist/modules/warranty_claims/api/settings-general/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/stats/route.js +199 -0
- package/dist/modules/warranty_claims/api/stats/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/submit/route.js +120 -0
- package/dist/modules/warranty_claims/api/submit/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/transition/route.js +126 -0
- package/dist/modules/warranty_claims/api/transition/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js +261 -0
- package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/vendor-policies/route.js +311 -0
- package/dist/modules/warranty_claims/api/vendor-policies/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/vendor-recovery/route.js +130 -0
- package/dist/modules/warranty_claims/api/vendor-recovery/route.js.map +7 -0
- package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js +153 -0
- package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js +268 -0
- package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js +54 -0
- package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js +87 -0
- package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js +120 -0
- package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js +135 -0
- package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js +218 -0
- package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js +231 -0
- package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js +82 -0
- package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js +136 -0
- package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js +41 -0
- package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js +45 -0
- package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/claimSla.js +92 -0
- package/dist/modules/warranty_claims/backend/components/claimSla.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/orderLookup.js +81 -0
- package/dist/modules/warranty_claims/backend/components/orderLookup.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/productLookup.js +317 -0
- package/dist/modules/warranty_claims/backend/components/productLookup.js.map +7 -0
- package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js +61 -0
- package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js.map +7 -0
- package/dist/modules/warranty_claims/backend/page.js +1088 -0
- package/dist/modules/warranty_claims/backend/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/page.meta.js +16 -0
- package/dist/modules/warranty_claims/backend/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js +427 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js +16 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js +2101 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js +16 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js +1249 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js +16 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js +110 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js +17 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js +49 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js +17 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +485 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js +253 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js +1565 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js +472 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js +115 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js +54 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +414 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js +21 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js +171 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js +111 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js +48 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js +19 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +429 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js +21 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js +182 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js.map +7 -0
- package/dist/modules/warranty_claims/ce.js +48 -0
- package/dist/modules/warranty_claims/ce.js.map +7 -0
- package/dist/modules/warranty_claims/commands/claim-lines.js +911 -0
- package/dist/modules/warranty_claims/commands/claim-lines.js.map +7 -0
- package/dist/modules/warranty_claims/commands/claims.js +2577 -0
- package/dist/modules/warranty_claims/commands/claims.js.map +7 -0
- package/dist/modules/warranty_claims/commands/index.js +4 -0
- package/dist/modules/warranty_claims/commands/index.js.map +7 -0
- package/dist/modules/warranty_claims/commands/settings.js +169 -0
- package/dist/modules/warranty_claims/commands/settings.js.map +7 -0
- package/dist/modules/warranty_claims/commands/shared.js +162 -0
- package/dist/modules/warranty_claims/commands/shared.js.map +7 -0
- package/dist/modules/warranty_claims/data/constants.js +35 -0
- package/dist/modules/warranty_claims/data/constants.js.map +7 -0
- package/dist/modules/warranty_claims/data/enrichers.js +97 -0
- package/dist/modules/warranty_claims/data/enrichers.js.map +7 -0
- package/dist/modules/warranty_claims/data/entities.js +731 -0
- package/dist/modules/warranty_claims/data/entities.js.map +7 -0
- package/dist/modules/warranty_claims/data/validators.js +488 -0
- package/dist/modules/warranty_claims/data/validators.js.map +7 -0
- package/dist/modules/warranty_claims/di.js +29 -0
- package/dist/modules/warranty_claims/di.js.map +7 -0
- package/dist/modules/warranty_claims/encryption.js +28 -0
- package/dist/modules/warranty_claims/encryption.js.map +7 -0
- package/dist/modules/warranty_claims/events.js +81 -0
- package/dist/modules/warranty_claims/events.js.map +7 -0
- package/dist/modules/warranty_claims/extension-points.js +19 -0
- package/dist/modules/warranty_claims/extension-points.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js +825 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js +11 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js +1139 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js +11 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +253 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +7 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js +18 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js.map +7 -0
- package/dist/modules/warranty_claims/index.js +15 -0
- package/dist/modules/warranty_claims/index.js.map +7 -0
- package/dist/modules/warranty_claims/lib/aiAssist.js +496 -0
- package/dist/modules/warranty_claims/lib/aiAssist.js.map +7 -0
- package/dist/modules/warranty_claims/lib/apiIdsFilter.js +11 -0
- package/dist/modules/warranty_claims/lib/apiIdsFilter.js.map +7 -0
- package/dist/modules/warranty_claims/lib/assigneeNames.js +153 -0
- package/dist/modules/warranty_claims/lib/assigneeNames.js.map +7 -0
- package/dist/modules/warranty_claims/lib/attachmentVisibility.js +9 -0
- package/dist/modules/warranty_claims/lib/attachmentVisibility.js.map +7 -0
- package/dist/modules/warranty_claims/lib/bulkFeedback.js +8 -0
- package/dist/modules/warranty_claims/lib/bulkFeedback.js.map +7 -0
- package/dist/modules/warranty_claims/lib/businessHours.js +250 -0
- package/dist/modules/warranty_claims/lib/businessHours.js.map +7 -0
- package/dist/modules/warranty_claims/lib/businessHoursForm.js +146 -0
- package/dist/modules/warranty_claims/lib/businessHoursForm.js.map +7 -0
- package/dist/modules/warranty_claims/lib/claimTypeConfig.js +39 -0
- package/dist/modules/warranty_claims/lib/claimTypeConfig.js.map +7 -0
- package/dist/modules/warranty_claims/lib/decryptionSafety.js +17 -0
- package/dist/modules/warranty_claims/lib/decryptionSafety.js.map +7 -0
- package/dist/modules/warranty_claims/lib/deskFilters.js +88 -0
- package/dist/modules/warranty_claims/lib/deskFilters.js.map +7 -0
- package/dist/modules/warranty_claims/lib/dictionaries.js +157 -0
- package/dist/modules/warranty_claims/lib/dictionaries.js.map +7 -0
- package/dist/modules/warranty_claims/lib/dictionaryLabels.js +12 -0
- package/dist/modules/warranty_claims/lib/dictionaryLabels.js.map +7 -0
- package/dist/modules/warranty_claims/lib/emailIntake.js +87 -0
- package/dist/modules/warranty_claims/lib/emailIntake.js.map +7 -0
- package/dist/modules/warranty_claims/lib/escalation.js +58 -0
- package/dist/modules/warranty_claims/lib/escalation.js.map +7 -0
- package/dist/modules/warranty_claims/lib/externalIntake.js +233 -0
- package/dist/modules/warranty_claims/lib/externalIntake.js.map +7 -0
- package/dist/modules/warranty_claims/lib/grading.js +21 -0
- package/dist/modules/warranty_claims/lib/grading.js.map +7 -0
- package/dist/modules/warranty_claims/lib/listSegments.js +18 -0
- package/dist/modules/warranty_claims/lib/listSegments.js.map +7 -0
- package/dist/modules/warranty_claims/lib/orderOwnership.js +25 -0
- package/dist/modules/warranty_claims/lib/orderOwnership.js.map +7 -0
- package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js +11 -0
- package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js.map +7 -0
- package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js +108 -0
- package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js.map +7 -0
- package/dist/modules/warranty_claims/lib/portalClaimAccess.js +26 -0
- package/dist/modules/warranty_claims/lib/portalClaimAccess.js.map +7 -0
- package/dist/modules/warranty_claims/lib/quantity.js +19 -0
- package/dist/modules/warranty_claims/lib/quantity.js.map +7 -0
- package/dist/modules/warranty_claims/lib/risk.js +204 -0
- package/dist/modules/warranty_claims/lib/risk.js.map +7 -0
- package/dist/modules/warranty_claims/lib/settings.js +55 -0
- package/dist/modules/warranty_claims/lib/settings.js.map +7 -0
- package/dist/modules/warranty_claims/lib/stateMachine.js +88 -0
- package/dist/modules/warranty_claims/lib/stateMachine.js.map +7 -0
- package/dist/modules/warranty_claims/lib/timelineFilters.js +16 -0
- package/dist/modules/warranty_claims/lib/timelineFilters.js.map +7 -0
- package/dist/modules/warranty_claims/lib/triage.js +241 -0
- package/dist/modules/warranty_claims/lib/triage.js.map +7 -0
- package/dist/modules/warranty_claims/lib/troubleshooting.js +111 -0
- package/dist/modules/warranty_claims/lib/troubleshooting.js.map +7 -0
- package/dist/modules/warranty_claims/lib/tryResolve.js +11 -0
- package/dist/modules/warranty_claims/lib/tryResolve.js.map +7 -0
- package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js +101 -0
- package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js.map +7 -0
- package/dist/modules/warranty_claims/lib/warrantyPreview.js +18 -0
- package/dist/modules/warranty_claims/lib/warrantyPreview.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js +32 -0
- package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js +16 -0
- package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js +17 -0
- package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js +29 -0
- package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js +25 -0
- package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js +13 -0
- package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js +15 -0
- package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js +13 -0
- package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js +13 -0
- package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js +12 -0
- package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js.map +7 -0
- package/dist/modules/warranty_claims/notifications.client.js +67 -0
- package/dist/modules/warranty_claims/notifications.client.js.map +7 -0
- package/dist/modules/warranty_claims/notifications.js +103 -0
- package/dist/modules/warranty_claims/notifications.js.map +7 -0
- package/dist/modules/warranty_claims/search.js +174 -0
- package/dist/modules/warranty_claims/search.js.map +7 -0
- package/dist/modules/warranty_claims/services/adjudicationEvaluator.js +202 -0
- package/dist/modules/warranty_claims/services/adjudicationEvaluator.js.map +7 -0
- package/dist/modules/warranty_claims/services/claimNumberGenerator.js +58 -0
- package/dist/modules/warranty_claims/services/claimNumberGenerator.js.map +7 -0
- package/dist/modules/warranty_claims/services/entitlementResolver.js +69 -0
- package/dist/modules/warranty_claims/services/entitlementResolver.js.map +7 -0
- package/dist/modules/warranty_claims/services/returnLabelProvider.js +14 -0
- package/dist/modules/warranty_claims/services/returnLabelProvider.js.map +7 -0
- package/dist/modules/warranty_claims/setup.js +121 -0
- package/dist/modules/warranty_claims/setup.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js +119 -0
- package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js +47 -0
- package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js +60 -0
- package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/claim-status-notification.js +83 -0
- package/dist/modules/warranty_claims/subscribers/claim-status-notification.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js +46 -0
- package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/email-to-claim.js +135 -0
- package/dist/modules/warranty_claims/subscribers/email-to-claim.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js +164 -0
- package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js +24 -0
- package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js.map +7 -0
- package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js +26 -0
- package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js +15 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js +197 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js +28 -0
- package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js +418 -0
- package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js +18 -0
- package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js +17 -0
- package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js +146 -0
- package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js +17 -0
- package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js +147 -0
- package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/injection-table.js +38 -0
- package/dist/modules/warranty_claims/widgets/injection-table.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js +223 -0
- package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js.map +7 -0
- package/dist/modules/warranty_claims/widgets/notifications/index.js +5 -0
- package/dist/modules/warranty_claims/widgets/notifications/index.js.map +7 -0
- package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js +334 -0
- package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js.map +7 -0
- package/generated/entities/warranty_claim/index.ts +51 -0
- package/generated/entities/warranty_claim_event/index.ts +11 -0
- package/generated/entities/warranty_claim_line/index.ts +37 -0
- package/generated/entities/warranty_claim_registration/index.ts +20 -0
- package/generated/entities/warranty_claim_sequence/index.ts +7 -0
- package/generated/entities/warranty_claim_settings/index.ts +20 -0
- package/generated/entities/warranty_claim_sla_signal/index.ts +11 -0
- package/generated/entities/warranty_troubleshooting_guide/index.ts +11 -0
- package/generated/entities/warranty_vendor_policy/index.ts +14 -0
- package/generated/entities.ids.generated.ts +12 -0
- package/generated/entity-fields-registry.ts +200 -0
- package/package.json +7 -7
- package/src/helpers/integration/api.ts +10 -3
- package/src/helpers/integration/salesFixtures.ts +17 -7
- package/src/modules/attachments/di.ts +30 -1
- package/src/modules/attachments/fields/attachment.tsx +215 -23
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +257 -0
- package/src/modules/attachments/lib/target-access-service.ts +57 -0
- package/src/modules/auth/api/logout.ts +46 -10
- package/src/modules/auth/api/reset/confirm.ts +7 -0
- package/src/modules/auth/api/reset.ts +7 -0
- package/src/modules/auth/commands/users.ts +22 -0
- package/src/modules/auth/events.ts +15 -0
- package/src/modules/customers/api/companies/route.ts +1 -0
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +4 -2
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +4 -2
- package/src/modules/customers/components/detail/assignableStaff.ts +14 -177
- package/src/modules/customers/lib/assignableStaff.ts +177 -0
- package/src/modules/data_sync/AGENTS.md +3 -0
- package/src/modules/data_sync/lib/batch-stream.ts +117 -0
- package/src/modules/data_sync/lib/sync-engine.ts +190 -115
- package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +4 -0
- package/src/modules/inbox_ops/api/extract/route.ts +4 -0
- package/src/modules/inbox_ops/api/webhook/inbound.ts +4 -0
- package/src/modules/sales/commands/documents.ts +16 -8
- package/src/modules/warranty_claims/AGENTS.md +49 -0
- package/src/modules/warranty_claims/acl.ts +71 -0
- package/src/modules/warranty_claims/ai-agents.ts +189 -0
- package/src/modules/warranty_claims/ai-tools.ts +711 -0
- package/src/modules/warranty_claims/api/ai/assess/route.ts +371 -0
- package/src/modules/warranty_claims/api/ai/draft-reply/route.ts +149 -0
- package/src/modules/warranty_claims/api/ai/suggest/route.ts +190 -0
- package/src/modules/warranty_claims/api/assign/route.ts +142 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +102 -0
- package/src/modules/warranty_claims/api/credit-memo/route.ts +191 -0
- package/src/modules/warranty_claims/api/entitlement/route.ts +224 -0
- package/src/modules/warranty_claims/api/events/route.ts +226 -0
- package/src/modules/warranty_claims/api/external/claims/route.ts +528 -0
- package/src/modules/warranty_claims/api/lines/route.ts +275 -0
- package/src/modules/warranty_claims/api/openapi.ts +28 -0
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +547 -0
- package/src/modules/warranty_claims/api/portal/claims/[id]/route.ts +195 -0
- package/src/modules/warranty_claims/api/portal/claims/[id]/shared.ts +125 -0
- package/src/modules/warranty_claims/api/portal/claims/[id]/submit/route.ts +82 -0
- package/src/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.ts +87 -0
- package/src/modules/warranty_claims/api/portal/claims/route.ts +579 -0
- package/src/modules/warranty_claims/api/portal/events/route.ts +260 -0
- package/src/modules/warranty_claims/api/portal/options/route.ts +113 -0
- package/src/modules/warranty_claims/api/portal/orders/lines/route.ts +258 -0
- package/src/modules/warranty_claims/api/portal/orders/route.ts +206 -0
- package/src/modules/warranty_claims/api/portal/troubleshooting/route.ts +151 -0
- package/src/modules/warranty_claims/api/receiving/route.ts +215 -0
- package/src/modules/warranty_claims/api/registrations/route.ts +417 -0
- package/src/modules/warranty_claims/api/replacement-order/route.ts +188 -0
- package/src/modules/warranty_claims/api/return-label/route.ts +291 -0
- package/src/modules/warranty_claims/api/risk/route.ts +112 -0
- package/src/modules/warranty_claims/api/route.ts +543 -0
- package/src/modules/warranty_claims/api/sales-return/route.ts +183 -0
- package/src/modules/warranty_claims/api/settings-general/route.ts +230 -0
- package/src/modules/warranty_claims/api/stats/route.ts +306 -0
- package/src/modules/warranty_claims/api/submit/route.ts +146 -0
- package/src/modules/warranty_claims/api/transition/route.ts +144 -0
- package/src/modules/warranty_claims/api/troubleshooting-guides/route.ts +295 -0
- package/src/modules/warranty_claims/api/vendor-policies/route.ts +351 -0
- package/src/modules/warranty_claims/api/vendor-recovery/route.ts +148 -0
- package/src/modules/warranty_claims/api/vendor-recovery-suggestions/route.ts +167 -0
- package/src/modules/warranty_claims/backend/components/AiAssessButtons.tsx +389 -0
- package/src/modules/warranty_claims/backend/components/ClaimStageProgress.tsx +65 -0
- package/src/modules/warranty_claims/backend/components/ClaimStatusBadge.tsx +137 -0
- package/src/modules/warranty_claims/backend/components/ClaimsKpiStrip.tsx +169 -0
- package/src/modules/warranty_claims/backend/components/EntitlementLookupBadge.tsx +203 -0
- package/src/modules/warranty_claims/backend/components/ReceivingPanel.tsx +300 -0
- package/src/modules/warranty_claims/backend/components/ReturnLabelPanel.tsx +292 -0
- package/src/modules/warranty_claims/backend/components/TroubleshootingWalker.tsx +125 -0
- package/src/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.tsx +217 -0
- package/src/modules/warranty_claims/backend/components/WarrantyWorkspace.tsx +66 -0
- package/src/modules/warranty_claims/backend/components/claimReasonOptions.ts +57 -0
- package/src/modules/warranty_claims/backend/components/claimSla.tsx +127 -0
- package/src/modules/warranty_claims/backend/components/orderLookup.ts +109 -0
- package/src/modules/warranty_claims/backend/components/productLookup.tsx +433 -0
- package/src/modules/warranty_claims/backend/components/useUserDisplayNames.ts +66 -0
- package/src/modules/warranty_claims/backend/page.meta.ts +12 -0
- package/src/modules/warranty_claims/backend/page.tsx +1302 -0
- package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.ts +12 -0
- package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.tsx +531 -0
- package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.ts +12 -0
- package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.tsx +2599 -0
- package/src/modules/warranty_claims/backend/warranty_claims/create/page.meta.ts +12 -0
- package/src/modules/warranty_claims/backend/warranty_claims/create/page.tsx +1533 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.ts +13 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.tsx +136 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.ts +13 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.tsx +52 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +555 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.tsx +295 -0
- package/src/modules/warranty_claims/backend/warranty_claims/settings/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/settings/page.tsx +1903 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.tsx +550 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.tsx +141 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.tsx +57 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.ts +17 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +477 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.tsx +214 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.tsx +137 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.ts +15 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.tsx +51 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.ts +17 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +506 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.tsx +220 -0
- package/src/modules/warranty_claims/ce.ts +44 -0
- package/src/modules/warranty_claims/commands/claim-lines.ts +1082 -0
- package/src/modules/warranty_claims/commands/claims.ts +3364 -0
- package/src/modules/warranty_claims/commands/index.ts +3 -0
- package/src/modules/warranty_claims/commands/settings.ts +198 -0
- package/src/modules/warranty_claims/commands/shared.ts +212 -0
- package/src/modules/warranty_claims/data/constants.ts +37 -0
- package/src/modules/warranty_claims/data/enrichers.ts +165 -0
- package/src/modules/warranty_claims/data/entities.ts +663 -0
- package/src/modules/warranty_claims/data/validators.ts +634 -0
- package/src/modules/warranty_claims/di.ts +34 -0
- package/src/modules/warranty_claims/encryption.ts +26 -0
- package/src/modules/warranty_claims/events.ts +81 -0
- package/src/modules/warranty_claims/extension-points.ts +16 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.ts +9 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.tsx +1037 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.ts +9 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.tsx +1409 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.ts +16 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +304 -0
- package/src/modules/warranty_claims/i18n/de.json +1270 -0
- package/src/modules/warranty_claims/i18n/en.json +1270 -0
- package/src/modules/warranty_claims/i18n/es.json +1270 -0
- package/src/modules/warranty_claims/i18n/ko.json +1270 -0
- package/src/modules/warranty_claims/i18n/pl.json +1270 -0
- package/src/modules/warranty_claims/index.ts +13 -0
- package/src/modules/warranty_claims/lib/aiAssist.ts +677 -0
- package/src/modules/warranty_claims/lib/apiIdsFilter.ts +12 -0
- package/src/modules/warranty_claims/lib/assigneeNames.ts +184 -0
- package/src/modules/warranty_claims/lib/attachmentVisibility.ts +5 -0
- package/src/modules/warranty_claims/lib/bulkFeedback.ts +6 -0
- package/src/modules/warranty_claims/lib/businessHours.ts +333 -0
- package/src/modules/warranty_claims/lib/businessHoursForm.ts +206 -0
- package/src/modules/warranty_claims/lib/claimTypeConfig.ts +49 -0
- package/src/modules/warranty_claims/lib/decryptionSafety.ts +19 -0
- package/src/modules/warranty_claims/lib/deskFilters.ts +131 -0
- package/src/modules/warranty_claims/lib/dictionaries.ts +212 -0
- package/src/modules/warranty_claims/lib/dictionaryLabels.ts +16 -0
- package/src/modules/warranty_claims/lib/emailIntake.ts +123 -0
- package/src/modules/warranty_claims/lib/escalation.ts +83 -0
- package/src/modules/warranty_claims/lib/externalIntake.ts +362 -0
- package/src/modules/warranty_claims/lib/grading.ts +23 -0
- package/src/modules/warranty_claims/lib/listSegments.ts +19 -0
- package/src/modules/warranty_claims/lib/orderOwnership.ts +58 -0
- package/src/modules/warranty_claims/lib/portalAttachmentUpload.ts +11 -0
- package/src/modules/warranty_claims/lib/portalAttachmentValidation.ts +115 -0
- package/src/modules/warranty_claims/lib/portalClaimAccess.ts +37 -0
- package/src/modules/warranty_claims/lib/quantity.ts +15 -0
- package/src/modules/warranty_claims/lib/risk.ts +371 -0
- package/src/modules/warranty_claims/lib/settings.ts +76 -0
- package/src/modules/warranty_claims/lib/stateMachine.ts +130 -0
- package/src/modules/warranty_claims/lib/timelineFilters.ts +22 -0
- package/src/modules/warranty_claims/lib/triage.ts +366 -0
- package/src/modules/warranty_claims/lib/troubleshooting.ts +157 -0
- package/src/modules/warranty_claims/lib/tryResolve.ts +7 -0
- package/src/modules/warranty_claims/lib/vendorPolicyRecovery.ts +182 -0
- package/src/modules/warranty_claims/lib/warrantyPreview.ts +20 -0
- package/src/modules/warranty_claims/migrations/.snapshot-open-mercato.json +3525 -0
- package/src/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.ts +38 -0
- package/src/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.ts +17 -0
- package/src/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.ts +17 -0
- package/src/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.ts +37 -0
- package/src/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.ts +25 -0
- package/src/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.ts +13 -0
- package/src/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.ts +15 -0
- package/src/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.ts +13 -0
- package/src/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.ts +13 -0
- package/src/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.ts +11 -0
- package/src/modules/warranty_claims/notifications.client.ts +78 -0
- package/src/modules/warranty_claims/notifications.ts +101 -0
- package/src/modules/warranty_claims/search.ts +199 -0
- package/src/modules/warranty_claims/services/adjudicationEvaluator.ts +344 -0
- package/src/modules/warranty_claims/services/claimNumberGenerator.ts +69 -0
- package/src/modules/warranty_claims/services/entitlementResolver.ts +102 -0
- package/src/modules/warranty_claims/services/returnLabelProvider.ts +30 -0
- package/src/modules/warranty_claims/setup.ts +154 -0
- package/src/modules/warranty_claims/subscribers/auto-vendor-recovery.ts +140 -0
- package/src/modules/warranty_claims/subscribers/claim-assigned-notification.ts +54 -0
- package/src/modules/warranty_claims/subscribers/claim-customer-reply-notification.ts +68 -0
- package/src/modules/warranty_claims/subscribers/claim-status-notification.ts +100 -0
- package/src/modules/warranty_claims/subscribers/claim-submitted-notification.ts +53 -0
- package/src/modules/warranty_claims/subscribers/email-to-claim.ts +175 -0
- package/src/modules/warranty_claims/subscribers/return-shipment-tracking.ts +226 -0
- package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.ts +28 -0
- package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.ts +31 -0
- package/src/modules/warranty_claims/widgets/dashboard/claims-queue/config.ts +15 -0
- package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.tsx +237 -0
- package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.ts +27 -0
- package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.tsx +527 -0
- package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.ts +37 -0
- package/src/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.ts +21 -0
- package/src/modules/warranty_claims/widgets/injection/customer-claims-tab.tsx +210 -0
- package/src/modules/warranty_claims/widgets/injection/order-claims-tab/widget.ts +21 -0
- package/src/modules/warranty_claims/widgets/injection/order-claims-tab.tsx +210 -0
- package/src/modules/warranty_claims/widgets/injection-table.ts +36 -0
- package/src/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.tsx +253 -0
- package/src/modules/warranty_claims/widgets/notifications/index.ts +1 -0
- 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/backend/warranty_claims/%5Bid%5D/page.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Copy, Hash, Info, MessageSquare, Pencil, RefreshCw, Trash2, UserRound } from 'lucide-react'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { parseBooleanFromUnknown } from '@open-mercato/shared/lib/boolean'\nimport type { TranslateFn, TranslateParams } from '@open-mercato/shared/lib/i18n/context'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatDateTime, formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { ActionsDropdown } from '@open-mercato/ui/backend/forms/ActionsDropdown'\nimport { LoadingMessage, ErrorMessage, RecordNotFoundState } from '@open-mercato/ui/backend/detail'\nimport { CrudForm, type CrudField, type CrudFieldOption, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\n// Lazy-load the chat surface so the claim detail route chunk does not carry the AI\n// SDK runtime for every operator \u2014 it only renders once a triage chat session is open.\nconst LazyAiChat = React.lazy(async () => {\n const mod = await import('@open-mercato/ui/ai/AiChat')\n return { default: mod.AiChat }\n})\nimport { AiIcon } from '@open-mercato/ui/ai/AiIcon'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { useAppEvent } from '@open-mercato/ui/backend/injection/useAppEvent'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { apiCall, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, deleteCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useCurrentUserId } from '@open-mercato/ui/backend/utils/useCurrentUserId'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { AttachmentInput } from '@open-mercato/core/modules/attachments/fields/attachment'\nimport {\n fetchAssignableStaffMembersPage,\n type AssignableStaffMember,\n} from '@open-mercato/core/modules/customers/lib/assignableStaff'\nimport { CLAIM_STATUS_TRANSITIONS } from '../../../data/constants'\nimport {\n ClaimStatusBadge,\n type ClaimLineStatus,\n type ClaimStatus,\n} from '../../components/ClaimStatusBadge'\nimport { ClaimSlaIndicator } from '../../components/claimSla'\nimport {\n ClaimLineProductPicker,\n EntitlementChip,\n computeEntitlementPreview,\n type ClaimProductPick,\n} from '../../components/productLookup'\nimport { AiAssessButtons } from '../../components/AiAssessButtons'\nimport { useUserDisplayNames } from '../../components/useUserDisplayNames'\nimport { ReceivingPanel } from '../../components/ReceivingPanel'\nimport { ReturnLabelPanel } from '../../components/ReturnLabelPanel'\nimport { VendorRecoverySuggestionsPanel } from '../../components/VendorRecoverySuggestionsPanel'\nimport { ClaimStageProgress } from '../../components/ClaimStageProgress'\nimport { claimTypeAllowsLineFinancialAdjustments, resolveClaimTypeUiConfig } from '../../../lib/claimTypeConfig'\nimport { isTerminal } from '../../../lib/stateMachine'\nimport { isCustomerVisibleAttachment } from '../../../lib/attachmentVisibility'\nimport { formatQuantity, parseQuantity, quantityInputValue } from '../../../lib/quantity'\nimport { localizeDictionaryLabel, type DictionaryLabelKind } from '../../../lib/dictionaryLabels'\nimport {\n TIMELINE_FILTERS,\n filterTimelineEvents,\n isTimelineFilterId,\n type TimelineFilterId,\n} from '../../../lib/timelineFilters'\n\ntype ClaimType = 'warranty' | 'return' | 'core_return' | 'vendor_recovery'\ntype ClaimChannel = 'staff' | 'portal' | 'api'\ntype ClaimPriority = 'low' | 'normal' | 'high' | 'urgent'\ntype Disposition =\n | 'restock'\n | 'repair'\n | 'replace'\n | 'credit'\n | 'refund'\n | 'field_destroy'\n | 'scrap'\n | 'return_to_vendor'\n | 'deny'\n\ntype TriageMessage = {\n messageKey: string\n params?: TranslateParams\n}\n\ntype TriageMessageValue = TriageMessage | string\n\ntype ClaimRiskLevel = 'none' | 'low' | 'medium' | 'high'\n\ntype ClaimRiskSignal = {\n id: string\n level: 'low' | 'medium' | 'high'\n messageKey: string\n params?: TranslateParams\n relatedClaimNumbers?: string[]\n}\n\ntype ClaimRiskAssessment = {\n level: ClaimRiskLevel\n signals: ClaimRiskSignal[]\n}\n\ntype RiskApiResponse = {\n ok?: boolean\n result?: ClaimRiskAssessment\n}\n\ntype FeatureCheckResponse = {\n ok?: boolean\n granted?: string[]\n}\n\ntype ClaimRecord = {\n id: string\n claimNumber: string | null\n claimType: ClaimType | string | null\n channel: ClaimChannel | string | null\n status: ClaimStatus | string | null\n priority: ClaimPriority | string | null\n customerId: string | null\n customerName: string | null\n orderId: string | null\n orderNumber: string | null\n salesReturnId: string | null\n replacementOrderId: string | null\n creditMemoId: string | null\n awaitingStaffReply: boolean\n vendorName: string | null\n vendorRef: string | null\n totalClaimedAmount: string | null\n totalApprovedAmount: string | null\n totalRecoveredAmount: string | null\n slaDueAt: string | null\n slaPausedAt: string | null\n submittedAt: string | null\n assigneeUserId: string | null\n assigneeName: string | null\n createdAt: string | null\n updatedAt: string | null\n currencyCode: string | null\n notes: string | null\n reasonCode: string | null\n rejectionReasonCode: string | null\n resolutionSummary: string | null\n returnLabelUrl: string | null\n returnTrackingNumber: string | null\n returnCarrier: string | null\n}\n\ntype ClaimLine = {\n id: string\n claimId: string | null\n lineNo: number | null\n productId: string | null\n variantId: string | null\n productName: string | null\n orderLineId: string | null\n sku: string | null\n serialNumber: string | null\n purchaseDate: string | null\n warrantyMonths: number | null\n faultCode: string | null\n faultDescription: string | null\n qtyClaimed: string | null\n qtyApproved: string | null\n qtyReceived: string | null\n disposition: Disposition | string | null\n lineStatus: ClaimLineStatus | string | null\n creditAmount: string | null\n restockingFee: string | null\n coreChargeAmount: string | null\n coreCreditAmount: string | null\n vendorClaimLineId: string | null\n conditionOnReceipt: string | null\n conditionGrade: string | null\n quarantineStatus: string | null\n inspectionNotes: string | null\n assessmentPayload: Record<string, unknown> | null\n updatedAt: string | null\n}\n\ntype ClaimEvent = {\n id: string\n kind: string\n visibility: 'internal' | 'customer' | string\n body: string | null\n payload: Record<string, unknown> | null\n actorUserId: string | null\n actorCustomerId: string | null\n createdAt: string | null\n}\n\ntype ClaimTriageSuggestion = {\n priority: {\n currentPriority: string\n suggestedPriority: string\n overdue: boolean\n reason: TriageMessageValue\n }\n lines: Array<{\n lineId: string\n lineNo: number\n sku: string | null\n productName: string | null\n serialNumber: string | null\n eligibility: {\n status: string\n reason: TriageMessageValue\n }\n suggestedDisposition: string\n reason: TriageMessageValue\n }>\n risk?: ClaimRiskAssessment\n generatedAt: string\n}\n\ntype InlineLineUpdateField = 'qtyApproved' | 'disposition' | 'lineStatus'\ntype InlineLineUpdateValue = string | null\ntype InlineLineSaveHandler = (\n line: ClaimLine,\n field: InlineLineUpdateField,\n value: InlineLineUpdateValue,\n) => Promise<void>\n\ntype SelectOption = {\n value: string\n label: string\n}\n\nfunction eligibilityBadgeVariant(status: string): 'success' | 'error' | 'neutral' {\n if (status === 'in_warranty') return 'success'\n if (status === 'out_of_warranty') return 'error'\n return 'neutral'\n}\n\ntype ClaimFormValues = Partial<ClaimRecord> & Record<string, unknown>\ntype ClaimLineFormValues = Partial<ClaimLine> & Record<string, unknown>\ntype TransitionFormValues = {\n rejectionReasonCode?: string | null\n resolutionSummary?: string | null\n}\ntype VendorRecoveryFormValues = {\n lineIds?: string[]\n vendorName?: string | null\n vendorRef?: string | null\n}\n\ntype TabId = 'lines' | 'timeline' | 'attachments' | 'ai'\n\nconst CLAIM_LINE_STATUSES: ClaimLineStatus[] = ['pending', 'approved', 'rejected', 'received', 'inspected', 'resolved']\nconst CLAIM_DISPOSITIONS: Disposition[] = [\n 'restock',\n 'repair',\n 'replace',\n 'credit',\n 'refund',\n 'field_destroy',\n 'scrap',\n 'return_to_vendor',\n 'deny',\n]\nconst DICTIONARY_KEYS = {\n faultCodes: 'warranty_claims.warranty_claim_fault_code',\n rejectionReasons: 'warranty_claims.warranty_claim_rejection_reason',\n} as const\nconst LINE_EDITABLE_CLAIM_STATUSES = new Set<string>([\n 'draft',\n 'submitted',\n 'in_review',\n 'info_requested',\n 'approved',\n 'received',\n 'inspecting',\n])\n// Must match the server-side receiving gate (`assertReceivingStatus` accepts only received /\n// inspecting). Showing the controls at approved / awaiting_return guided agents into an\n// operation the API rejects with a wrong-state error (WQA-006 / FLOW-02).\nconst RECEIVING_CAPABLE_CLAIM_STATUSES = new Set<string>([\n 'received',\n 'inspecting',\n])\nconst DELETABLE_CLAIM_STATUSES = new Set<string>(['draft', 'cancelled'])\nconst LINE_STATUS_TRANSITIONS: Record<ClaimLineStatus, ClaimLineStatus[]> = {\n pending: ['approved', 'rejected'],\n approved: ['received', 'resolved'],\n rejected: [],\n received: ['inspected'],\n inspected: ['resolved'],\n resolved: [],\n}\nconst EMPTY_RISK_ASSESSMENT: ClaimRiskAssessment = { level: 'none', signals: [] }\nconst UNASSIGNED_SELECT_VALUE = '__unassigned__'\nconst CLEAR_SELECT_VALUE = '__clear__'\nconst AGENT_ID = 'warranty_claims.claims_assistant'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction toStringOrNull(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length ? value.trim() : null\n}\n\nfunction toNumberOrNull(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : null\n }\n return null\n}\n\nfunction toTranslateParams(value: unknown): TranslateParams | undefined {\n if (!isRecord(value)) return undefined\n const params: TranslateParams = {}\n for (const [key, entry] of Object.entries(value)) {\n if (typeof entry === 'string' || typeof entry === 'number') {\n params[key] = entry\n }\n }\n return Object.keys(params).length ? params : undefined\n}\n\nfunction normalizeRiskSignal(value: unknown): ClaimRiskSignal | null {\n if (!isRecord(value)) return null\n const id = toStringOrNull(value.id)\n const level = toStringOrNull(value.level)\n const messageKey = toStringOrNull(value.messageKey)\n if (!id || !messageKey || (level !== 'low' && level !== 'medium' && level !== 'high')) return null\n const relatedClaimNumbers = Array.isArray(value.relatedClaimNumbers)\n ? value.relatedClaimNumbers.filter((claimNumber): claimNumber is string => typeof claimNumber === 'string' && claimNumber.length > 0)\n : undefined\n return {\n id,\n level,\n messageKey,\n params: toTranslateParams(value.params),\n relatedClaimNumbers: relatedClaimNumbers?.length ? relatedClaimNumbers : undefined,\n }\n}\n\nfunction normalizeRiskAssessment(value: unknown): ClaimRiskAssessment {\n if (!isRecord(value)) return EMPTY_RISK_ASSESSMENT\n const level = toStringOrNull(value.level)\n const normalizedLevel: ClaimRiskLevel =\n level === 'low' || level === 'medium' || level === 'high' || level === 'none'\n ? level\n : 'none'\n const signals = Array.isArray(value.signals)\n ? value.signals.map(normalizeRiskSignal).filter((signal): signal is ClaimRiskSignal => signal !== null)\n : []\n return { level: normalizedLevel, signals }\n}\n\nfunction normalizeRiskResponse(value: unknown): ClaimRiskAssessment {\n if (!isRecord(value)) return EMPTY_RISK_ASSESSMENT\n if ('result' in value) return normalizeRiskAssessment(value.result)\n return normalizeRiskAssessment(value)\n}\n\nfunction isClaimLineStatusValue(value: string | null | undefined): value is ClaimLineStatus {\n return typeof value === 'string' && CLAIM_LINE_STATUSES.includes(value as ClaimLineStatus)\n}\n\nfunction buildLineStatusOptions(status: string | null | undefined, t: TranslateFn): SelectOption[] {\n const current = isClaimLineStatusValue(status) ? status : 'pending'\n const values = Array.from(new Set<ClaimLineStatus>([current, ...LINE_STATUS_TRANSITIONS[current]]))\n return values.map((value) => ({ value, label: t(`warranty_claims.lineStatus.${value}`) }))\n}\n\nfunction buildDispositionOptions(\n allowedDispositions: readonly string[],\n currentDisposition: string | null | undefined,\n t: TranslateFn,\n): SelectOption[] {\n const values = new Set<string>(\n CLAIM_DISPOSITIONS.filter((disposition) => allowedDispositions.includes(disposition)),\n )\n if (currentDisposition) values.add(currentDisposition)\n return Array.from(values).map((disposition) => ({\n value: disposition,\n label: t(`warranty_claims.disposition.${disposition}`, disposition),\n }))\n}\n\nfunction formatTriageMessage(value: TriageMessageValue, t: TranslateFn): string {\n if (typeof value === 'string') return t(value)\n return t(value.messageKey, value.params)\n}\n\nfunction triageLineHeading(\n suggestedLine: ClaimTriageSuggestion['lines'][number],\n lines: ClaimLine[],\n t: TranslateFn,\n): string {\n const name = suggestedLine.productName ?? suggestedLine.sku ?? suggestedLine.serialNumber ?? null\n const lineNo = toNumberOrNull(suggestedLine.lineNo)\n ?? lines.find((line) => line.id === suggestedLine.lineId)?.lineNo\n ?? null\n const label = name ?? t('warranty_claims.detail.lines.unnamed', 'Unnamed line')\n return lineNo !== null ? `#${lineNo} ${label}` : label\n}\n\nfunction formatTimelineBody(event: ClaimEvent, t: TranslateFn, userNames: Record<string, string>): string | null {\n if (event.body) return event.body\n const payload = event.payload\n const action = payload ? toStringOrNull(payload.action) : null\n if (event.kind === 'system' && action === 'sla_paused') return t('warranty_claims.timeline.slaPaused')\n if (event.kind === 'system' && action === 'sla_resumed') return t('warranty_claims.timeline.slaResumed')\n if (event.kind === 'system' && action === 'auto_approved') return t('warranty_claims.timeline.autoApproved')\n if (event.kind === 'system' && action === 'ai_assessment_recorded') return t('warranty_claims.timeline.aiAssessmentRecorded')\n if (event.kind === 'system' && action === 'sales_return_created') return t('warranty_claims.timeline.salesReturnCreated')\n if (event.kind === 'system' && action === 'sales_return_orphaned') return t('warranty_claims.timeline.salesReturnOrphaned')\n if (event.kind === 'system' && action === 'undo_sales_return_created') return t('warranty_claims.timeline.undoSalesReturnCreated')\n if (event.kind === 'system' && action === 'replacement_order_created') return t('warranty_claims.timeline.replacementOrderCreated')\n if (event.kind === 'system' && action === 'replacement_order_orphaned') return t('warranty_claims.timeline.replacementOrderOrphaned')\n if (event.kind === 'system' && action === 'undo_replacement_order_created') return t('warranty_claims.timeline.undoReplacementOrderCreated')\n if (event.kind === 'system' && action === 'credit_memo_created') return t('warranty_claims.timeline.creditMemoCreated')\n if (event.kind === 'system' && action === 'credit_memo_orphaned') return t('warranty_claims.timeline.creditMemoOrphaned')\n if (event.kind === 'system' && action === 'undo_credit_memo_created') return t('warranty_claims.timeline.undoCreditMemoCreated')\n if (event.kind === 'assignment') {\n const assigneeUserId = payload ? toStringOrNull(payload.assigneeUserId) : null\n if (!assigneeUserId) return t('warranty_claims.timeline.unassigned')\n return t('warranty_claims.timeline.assignedTo', { name: userNames[assigneeUserId] ?? t('warranty_claims.detail.unknownUser') })\n }\n const from = payload ? toStringOrNull(payload.from) ?? toStringOrNull(payload.fromStatus) : null\n const to = payload ? toStringOrNull(payload.to) ?? toStringOrNull(payload.toStatus) : null\n if (event.kind === 'status_changed' && from && to) {\n const statusLine = `${t(`warranty_claims.status.${from}`)} \u2192 ${t(`warranty_claims.status.${to}`)}`\n const systemNote = payload ? toStringOrNull(payload.systemNote) : null\n if (systemNote && systemNote.startsWith('warranty_claims.')) {\n return `${statusLine} \u2014 ${t(systemNote)}`\n }\n return statusLine\n }\n return null\n}\n\nfunction resolveTimelineActor(event: ClaimEvent, claim: ClaimRecord, userNames: Record<string, string>, t: TranslateFn): string {\n if (event.actorUserId) return userNames[event.actorUserId] ?? t('warranty_claims.detail.unknownUser')\n if (event.actorCustomerId) return claim.customerName ?? t('warranty_claims.detail.customerActor')\n return t('warranty_claims.detail.systemActor')\n}\n\nfunction translateErrorMessage(err: unknown, t: TranslateFn, fallbackKey: string): string {\n const mappedMessage = mapCrudServerErrorToFormErrors(err).message\n if (typeof mappedMessage === 'string' && mappedMessage.trim().length) return t(mappedMessage, mappedMessage)\n if (err instanceof Error && err.message) return t(err.message, err.message)\n return t(fallbackKey)\n}\n\nfunction buildRiskSignalTitle(signal: ClaimRiskSignal): string | undefined {\n return signal.relatedClaimNumbers?.length ? signal.relatedClaimNumbers.join(', ') : undefined\n}\n\nfunction riskSignalVariant(signal: ClaimRiskSignal): 'warning' | 'error' {\n return signal.level === 'high' ? 'error' : 'warning'\n}\n\nfunction normalizeClaim(value: unknown): ClaimRecord | null {\n if (!isRecord(value)) return null\n const id = toStringOrNull(value.id)\n if (!id) return null\n return {\n id,\n claimNumber: toStringOrNull(value.claimNumber),\n claimType: toStringOrNull(value.claimType),\n channel: toStringOrNull(value.channel),\n status: toStringOrNull(value.status),\n priority: toStringOrNull(value.priority),\n customerId: toStringOrNull(value.customerId),\n customerName: toStringOrNull(value.customerName),\n orderId: toStringOrNull(value.orderId),\n orderNumber: toStringOrNull(value.orderNumber),\n salesReturnId: toStringOrNull(value.salesReturnId),\n replacementOrderId: toStringOrNull(value.replacementOrderId),\n creditMemoId: toStringOrNull(value.creditMemoId),\n awaitingStaffReply: parseBooleanFromUnknown(value.awaitingStaffReply) ?? false,\n vendorName: toStringOrNull(value.vendorName),\n vendorRef: toStringOrNull(value.vendorRef),\n totalClaimedAmount: toStringOrNull(value.totalClaimedAmount),\n totalApprovedAmount: toStringOrNull(value.totalApprovedAmount),\n totalRecoveredAmount: toStringOrNull(value.totalRecoveredAmount),\n slaDueAt: toStringOrNull(value.slaDueAt),\n slaPausedAt: toStringOrNull(value.slaPausedAt),\n submittedAt: toStringOrNull(value.submittedAt),\n assigneeUserId: toStringOrNull(value.assigneeUserId),\n assigneeName: toStringOrNull(value.assigneeName),\n createdAt: toStringOrNull(value.createdAt),\n updatedAt: toStringOrNull(value.updatedAt),\n currencyCode: toStringOrNull(value.currencyCode),\n notes: toStringOrNull(value.notes),\n reasonCode: toStringOrNull(value.reasonCode),\n rejectionReasonCode: toStringOrNull(value.rejectionReasonCode),\n resolutionSummary: toStringOrNull(value.resolutionSummary),\n returnLabelUrl: toStringOrNull(value.returnLabelUrl),\n returnTrackingNumber: toStringOrNull(value.returnTrackingNumber),\n returnCarrier: toStringOrNull(value.returnCarrier),\n }\n}\n\nfunction normalizeLine(value: unknown): ClaimLine | null {\n if (!isRecord(value)) return null\n const id = toStringOrNull(value.id)\n if (!id) return null\n return {\n id,\n claimId: toStringOrNull(value.claimId),\n lineNo: toNumberOrNull(value.lineNo),\n productId: toStringOrNull(value.productId),\n variantId: toStringOrNull(value.variantId),\n productName: toStringOrNull(value.productName),\n orderLineId: toStringOrNull(value.orderLineId),\n sku: toStringOrNull(value.sku),\n serialNumber: toStringOrNull(value.serialNumber),\n purchaseDate: toStringOrNull(value.purchaseDate),\n warrantyMonths: toNumberOrNull(value.warrantyMonths),\n faultCode: toStringOrNull(value.faultCode),\n faultDescription: toStringOrNull(value.faultDescription),\n qtyClaimed: toStringOrNull(value.qtyClaimed),\n qtyApproved: toStringOrNull(value.qtyApproved),\n qtyReceived: toStringOrNull(value.qtyReceived),\n disposition: toStringOrNull(value.disposition),\n lineStatus: toStringOrNull(value.lineStatus),\n creditAmount: toStringOrNull(value.creditAmount),\n restockingFee: toStringOrNull(value.restockingFee),\n coreChargeAmount: toStringOrNull(value.coreChargeAmount),\n coreCreditAmount: toStringOrNull(value.coreCreditAmount),\n vendorClaimLineId: toStringOrNull(value.vendorClaimLineId),\n conditionOnReceipt: toStringOrNull(value.conditionOnReceipt),\n conditionGrade: toStringOrNull(value.conditionGrade),\n quarantineStatus: toStringOrNull(value.quarantineStatus),\n inspectionNotes: toStringOrNull(value.inspectionNotes),\n assessmentPayload: isRecord(value.assessmentPayload) ? value.assessmentPayload : null,\n updatedAt: toStringOrNull(value.updatedAt),\n }\n}\n\nfunction normalizeEvent(value: unknown): ClaimEvent | null {\n if (!isRecord(value)) return null\n const id = toStringOrNull(value.id)\n if (!id) return null\n return {\n id,\n kind: toStringOrNull(value.kind) ?? 'system',\n visibility: toStringOrNull(value.visibility) ?? 'internal',\n body: toStringOrNull(value.body),\n payload: isRecord(value.payload) ? value.payload : null,\n actorUserId: toStringOrNull(value.actorUserId),\n actorCustomerId: toStringOrNull(value.actorCustomerId),\n createdAt: toStringOrNull(value.createdAt),\n }\n}\n\nfunction normalizeDictionaryOption(item: unknown): CrudFieldOption | null {\n if (!isRecord(item)) return null\n const value = toStringOrNull(item.value)\n if (!value) return null\n return { value, label: toStringOrNull(item.label) ?? value }\n}\n\nfunction nullableText(value: unknown): string | null {\n return toStringOrNull(value)\n}\n\nfunction buildConflictError(\n call: { status: number; result: unknown },\n fallbackMessage: string,\n t?: TranslateFn,\n): Error & Record<string, unknown> {\n const payload = isRecord(call.result) ? call.result : {}\n const rawMessage = typeof payload.error === 'string' ? payload.error : fallbackMessage\n const message = t ? t(rawMessage) : rawMessage\n return Object.assign(new Error(message), { status: call.status }, payload)\n}\n\nfunction readDraftReplyPayload(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) return {}\n return isRecord(value.result) ? value.result : value\n}\n\nfunction isDraftReplyNotConfigured(value: unknown): boolean {\n const payload = readDraftReplyPayload(value)\n return payload.notConfigured === true\n}\n\nfunction readDraftReply(value: unknown): string | null {\n return toStringOrNull(readDraftReplyPayload(value).draft)\n}\n\nfunction readErrorKey(value: unknown): string | null {\n return isRecord(value) ? toStringOrNull(value.error) : null\n}\n\nfunction formatAmount(value: string | null, currencyCode: string | null, fallback: string): string {\n const amount = toNumberOrNull(value)\n if (amount === null) return fallback\n if (!currencyCode) return amount.toLocaleString()\n return new Intl.NumberFormat(undefined, { style: 'currency', currency: currencyCode }).format(amount)\n}\n\nfunction eventIcon(kind: string) {\n if (kind === 'comment') return MessageSquare\n if (kind === 'assignment') return UserRound\n if (kind === 'status_changed') return RefreshCw\n return Info\n}\n\nconst TIMELINE_FILTER_LABELS: Record<TimelineFilterId, { key: string; fallback: string }> = {\n all: { key: 'warranty_claims.detail.timeline.filter.all', fallback: 'All' },\n comments: { key: 'warranty_claims.detail.timeline.filter.comments', fallback: 'Comments' },\n status_changes: { key: 'warranty_claims.detail.timeline.filter.statusChanges', fallback: 'Status changes' },\n customer_visible: { key: 'warranty_claims.detail.timeline.filter.customerVisible', fallback: 'Customer-visible' },\n}\n\nfunction RiskSignalChips({ signals, t }: { signals: ClaimRiskSignal[]; t: TranslateFn }) {\n if (!signals.length) return null\n return (\n <>\n {signals.map((signal) => (\n <span key={signal.id} className=\"min-w-0 max-w-full\" title={buildRiskSignalTitle(signal)}>\n <StatusBadge\n variant={riskSignalVariant(signal)}\n className=\"h-auto max-w-full rounded-md py-1 whitespace-normal break-words text-left leading-snug\"\n >\n {t(signal.messageKey, signal.params)}\n </StatusBadge>\n </span>\n ))}\n </>\n )\n}\n\nexport function InlineQtyApprovedCell({\n line,\n disabled,\n label,\n onSave,\n}: {\n line: ClaimLine\n disabled: boolean\n label: string\n onSave: InlineLineSaveHandler\n}) {\n const currentValue = quantityInputValue(line.qtyApproved)\n const [draft, setDraft] = React.useState(currentValue)\n const blurSaveSuppressedRef = React.useRef(false)\n\n React.useEffect(() => {\n setDraft(currentValue)\n }, [currentValue])\n\n const commit = React.useCallback((value: string) => {\n const nextValue = value.trim().length ? value.trim() : null\n if (parseQuantity(nextValue) === parseQuantity(line.qtyApproved)) return\n void onSave(line, 'qtyApproved', nextValue)\n }, [line, onSave])\n\n return (\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n className=\"w-24\"\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => { blurSaveSuppressedRef.current = false }}\n onBlur={() => {\n if (blurSaveSuppressedRef.current) {\n blurSaveSuppressedRef.current = false\n return\n }\n commit(draft)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n blurSaveSuppressedRef.current = true\n setDraft(currentValue)\n event.currentTarget.blur()\n return\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n blurSaveSuppressedRef.current = true\n commit(draft)\n event.currentTarget.blur()\n }\n }}\n />\n )\n}\n\nexport function InlineLineSelectCell({\n line,\n field,\n value,\n options,\n label,\n emptyLabel,\n disabled,\n onSave,\n}: {\n line: ClaimLine\n field: Exclude<InlineLineUpdateField, 'qtyApproved'>\n value: string | null\n options: SelectOption[]\n label: string\n emptyLabel?: string\n disabled: boolean\n onSave: InlineLineSaveHandler\n}) {\n const selectedValue = value ?? CLEAR_SELECT_VALUE\n\n return (\n <div onClick={(event) => event.stopPropagation()}>\n <Select\n value={selectedValue}\n disabled={disabled}\n onValueChange={(nextValue) => {\n const normalizedValue = nextValue === CLEAR_SELECT_VALUE ? null : nextValue\n if (normalizedValue === value) return\n void onSave(line, field, normalizedValue)\n }}\n >\n <SelectTrigger aria-label={label} className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {emptyLabel ? <SelectItem value={CLEAR_SELECT_VALUE}>{emptyLabel}</SelectItem> : null}\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nexport default function WarrantyClaimDetailPage({ params }: { params?: { id?: string } }) {\n const t = useT()\n const locale = useLocale()\n const router = useRouter()\n const id = typeof params?.id === 'string' ? params.id : ''\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const currentUserId = useCurrentUserId()\n const scopeVersion = useOrganizationScopeVersion()\n const [claim, setClaim] = React.useState<ClaimRecord | null>(null)\n const [lines, setLines] = React.useState<ClaimLine[]>([])\n const [events, setEvents] = React.useState<ClaimEvent[]>([])\n const [attachmentCount, setAttachmentCount] = React.useState(0)\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [notFound, setNotFound] = React.useState(false)\n const [activeTab, setActiveTab] = React.useState<TabId>('lines')\n const [timelineFilter, setTimelineFilter] = React.useState<TimelineFilterId>('all')\n const [customerLink, setCustomerLink] = React.useState<{ customerId: string; href: string } | null>(null)\n const [lineDialog, setLineDialog] = React.useState<{ mode: 'create' } | { mode: 'edit'; line: ClaimLine } | null>(null)\n const [defaultWarrantyMonths, setDefaultWarrantyMonths] = React.useState<number | null>(null)\n const [featureAccess, setFeatureAccess] = React.useState({\n claimManage: false,\n claimDelete: false,\n receivingManage: false,\n salesReturnsCreate: false,\n salesOrdersManage: false,\n salesCreditMemosManage: false,\n })\n\n React.useEffect(() => {\n let cancelled = false\n void apiCall<{ result?: { defaultWarrantyMonths?: number | null } }>('/api/warranty_claims/settings-general', { headers: { 'x-om-forbidden-redirect': '0' } }, { fallback: {} })\n .then((call) => {\n if (cancelled || !call.ok) return\n const months = call.result?.result?.defaultWarrantyMonths\n setDefaultWarrantyMonths(typeof months === 'number' && Number.isFinite(months) ? months : null)\n })\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [scopeVersion])\n\n React.useEffect(() => {\n let cancelled = false\n void apiCall<FeatureCheckResponse>(\n '/api/auth/feature-check',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n features: [\n 'warranty_claims.claim.manage',\n 'warranty_claims.claim.delete',\n 'warranty_claims.receiving.manage',\n 'sales.returns.create',\n 'sales.orders.manage',\n 'sales.credit_memos.manage',\n ],\n }),\n },\n { fallback: { ok: false, granted: [] } },\n )\n .then((call) => {\n if (cancelled || !call.ok) return\n const granted = Array.isArray(call.result?.granted) ? call.result.granted : []\n const allGranted = call.result?.ok === true\n setFeatureAccess({\n claimManage: allGranted || hasFeature(granted, 'warranty_claims.claim.manage'),\n claimDelete: allGranted || hasFeature(granted, 'warranty_claims.claim.delete'),\n receivingManage: allGranted || hasFeature(granted, 'warranty_claims.receiving.manage'),\n salesReturnsCreate: allGranted || hasFeature(granted, 'sales.returns.create'),\n salesOrdersManage: allGranted || hasFeature(granted, 'sales.orders.manage'),\n salesCreditMemosManage: allGranted || hasFeature(granted, 'sales.credit_memos.manage'),\n })\n })\n .catch(() => {\n if (!cancelled) {\n setFeatureAccess({\n claimManage: false,\n claimDelete: false,\n receivingManage: false,\n salesReturnsCreate: false,\n salesOrdersManage: false,\n salesCreditMemosManage: false,\n })\n }\n })\n return () => {\n cancelled = true\n }\n }, [scopeVersion])\n const [transitionDialog, setTransitionDialog] = React.useState<{ toStatus: ClaimStatus } | null>(null)\n const [vendorDialogOpen, setVendorDialogOpen] = React.useState(false)\n const [commentBody, setCommentBody] = React.useState('')\n const [commentVisibility, setCommentVisibility] = React.useState<'internal' | 'customer'>('internal')\n const [aiSuggestion, setAiSuggestion] = React.useState<ClaimTriageSuggestion | null>(null)\n const [aiLoading, setAiLoading] = React.useState(false)\n const [appliedTriageLineIds, setAppliedTriageLineIds] = React.useState<Set<string>>(new Set())\n const [draftReplyLoading, setDraftReplyLoading] = React.useState(false)\n const [draftReplyHidden, setDraftReplyHidden] = React.useState(false)\n const [riskAssessment, setRiskAssessment] = React.useState<ClaimRiskAssessment>(EMPTY_RISK_ASSESSMENT)\n const [slaAtRiskThresholdPct, setSlaAtRiskThresholdPct] = React.useState<number | undefined>(undefined)\n const [assignDialogOpen, setAssignDialogOpen] = React.useState(false)\n const [assignSearch, setAssignSearch] = React.useState('')\n const [assignOptions, setAssignOptions] = React.useState<AssignableStaffMember[]>([])\n const [assignLoading, setAssignLoading] = React.useState(false)\n const [selectedAssigneeUserId, setSelectedAssigneeUserId] = React.useState<string>(UNASSIGNED_SELECT_VALUE)\n const mutationContextId = React.useMemo(() => `warranty-claim:${id || 'pending'}`, [id])\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId?: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('warranty_claims.common.saveBlocked'),\n })\n\n const mutationContext = React.useMemo(() => ({\n formId: mutationContextId,\n resourceKind: 'warranty_claims.claim',\n resourceId: claim?.id ?? id,\n retryLastMutation,\n }), [claim?.id, id, mutationContextId, retryLastMutation])\n\n const loadDictionaryOptions = React.useCallback(async (\n dictionaryKey: string,\n kind: DictionaryLabelKind,\n ): Promise<CrudFieldOption[]> => {\n const dictionaries = await readApiResultOrThrow<{ items?: Array<{ id?: string; key?: string }> }>(\n '/api/dictionaries',\n undefined,\n {\n fallback: { items: [] },\n errorMessage: t('warranty_claims.form.error.dictionaryLoad'),\n },\n )\n const dictionary = (dictionaries.items ?? []).find((item) => item.key === dictionaryKey)\n if (!dictionary?.id) return []\n const entries = await readApiResultOrThrow<{ items?: unknown[] }>(\n `/api/dictionaries/${encodeURIComponent(dictionary.id)}/entries`,\n undefined,\n {\n fallback: { items: [] },\n errorMessage: t('warranty_claims.form.error.dictionaryLoad'),\n },\n )\n return (entries.items ?? [])\n .map(normalizeDictionaryOption)\n .filter((option): option is CrudFieldOption => option !== null)\n .map((option) => ({\n ...option,\n label: localizeDictionaryLabel(t, kind, option.value, option.label),\n }))\n }, [t])\n\n const loadData = React.useCallback(async () => {\n if (!id) return\n setLoading(true)\n setError(null)\n setNotFound(false)\n try {\n const [claimPayload, linesPayload, eventsPayload, riskPayload, statsPayload, attachmentsPayload] = await Promise.all([\n readApiResultOrThrow<{ items?: unknown[] }>(\n `/api/warranty_claims?ids=${encodeURIComponent(id)}&page=1&pageSize=1`,\n undefined,\n { fallback: { items: [] }, errorMessage: t('warranty_claims.detail.error.load') },\n ),\n readApiResultOrThrow<{ items?: unknown[] }>(\n `/api/warranty_claims/lines?claimId=${encodeURIComponent(id)}&page=1&pageSize=100`,\n undefined,\n { fallback: { items: [] }, errorMessage: t('warranty_claims.detail.error.loadLines') },\n ),\n readApiResultOrThrow<{ items?: unknown[] }>(\n `/api/warranty_claims/events?claimId=${encodeURIComponent(id)}`,\n undefined,\n { fallback: { items: [] }, errorMessage: t('warranty_claims.detail.error.loadEvents') },\n ),\n readApiResultOrThrow<RiskApiResponse>(\n `/api/warranty_claims/risk?claimId=${encodeURIComponent(id)}`,\n undefined,\n {\n fallback: { ok: true, result: EMPTY_RISK_ASSESSMENT },\n errorMessage: t('warranty_claims.detail.error.loadRisk'),\n },\n ),\n readApiResultOrThrow<{ ok?: boolean; result?: { slaAtRiskThresholdPct?: number } }>(\n '/api/warranty_claims/stats',\n undefined,\n { fallback: { ok: true, result: {} } },\n ),\n readApiResultOrThrow<{ items?: unknown[] }>(\n `/api/attachments?entityId=${encodeURIComponent('warranty_claims:warranty_claim')}&recordId=${encodeURIComponent(id)}`,\n undefined,\n { fallback: { items: [] } },\n ),\n ])\n const nextClaim = (claimPayload.items ?? []).map(normalizeClaim).find((item): item is ClaimRecord => item !== null) ?? null\n if (!nextClaim) {\n setClaim(null)\n setLines([])\n setEvents([])\n setAttachmentCount(0)\n setRiskAssessment(EMPTY_RISK_ASSESSMENT)\n setNotFound(true)\n return\n }\n setClaim(nextClaim)\n setLines((linesPayload.items ?? []).map(normalizeLine).filter((item): item is ClaimLine => item !== null))\n setEvents((eventsPayload.items ?? []).map(normalizeEvent).filter((item): item is ClaimEvent => item !== null))\n setAttachmentCount(Array.isArray(attachmentsPayload.items) ? attachmentsPayload.items.length : 0)\n setRiskAssessment(normalizeRiskResponse(riskPayload))\n const nextThreshold = statsPayload?.result?.slaAtRiskThresholdPct\n setSlaAtRiskThresholdPct(typeof nextThreshold === 'number' ? nextThreshold : undefined)\n } catch (err) {\n setError(err instanceof Error ? err.message : t('warranty_claims.detail.error.load'))\n } finally {\n setLoading(false)\n }\n }, [id, scopeVersion, t])\n\n React.useEffect(() => {\n void loadData()\n }, [loadData])\n\n useAppEvent('warranty_claims.claim.*', (event) => {\n const eventClaimId = toStringOrNull(event.payload.claimId)\n if (eventClaimId === id) void loadData()\n }, [id, loadData])\n\n const referencedUserIds = React.useMemo(() => {\n const collected = new Set<string>()\n if (claim?.assigneeUserId) collected.add(claim.assigneeUserId)\n for (const event of events) {\n if (event.actorUserId) collected.add(event.actorUserId)\n if (event.kind === 'assignment') {\n const assigneeUserId = toStringOrNull(event.payload?.assigneeUserId)\n if (assigneeUserId) collected.add(assigneeUserId)\n }\n }\n return [...collected]\n }, [claim?.assigneeUserId, events])\n const userNames = useUserDisplayNames(referencedUserIds)\n\n React.useEffect(() => {\n if (!assignDialogOpen) return\n const controller = new AbortController()\n setAssignLoading(true)\n fetchAssignableStaffMembersPage(assignSearch, { page: 1, pageSize: 24, signal: controller.signal })\n .then((page) => setAssignOptions(page.items))\n .catch(() => setAssignOptions([]))\n .finally(() => {\n if (!controller.signal.aborted) setAssignLoading(false)\n })\n return () => controller.abort()\n }, [assignDialogOpen, assignSearch])\n\n const claimCustomerId = claim?.customerId ?? null\n React.useEffect(() => {\n if (!claimCustomerId || customerLink?.customerId === claimCustomerId) return\n const controller = new AbortController()\n const idsParam = encodeURIComponent(claimCustomerId)\n const hasMatch = (payload: { items?: unknown[] } | null) =>\n (payload?.items ?? []).some((item) => isRecord(item) && toStringOrNull(item.id) === claimCustomerId)\n const resolveCustomerHref = async (): Promise<string | null> => {\n const people = await apiCall<{ items?: unknown[] }>(\n `/api/customers/people?ids=${idsParam}&pageSize=1`,\n { signal: controller.signal },\n { fallback: { items: [] } },\n )\n if (people.ok && hasMatch(people.result)) return `/backend/customers/people/${claimCustomerId}`\n const companies = await apiCall<{ items?: unknown[] }>(\n `/api/customers/companies?ids=${idsParam}&pageSize=1`,\n { signal: controller.signal },\n { fallback: { items: [] } },\n )\n if (companies.ok && hasMatch(companies.result)) return `/backend/customers/companies/${claimCustomerId}`\n return null\n }\n resolveCustomerHref()\n .then((href) => {\n if (controller.signal.aborted || !href) return\n setCustomerLink({ customerId: claimCustomerId, href })\n })\n .catch(() => {})\n return () => controller.abort()\n }, [claimCustomerId, customerLink])\n\n const filteredTimelineEvents = React.useMemo(\n () => filterTimelineEvents(events, timelineFilter),\n [events, timelineFilter],\n )\n\n const currentStatus = typeof claim?.status === 'string' ? claim.status : 'draft'\n const nextStatuses = React.useMemo(() => {\n if (!claim || !(currentStatus in CLAIM_STATUS_TRANSITIONS)) return []\n return CLAIM_STATUS_TRANSITIONS[currentStatus as ClaimStatus] ?? []\n }, [claim, currentStatus])\n const primaryNextStatus = React.useMemo(\n () => nextStatuses.find((status) => status !== 'cancelled' && status !== 'rejected' && status !== 'info_requested') ?? nextStatuses[0] ?? null,\n [nextStatuses],\n )\n const resolutionStatuses = React.useMemo(\n () => nextStatuses.filter((status) => status !== primaryNextStatus),\n [nextStatuses, primaryNextStatus],\n )\n\n const noValue = t('warranty_claims.common.noValue')\n const linesEditable = LINE_EDITABLE_CLAIM_STATUSES.has(currentStatus)\n const linesInlineEditable = linesEditable && featureAccess.claimManage\n // FLOW-04 gating. `claimActive` = not fully terminal (closed/cancelled): reassignment and\n // vendor-recovery (which requires resolved lines) stay available. `claimMutable` is stricter \u2014\n // it also excludes resolved/rejected, where header fields and lines are server-locked \u2014 so the\n // header \"Edit\" and AI mutating controls are hidden there instead of leading to a dead form.\n const claimActive = !isTerminal(currentStatus)\n const claimMutable = claimActive && currentStatus !== 'resolved' && currentStatus !== 'rejected'\n const allowedDispositions = React.useMemo(\n () => resolveClaimTypeUiConfig(claim?.claimType).allowedDispositions,\n [claim?.claimType],\n )\n const currentLineDisposition = lineDialog?.mode === 'edit' ? lineDialog.line.disposition : null\n const riskSignals = riskAssessment.signals\n const assigneeDisplayName = claim?.assigneeUserId\n ? claim.assigneeName ?? userNames[claim.assigneeUserId] ?? t('warranty_claims.detail.unknownUser')\n : t('warranty_claims.detail.unassigned')\n const eligibleVendorLines = React.useMemo(\n () => lines.filter((line) => line.lineStatus === 'resolved' && !line.vendorClaimLineId),\n [lines],\n )\n const assignableOptions = React.useMemo(() => {\n const byUserId = new Map<string, AssignableStaffMember>()\n for (const option of assignOptions) byUserId.set(option.userId, option)\n if (claim?.assigneeUserId && !byUserId.has(claim.assigneeUserId)) {\n byUserId.set(claim.assigneeUserId, {\n teamMemberId: claim.assigneeUserId,\n userId: claim.assigneeUserId,\n displayName: userNames[claim.assigneeUserId] ?? t('warranty_claims.detail.unknownUser'),\n email: null,\n teamName: null,\n })\n }\n return Array.from(byUserId.values())\n }, [assignOptions, claim?.assigneeUserId, userNames, t])\n\n const openAssignDialog = React.useCallback(() => {\n setSelectedAssigneeUserId(claim?.assigneeUserId ?? UNASSIGNED_SELECT_VALUE)\n setAssignSearch('')\n setAssignDialogOpen(true)\n }, [claim?.assigneeUserId])\n\n const runClaimPost = React.useCallback(async (\n endpoint: string,\n body: Record<string, unknown>,\n successKey: string,\n ) => {\n if (!claim) return\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n }),\n )\n if (!call.ok) throw buildConflictError(call, t('warranty_claims.detail.error.action'), t)\n return call\n },\n context: mutationContext,\n mutationPayload: body,\n })\n flash(t(successKey), 'success')\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const createSalesReturn = React.useCallback(async () => {\n if (!claim) return\n const payload = { claimId: claim.id }\n try {\n const call = await runMutation({\n operation: async () => {\n const response = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall<{ salesReturnId?: string; skippedLineIds?: string[] }>('/api/warranty_claims/sales-return', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n if (!response.ok) throw buildConflictError(response, t('warranty_claims.detail.error.action'), t)\n return response\n },\n context: mutationContext,\n mutationPayload: payload,\n })\n flash(t('warranty_claims.detail.createSalesReturnSuccess'), 'success')\n const skippedCount = call?.result?.skippedLineIds?.length ?? 0\n if (skippedCount > 0) {\n flash(t('warranty_claims.detail.createSalesReturnSkipped', undefined, { count: skippedCount }), 'info')\n }\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const createReplacementOrder = React.useCallback(async () => {\n if (!claim) return\n const payload = { claimId: claim.id }\n try {\n const call = await runMutation({\n operation: async () => {\n const response = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall<{ replacementOrderId?: string; skippedLineIds?: string[] }>('/api/warranty_claims/replacement-order', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n if (!response.ok) throw buildConflictError(response, t('warranty_claims.detail.error.action'), t)\n return response\n },\n context: mutationContext,\n mutationPayload: payload,\n })\n flash(t('warranty_claims.detail.createReplacementOrderSuccess'), 'success')\n const skippedCount = call?.result?.skippedLineIds?.length ?? 0\n if (skippedCount > 0) {\n flash(t('warranty_claims.detail.createReplacementOrderSkipped', undefined, { count: skippedCount }), 'info')\n }\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const createCreditMemo = React.useCallback(async () => {\n if (!claim) return\n const payload = { claimId: claim.id }\n try {\n const call = await runMutation({\n operation: async () => {\n const response = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall<{ creditMemoId?: string; skippedLineIds?: string[]; grandTotalGrossAmount?: string; currencyCode?: string }>('/api/warranty_claims/credit-memo', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n if (!response.ok) throw buildConflictError(response, t('warranty_claims.detail.error.action'), t)\n return response\n },\n context: mutationContext,\n mutationPayload: payload,\n })\n flash(\n t('warranty_claims.detail.createCreditMemoSuccess', undefined, {\n amount: call?.result?.grandTotalGrossAmount ?? '',\n currency: call?.result?.currencyCode ?? '',\n }),\n 'success',\n )\n const skippedCount = call?.result?.skippedLineIds?.length ?? 0\n if (skippedCount > 0) {\n flash(t('warranty_claims.detail.createCreditMemoSkipped', undefined, { count: skippedCount }), 'info')\n }\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const performAssignment = React.useCallback(async (assigneeUserId: string | null) => {\n if (!claim) return false\n const payload = { id: claim.id, assigneeUserId }\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall('/api/warranty_claims/assign', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n if (!call.ok) throw buildConflictError(call, t('warranty_claims.detail.error.action'), t)\n return call\n },\n context: mutationContext,\n mutationPayload: payload,\n })\n flash(t('warranty_claims.list.flash.assigned'), 'success')\n await loadData()\n return true\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return false\n flash(translateErrorMessage(err, t, 'warranty_claims.detail.error.action'), 'error')\n return false\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const assignClaim = React.useCallback(async () => {\n const assigneeUserId = selectedAssigneeUserId === UNASSIGNED_SELECT_VALUE ? null : selectedAssigneeUserId\n const success = await performAssignment(assigneeUserId)\n if (success) setAssignDialogOpen(false)\n }, [performAssignment, selectedAssigneeUserId])\n\n const assignToMe = React.useCallback(async () => {\n if (!currentUserId) return\n await performAssignment(currentUserId)\n }, [currentUserId, performAssignment])\n\n const loadAiSuggestion = React.useCallback(async () => {\n if (!id) return\n setAiLoading(true)\n try {\n const suggestion = await readApiResultOrThrow<ClaimTriageSuggestion>(\n `/api/warranty_claims/ai/suggest?claimId=${encodeURIComponent(id)}`,\n undefined,\n { errorMessage: t('warranty_claims.detail.error.action') },\n )\n setAiSuggestion(suggestion)\n setAppliedTriageLineIds(new Set())\n } catch (err) {\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n } finally {\n setAiLoading(false)\n }\n }, [id, t])\n\n const applyAiDisposition = React.useCallback(async (lineId: string, disposition: string) => {\n if (!claim) return\n const line = lines.find((candidate) => candidate.id === lineId)\n if (!line) return\n try {\n await runMutation({\n operation: () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader(line.updatedAt),\n () => updateCrud('warranty_claims/lines', { id: lineId, claimId: claim.id, disposition }, {\n errorMessage: t('warranty_claims.detail.lines.error.save'),\n }),\n ),\n context: mutationContext,\n mutationPayload: { id: lineId, claimId: claim.id, disposition },\n })\n flash(t('warranty_claims.detail.lines.flash.saved'), 'success')\n setAppliedTriageLineIds((prev) => new Set(prev).add(lineId))\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.action')\n flash(message, 'error')\n }\n }, [claim, lines, loadData, mutationContext, runMutation, t])\n\n const handleTransition = React.useCallback(async (toStatus: ClaimStatus, values?: TransitionFormValues) => {\n if (!claim) return\n await runClaimPost(\n toStatus === 'submitted' && currentStatus === 'draft'\n ? '/api/warranty_claims/submit'\n : '/api/warranty_claims/transition',\n toStatus === 'submitted' && currentStatus === 'draft'\n ? { id: claim.id }\n : {\n id: claim.id,\n toStatus,\n rejectionReasonCode: nullableText(values?.rejectionReasonCode),\n resolutionSummary: nullableText(values?.resolutionSummary),\n },\n 'warranty_claims.detail.flash.transitioned',\n )\n }, [claim, currentStatus, runClaimPost])\n\n const generateSupplierRecovery = React.useCallback(async ({\n lineIds,\n vendorName,\n }: {\n lineIds: string[]\n vendorName: string\n }) => {\n if (!claim) return\n if (!lineIds.length || !vendorName.trim()) {\n flash(t('warranty_claims.errors.vendorRecoveryNeedsResolvedLines'), 'error')\n return\n }\n await runClaimPost(\n '/api/warranty_claims/vendor-recovery',\n {\n claimId: claim.id,\n lineIds,\n vendorName: vendorName.trim(),\n vendorRef: null,\n },\n 'warranty_claims.detail.vendorRecovery.created',\n )\n }, [claim, runClaimPost, t])\n\n const confirmAndTransition = React.useCallback(async (toStatus: ClaimStatus) => {\n if (!claim) return\n if (toStatus === 'rejected') {\n setTransitionDialog({ toStatus })\n return\n }\n if (toStatus === 'cancelled') {\n const confirmed = await confirm({\n title: t('warranty_claims.detail.confirm.cancelTitle'),\n variant: 'destructive',\n })\n if (!confirmed) return\n } else {\n const confirmed = await confirm({\n title: t('warranty_claims.detail.confirm.transitionTitle'),\n })\n if (!confirmed) return\n }\n await handleTransition(toStatus)\n }, [claim, confirm, handleTransition, t])\n\n const deleteClaim = React.useCallback(async () => {\n if (!claim || !featureAccess.claimDelete || !DELETABLE_CLAIM_STATUSES.has(currentStatus)) return\n const confirmed = await confirm({\n title: t('warranty_claims.audit.claim.delete'),\n variant: 'destructive',\n })\n if (!confirmed) return\n try {\n await runMutation({\n operation: () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => deleteCrud('warranty_claims', claim.id, {\n errorMessage: t('warranty_claims.edit.error.delete'),\n }),\n ),\n context: mutationContext,\n mutationPayload: { id: claim.id },\n })\n flash(t('warranty_claims.edit.deleted'), 'success')\n router.push('/backend/warranty_claims')\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n flash(translateErrorMessage(err, t, 'warranty_claims.edit.error.delete'), 'error')\n }\n }, [claim, confirm, currentStatus, featureAccess.claimDelete, loadData, mutationContext, router, runMutation, t])\n\n const headerMoreActions = React.useMemo(() => {\n if (!claim) return []\n const items = [\n ...(claimMutable ? [{\n id: 'edit',\n label: t('warranty_claims.detail.actions.edit'),\n icon: Pencil,\n onSelect: () => router.push(`/backend/warranty_claims/${claim.id}/edit`),\n }] : []),\n {\n id: 'copy-link',\n label: t('warranty_claims.detail.copyLink'),\n icon: Copy,\n onSelect: async () => {\n try {\n await navigator.clipboard.writeText(window.location.href)\n flash(t('warranty_claims.detail.linkCopied'), 'success')\n } catch {\n flash(t('warranty_claims.detail.copyFailed', 'Could not copy to the clipboard.'), 'error')\n }\n },\n },\n ]\n if (claim.claimNumber) {\n items.push({\n id: 'copy-number',\n label: t('warranty_claims.detail.copyClaimNumber', 'Copy claim number'),\n icon: Hash,\n onSelect: async () => {\n try {\n await navigator.clipboard.writeText(claim.claimNumber ?? '')\n flash(t('warranty_claims.detail.claimNumberCopied', 'Claim number copied.'), 'success')\n } catch {\n flash(t('warranty_claims.detail.copyFailed', 'Could not copy to the clipboard.'), 'error')\n }\n },\n })\n }\n if (claim.orderId) {\n items.push({\n id: 'view-order',\n label: claim.orderNumber ?? t('warranty_claims.detail.viewOrder'),\n icon: Copy,\n onSelect: () => router.push(`/backend/sales/documents/${claim.orderId}`),\n })\n }\n if (featureAccess.claimManage && claimActive) {\n items.push({\n id: 'assign',\n label: t('warranty_claims.detail.reassign'),\n icon: UserRound,\n onSelect: openAssignDialog,\n })\n if (currentUserId && claim.assigneeUserId !== currentUserId) {\n items.push({\n id: 'assign-to-me',\n label: t('warranty_claims.detail.assignToMe'),\n icon: UserRound,\n onSelect: () => { void assignToMe() },\n })\n }\n if (claim.claimType !== 'vendor_recovery' && eligibleVendorLines.length > 0) {\n items.push({\n id: 'vendor-recovery',\n label: t('warranty_claims.detail.actions.vendorRecovery'),\n icon: RefreshCw,\n onSelect: () => setVendorDialogOpen(true),\n })\n }\n }\n return items\n }, [assignToMe, claim, claimActive, claimMutable, currentUserId, eligibleVendorLines.length, featureAccess.claimManage, openAssignDialog, router, t])\n\n const submitComment = React.useCallback(async () => {\n if (!claim || !commentBody.trim()) return\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(claim.updatedAt),\n () => apiCall('/api/warranty_claims/events', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n claimId: claim.id,\n body: commentBody.trim(),\n visibility: commentVisibility,\n }),\n }),\n )\n if (!call.ok) throw buildConflictError(call, t('warranty_claims.detail.error.action'), t)\n return call\n },\n context: mutationContext,\n mutationPayload: {\n claimId: claim.id,\n body: commentBody.trim(),\n visibility: commentVisibility,\n },\n })\n setCommentBody('')\n flash(t('warranty_claims.detail.flash.commentAdded'), 'success')\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n const message = translateErrorMessage(err, t, 'warranty_claims.detail.error.comment')\n flash(message, 'error')\n }\n }, [claim, commentBody, commentVisibility, loadData, mutationContext, runMutation, t])\n\n const draftReplyWithAi = React.useCallback(async () => {\n if (!claim) return\n setDraftReplyLoading(true)\n try {\n const call = await runMutation({\n operation: async () => {\n const draftCall = await apiCall('/api/warranty_claims/ai/draft-reply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ claimId: claim.id }),\n })\n if (isDraftReplyNotConfigured(draftCall.result)) return draftCall\n if (!draftCall.ok) throw new Error(readErrorKey(draftCall.result) ?? 'warranty_claims.ai.draftError')\n return draftCall\n },\n context: mutationContext,\n mutationPayload: { claimId: claim.id },\n })\n if (isDraftReplyNotConfigured(call.result)) {\n setDraftReplyHidden(true)\n return\n }\n const draft = readDraftReply(call.result)\n if (!draft) {\n flash(t('warranty_claims.ai.draftError'), 'error')\n return\n }\n setCommentBody(draft)\n setCommentVisibility('customer')\n } catch (err) {\n flash(translateErrorMessage(err, t, 'warranty_claims.ai.draftError'), 'error')\n } finally {\n setDraftReplyLoading(false)\n }\n }, [claim, mutationContext, runMutation, t])\n\n const saveLineInlineField = React.useCallback<InlineLineSaveHandler>(async (line, field, value) => {\n if (!claim) return\n const payload: Record<string, unknown> = { id: line.id, claimId: claim.id, [field]: value }\n try {\n await runMutation({\n operation: () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader(line.updatedAt),\n () => updateCrud('warranty_claims/lines', payload, {\n errorMessage: t('warranty_claims.detail.lines.error.save'),\n }),\n ),\n context: mutationContext,\n mutationPayload: payload,\n })\n flash(t('warranty_claims.detail.lines.flash.saved'), 'success')\n await loadData()\n } catch (err) {\n if (surfaceRecordConflict(err, t, { onRefresh: loadData })) return\n flash(translateErrorMessage(err, t, 'warranty_claims.detail.lines.error.save'), 'error')\n }\n }, [claim, loadData, mutationContext, runMutation, t])\n\n const lineFields = React.useMemo<CrudField[]>(() => [\n {\n id: 'productLookup',\n label: t('warranty_claims.form.productLookup'),\n type: 'custom',\n layout: 'full',\n component: ({ values, setFormValue }) => (\n <ClaimLineProductPicker\n value={{\n productId: nullableText(values?.productId),\n variantId: nullableText(values?.variantId),\n productName: nullableText(values?.productName),\n sku: nullableText(values?.sku),\n }}\n onPick={(pick: ClaimProductPick) => {\n setFormValue?.('productId', pick.productId)\n setFormValue?.('variantId', pick.variantId)\n setFormValue?.('sku', pick.sku)\n setFormValue?.('productName', pick.productName)\n }}\n onClear={() => {\n setFormValue?.('productId', null)\n setFormValue?.('variantId', null)\n }}\n hideLabel\n />\n ),\n },\n { id: 'productName', label: t('warranty_claims.form.productName'), type: 'text', layout: 'half' },\n { id: 'sku', label: t('warranty_claims.form.sku'), type: 'text', layout: 'half' },\n { id: 'serialNumber', label: t('warranty_claims.form.serialNumber'), type: 'text', layout: 'half' },\n { id: 'purchaseDate', label: t('warranty_claims.form.purchaseDate'), type: 'date', layout: 'half' },\n { id: 'warrantyMonths', label: t('warranty_claims.form.warrantyMonths'), type: 'number', layout: 'half' },\n {\n id: 'entitlementPreview',\n label: t('warranty_claims.form.entitlement'),\n type: 'custom',\n layout: 'half',\n component: ({ values }) => {\n const purchaseDateText = nullableText(values?.purchaseDate)\n const purchaseDate = purchaseDateText ? new Date(purchaseDateText) : null\n const monthsValue = Number(values?.warrantyMonths)\n const months = Number.isFinite(monthsValue) && String(values?.warrantyMonths ?? '').trim() !== '' ? monthsValue : null\n return <EntitlementChip status={computeEntitlementPreview(purchaseDate, months)} t={t} />\n },\n },\n {\n id: 'faultCode',\n label: t('warranty_claims.form.faultCode'),\n type: 'select',\n loadOptions: () => loadDictionaryOptions(DICTIONARY_KEYS.faultCodes, 'fault'),\n layout: 'half',\n },\n { id: 'faultDescription', label: t('warranty_claims.form.faultDescription'), type: 'textarea', rows: 3, layout: 'full' },\n { id: 'qtyClaimed', label: t('warranty_claims.form.qtyClaimed'), type: 'number', layout: 'third' },\n { id: 'qtyApproved', label: t('warranty_claims.form.qtyApproved'), type: 'number', layout: 'third' },\n { id: 'qtyReceived', label: t('warranty_claims.form.qtyReceived'), type: 'number', layout: 'third' },\n {\n id: 'lineStatus',\n label: t('warranty_claims.form.lineStatus'),\n type: 'select',\n options: CLAIM_LINE_STATUSES.map((status) => ({ value: status, label: t(`warranty_claims.lineStatus.${status}`) })),\n layout: 'half',\n },\n {\n id: 'disposition',\n label: t('warranty_claims.form.disposition'),\n type: 'select',\n options: buildDispositionOptions(allowedDispositions, currentLineDisposition, t),\n layout: 'half',\n },\n { id: 'creditAmount', label: t('warranty_claims.form.creditAmount'), type: 'number', layout: 'third' },\n { id: 'restockingFee', label: t('warranty_claims.form.restockingFee'), type: 'number', layout: 'third' },\n { id: 'coreChargeAmount', label: t('warranty_claims.form.coreChargeAmount'), type: 'number', layout: 'third' },\n { id: 'coreCreditAmount', label: t('warranty_claims.form.coreCreditAmount'), type: 'number', layout: 'third' },\n { id: 'conditionOnReceipt', label: t('warranty_claims.form.conditionOnReceipt'), type: 'textarea', rows: 3, layout: 'full' },\n { id: 'inspectionNotes', label: t('warranty_claims.form.inspectionNotes'), type: 'textarea', rows: 3, layout: 'full' },\n ], [allowedDispositions, currentLineDisposition, loadDictionaryOptions, t])\n\n const lineGroups = React.useMemo<CrudFormGroup[]>(() => [\n {\n id: 'line-main',\n title: t(resolveClaimTypeUiConfig(claim?.claimType).lineHeaderKey),\n fields: [\n 'productLookup',\n 'productName',\n 'sku',\n 'serialNumber',\n 'purchaseDate',\n 'warrantyMonths',\n 'entitlementPreview',\n 'faultCode',\n 'faultDescription',\n 'qtyClaimed',\n 'qtyApproved',\n 'qtyReceived',\n 'lineStatus',\n 'disposition',\n ],\n },\n {\n id: 'line-money',\n title: t('warranty_claims.detail.lines.amounts'),\n // Restock / core fields belong only to return-family claims; warranty & vendor-recovery\n // settle on the credit amount alone (LINE-05).\n fields: claimTypeAllowsLineFinancialAdjustments(claim?.claimType)\n ? ['creditAmount', 'restockingFee', 'coreChargeAmount', 'coreCreditAmount']\n : ['creditAmount'],\n },\n {\n id: 'line-inspection',\n title: t('warranty_claims.detail.lines.inspection'),\n fields: ['conditionOnReceipt', 'inspectionNotes'],\n },\n ], [claim?.claimType, t])\n\n const lineColumns = React.useMemo<ColumnDef<ClaimLine>[]>(() => [\n {\n accessorKey: 'lineNo',\n header: t('warranty_claims.detail.lines.column.number'),\n cell: ({ row }) => <span className=\"font-mono text-xs\">{row.original.lineNo ?? noValue}</span>,\n },\n {\n accessorKey: 'lineStatus',\n header: t('warranty_claims.detail.lines.column.status'),\n cell: ({ row }) => (\n <InlineLineSelectCell\n line={row.original}\n field=\"lineStatus\"\n value={row.original.lineStatus}\n label={t('warranty_claims.form.lineStatus')}\n options={buildLineStatusOptions(row.original.lineStatus, t)}\n disabled={!linesInlineEditable}\n onSave={saveLineInlineField}\n />\n ),\n },\n {\n accessorKey: 'productName',\n header: t('warranty_claims.detail.lines.column.product'),\n cell: ({ row }) => (\n <div className=\"max-w-80 space-y-0.5\">\n <div className=\"truncate font-medium\" title={row.original.productName ?? undefined}>{row.original.productName ?? noValue}</div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {[row.original.sku, row.original.serialNumber].filter(Boolean).join(' / ') || noValue}\n </div>\n </div>\n ),\n },\n {\n id: 'entitlement',\n header: t('warranty_claims.detail.lines.column.entitlement'),\n cell: ({ row }) => {\n const purchaseDate = row.original.purchaseDate ? new Date(row.original.purchaseDate) : null\n return (\n <EntitlementChip\n status={computeEntitlementPreview(purchaseDate, row.original.warrantyMonths)}\n t={t}\n />\n )\n },\n },\n {\n accessorKey: 'qtyClaimed',\n header: t('warranty_claims.lines.header.qtyClaimed'),\n cell: ({ row }) => formatQuantity(row.original.qtyClaimed, noValue),\n },\n {\n accessorKey: 'qtyApproved',\n header: t('warranty_claims.lines.header.qtyApproved'),\n cell: ({ row }) => (\n <InlineQtyApprovedCell\n line={row.original}\n disabled={!linesInlineEditable}\n label={t('warranty_claims.form.qtyApproved')}\n onSave={saveLineInlineField}\n />\n ),\n },\n {\n accessorKey: 'disposition',\n header: t('warranty_claims.form.disposition'),\n cell: ({ row }) => (\n <InlineLineSelectCell\n line={row.original}\n field=\"disposition\"\n value={row.original.disposition}\n label={t('warranty_claims.form.disposition')}\n emptyLabel={noValue}\n options={buildDispositionOptions(allowedDispositions, row.original.disposition, t)}\n disabled={!linesInlineEditable}\n onSave={saveLineInlineField}\n />\n ),\n },\n {\n accessorKey: 'creditAmount',\n header: t('warranty_claims.detail.lines.column.credit'),\n cell: ({ row }) => formatAmount(row.original.creditAmount, claim?.currencyCode ?? null, noValue),\n },\n ], [allowedDispositions, claim?.currencyCode, linesInlineEditable, noValue, saveLineInlineField, t])\n\n const transitionFields = React.useMemo<CrudField[]>(() => [\n {\n id: 'rejectionReasonCode',\n label: t('warranty_claims.form.rejectionReasonCode'),\n type: 'select',\n required: true,\n loadOptions: () => loadDictionaryOptions(DICTIONARY_KEYS.rejectionReasons, 'rejection'),\n },\n {\n id: 'resolutionSummary',\n label: t('warranty_claims.form.resolutionSummary'),\n type: 'textarea',\n rows: 3,\n layout: 'full',\n },\n ], [loadDictionaryOptions, t])\n\n const vendorFields = React.useMemo<CrudField[]>(() => [\n {\n id: 'lineIds',\n label: t('warranty_claims.detail.vendorRecovery.lines'),\n type: 'select',\n multiple: true,\n required: true,\n options: eligibleVendorLines.map((line) => ({\n value: line.id,\n label: [\n t('warranty_claims.form.lines.lineLabel', 'Line {number}', { number: line.lineNo ?? '?' }),\n line.productName ?? line.sku,\n ].filter(Boolean).join(' \u2014 '),\n })),\n },\n { id: 'vendorName', label: t('warranty_claims.form.vendorName'), type: 'text', required: true },\n { id: 'vendorRef', label: t('warranty_claims.form.vendorRef'), type: 'text' },\n ], [eligibleVendorLines, t])\n\n if (loading) {\n return (\n <Page>\n <PageBody>\n <LoadingMessage label={t('warranty_claims.detail.loading')} />\n </PageBody>\n </Page>\n )\n }\n\n if (notFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={t('warranty_claims.errors.notFound')}\n backHref=\"/backend/warranty_claims\"\n backLabel={t('warranty_claims.detail.actions.backToList')}\n />\n </PageBody>\n </Page>\n )\n }\n\n if (error || !claim) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error ?? t('warranty_claims.errors.notFound')}\n action={(\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link href=\"/backend/warranty_claims\">{t('warranty_claims.detail.actions.backToList')}</Link>\n </Button>\n )}\n />\n </PageBody>\n </Page>\n )\n }\n\n const tabs: Array<{ id: TabId; label: string; count?: number }> = [\n { id: 'lines', label: t('warranty_claims.detail.tabs.lines'), count: lines.length },\n { id: 'timeline', label: t('warranty_claims.detail.tabs.timeline'), count: events.length },\n { id: 'attachments', label: t('warranty_claims.detail.tabs.attachments'), count: attachmentCount },\n { id: 'ai', label: t('warranty_claims.detail.tabs.ai') },\n ]\n const approvedLineCount = lines.filter((line) => line.lineStatus === 'approved').length\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n <div className=\"overflow-hidden rounded-xl border border-border bg-card\">\n <div className=\"px-8 pb-5 pt-5\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"inline-flex items-center rounded-md border border-border bg-background px-2.5 py-1 text-xs text-muted-foreground\">\n {t(`warranty_claims.claimType.${claim.claimType ?? 'warranty'}`)}\n <span className=\"ml-1 font-semibold text-foreground\">\n {claim.claimNumber ?? t('warranty_claims.detail.unnumbered', 'Unnumbered claim')}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {featureAccess.claimDelete ? (\n <IconButton\n type=\"button\"\n variant=\"outline\"\n size=\"default\"\n className=\"border-destructive/30 text-destructive hover:bg-destructive/10 hover:text-destructive\"\n disabled={!DELETABLE_CLAIM_STATUSES.has(currentStatus)}\n aria-label={t('warranty_claims.audit.claim.delete')}\n title={DELETABLE_CLAIM_STATUSES.has(currentStatus)\n ? t('warranty_claims.audit.claim.delete')\n : t('warranty_claims.errors.deleteNotAllowed')}\n onClick={() => { void deleteClaim() }}\n >\n <Trash2 className=\"size-4\" aria-hidden />\n </IconButton>\n ) : null}\n <ActionsDropdown\n items={headerMoreActions}\n triggerMode=\"icon\"\n ariaLabel={t('ui.actions.actions', 'Actions')}\n />\n <Select\n value=\"\"\n disabled={!featureAccess.claimManage || resolutionStatuses.length === 0}\n onValueChange={(status) => { void confirmAndTransition(status as ClaimStatus) }}\n >\n <SelectTrigger className=\"h-8 w-28\" aria-label={t('warranty_claims.edit.fulfillment.resolution')}>\n <SelectValue placeholder={t('warranty_claims.edit.fulfillment.resolution')} />\n </SelectTrigger>\n <SelectContent>\n {resolutionStatuses.map((status) => (\n <SelectItem key={status} value={status}>\n {t(`warranty_claims.status.${status}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {featureAccess.claimManage && primaryNextStatus ? (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => { void confirmAndTransition(primaryNextStatus) }}\n >\n {primaryNextStatus === 'submitted' && currentStatus === 'draft'\n ? t('warranty_claims.detail.actions.submit')\n : primaryNextStatus === 'in_review' && currentStatus === 'submitted'\n ? t('warranty_claims.list.actions.startReview')\n : t(`warranty_claims.status.${primaryNextStatus}`)}\n </Button>\n ) : null}\n </div>\n </div>\n <h1 className=\"mt-3 max-w-3xl text-2xl font-bold tracking-tight text-foreground\">\n {claim.notes || claim.reasonCode || claim.claimNumber || t('warranty_claims.detail.unnumbered', 'Unnumbered claim')}\n </h1>\n <div className=\"mt-3 grid gap-4 sm:grid-cols-2 xl:max-w-4xl xl:grid-cols-6\">\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.customer')}</p>\n <div className=\"mt-1 text-sm font-medium text-foreground\">\n <span>\n {claim.customerName ? (\n customerLink && customerLink.customerId === claim.customerId ? (\n <Link\n href={customerLink.href}\n className=\"text-foreground underline-offset-4 hover:underline\"\n >\n {claim.customerName}\n </Link>\n ) : (\n claim.customerName\n )\n ) : (\n noValue\n )}\n </span>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.priority', 'Priority')}</p>\n <p className=\"mt-1 text-sm font-medium text-foreground\">\n {t(`warranty_claims.priority.${claim.priority ?? 'normal'}`)}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.opened')}</p>\n <p className=\"mt-1 text-sm font-medium text-foreground\" title={formatDateTime(claim.createdAt) ?? undefined}>\n {formatRelativeTime(claim.createdAt, { locale }) ?? noValue}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.list.column.slaDueAt')}</p>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-sm\">\n <ClaimSlaIndicator\n slaDueAt={claim.slaDueAt}\n slaPausedAt={claim.slaPausedAt}\n submittedAt={claim.submittedAt}\n status={claim.status}\n atRiskThresholdPct={slaAtRiskThresholdPct}\n />\n </div>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.owner')}</p>\n <p className=\"mt-1 truncate text-sm font-medium text-foreground\" title={assigneeDisplayName}>{assigneeDisplayName}</p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.state')}</p>\n <div className=\"mt-1\">\n <ClaimStatusBadge status={claim.status} />\n </div>\n </div>\n </div>\n {riskSignals.length > 0 ? (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 xl:max-w-4xl\" data-testid=\"warranty-claim-risk-signals\">\n <RiskSignalChips signals={riskSignals} t={t} />\n </div>\n ) : null}\n </div>\n <ClaimStageProgress status={claim.status} />\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as TabId)}\n variant=\"underline\"\n >\n <TabsList className=\"h-auto w-full flex-wrap gap-1 px-7\" aria-label={t('warranty_claims.detail.tabs.label', 'Claim sections')}>\n {tabs.map((tab) => (\n <TabsTrigger\n key={tab.id}\n value={tab.id}\n count={tab.count}\n data-tab-id={tab.id}\n className=\"px-4 pb-2 pt-3\"\n >\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n <TabsContent value=\"lines\" className=\"mt-0\">\n <div>\n <div className=\"grid items-center gap-4 border-b border-border px-8 py-5 sm:grid-cols-2 xl:grid-cols-[repeat(3,minmax(0,1fr))_auto]\">\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.totalClaimed')}</p>\n <p className=\"mt-1 text-base font-semibold text-foreground\">\n {formatAmount(claim.totalClaimedAmount, claim.currencyCode, noValue)}\n </p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {t('warranty_claims.detail.lines.count', { count: lines.length })}\n </p>\n </div>\n <div className=\"xl:border-l xl:border-border xl:pl-5\">\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.totalApproved')}</p>\n <p className=\"mt-1 text-base font-semibold text-foreground\">\n {formatAmount(claim.totalApprovedAmount, claim.currencyCode, noValue)}\n </p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {t('warranty_claims.detail.lines.approvedCount', { count: approvedLineCount })}\n </p>\n </div>\n <div className=\"xl:border-l xl:border-border xl:pl-5\">\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.totalRecovered')}</p>\n <p className=\"mt-1 text-base font-semibold text-foreground\">\n {formatAmount(claim.totalRecoveredAmount, claim.currencyCode, noValue)}\n </p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {claim.vendorName ?? t('warranty_claims.detail.lines.noVendorClaims')}\n </p>\n </div>\n {linesInlineEditable ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"justify-self-start xl:justify-self-end\" onClick={() => setLineDialog({ mode: 'create' })}>\n {t('warranty_claims.detail.lines.add')}\n </Button>\n ) : null}\n </div>\n <div className=\"pb-3\">\n <DataTable<ClaimLine>\n embedded\n columns={lineColumns}\n data={lines}\n stickyActionsColumn\n emptyState={(\n <EmptyState\n title={t('warranty_claims.detail.lines.empty.title')}\n description={t('warranty_claims.detail.lines.empty.description')}\n variant=\"subtle\"\n />\n )}\n rowActions={linesInlineEditable ? (line) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('warranty_claims.detail.lines.edit'),\n onSelect: () => setLineDialog({ mode: 'edit', line }),\n },\n ]}\n />\n ) : undefined}\n />\n </div>\n <div className=\"px-8 pb-8\">\n <ReceivingPanel\n claimId={claim.id}\n lines={lines}\n canManage={featureAccess.receivingManage}\n receivingCapable={RECEIVING_CAPABLE_CLAIM_STATUSES.has(currentStatus)}\n onRefresh={loadData}\n />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"timeline\" className=\"mt-0\">\n <div className=\"mx-8 max-w-3xl space-y-5 pb-8 pt-6\">\n {featureAccess.claimManage ? (\n <div>\n <div className=\"space-y-4\">\n <Textarea\n value={commentBody}\n onChange={(event) => setCommentBody(event.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n void submitComment()\n }\n }}\n placeholder={t('warranty_claims.detail.timeline.commentPlaceholder')}\n rows={6}\n />\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Select value={commentVisibility} onValueChange={(next) => setCommentVisibility(next === 'customer' ? 'customer' : 'internal')}>\n <SelectTrigger className=\"w-40\" aria-label={t('warranty_claims.detail.visibility.label')}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"internal\">{t('warranty_claims.detail.visibility.internal')}</SelectItem>\n <SelectItem value=\"customer\">{t('warranty_claims.detail.visibility.customer')}</SelectItem>\n </SelectContent>\n </Select>\n {!draftReplyHidden && featureAccess.claimManage && claimMutable ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => { void draftReplyWithAi() }}\n disabled={draftReplyLoading}\n >\n <AiIcon className=\"size-4\" aria-hidden=\"true\" />\n {draftReplyLoading\n ? t('warranty_claims.ai.draftingReply')\n : t('warranty_claims.ai.draftReply')}\n </Button>\n ) : null}\n </div>\n <Button type=\"button\" onClick={() => { void submitComment() }} disabled={!commentBody.trim()}>\n {t('warranty_claims.detail.timeline.addComment')}\n </Button>\n </div>\n </div>\n </div>\n ) : null}\n <div className=\"space-y-3\">\n {events.length ? (\n <SegmentedControl\n size=\"sm\"\n value={timelineFilter}\n onValueChange={(next) => setTimelineFilter(isTimelineFilterId(next) ? next : 'all')}\n aria-label={t('warranty_claims.detail.timeline.filter.label', 'Filter timeline')}\n >\n {TIMELINE_FILTERS.map((filter) => (\n <SegmentedControlItem key={filter} value={filter}>\n {t(TIMELINE_FILTER_LABELS[filter].key, TIMELINE_FILTER_LABELS[filter].fallback)}\n </SegmentedControlItem>\n ))}\n </SegmentedControl>\n ) : null}\n {filteredTimelineEvents.length ? filteredTimelineEvents.map((event) => {\n const Icon = eventIcon(event.kind)\n const body = formatTimelineBody(event, t, userNames)\n const actor = resolveTimelineActor(event, claim, userNames, t)\n return (\n <div key={event.id} className=\"flex gap-3 py-2\">\n <div className=\"flex size-7 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <Icon className=\"h-4 w-4\" aria-hidden />\n </div>\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">{t(`warranty_claims.eventKind.${event.kind}`)}</span>\n <span className=\"text-sm text-muted-foreground\">{actor}</span>\n <StatusBadge variant={event.visibility === 'customer' ? 'info' : 'neutral'}>\n {event.visibility === 'customer'\n ? t('warranty_claims.detail.visibility.customer')\n : t('warranty_claims.detail.visibility.internal')}\n </StatusBadge>\n <span className=\"text-xs text-muted-foreground\">{formatDateTime(event.createdAt) ?? noValue}</span>\n </div>\n {body ? <p className=\"text-sm\">{body}</p> : null}\n </div>\n </div>\n )\n }) : events.length ? (\n <EmptyState\n title={t('warranty_claims.detail.timeline.filterEmpty.title', 'No matching events')}\n description={t('warranty_claims.detail.timeline.filterEmpty.description', 'No timeline events match the selected filter.')}\n variant=\"subtle\"\n />\n ) : (\n <EmptyState\n title={t('warranty_claims.detail.timeline.empty.title')}\n description={t('warranty_claims.detail.timeline.empty.description')}\n variant=\"subtle\"\n />\n )}\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"attachments\" className=\"mt-0\">\n <div className=\"px-8 pb-8 pt-6\">\n <AttachmentInput\n entityId=\"warranty_claims:warranty_claim\"\n recordId={claim.id}\n allowDelete={featureAccess.claimManage}\n allowReplace={featureAccess.claimManage}\n disabled={!featureAccess.claimManage}\n onCountChange={setAttachmentCount}\n renderItemMeta={(item) => (\n isCustomerVisibleAttachment(item.tags) ? (\n <StatusBadge variant=\"info\">\n {t('warranty_claims.detail.attachments.customerVisible', 'Visible to customer')}\n </StatusBadge>\n ) : null\n )}\n />\n </div>\n </TabsContent>\n\n <TabsContent value=\"ai\" className=\"mt-0\">\n <div className=\"grid gap-4 px-8 pb-8 pt-6 xl:grid-cols-2\">\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium\">{t('warranty_claims.triage.panelTitle')}</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">{t('warranty_claims.triage.panelSubtitle')}</p>\n </div>\n <Button type=\"button\" variant=\"outline\" onClick={loadAiSuggestion} disabled={aiLoading}>\n {t('warranty_claims.triage.suggestButton')}\n </Button>\n </div>\n {aiSuggestion ? (\n <div className=\"mt-4 space-y-4\">\n <div className=\"rounded-md border border-border p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusBadge variant={aiSuggestion.priority.overdue ? 'error' : 'info'}>\n {t(`warranty_claims.priority.${aiSuggestion.priority.currentPriority}`)}\n {' \u2192 '}\n {t(`warranty_claims.priority.${aiSuggestion.priority.suggestedPriority}`)}\n </StatusBadge>\n <RiskSignalChips signals={aiSuggestion.risk?.signals ?? []} t={t} />\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">{formatTriageMessage(aiSuggestion.priority.reason, t)}</p>\n </div>\n <div className=\"space-y-2\">\n {aiSuggestion.lines.map((suggestedLine) => {\n const applied = appliedTriageLineIds.has(suggestedLine.lineId)\n return (\n <div\n key={suggestedLine.lineId}\n className=\"flex flex-wrap items-start justify-between gap-3 rounded-md border border-border p-3\"\n >\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium\">\n {triageLineHeading(suggestedLine, lines, t)}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2\">\n <StatusBadge variant={eligibilityBadgeVariant(suggestedLine.eligibility.status)}>\n {t(`warranty_claims.eligibility.${suggestedLine.eligibility.status}`)}\n </StatusBadge>\n <StatusBadge variant=\"info\">\n {t(`warranty_claims.disposition.${suggestedLine.suggestedDisposition}`)}\n </StatusBadge>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">{formatTriageMessage(suggestedLine.reason, t)}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{formatTriageMessage(suggestedLine.eligibility.reason, t)}</p>\n </div>\n {applied ? (\n <StatusBadge variant=\"success\">\n {t('warranty_claims.triage.applied', 'Applied')}\n {': '}\n {t(`warranty_claims.disposition.${suggestedLine.suggestedDisposition}`)}\n </StatusBadge>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => applyAiDisposition(suggestedLine.lineId, suggestedLine.suggestedDisposition)}\n >\n {t('warranty_claims.triage.apply')}\n </Button>\n )}\n </div>\n )\n })}\n </div>\n </div>\n ) : (\n <div className=\"mt-4\">\n <EmptyState\n title={t('warranty_claims.triage.panelTitle')}\n description={t('warranty_claims.triage.empty.description')}\n variant=\"subtle\"\n />\n </div>\n )}\n </div>\n <div className=\"h-96 overflow-hidden rounded-lg border border-border bg-card\">\n <React.Suspense fallback={<LoadingMessage label={t('warranty_claims.detail.loading')} />}>\n {/* Scope the conversation to this claim and remount on claim change so a\n claim can never inherit another claim's transcript (WQA-007 / AI-01). */}\n <LazyAiChat\n key={`${AGENT_ID}:${claim.id}`}\n agent={AGENT_ID}\n pageContext={{ entityType: 'warranty_claims.claim', recordId: claim.id }}\n className=\"h-full\"\n placeholder={t('warranty_claims.ai.chatPlaceholder')}\n welcomeTitle={t('warranty_claims.ai.chatWelcomeTitle')}\n />\n </React.Suspense>\n </div>\n {lines.length ? (\n <div className=\"space-y-3 xl:col-span-2\">\n {lines.map((line) => (\n <div key={line.id} className=\"flex flex-wrap items-center justify-between gap-3 rounded-lg border border-border p-4\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {line.productName ?? line.sku ?? t('warranty_claims.detail.lines.unnamed', 'Unnamed line')}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {[line.sku, line.serialNumber].filter(Boolean).join(' / ') || noValue}\n </p>\n </div>\n <AiAssessButtons\n claimId={claim.id}\n line={line}\n canManage={featureAccess.claimManage && claimMutable}\n onRefresh={loadData}\n />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n <ReturnLabelPanel claim={claim} canManage={featureAccess.claimManage} onRefresh={loadData} />\n\n {(() => {\n const showSalesReturn = featureAccess.claimManage\n && featureAccess.salesReturnsCreate\n && claim.orderId\n && !claim.salesReturnId\n && ['approved', 'awaiting_return', 'received', 'inspecting'].includes(currentStatus ?? '')\n const showReplacementOrder = featureAccess.claimManage\n && featureAccess.salesOrdersManage\n && claim.orderId\n && !claim.replacementOrderId\n && ['approved', 'awaiting_return', 'received', 'inspecting', 'resolved'].includes(currentStatus ?? '')\n const showCreditMemo = featureAccess.claimManage\n && featureAccess.salesCreditMemosManage\n && claim.orderId\n && !claim.creditMemoId\n && ['received', 'inspecting', 'resolved'].includes(currentStatus ?? '')\n if (!showSalesReturn && !showReplacementOrder && !showCreditMemo) return null\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {showSalesReturn ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => { void createSalesReturn() }}>\n {t('warranty_claims.detail.createSalesReturn')}\n </Button>\n ) : null}\n {showReplacementOrder ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => { void createReplacementOrder() }}>\n {t('warranty_claims.detail.createReplacementOrder')}\n </Button>\n ) : null}\n {showCreditMemo ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => { void createCreditMemo() }}>\n {t('warranty_claims.detail.createCreditMemo')}\n </Button>\n ) : null}\n </div>\n )\n })()}\n\n <VendorRecoverySuggestionsPanel\n claim={claim}\n canManage={featureAccess.claimManage}\n onGenerateSupplierRecovery={generateSupplierRecovery}\n />\n </div>\n </PageBody>\n\n <Dialog open={assignDialogOpen} onOpenChange={setAssignDialogOpen}>\n <DialogContent\n className=\"max-w-lg\"\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n void assignClaim()\n }\n if (event.key === 'Escape') {\n setAssignDialogOpen(false)\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{t('warranty_claims.detail.assignDialog.title')}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"warranty-claim-assignee-search\">\n {t('warranty_claims.detail.assignDialog.search')}\n </Label>\n <Input\n id=\"warranty-claim-assignee-search\"\n value={assignSearch}\n onChange={(event) => setAssignSearch(event.target.value)}\n placeholder={t('warranty_claims.detail.assignDialog.searchPlaceholder')}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"warranty-claim-assignee-select\">\n {t('warranty_claims.detail.assignDialog.staff')}\n </Label>\n <Select value={selectedAssigneeUserId} onValueChange={setSelectedAssigneeUserId}>\n <SelectTrigger id=\"warranty-claim-assignee-select\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={UNASSIGNED_SELECT_VALUE}>{t('warranty_claims.detail.unassigned')}</SelectItem>\n {assignableOptions.map((staffMember) => (\n <SelectItem key={staffMember.userId} value={staffMember.userId}>\n {staffMember.email && staffMember.email !== staffMember.displayName\n ? `${staffMember.displayName} (${staffMember.email})`\n : staffMember.displayName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {assignLoading ? (\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.assignDialog.loading')}</p>\n ) : null}\n {!assignLoading && assignableOptions.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">{t('warranty_claims.detail.assignDialog.empty')}</p>\n ) : null}\n </div>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setAssignDialogOpen(false)}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button type=\"button\" onClick={() => { void assignClaim() }}>\n {t('warranty_claims.form.submit')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog open={lineDialog !== null} onOpenChange={(open) => { if (!open) setLineDialog(null) }}>\n <DialogContent className=\"sm:max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {lineDialog?.mode === 'edit'\n ? t('warranty_claims.detail.lines.edit')\n : t('warranty_claims.detail.lines.add')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<ClaimLineFormValues>\n embedded\n title={lineDialog?.mode === 'edit' ? t('warranty_claims.detail.lines.edit') : t('warranty_claims.detail.lines.add')}\n fields={lineDialog?.mode === 'edit' ? lineFields : lineFields.filter((field) => field.id !== 'lineStatus')}\n groups={lineDialog?.mode === 'edit'\n ? lineGroups\n : lineGroups.map((group) => ({ ...group, fields: (group.fields ?? []).filter((fieldId) => fieldId !== 'lineStatus') }))}\n initialValues={lineDialog?.mode === 'edit'\n ? {\n ...lineDialog.line,\n qtyClaimed: quantityInputValue(lineDialog.line.qtyClaimed),\n qtyApproved: quantityInputValue(lineDialog.line.qtyApproved),\n qtyReceived: quantityInputValue(lineDialog.line.qtyReceived),\n }\n : { claimId: claim.id, qtyClaimed: '1', lineStatus: 'pending', warrantyMonths: defaultWarrantyMonths ?? undefined }}\n submitLabel={t('warranty_claims.form.submit')}\n onSubmit={async (values) => {\n const payload: Record<string, unknown> = {\n claimId: claim.id,\n productId: nullableText(values.productId),\n variantId: nullableText(values.variantId),\n productName: nullableText(values.productName),\n sku: nullableText(values.sku),\n serialNumber: nullableText(values.serialNumber),\n purchaseDate: nullableText(values.purchaseDate),\n warrantyMonths: values.warrantyMonths === null || values.warrantyMonths === undefined || String(values.warrantyMonths).trim() === ''\n ? null\n : Number(values.warrantyMonths),\n faultCode: nullableText(values.faultCode),\n faultDescription: nullableText(values.faultDescription),\n qtyClaimed: values.qtyClaimed ?? 1,\n qtyApproved: values.qtyApproved ?? null,\n qtyReceived: values.qtyReceived ?? null,\n disposition: nullableText(values.disposition),\n creditAmount: values.creditAmount ?? null,\n restockingFee: values.restockingFee ?? null,\n coreChargeAmount: values.coreChargeAmount ?? null,\n coreCreditAmount: values.coreCreditAmount ?? null,\n conditionOnReceipt: nullableText(values.conditionOnReceipt),\n inspectionNotes: nullableText(values.inspectionNotes),\n }\n if (lineDialog?.mode === 'edit') {\n payload.lineStatus = nullableText(values.lineStatus) ?? 'pending'\n }\n if (lineDialog?.mode === 'edit') {\n await updateCrud('warranty_claims/lines', { id: lineDialog.line.id, ...payload }, {\n errorMessage: t('warranty_claims.detail.lines.error.save'),\n })\n flash(t('warranty_claims.detail.lines.flash.saved'), 'success')\n } else {\n await createCrud('warranty_claims/lines', payload, {\n errorMessage: t('warranty_claims.detail.lines.error.save'),\n })\n flash(t('warranty_claims.detail.lines.flash.created'), 'success')\n }\n setLineDialog(null)\n await loadData()\n }}\n onDelete={lineDialog?.mode === 'edit'\n ? async () => {\n await deleteCrud('warranty_claims/lines', {\n body: { id: lineDialog.line.id, claimId: claim.id },\n errorMessage: t('warranty_claims.detail.lines.error.delete'),\n })\n flash(t('warranty_claims.detail.lines.flash.deleted'), 'success')\n setLineDialog(null)\n await loadData()\n }\n : undefined}\n />\n </DialogContent>\n </Dialog>\n\n <Dialog open={transitionDialog !== null} onOpenChange={(open) => { if (!open) setTransitionDialog(null) }}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t('warranty_claims.detail.confirm.rejectTitle')}</DialogTitle>\n </DialogHeader>\n <CrudForm<TransitionFormValues>\n embedded\n title={t('warranty_claims.detail.confirm.rejectTitle')}\n fields={transitionFields}\n initialValues={{ rejectionReasonCode: claim.rejectionReasonCode ?? '', resolutionSummary: claim.resolutionSummary ?? '' }}\n submitLabel={t('warranty_claims.detail.actions.transition')}\n onSubmit={async (values) => {\n if (!transitionDialog) return\n await handleTransition(transitionDialog.toStatus, values)\n setTransitionDialog(null)\n }}\n />\n </DialogContent>\n </Dialog>\n\n <Dialog open={vendorDialogOpen} onOpenChange={setVendorDialogOpen}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t('warranty_claims.detail.actions.vendorRecovery')}</DialogTitle>\n </DialogHeader>\n <CrudForm<VendorRecoveryFormValues>\n embedded\n title={t('warranty_claims.detail.actions.vendorRecovery')}\n fields={vendorFields}\n initialValues={{ lineIds: eligibleVendorLines.map((line) => line.id), vendorName: '', vendorRef: '' }}\n submitLabel={t('warranty_claims.detail.actions.vendorRecovery')}\n onSubmit={async (values) => {\n const lineIds = Array.isArray(values.lineIds) ? values.lineIds.filter((lineId): lineId is string => typeof lineId === 'string') : []\n if (!lineIds.length) {\n flash(t('warranty_claims.errors.vendorRecoveryNeedsResolvedLines'), 'error')\n return\n }\n await runClaimPost(\n '/api/warranty_claims/vendor-recovery',\n {\n claimId: claim.id,\n lineIds,\n vendorName: nullableText(values.vendorName),\n vendorRef: nullableText(values.vendorRef),\n },\n 'warranty_claims.detail.vendorRecovery.created',\n )\n setVendorDialogOpen(false)\n }}\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const metadata = {
|
|
2
|
+
requireAuth: true,
|
|
3
|
+
requireFeatures: ["warranty_claims.claim.view"],
|
|
4
|
+
pageTitle: "Claim detail",
|
|
5
|
+
pageTitleKey: "warranty_claims.detail.title",
|
|
6
|
+
pageGroup: "Warranty claims",
|
|
7
|
+
pageGroupKey: "warranty_claims.nav.group",
|
|
8
|
+
breadcrumb: [
|
|
9
|
+
{ label: "Claims", labelKey: "warranty_claims.nav.claims", href: "/backend/warranty_claims" },
|
|
10
|
+
{ label: "Claim detail", labelKey: "warranty_claims.detail.title" }
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
metadata
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=page.meta.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/warranty_claims/backend/warranty_claims/%5Bid%5D/page.meta.ts"],
|
|
4
|
+
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['warranty_claims.claim.view'],\n pageTitle: 'Claim detail',\n pageTitleKey: 'warranty_claims.detail.title',\n pageGroup: 'Warranty claims',\n pageGroupKey: 'warranty_claims.nav.group',\n breadcrumb: [\n { label: 'Claims', labelKey: 'warranty_claims.nav.claims', href: '/backend/warranty_claims' },\n { label: 'Claim detail', labelKey: 'warranty_claims.detail.title' },\n ],\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,4BAA4B;AAAA,EAC9C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,UAAU,UAAU,8BAA8B,MAAM,2BAA2B;AAAA,IAC5F,EAAE,OAAO,gBAAgB,UAAU,+BAA+B;AAAA,EACpE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|