@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,153 @@
|
|
|
1
|
+
import { E } from "../../../generated/entities.ids.generated.js";
|
|
2
|
+
import { readSafeDecryptedString } from "./decryptionSafety.js";
|
|
3
|
+
const ASSIGNEE_NAME_LOOKUP_LIMIT = 100;
|
|
4
|
+
const assigneeOrganizationId = /* @__PURE__ */ Symbol("warranty_claims.assigneeOrganizationId");
|
|
5
|
+
function toRecord(value) {
|
|
6
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
7
|
+
}
|
|
8
|
+
function resolveAuthUserEntityId() {
|
|
9
|
+
const registry = E;
|
|
10
|
+
const value = registry.auth?.user;
|
|
11
|
+
return typeof value === "string" ? value : null;
|
|
12
|
+
}
|
|
13
|
+
function resolveStaffMemberEntityId() {
|
|
14
|
+
const registry = E;
|
|
15
|
+
const value = registry.staff?.staff_team_member;
|
|
16
|
+
return typeof value === "string" ? value : null;
|
|
17
|
+
}
|
|
18
|
+
function toDisplayName(record) {
|
|
19
|
+
return readSafeDecryptedString(record.name) ?? readSafeDecryptedString(record.email);
|
|
20
|
+
}
|
|
21
|
+
function readOrganizationId(record) {
|
|
22
|
+
const hidden = record[assigneeOrganizationId];
|
|
23
|
+
if (typeof hidden === "string" && hidden.length) return hidden;
|
|
24
|
+
const value = record.organizationId ?? record.organization_id;
|
|
25
|
+
return typeof value === "string" && value.length ? value : null;
|
|
26
|
+
}
|
|
27
|
+
function organizationFilter(deps) {
|
|
28
|
+
if (deps.organizationId) return deps.organizationId;
|
|
29
|
+
if (!Array.isArray(deps.organizationIds)) return null;
|
|
30
|
+
const organizationIds = Array.from(new Set(deps.organizationIds.filter((id) => typeof id === "string" && id.length)));
|
|
31
|
+
return organizationIds.length ? { $in: organizationIds } : null;
|
|
32
|
+
}
|
|
33
|
+
async function queryAssigneeRecords(deps, userIds, entityId) {
|
|
34
|
+
const organizationScope = organizationFilter(deps);
|
|
35
|
+
if (!deps.tenantId || !userIds.length || !entityId) return [];
|
|
36
|
+
if (!deps.organizationId && !organizationScope) return [];
|
|
37
|
+
const queryEngine = deps.container.resolve("queryEngine");
|
|
38
|
+
const result = await queryEngine.query(entityId, {
|
|
39
|
+
tenantId: deps.tenantId,
|
|
40
|
+
filters: {
|
|
41
|
+
id: { $in: userIds.slice(0, ASSIGNEE_NAME_LOOKUP_LIMIT) },
|
|
42
|
+
...organizationScope ? { organization_id: organizationScope } : {},
|
|
43
|
+
deleted_at: null,
|
|
44
|
+
is_confirmed: true
|
|
45
|
+
},
|
|
46
|
+
fields: ["id", "name", "email", "tenant_id", "organization_id", "is_confirmed"],
|
|
47
|
+
page: { page: 1, pageSize: ASSIGNEE_NAME_LOOKUP_LIMIT }
|
|
48
|
+
});
|
|
49
|
+
return (result.items ?? []).map(toRecord).filter((record) => record !== null);
|
|
50
|
+
}
|
|
51
|
+
function attachAssigneeOrganizationId(record, organizationId) {
|
|
52
|
+
Object.defineProperty(record, assigneeOrganizationId, { value: organizationId, enumerable: false });
|
|
53
|
+
return record;
|
|
54
|
+
}
|
|
55
|
+
function collectAssigneeUserIds(items) {
|
|
56
|
+
const ids = /* @__PURE__ */ new Set();
|
|
57
|
+
for (const item of items) {
|
|
58
|
+
const record = toRecord(item);
|
|
59
|
+
if (!record) continue;
|
|
60
|
+
const value = record.assigneeUserId;
|
|
61
|
+
if (typeof value === "string" && value.length) ids.add(value);
|
|
62
|
+
if (ids.size >= ASSIGNEE_NAME_LOOKUP_LIMIT) break;
|
|
63
|
+
}
|
|
64
|
+
return [...ids];
|
|
65
|
+
}
|
|
66
|
+
async function resolveAssigneeDisplayNames(deps, userIds, entityId = resolveAuthUserEntityId()) {
|
|
67
|
+
const names = /* @__PURE__ */ new Map();
|
|
68
|
+
try {
|
|
69
|
+
const records = await queryAssigneeRecords(deps, userIds, entityId);
|
|
70
|
+
for (const record of records) {
|
|
71
|
+
const id = record.id;
|
|
72
|
+
if (typeof id !== "string" || !id.length) continue;
|
|
73
|
+
const displayName = toDisplayName(record);
|
|
74
|
+
if (displayName) names.set(id, displayName);
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
return names;
|
|
78
|
+
}
|
|
79
|
+
return names;
|
|
80
|
+
}
|
|
81
|
+
async function isAssignableStaffUser(deps, userId, entityId = resolveStaffMemberEntityId()) {
|
|
82
|
+
if (!deps.tenantId || !deps.organizationId || !userId || !entityId) return false;
|
|
83
|
+
try {
|
|
84
|
+
const queryEngine = deps.container.resolve("queryEngine");
|
|
85
|
+
const result = await queryEngine.query(entityId, {
|
|
86
|
+
tenantId: deps.tenantId,
|
|
87
|
+
filters: {
|
|
88
|
+
user_id: userId,
|
|
89
|
+
organization_id: deps.organizationId,
|
|
90
|
+
deleted_at: null,
|
|
91
|
+
is_active: true
|
|
92
|
+
},
|
|
93
|
+
fields: ["id", "user_id", "organization_id", "is_active"],
|
|
94
|
+
page: { page: 1, pageSize: 1 }
|
|
95
|
+
});
|
|
96
|
+
if (!result.items?.length) return false;
|
|
97
|
+
const names = await resolveAssigneeDisplayNames(deps, [userId]);
|
|
98
|
+
return names.has(userId);
|
|
99
|
+
} catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function decorateItemsWithAssigneeNames(items, deps) {
|
|
104
|
+
const records = items.map(toRecord).filter((record) => record !== null);
|
|
105
|
+
if (!records.length) return;
|
|
106
|
+
for (const record of records) {
|
|
107
|
+
if (!("assigneeName" in record)) record.assigneeName = null;
|
|
108
|
+
}
|
|
109
|
+
const userIds = collectAssigneeUserIds(records);
|
|
110
|
+
if (!userIds.length) return;
|
|
111
|
+
if (deps.organizationId) {
|
|
112
|
+
const names = await resolveAssigneeDisplayNames(deps, userIds);
|
|
113
|
+
if (!names.size) return;
|
|
114
|
+
for (const record of records) {
|
|
115
|
+
const assigneeUserId = record.assigneeUserId;
|
|
116
|
+
if (typeof assigneeUserId === "string" && names.has(assigneeUserId)) {
|
|
117
|
+
record.assigneeName = names.get(assigneeUserId) ?? null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const recordOrganizationIds = Array.from(new Set(records.map(readOrganizationId).filter((id) => id !== null)));
|
|
124
|
+
const lookupDeps = deps.organizationIds === null ? { ...deps, organizationIds: recordOrganizationIds } : deps;
|
|
125
|
+
const assignees = await queryAssigneeRecords(lookupDeps, userIds, resolveAuthUserEntityId());
|
|
126
|
+
const namesByOrganizationAndUser = /* @__PURE__ */ new Map();
|
|
127
|
+
for (const assignee of assignees) {
|
|
128
|
+
const userId = assignee.id;
|
|
129
|
+
const organizationId = readOrganizationId(assignee);
|
|
130
|
+
const displayName = toDisplayName(assignee);
|
|
131
|
+
if (typeof userId === "string" && organizationId && displayName) {
|
|
132
|
+
namesByOrganizationAndUser.set(`${organizationId}:${userId}`, displayName);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const record of records) {
|
|
136
|
+
const userId = record.assigneeUserId;
|
|
137
|
+
const organizationId = readOrganizationId(record);
|
|
138
|
+
if (typeof userId !== "string" || !organizationId) continue;
|
|
139
|
+
record.assigneeName = namesByOrganizationAndUser.get(`${organizationId}:${userId}`) ?? null;
|
|
140
|
+
}
|
|
141
|
+
} catch {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
ASSIGNEE_NAME_LOOKUP_LIMIT,
|
|
147
|
+
attachAssigneeOrganizationId,
|
|
148
|
+
collectAssigneeUserIds,
|
|
149
|
+
decorateItemsWithAssigneeNames,
|
|
150
|
+
isAssignableStaffUser,
|
|
151
|
+
resolveAssigneeDisplayNames
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=assigneeNames.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/warranty_claims/lib/assigneeNames.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { QueryEngine } from '@open-mercato/shared/lib/query/types'\nimport { E } from '#generated/entities.ids.generated'\nimport { readSafeDecryptedString } from './decryptionSafety'\n\nexport const ASSIGNEE_NAME_LOOKUP_LIMIT = 100\n\nexport type AssigneeNameLookupDeps = {\n container: { resolve: (name: string) => unknown }\n tenantId: string | null\n organizationId: string | null\n organizationIds?: readonly string[] | null\n}\n\nconst assigneeOrganizationId = Symbol('warranty_claims.assigneeOrganizationId')\n\nfunction toRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : null\n}\n\nfunction resolveAuthUserEntityId(): EntityId | null {\n const registry = E as unknown as Record<string, Record<string, string> | undefined>\n const value = registry.auth?.user\n return typeof value === 'string' ? (value as EntityId) : null\n}\n\nfunction resolveStaffMemberEntityId(): EntityId | null {\n const registry = E as unknown as Record<string, Record<string, string> | undefined>\n const value = registry.staff?.staff_team_member\n return typeof value === 'string' ? (value as EntityId) : null\n}\n\nfunction toDisplayName(record: Record<string, unknown>): string | null {\n return readSafeDecryptedString(record.name) ?? readSafeDecryptedString(record.email)\n}\n\nfunction readOrganizationId(record: Record<string, unknown>): string | null {\n const hidden = (record as Record<PropertyKey, unknown>)[assigneeOrganizationId]\n if (typeof hidden === 'string' && hidden.length) return hidden\n const value = record.organizationId ?? record.organization_id\n return typeof value === 'string' && value.length ? value : null\n}\n\nfunction organizationFilter(deps: AssigneeNameLookupDeps): string | { $in: string[] } | null {\n if (deps.organizationId) return deps.organizationId\n if (!Array.isArray(deps.organizationIds)) return null\n const organizationIds = Array.from(new Set(deps.organizationIds.filter((id) => typeof id === 'string' && id.length)))\n return organizationIds.length ? { $in: organizationIds } : null\n}\n\nasync function queryAssigneeRecords(\n deps: AssigneeNameLookupDeps,\n userIds: string[],\n entityId: EntityId | null,\n): Promise<Record<string, unknown>[]> {\n const organizationScope = organizationFilter(deps)\n if (!deps.tenantId || !userIds.length || !entityId) return []\n if (!deps.organizationId && !organizationScope) return []\n const queryEngine = deps.container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<Record<string, unknown>>(entityId, {\n tenantId: deps.tenantId,\n filters: {\n id: { $in: userIds.slice(0, ASSIGNEE_NAME_LOOKUP_LIMIT) },\n ...(organizationScope ? { organization_id: organizationScope } : {}),\n deleted_at: null,\n is_confirmed: true,\n },\n fields: ['id', 'name', 'email', 'tenant_id', 'organization_id', 'is_confirmed'],\n page: { page: 1, pageSize: ASSIGNEE_NAME_LOOKUP_LIMIT },\n })\n return (result.items ?? []).map(toRecord).filter((record): record is Record<string, unknown> => record !== null)\n}\n\nexport function attachAssigneeOrganizationId<T extends Record<string, unknown>>(record: T, organizationId: string | null): T {\n Object.defineProperty(record, assigneeOrganizationId, { value: organizationId, enumerable: false })\n return record\n}\n\nexport function collectAssigneeUserIds(items: readonly unknown[]): string[] {\n const ids = new Set<string>()\n for (const item of items) {\n const record = toRecord(item)\n if (!record) continue\n const value = record.assigneeUserId\n if (typeof value === 'string' && value.length) ids.add(value)\n if (ids.size >= ASSIGNEE_NAME_LOOKUP_LIMIT) break\n }\n return [...ids]\n}\n\nexport async function resolveAssigneeDisplayNames(\n deps: AssigneeNameLookupDeps,\n userIds: string[],\n entityId: EntityId | null = resolveAuthUserEntityId(),\n): Promise<Map<string, string>> {\n const names = new Map<string, string>()\n try {\n const records = await queryAssigneeRecords(deps, userIds, entityId)\n for (const record of records) {\n const id = record.id\n if (typeof id !== 'string' || !id.length) continue\n const displayName = toDisplayName(record)\n if (displayName) names.set(id, displayName)\n }\n } catch {\n return names\n }\n return names\n}\n\nexport async function isAssignableStaffUser(\n deps: AssigneeNameLookupDeps,\n userId: string,\n entityId: EntityId | null = resolveStaffMemberEntityId(),\n): Promise<boolean> {\n if (!deps.tenantId || !deps.organizationId || !userId || !entityId) return false\n try {\n const queryEngine = deps.container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<Record<string, unknown>>(entityId, {\n tenantId: deps.tenantId,\n filters: {\n user_id: userId,\n organization_id: deps.organizationId,\n deleted_at: null,\n is_active: true,\n },\n fields: ['id', 'user_id', 'organization_id', 'is_active'],\n page: { page: 1, pageSize: 1 },\n })\n if (!result.items?.length) return false\n const names = await resolveAssigneeDisplayNames(deps, [userId])\n return names.has(userId)\n } catch {\n return false\n }\n}\n\nexport async function decorateItemsWithAssigneeNames(\n items: readonly unknown[],\n deps: AssigneeNameLookupDeps,\n): Promise<void> {\n const records = items.map(toRecord).filter((record): record is Record<string, unknown> => record !== null)\n if (!records.length) return\n for (const record of records) {\n if (!('assigneeName' in record)) record.assigneeName = null\n }\n const userIds = collectAssigneeUserIds(records)\n if (!userIds.length) return\n if (deps.organizationId) {\n const names = await resolveAssigneeDisplayNames(deps, userIds)\n if (!names.size) return\n for (const record of records) {\n const assigneeUserId = record.assigneeUserId\n if (typeof assigneeUserId === 'string' && names.has(assigneeUserId)) {\n record.assigneeName = names.get(assigneeUserId) ?? null\n }\n }\n return\n }\n try {\n const recordOrganizationIds = Array.from(new Set(records.map(readOrganizationId).filter((id): id is string => id !== null)))\n const lookupDeps = deps.organizationIds === null\n ? { ...deps, organizationIds: recordOrganizationIds }\n : deps\n const assignees = await queryAssigneeRecords(lookupDeps, userIds, resolveAuthUserEntityId())\n const namesByOrganizationAndUser = new Map<string, string>()\n for (const assignee of assignees) {\n const userId = assignee.id\n const organizationId = readOrganizationId(assignee)\n const displayName = toDisplayName(assignee)\n if (typeof userId === 'string' && organizationId && displayName) {\n namesByOrganizationAndUser.set(`${organizationId}:${userId}`, displayName)\n }\n }\n for (const record of records) {\n const userId = record.assigneeUserId\n const organizationId = readOrganizationId(record)\n if (typeof userId !== 'string' || !organizationId) continue\n record.assigneeName = namesByOrganizationAndUser.get(`${organizationId}:${userId}`) ?? null\n }\n } catch {\n return\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const CUSTOMER_VISIBLE_ATTACHMENT_TAG = "customer-visible";
|
|
2
|
+
function isCustomerVisibleAttachment(metadataTags) {
|
|
3
|
+
return Array.isArray(metadataTags) && metadataTags.includes(CUSTOMER_VISIBLE_ATTACHMENT_TAG);
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
CUSTOMER_VISIBLE_ATTACHMENT_TAG,
|
|
7
|
+
isCustomerVisibleAttachment
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=attachmentVisibility.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/warranty_claims/lib/attachmentVisibility.ts"],
|
|
4
|
+
"sourcesContent": ["export const CUSTOMER_VISIBLE_ATTACHMENT_TAG = 'customer-visible'\n\nexport function isCustomerVisibleAttachment(metadataTags: string[] | undefined): boolean {\n return Array.isArray(metadataTags) && metadataTags.includes(CUSTOMER_VISIBLE_ATTACHMENT_TAG)\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,kCAAkC;AAExC,SAAS,4BAA4B,cAA6C;AACvF,SAAO,MAAM,QAAQ,YAAY,KAAK,aAAa,SAAS,+BAA+B;AAC7F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
function appendSkippedBulkCount(summary, skipped, t) {
|
|
2
|
+
if (skipped <= 0) return summary;
|
|
3
|
+
return `${summary} ${t("warranty_claims.bulk.skipped", "{skipped} skipped.", { skipped })}`;
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
appendSkippedBulkCount
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=bulkFeedback.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/warranty_claims/lib/bulkFeedback.ts"],
|
|
4
|
+
"sourcesContent": ["import type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\n\nexport function appendSkippedBulkCount(summary: string, skipped: number, t: TranslateFn): string {\n if (skipped <= 0) return summary\n return `${summary} ${t('warranty_claims.bulk.skipped', '{skipped} skipped.', { skipped })}`\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAAS,uBAAuB,SAAiB,SAAiB,GAAwB;AAC/F,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO,GAAG,OAAO,IAAI,EAAE,gCAAgC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAC3F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
const DAY_MS = 24 * 60 * 60 * 1e3;
|
|
2
|
+
const MINUTE_MS = 60 * 1e3;
|
|
3
|
+
const DAY_MINUTES = 24 * 60;
|
|
4
|
+
const WEEKDAYS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
|
|
5
|
+
function toRecord(value) {
|
|
6
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
7
|
+
}
|
|
8
|
+
function wallClockMillisBetween(start, end) {
|
|
9
|
+
return Math.max(0, end.getTime() - start.getTime());
|
|
10
|
+
}
|
|
11
|
+
function resolveTimezone(value) {
|
|
12
|
+
if (typeof value !== "string" || value.trim().length === 0) return "UTC";
|
|
13
|
+
const timezone = value.trim();
|
|
14
|
+
try {
|
|
15
|
+
new Intl.DateTimeFormat("en-US", { timeZone: timezone }).format(/* @__PURE__ */ new Date());
|
|
16
|
+
return timezone;
|
|
17
|
+
} catch {
|
|
18
|
+
return "UTC";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function formatterFor(timezone) {
|
|
22
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
23
|
+
timeZone: timezone,
|
|
24
|
+
year: "numeric",
|
|
25
|
+
month: "2-digit",
|
|
26
|
+
day: "2-digit",
|
|
27
|
+
hour: "2-digit",
|
|
28
|
+
minute: "2-digit",
|
|
29
|
+
second: "2-digit",
|
|
30
|
+
hourCycle: "h23"
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function datePartsInTimezone(date, timezone) {
|
|
34
|
+
const parts = formatterFor(timezone).formatToParts(date);
|
|
35
|
+
const getPart = (type) => {
|
|
36
|
+
const value = parts.find((part) => part.type === type)?.value;
|
|
37
|
+
return value ? Number(value) : 0;
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
year: getPart("year"),
|
|
41
|
+
month: getPart("month"),
|
|
42
|
+
day: getPart("day"),
|
|
43
|
+
hour: getPart("hour"),
|
|
44
|
+
minute: getPart("minute"),
|
|
45
|
+
second: getPart("second"),
|
|
46
|
+
millisecond: date.getUTCMilliseconds()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function timezoneOffsetMs(date, timezone) {
|
|
50
|
+
const parts = datePartsInTimezone(date, timezone);
|
|
51
|
+
const localAsUtc = Date.UTC(
|
|
52
|
+
parts.year,
|
|
53
|
+
parts.month - 1,
|
|
54
|
+
parts.day,
|
|
55
|
+
parts.hour,
|
|
56
|
+
parts.minute,
|
|
57
|
+
parts.second,
|
|
58
|
+
parts.millisecond
|
|
59
|
+
);
|
|
60
|
+
return localAsUtc - date.getTime();
|
|
61
|
+
}
|
|
62
|
+
function zonedLocalToUtc(parts, timezone) {
|
|
63
|
+
const localAsUtc = Date.UTC(
|
|
64
|
+
parts.year,
|
|
65
|
+
parts.month - 1,
|
|
66
|
+
parts.day,
|
|
67
|
+
parts.hour,
|
|
68
|
+
parts.minute,
|
|
69
|
+
parts.second,
|
|
70
|
+
parts.millisecond
|
|
71
|
+
);
|
|
72
|
+
const firstOffset = timezoneOffsetMs(new Date(localAsUtc), timezone);
|
|
73
|
+
const firstCandidate = localAsUtc - firstOffset;
|
|
74
|
+
const secondOffset = timezoneOffsetMs(new Date(firstCandidate), timezone);
|
|
75
|
+
return new Date(localAsUtc - secondOffset);
|
|
76
|
+
}
|
|
77
|
+
function dateKeyFromParts(parts) {
|
|
78
|
+
return [
|
|
79
|
+
String(parts.year).padStart(4, "0"),
|
|
80
|
+
String(parts.month).padStart(2, "0"),
|
|
81
|
+
String(parts.day).padStart(2, "0")
|
|
82
|
+
].join("-");
|
|
83
|
+
}
|
|
84
|
+
function dateKeyFromDayStamp(dayStamp) {
|
|
85
|
+
const date = new Date(dayStamp);
|
|
86
|
+
return dateKeyFromParts({
|
|
87
|
+
year: date.getUTCFullYear(),
|
|
88
|
+
month: date.getUTCMonth() + 1,
|
|
89
|
+
day: date.getUTCDate()
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function weekdayFromDayStamp(dayStamp) {
|
|
93
|
+
return WEEKDAYS[new Date(dayStamp).getUTCDay()];
|
|
94
|
+
}
|
|
95
|
+
function localDayStamp(date, timezone) {
|
|
96
|
+
const parts = datePartsInTimezone(date, timezone);
|
|
97
|
+
return Date.UTC(parts.year, parts.month - 1, parts.day);
|
|
98
|
+
}
|
|
99
|
+
function parseTime(value) {
|
|
100
|
+
if (typeof value !== "string") return null;
|
|
101
|
+
const match = /^(\d{1,2}):(\d{2})(?::(\d{2}))?$/.exec(value.trim());
|
|
102
|
+
if (!match) return null;
|
|
103
|
+
const hour = Number(match[1]);
|
|
104
|
+
const minute = Number(match[2]);
|
|
105
|
+
const second = match[3] ? Number(match[3]) : 0;
|
|
106
|
+
if (!Number.isInteger(hour) || !Number.isInteger(minute) || !Number.isInteger(second)) return null;
|
|
107
|
+
if (minute < 0 || minute > 59 || second !== 0) return null;
|
|
108
|
+
if (hour === 24 && minute === 0 && second === 0) return DAY_MINUTES;
|
|
109
|
+
if (hour < 0 || hour > 23) return null;
|
|
110
|
+
return hour * 60 + minute;
|
|
111
|
+
}
|
|
112
|
+
function parseIntervals(value) {
|
|
113
|
+
if (!Array.isArray(value)) return [];
|
|
114
|
+
const intervals = [];
|
|
115
|
+
for (const rawInterval of value) {
|
|
116
|
+
const interval = toRecord(rawInterval);
|
|
117
|
+
if (!interval) continue;
|
|
118
|
+
const startMinutes = parseTime(interval.start);
|
|
119
|
+
const endMinutes = parseTime(interval.end);
|
|
120
|
+
if (startMinutes === null || endMinutes === null || endMinutes <= startMinutes) continue;
|
|
121
|
+
intervals.push({ startMinutes, endMinutes });
|
|
122
|
+
}
|
|
123
|
+
const sorted = intervals.sort((left, right) => left.startMinutes - right.startMinutes);
|
|
124
|
+
const merged = [];
|
|
125
|
+
for (const interval of sorted) {
|
|
126
|
+
const previous = merged[merged.length - 1];
|
|
127
|
+
if (!previous || interval.startMinutes > previous.endMinutes) {
|
|
128
|
+
merged.push({ ...interval });
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
previous.endMinutes = Math.max(previous.endMinutes, interval.endMinutes);
|
|
132
|
+
}
|
|
133
|
+
return merged;
|
|
134
|
+
}
|
|
135
|
+
function parseHolidays(value) {
|
|
136
|
+
if (!Array.isArray(value)) return /* @__PURE__ */ new Set();
|
|
137
|
+
return new Set(
|
|
138
|
+
value.filter((item) => typeof item === "string" && /^\d{4}-\d{2}-\d{2}$/.test(item))
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function allDayWeek() {
|
|
142
|
+
return new Map(WEEKDAYS.map((weekday) => [weekday, [{ startMinutes: 0, endMinutes: DAY_MINUTES }]]));
|
|
143
|
+
}
|
|
144
|
+
function hasAnyInterval(week) {
|
|
145
|
+
for (const intervals of week.values()) {
|
|
146
|
+
if (intervals.length > 0) return true;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function normalizeCalendar(config) {
|
|
151
|
+
const record = toRecord(config);
|
|
152
|
+
if (!record) return null;
|
|
153
|
+
const timezone = resolveTimezone(record.timezone);
|
|
154
|
+
const holidays = parseHolidays(record.holidays);
|
|
155
|
+
const rawWeek = toRecord(record.week);
|
|
156
|
+
const week = /* @__PURE__ */ new Map();
|
|
157
|
+
if (rawWeek) {
|
|
158
|
+
for (const weekday of WEEKDAYS) {
|
|
159
|
+
week.set(weekday, parseIntervals(rawWeek[weekday]));
|
|
160
|
+
}
|
|
161
|
+
if (!hasAnyInterval(week)) return null;
|
|
162
|
+
} else if (holidays.size > 0) {
|
|
163
|
+
return { timezone, holidays, week: allDayWeek() };
|
|
164
|
+
} else {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
return { timezone, holidays, week };
|
|
168
|
+
}
|
|
169
|
+
function localDateTimeForDay(dayStamp, minuteOfDay, timezone) {
|
|
170
|
+
const dayOffset = Math.floor(minuteOfDay / DAY_MINUTES);
|
|
171
|
+
const minutes = minuteOfDay % DAY_MINUTES;
|
|
172
|
+
const date = new Date(dayStamp + dayOffset * DAY_MS);
|
|
173
|
+
return zonedLocalToUtc({
|
|
174
|
+
year: date.getUTCFullYear(),
|
|
175
|
+
month: date.getUTCMonth() + 1,
|
|
176
|
+
day: date.getUTCDate(),
|
|
177
|
+
hour: Math.floor(minutes / 60),
|
|
178
|
+
minute: minutes % 60,
|
|
179
|
+
second: 0,
|
|
180
|
+
millisecond: 0
|
|
181
|
+
}, timezone);
|
|
182
|
+
}
|
|
183
|
+
function businessMillisBetween(start, end, config) {
|
|
184
|
+
if (!(start instanceof Date) || !(end instanceof Date)) return 0;
|
|
185
|
+
if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return 0;
|
|
186
|
+
if (end.getTime() <= start.getTime()) return 0;
|
|
187
|
+
const calendar = normalizeCalendar(config);
|
|
188
|
+
if (!calendar) return wallClockMillisBetween(start, end);
|
|
189
|
+
const firstDay = localDayStamp(start, calendar.timezone);
|
|
190
|
+
const lastDay = localDayStamp(end, calendar.timezone);
|
|
191
|
+
let elapsed = 0;
|
|
192
|
+
for (let dayStamp = firstDay; dayStamp <= lastDay; dayStamp += DAY_MS) {
|
|
193
|
+
const dateKey = dateKeyFromDayStamp(dayStamp);
|
|
194
|
+
if (calendar.holidays.has(dateKey)) continue;
|
|
195
|
+
const intervals = calendar.week.get(weekdayFromDayStamp(dayStamp)) ?? [];
|
|
196
|
+
for (const interval of intervals) {
|
|
197
|
+
const intervalStart = localDateTimeForDay(dayStamp, interval.startMinutes, calendar.timezone);
|
|
198
|
+
const intervalEnd = localDateTimeForDay(dayStamp, interval.endMinutes, calendar.timezone);
|
|
199
|
+
const overlapStart = Math.max(start.getTime(), intervalStart.getTime());
|
|
200
|
+
const overlapEnd = Math.min(end.getTime(), intervalEnd.getTime());
|
|
201
|
+
if (overlapEnd > overlapStart) elapsed += overlapEnd - overlapStart;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return elapsed;
|
|
205
|
+
}
|
|
206
|
+
function slaProgressPct(submittedAt, now, slaHours, config) {
|
|
207
|
+
if (!Number.isFinite(slaHours) || slaHours <= 0) return 0;
|
|
208
|
+
const elapsed = businessMillisBetween(submittedAt, now, config);
|
|
209
|
+
return elapsed / (slaHours * 60 * 60 * 1e3) * 100;
|
|
210
|
+
}
|
|
211
|
+
const ADD_BUSINESS_MILLIS_HORIZON_DAYS = 3660;
|
|
212
|
+
function addBusinessMillis(start, durationMillis, config) {
|
|
213
|
+
if (!(start instanceof Date) || !Number.isFinite(start.getTime())) return start;
|
|
214
|
+
if (!Number.isFinite(durationMillis) || durationMillis <= 0) return new Date(start.getTime());
|
|
215
|
+
const calendar = normalizeCalendar(config);
|
|
216
|
+
if (!calendar) return new Date(start.getTime() + durationMillis);
|
|
217
|
+
let remaining = durationMillis;
|
|
218
|
+
let dayStamp = localDayStamp(start, calendar.timezone);
|
|
219
|
+
const startMs = start.getTime();
|
|
220
|
+
for (let dayIndex = 0; dayIndex < ADD_BUSINESS_MILLIS_HORIZON_DAYS; dayIndex += 1, dayStamp += DAY_MS) {
|
|
221
|
+
const dateKey = dateKeyFromDayStamp(dayStamp);
|
|
222
|
+
if (calendar.holidays.has(dateKey)) continue;
|
|
223
|
+
const intervals = calendar.week.get(weekdayFromDayStamp(dayStamp)) ?? [];
|
|
224
|
+
for (const interval of intervals) {
|
|
225
|
+
const intervalStart = localDateTimeForDay(dayStamp, interval.startMinutes, calendar.timezone).getTime();
|
|
226
|
+
const intervalEnd = localDateTimeForDay(dayStamp, interval.endMinutes, calendar.timezone).getTime();
|
|
227
|
+
const usableStart = Math.max(startMs, intervalStart);
|
|
228
|
+
if (intervalEnd <= usableStart) continue;
|
|
229
|
+
const available = intervalEnd - usableStart;
|
|
230
|
+
if (available >= remaining) return new Date(usableStart + remaining);
|
|
231
|
+
remaining -= available;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return new Date(startMs + durationMillis);
|
|
235
|
+
}
|
|
236
|
+
function slaProgressPctFromDue(now, slaDueAt, slaHours, config) {
|
|
237
|
+
if (!Number.isFinite(slaHours) || slaHours <= 0) return 0;
|
|
238
|
+
const totalMillis = slaHours * 60 * 60 * 1e3;
|
|
239
|
+
if (now.getTime() >= slaDueAt.getTime()) {
|
|
240
|
+
return 100 + businessMillisBetween(slaDueAt, now, config) / totalMillis * 100;
|
|
241
|
+
}
|
|
242
|
+
return Math.max(0, 100 - businessMillisBetween(now, slaDueAt, config) / totalMillis * 100);
|
|
243
|
+
}
|
|
244
|
+
export {
|
|
245
|
+
addBusinessMillis,
|
|
246
|
+
businessMillisBetween,
|
|
247
|
+
slaProgressPct,
|
|
248
|
+
slaProgressPctFromDue
|
|
249
|
+
};
|
|
250
|
+
//# sourceMappingURL=businessHours.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/warranty_claims/lib/businessHours.ts"],
|
|
4
|
+
"sourcesContent": ["const DAY_MS = 24 * 60 * 60 * 1000\nconst MINUTE_MS = 60 * 1000\nconst DAY_MINUTES = 24 * 60\n\nconst WEEKDAYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] as const\n\nexport type BusinessWeekday = (typeof WEEKDAYS)[number]\n\nexport type BusinessHoursInterval = {\n start: string\n end: string\n}\n\nexport type BusinessHoursConfig = Record<string, unknown> & {\n timezone?: string\n week?: Partial<Record<BusinessWeekday, BusinessHoursInterval[]>>\n holidays?: string[]\n}\n\ntype TimeInterval = {\n startMinutes: number\n endMinutes: number\n}\n\ntype LocalParts = {\n year: number\n month: number\n day: number\n hour: number\n minute: number\n second: number\n millisecond: number\n}\n\ntype NormalizedCalendar = {\n timezone: string\n holidays: Set<string>\n week: Map<BusinessWeekday, TimeInterval[]>\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : null\n}\n\nfunction wallClockMillisBetween(start: Date, end: Date): number {\n return Math.max(0, end.getTime() - start.getTime())\n}\n\nfunction resolveTimezone(value: unknown): string {\n if (typeof value !== 'string' || value.trim().length === 0) return 'UTC'\n const timezone = value.trim()\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(new Date())\n return timezone\n } catch {\n return 'UTC'\n }\n}\n\nfunction formatterFor(timezone: string): Intl.DateTimeFormat {\n return new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n })\n}\n\nfunction datePartsInTimezone(date: Date, timezone: string): LocalParts {\n const parts = formatterFor(timezone).formatToParts(date)\n const getPart = (type: Intl.DateTimeFormatPartTypes): number => {\n const value = parts.find((part) => part.type === type)?.value\n return value ? Number(value) : 0\n }\n return {\n year: getPart('year'),\n month: getPart('month'),\n day: getPart('day'),\n hour: getPart('hour'),\n minute: getPart('minute'),\n second: getPart('second'),\n millisecond: date.getUTCMilliseconds(),\n }\n}\n\nfunction timezoneOffsetMs(date: Date, timezone: string): number {\n const parts = datePartsInTimezone(date, timezone)\n const localAsUtc = Date.UTC(\n parts.year,\n parts.month - 1,\n parts.day,\n parts.hour,\n parts.minute,\n parts.second,\n parts.millisecond,\n )\n return localAsUtc - date.getTime()\n}\n\nfunction zonedLocalToUtc(parts: LocalParts, timezone: string): Date {\n const localAsUtc = Date.UTC(\n parts.year,\n parts.month - 1,\n parts.day,\n parts.hour,\n parts.minute,\n parts.second,\n parts.millisecond,\n )\n const firstOffset = timezoneOffsetMs(new Date(localAsUtc), timezone)\n const firstCandidate = localAsUtc - firstOffset\n const secondOffset = timezoneOffsetMs(new Date(firstCandidate), timezone)\n return new Date(localAsUtc - secondOffset)\n}\n\nfunction dateKeyFromParts(parts: Pick<LocalParts, 'year' | 'month' | 'day'>): string {\n return [\n String(parts.year).padStart(4, '0'),\n String(parts.month).padStart(2, '0'),\n String(parts.day).padStart(2, '0'),\n ].join('-')\n}\n\nfunction dateKeyFromDayStamp(dayStamp: number): string {\n const date = new Date(dayStamp)\n return dateKeyFromParts({\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1,\n day: date.getUTCDate(),\n })\n}\n\nfunction weekdayFromDayStamp(dayStamp: number): BusinessWeekday {\n return WEEKDAYS[new Date(dayStamp).getUTCDay()]\n}\n\nfunction localDayStamp(date: Date, timezone: string): number {\n const parts = datePartsInTimezone(date, timezone)\n return Date.UTC(parts.year, parts.month - 1, parts.day)\n}\n\nfunction parseTime(value: unknown): number | null {\n if (typeof value !== 'string') return null\n const match = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec(value.trim())\n if (!match) return null\n const hour = Number(match[1])\n const minute = Number(match[2])\n const second = match[3] ? Number(match[3]) : 0\n if (!Number.isInteger(hour) || !Number.isInteger(minute) || !Number.isInteger(second)) return null\n if (minute < 0 || minute > 59 || second !== 0) return null\n if (hour === 24 && minute === 0 && second === 0) return DAY_MINUTES\n if (hour < 0 || hour > 23) return null\n return hour * 60 + minute\n}\n\nfunction parseIntervals(value: unknown): TimeInterval[] {\n if (!Array.isArray(value)) return []\n const intervals: TimeInterval[] = []\n for (const rawInterval of value) {\n const interval = toRecord(rawInterval)\n if (!interval) continue\n const startMinutes = parseTime(interval.start)\n const endMinutes = parseTime(interval.end)\n if (startMinutes === null || endMinutes === null || endMinutes <= startMinutes) continue\n intervals.push({ startMinutes, endMinutes })\n }\n const sorted = intervals.sort((left, right) => left.startMinutes - right.startMinutes)\n const merged: TimeInterval[] = []\n for (const interval of sorted) {\n const previous = merged[merged.length - 1]\n if (!previous || interval.startMinutes > previous.endMinutes) {\n merged.push({ ...interval })\n continue\n }\n previous.endMinutes = Math.max(previous.endMinutes, interval.endMinutes)\n }\n return merged\n}\n\nfunction parseHolidays(value: unknown): Set<string> {\n if (!Array.isArray(value)) return new Set()\n return new Set(\n value.filter((item): item is string => typeof item === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(item)),\n )\n}\n\nfunction allDayWeek(): Map<BusinessWeekday, TimeInterval[]> {\n return new Map(WEEKDAYS.map((weekday) => [weekday, [{ startMinutes: 0, endMinutes: DAY_MINUTES }]]))\n}\n\nfunction hasAnyInterval(week: Map<BusinessWeekday, TimeInterval[]>): boolean {\n for (const intervals of week.values()) {\n if (intervals.length > 0) return true\n }\n return false\n}\n\nfunction normalizeCalendar(config: BusinessHoursConfig | null | undefined): NormalizedCalendar | null {\n const record = toRecord(config)\n if (!record) return null\n\n const timezone = resolveTimezone(record.timezone)\n const holidays = parseHolidays(record.holidays)\n const rawWeek = toRecord(record.week)\n const week = new Map<BusinessWeekday, TimeInterval[]>()\n if (rawWeek) {\n for (const weekday of WEEKDAYS) {\n week.set(weekday, parseIntervals(rawWeek[weekday]))\n }\n if (!hasAnyInterval(week)) return null\n } else if (holidays.size > 0) {\n return { timezone, holidays, week: allDayWeek() }\n } else {\n return null\n }\n\n return { timezone, holidays, week }\n}\n\nfunction localDateTimeForDay(dayStamp: number, minuteOfDay: number, timezone: string): Date {\n const dayOffset = Math.floor(minuteOfDay / DAY_MINUTES)\n const minutes = minuteOfDay % DAY_MINUTES\n const date = new Date(dayStamp + dayOffset * DAY_MS)\n return zonedLocalToUtc({\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1,\n day: date.getUTCDate(),\n hour: Math.floor(minutes / 60),\n minute: minutes % 60,\n second: 0,\n millisecond: 0,\n }, timezone)\n}\n\nexport function businessMillisBetween(\n start: Date,\n end: Date,\n config: BusinessHoursConfig | null | undefined,\n): number {\n if (!(start instanceof Date) || !(end instanceof Date)) return 0\n if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return 0\n if (end.getTime() <= start.getTime()) return 0\n\n const calendar = normalizeCalendar(config)\n if (!calendar) return wallClockMillisBetween(start, end)\n\n const firstDay = localDayStamp(start, calendar.timezone)\n const lastDay = localDayStamp(end, calendar.timezone)\n let elapsed = 0\n\n for (let dayStamp = firstDay; dayStamp <= lastDay; dayStamp += DAY_MS) {\n const dateKey = dateKeyFromDayStamp(dayStamp)\n if (calendar.holidays.has(dateKey)) continue\n\n const intervals = calendar.week.get(weekdayFromDayStamp(dayStamp)) ?? []\n for (const interval of intervals) {\n const intervalStart = localDateTimeForDay(dayStamp, interval.startMinutes, calendar.timezone)\n const intervalEnd = localDateTimeForDay(dayStamp, interval.endMinutes, calendar.timezone)\n const overlapStart = Math.max(start.getTime(), intervalStart.getTime())\n const overlapEnd = Math.min(end.getTime(), intervalEnd.getTime())\n if (overlapEnd > overlapStart) elapsed += overlapEnd - overlapStart\n }\n }\n\n return elapsed\n}\n\nexport function slaProgressPct(\n submittedAt: Date,\n now: Date,\n slaHours: number,\n config: BusinessHoursConfig | null | undefined,\n): number {\n if (!Number.isFinite(slaHours) || slaHours <= 0) return 0\n const elapsed = businessMillisBetween(submittedAt, now, config)\n return (elapsed / (slaHours * 60 * 60 * 1000)) * 100\n}\n\nconst ADD_BUSINESS_MILLIS_HORIZON_DAYS = 3660\n\nexport function addBusinessMillis(\n start: Date,\n durationMillis: number,\n config: BusinessHoursConfig | null | undefined,\n): Date {\n if (!(start instanceof Date) || !Number.isFinite(start.getTime())) return start\n if (!Number.isFinite(durationMillis) || durationMillis <= 0) return new Date(start.getTime())\n\n const calendar = normalizeCalendar(config)\n if (!calendar) return new Date(start.getTime() + durationMillis)\n\n let remaining = durationMillis\n let dayStamp = localDayStamp(start, calendar.timezone)\n const startMs = start.getTime()\n\n for (let dayIndex = 0; dayIndex < ADD_BUSINESS_MILLIS_HORIZON_DAYS; dayIndex += 1, dayStamp += DAY_MS) {\n const dateKey = dateKeyFromDayStamp(dayStamp)\n if (calendar.holidays.has(dateKey)) continue\n\n const intervals = calendar.week.get(weekdayFromDayStamp(dayStamp)) ?? []\n for (const interval of intervals) {\n const intervalStart = localDateTimeForDay(dayStamp, interval.startMinutes, calendar.timezone).getTime()\n const intervalEnd = localDateTimeForDay(dayStamp, interval.endMinutes, calendar.timezone).getTime()\n const usableStart = Math.max(startMs, intervalStart)\n if (intervalEnd <= usableStart) continue\n const available = intervalEnd - usableStart\n if (available >= remaining) return new Date(usableStart + remaining)\n remaining -= available\n }\n }\n\n // Degenerate calendar (e.g. every future day marked as a holiday) \u2014 fall back\n // to wall clock past the horizon instead of looping forever.\n return new Date(startMs + durationMillis)\n}\n\nexport function slaProgressPctFromDue(\n now: Date,\n slaDueAt: Date,\n slaHours: number,\n config: BusinessHoursConfig | null | undefined,\n): number {\n if (!Number.isFinite(slaHours) || slaHours <= 0) return 0\n const totalMillis = slaHours * 60 * 60 * 1000\n if (now.getTime() >= slaDueAt.getTime()) {\n return 100 + (businessMillisBetween(slaDueAt, now, config) / totalMillis) * 100\n }\n return Math.max(0, 100 - (businessMillisBetween(now, slaDueAt, config) / totalMillis) * 100)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const BUSINESS_HOURS_WEEKDAYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
|
|
2
|
+
const BUSINESS_HOURS_DAY_MINUTES = 24 * 60;
|
|
3
|
+
const BUSINESS_HOURS_DEFAULT_START = "09:00";
|
|
4
|
+
const BUSINESS_HOURS_DEFAULT_END = "17:00";
|
|
5
|
+
const BUSINESS_HOURS_HOLIDAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
6
|
+
function isRecord(value) {
|
|
7
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function stringifyJsonValue(value) {
|
|
10
|
+
if (value === null) return "";
|
|
11
|
+
const serialized = JSON.stringify(value, null, 2);
|
|
12
|
+
return typeof serialized === "string" ? serialized : "";
|
|
13
|
+
}
|
|
14
|
+
let businessHoursRowSeq = 0;
|
|
15
|
+
function nextBusinessHoursRowKey() {
|
|
16
|
+
businessHoursRowSeq += 1;
|
|
17
|
+
return `business-hours-${businessHoursRowSeq}`;
|
|
18
|
+
}
|
|
19
|
+
function businessHoursTimeToMinutes(value) {
|
|
20
|
+
const match = /^(\d{1,2}):(\d{2})(?::(\d{2}))?$/.exec(value.trim());
|
|
21
|
+
if (!match) return null;
|
|
22
|
+
const hour = Number(match[1]);
|
|
23
|
+
const minute = Number(match[2]);
|
|
24
|
+
const second = match[3] ? Number(match[3]) : 0;
|
|
25
|
+
if (minute > 59 || second !== 0) return null;
|
|
26
|
+
if (hour === 24 && minute === 0) return BUSINESS_HOURS_DAY_MINUTES;
|
|
27
|
+
if (hour > 23) return null;
|
|
28
|
+
return hour * 60 + minute;
|
|
29
|
+
}
|
|
30
|
+
function formatBusinessHoursTime(minutes) {
|
|
31
|
+
if (minutes === BUSINESS_HOURS_DAY_MINUTES) return "24:00";
|
|
32
|
+
const hour = Math.floor(minutes / 60);
|
|
33
|
+
const minute = minutes % 60;
|
|
34
|
+
return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
|
|
35
|
+
}
|
|
36
|
+
function businessHoursEndTimeToMinutes(value) {
|
|
37
|
+
const minutes = businessHoursTimeToMinutes(value);
|
|
38
|
+
if (minutes === 0) return BUSINESS_HOURS_DAY_MINUTES;
|
|
39
|
+
return minutes;
|
|
40
|
+
}
|
|
41
|
+
function formatBusinessHoursEndTimeForInput(minutes) {
|
|
42
|
+
if (minutes === BUSINESS_HOURS_DAY_MINUTES) return "00:00";
|
|
43
|
+
return formatBusinessHoursTime(minutes);
|
|
44
|
+
}
|
|
45
|
+
function normalizeBusinessHoursEndTime(value) {
|
|
46
|
+
return businessHoursEndTimeToMinutes(value) === BUSINESS_HOURS_DAY_MINUTES ? "24:00" : value;
|
|
47
|
+
}
|
|
48
|
+
function createBusinessHoursIntervalRow(start = BUSINESS_HOURS_DEFAULT_START, end = BUSINESS_HOURS_DEFAULT_END) {
|
|
49
|
+
return { key: nextBusinessHoursRowKey(), start, end };
|
|
50
|
+
}
|
|
51
|
+
function parseBusinessHoursIntervalRows(value) {
|
|
52
|
+
if (!Array.isArray(value)) return [];
|
|
53
|
+
const intervals = [];
|
|
54
|
+
for (const rawInterval of value) {
|
|
55
|
+
if (!isRecord(rawInterval)) continue;
|
|
56
|
+
const startMinutes = typeof rawInterval.start === "string" ? businessHoursTimeToMinutes(rawInterval.start) : null;
|
|
57
|
+
const endMinutes = typeof rawInterval.end === "string" ? businessHoursEndTimeToMinutes(rawInterval.end) : null;
|
|
58
|
+
if (startMinutes === null || endMinutes === null || endMinutes <= startMinutes) continue;
|
|
59
|
+
intervals.push({ startMinutes, endMinutes });
|
|
60
|
+
}
|
|
61
|
+
return intervals.sort((left, right) => left.startMinutes - right.startMinutes).map((interval) => createBusinessHoursIntervalRow(
|
|
62
|
+
formatBusinessHoursTime(interval.startMinutes),
|
|
63
|
+
formatBusinessHoursEndTimeForInput(interval.endMinutes)
|
|
64
|
+
));
|
|
65
|
+
}
|
|
66
|
+
function buildBusinessHoursFormValue(record) {
|
|
67
|
+
const source = isRecord(record) ? record : null;
|
|
68
|
+
const rawWeek = source && isRecord(source.week) ? source.week : null;
|
|
69
|
+
const days = BUSINESS_HOURS_WEEKDAYS.map((weekday) => {
|
|
70
|
+
const intervals = rawWeek ? parseBusinessHoursIntervalRows(rawWeek[weekday]) : [];
|
|
71
|
+
return {
|
|
72
|
+
weekday,
|
|
73
|
+
enabled: intervals.length > 0,
|
|
74
|
+
intervals: intervals.length ? intervals : [createBusinessHoursIntervalRow()]
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const holidays = Array.isArray(source?.holidays) ? source.holidays.filter((item) => typeof item === "string" && BUSINESS_HOURS_HOLIDAY_PATTERN.test(item)).map((date) => ({ key: nextBusinessHoursRowKey(), date })) : [];
|
|
78
|
+
const extras = {};
|
|
79
|
+
if (source) {
|
|
80
|
+
for (const [key, entry] of Object.entries(source)) {
|
|
81
|
+
if (key === "timezone" || key === "week" || key === "holidays") continue;
|
|
82
|
+
extras[key] = entry;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
timezone: typeof source?.timezone === "string" ? source.timezone.trim() : "",
|
|
87
|
+
days,
|
|
88
|
+
holidays,
|
|
89
|
+
extras,
|
|
90
|
+
raw: stringifyJsonValue(source),
|
|
91
|
+
rawDirty: false
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function serializeBusinessHoursRecord(value) {
|
|
95
|
+
const result = { ...value.extras };
|
|
96
|
+
const timezone = value.timezone.trim();
|
|
97
|
+
if (timezone) result.timezone = timezone;
|
|
98
|
+
const week = {};
|
|
99
|
+
for (const day of value.days) {
|
|
100
|
+
if (!day.enabled) continue;
|
|
101
|
+
const intervals = day.intervals.map((interval) => ({ start: interval.start.trim(), end: normalizeBusinessHoursEndTime(interval.end.trim()) })).filter((interval) => interval.start.length > 0 || interval.end.length > 0);
|
|
102
|
+
if (intervals.length) week[day.weekday] = intervals;
|
|
103
|
+
}
|
|
104
|
+
if (Object.keys(week).length) result.week = week;
|
|
105
|
+
const holidays = Array.from(new Set(
|
|
106
|
+
value.holidays.map((row) => row.date.trim()).filter((date) => BUSINESS_HOURS_HOLIDAY_PATTERN.test(date))
|
|
107
|
+
));
|
|
108
|
+
if (holidays.length) result.holidays = holidays;
|
|
109
|
+
return Object.keys(result).length ? result : null;
|
|
110
|
+
}
|
|
111
|
+
function validateBusinessHoursValue(value, translations) {
|
|
112
|
+
if (value.rawDirty) return { ok: false, reason: "json" };
|
|
113
|
+
const rowErrors = {};
|
|
114
|
+
for (const day of value.days) {
|
|
115
|
+
if (!day.enabled) continue;
|
|
116
|
+
for (const interval of day.intervals) {
|
|
117
|
+
const startMinutes = businessHoursTimeToMinutes(interval.start);
|
|
118
|
+
const endMinutes = businessHoursEndTimeToMinutes(interval.end);
|
|
119
|
+
if (startMinutes === null || endMinutes === null || startMinutes >= BUSINESS_HOURS_DAY_MINUTES || endMinutes <= startMinutes) {
|
|
120
|
+
rowErrors[interval.key] = translations.error.window;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (const holiday of value.holidays) {
|
|
125
|
+
if (!BUSINESS_HOURS_HOLIDAY_PATTERN.test(holiday.date.trim())) {
|
|
126
|
+
rowErrors[holiday.key] = translations.error.holiday;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (Object.keys(rowErrors).length) return { ok: false, reason: "rows", rowErrors };
|
|
130
|
+
return { ok: true, value: serializeBusinessHoursRecord(value) };
|
|
131
|
+
}
|
|
132
|
+
export {
|
|
133
|
+
buildBusinessHoursFormValue,
|
|
134
|
+
businessHoursEndTimeToMinutes,
|
|
135
|
+
businessHoursTimeToMinutes,
|
|
136
|
+
createBusinessHoursIntervalRow,
|
|
137
|
+
formatBusinessHoursEndTimeForInput,
|
|
138
|
+
formatBusinessHoursTime,
|
|
139
|
+
nextBusinessHoursRowKey,
|
|
140
|
+
normalizeBusinessHoursEndTime,
|
|
141
|
+
parseBusinessHoursIntervalRows,
|
|
142
|
+
serializeBusinessHoursRecord,
|
|
143
|
+
stringifyJsonValue,
|
|
144
|
+
validateBusinessHoursValue
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=businessHoursForm.js.map
|