@open-mercato/core 0.4.5-develop-5191db4ef3 → 0.4.5-develop-033a719bf2
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/dist/generated/entities/message/index.js +65 -0
- package/dist/generated/entities/message/index.js.map +7 -0
- package/dist/generated/entities/message_access_token/index.js +19 -0
- package/dist/generated/entities/message_access_token/index.js.map +7 -0
- package/dist/generated/entities/message_confirmation/index.js +21 -0
- package/dist/generated/entities/message_confirmation/index.js.map +7 -0
- package/dist/generated/entities/message_object/index.js +23 -0
- package/dist/generated/entities/message_object/index.js.map +7 -0
- package/dist/generated/entities/message_recipient/index.js +31 -0
- package/dist/generated/entities/message_recipient/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +8 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +10 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +27 -8
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/lib/messageObjectPreviews.js +131 -0
- package/dist/modules/customers/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/customers/message-objects.js +71 -0
- package/dist/modules/customers/message-objects.js.map +7 -0
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js +51 -0
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js.map +7 -0
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js +35 -0
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js.map +7 -0
- package/dist/modules/customers/widgets/messages/index.js +7 -0
- package/dist/modules/customers/widgets/messages/index.js.map +7 -0
- package/dist/modules/messages/acl.js +15 -0
- package/dist/modules/messages/acl.js.map +7 -0
- package/dist/modules/messages/api/[id]/actions/[actionId]/route.js +92 -0
- package/dist/modules/messages/api/[id]/actions/[actionId]/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/archive/route.js +120 -0
- package/dist/modules/messages/api/[id]/archive/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/attachments/route.js +195 -0
- package/dist/modules/messages/api/[id]/attachments/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/confirmation/route.js +67 -0
- package/dist/modules/messages/api/[id]/confirmation/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/conversation/archive/route.js +68 -0
- package/dist/modules/messages/api/[id]/conversation/archive/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/conversation/read/route.js +68 -0
- package/dist/modules/messages/api/[id]/conversation/read/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/conversation/route.js +68 -0
- package/dist/modules/messages/api/[id]/conversation/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/forward/route.js +85 -0
- package/dist/modules/messages/api/[id]/forward/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/forward-preview/route.js +70 -0
- package/dist/modules/messages/api/[id]/forward-preview/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/read/route.js +120 -0
- package/dist/modules/messages/api/[id]/read/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/reply/route.js +87 -0
- package/dist/modules/messages/api/[id]/reply/route.js.map +7 -0
- package/dist/modules/messages/api/[id]/route.js +350 -0
- package/dist/modules/messages/api/[id]/route.js.map +7 -0
- package/dist/modules/messages/api/object-types/route.js +54 -0
- package/dist/modules/messages/api/object-types/route.js.map +7 -0
- package/dist/modules/messages/api/openapi.js +261 -0
- package/dist/modules/messages/api/openapi.js.map +7 -0
- package/dist/modules/messages/api/route.js +262 -0
- package/dist/modules/messages/api/route.js.map +7 -0
- package/dist/modules/messages/api/token/[token]/route.js +99 -0
- package/dist/modules/messages/api/token/[token]/route.js.map +7 -0
- package/dist/modules/messages/api/types/route.js +40 -0
- package/dist/modules/messages/api/types/route.js.map +7 -0
- package/dist/modules/messages/api/unread-count/route.js +43 -0
- package/dist/modules/messages/api/unread-count/route.js.map +7 -0
- package/dist/modules/messages/backend/messages/[id]/page.js +10 -0
- package/dist/modules/messages/backend/messages/[id]/page.js.map +7 -0
- package/dist/modules/messages/backend/messages/[id]/page.meta.js +16 -0
- package/dist/modules/messages/backend/messages/[id]/page.meta.js.map +7 -0
- package/dist/modules/messages/backend/messages/compose/page.js +10 -0
- package/dist/modules/messages/backend/messages/compose/page.js.map +7 -0
- package/dist/modules/messages/backend/messages/compose/page.meta.js +17 -0
- package/dist/modules/messages/backend/messages/compose/page.meta.js.map +7 -0
- package/dist/modules/messages/backend/page.js +10 -0
- package/dist/modules/messages/backend/page.js.map +7 -0
- package/dist/modules/messages/backend/page.meta.js +33 -0
- package/dist/modules/messages/backend/page.meta.js.map +7 -0
- package/dist/modules/messages/commands/actions.js +265 -0
- package/dist/modules/messages/commands/actions.js.map +7 -0
- package/dist/modules/messages/commands/attachments.js +217 -0
- package/dist/modules/messages/commands/attachments.js.map +7 -0
- package/dist/modules/messages/commands/confirmations.js +151 -0
- package/dist/modules/messages/commands/confirmations.js.map +7 -0
- package/dist/modules/messages/commands/conversation.js +240 -0
- package/dist/modules/messages/commands/conversation.js.map +7 -0
- package/dist/modules/messages/commands/messages.js +748 -0
- package/dist/modules/messages/commands/messages.js.map +7 -0
- package/dist/modules/messages/commands/recipients.js +259 -0
- package/dist/modules/messages/commands/recipients.js.map +7 -0
- package/dist/modules/messages/commands/shared.js +258 -0
- package/dist/modules/messages/commands/shared.js.map +7 -0
- package/dist/modules/messages/commands/tokens.js +69 -0
- package/dist/modules/messages/commands/tokens.js.map +7 -0
- package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -0
- package/dist/modules/messages/components/ComposeMessagePageClient.js.map +7 -0
- package/dist/modules/messages/components/MessageDetailPageClient.js +261 -0
- package/dist/modules/messages/components/MessageDetailPageClient.js.map +7 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js +390 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +7 -0
- package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js +31 -0
- package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js.map +7 -0
- package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js +69 -0
- package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js.map +7 -0
- package/dist/modules/messages/components/defaults/DefaultMessageActions.js +31 -0
- package/dist/modules/messages/components/defaults/DefaultMessageActions.js.map +7 -0
- package/dist/modules/messages/components/defaults/DefaultMessageContent.js +19 -0
- package/dist/modules/messages/components/defaults/DefaultMessageContent.js.map +7 -0
- package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +90 -0
- package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +7 -0
- package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +86 -0
- package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +7 -0
- package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +61 -0
- package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +7 -0
- package/dist/modules/messages/components/message-detail/detail-panels.js +27 -0
- package/dist/modules/messages/components/message-detail/detail-panels.js.map +7 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js +52 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js.map +7 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js +289 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js.map +7 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +103 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +7 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js +78 -0
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js +94 -0
- package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +110 -0
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +58 -0
- package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/actions-panel.js +51 -0
- package/dist/modules/messages/components/message-detail/panels/actions-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +66 -0
- package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/body-panel.js +20 -0
- package/dist/modules/messages/components/message-detail/panels/body-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js +36 -0
- package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/dialogs.js +96 -0
- package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/index.js +25 -0
- package/dist/modules/messages/components/message-detail/panels/index.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/meta-panel.js +14 -0
- package/dist/modules/messages/components/message-detail/panels/meta-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/objects-panel.js +51 -0
- package/dist/modules/messages/components/message-detail/panels/objects-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +54 -0
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +7 -0
- package/dist/modules/messages/components/message-detail/types.js +1 -0
- package/dist/modules/messages/components/message-detail/types.js.map +7 -0
- package/dist/modules/messages/components/message-detail/utils.js +54 -0
- package/dist/modules/messages/components/message-detail/utils.js.map +7 -0
- package/dist/modules/messages/components/utils/PriorityBadge.js +52 -0
- package/dist/modules/messages/components/utils/PriorityBadge.js.map +7 -0
- package/dist/modules/messages/components/utils/typeUiRegistry.js +77 -0
- package/dist/modules/messages/components/utils/typeUiRegistry.js.map +7 -0
- package/dist/modules/messages/data/entities.js +309 -0
- package/dist/modules/messages/data/entities.js.map +7 -0
- package/dist/modules/messages/data/validators.js +272 -0
- package/dist/modules/messages/data/validators.js.map +7 -0
- package/dist/modules/messages/emails/MessageEmail.js +108 -0
- package/dist/modules/messages/emails/MessageEmail.js.map +7 -0
- package/dist/modules/messages/events.js +24 -0
- package/dist/modules/messages/events.js.map +7 -0
- package/dist/modules/messages/frontend/messages/view/[token]/page.js +247 -0
- package/dist/modules/messages/frontend/messages/view/[token]/page.js.map +7 -0
- package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js +9 -0
- package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js.map +7 -0
- package/dist/modules/messages/index.js +21 -0
- package/dist/modules/messages/index.js.map +7 -0
- package/dist/modules/messages/lib/actions.js +141 -0
- package/dist/modules/messages/lib/actions.js.map +7 -0
- package/dist/modules/messages/lib/attachments.js +131 -0
- package/dist/modules/messages/lib/attachments.js.map +7 -0
- package/dist/modules/messages/lib/constants.js +7 -0
- package/dist/modules/messages/lib/constants.js.map +7 -0
- package/dist/modules/messages/lib/email-sender.js +201 -0
- package/dist/modules/messages/lib/email-sender.js.map +7 -0
- package/dist/modules/messages/lib/forwarding.js +179 -0
- package/dist/modules/messages/lib/forwarding.js.map +7 -0
- package/dist/modules/messages/lib/message-objects-registry.js +49 -0
- package/dist/modules/messages/lib/message-objects-registry.js.map +7 -0
- package/dist/modules/messages/lib/message-types-registry.js +41 -0
- package/dist/modules/messages/lib/message-types-registry.js.map +7 -0
- package/dist/modules/messages/lib/object-validation.js +20 -0
- package/dist/modules/messages/lib/object-validation.js.map +7 -0
- package/dist/modules/messages/lib/operationMetadata.js +21 -0
- package/dist/modules/messages/lib/operationMetadata.js.map +7 -0
- package/dist/modules/messages/lib/priorityUtils.js +61 -0
- package/dist/modules/messages/lib/priorityUtils.js.map +7 -0
- package/dist/modules/messages/lib/routeHelpers.js +44 -0
- package/dist/modules/messages/lib/routeHelpers.js.map +7 -0
- package/dist/modules/messages/message-objects.js +7 -0
- package/dist/modules/messages/message-objects.js.map +7 -0
- package/dist/modules/messages/message-types.js +67 -0
- package/dist/modules/messages/message-types.js.map +7 -0
- package/dist/modules/messages/migrations/Migration20260213181243.js +31 -0
- package/dist/modules/messages/migrations/Migration20260213181243.js.map +7 -0
- package/dist/modules/messages/migrations/Migration20260215165126.js +16 -0
- package/dist/modules/messages/migrations/Migration20260215165126.js.map +7 -0
- package/dist/modules/messages/notifications.js +27 -0
- package/dist/modules/messages/notifications.js.map +7 -0
- package/dist/modules/messages/setup.js +21 -0
- package/dist/modules/messages/setup.js.map +7 -0
- package/dist/modules/messages/subscribers/message-notification.js +108 -0
- package/dist/modules/messages/subscribers/message-notification.js.map +7 -0
- package/dist/modules/messages/workers/send-email.worker.js +253 -0
- package/dist/modules/messages/workers/send-email.worker.js.map +7 -0
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +30 -11
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/payments.js +12 -6
- package/dist/modules/sales/commands/payments.js.map +2 -2
- package/dist/modules/sales/lib/messageObjectPreviews.js +114 -0
- package/dist/modules/sales/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/sales/message-objects.js +57 -0
- package/dist/modules/sales/message-objects.js.map +7 -0
- package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +51 -0
- package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +7 -0
- package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +36 -0
- package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +7 -0
- package/dist/modules/sales/widgets/messages/index.js +7 -0
- package/dist/modules/sales/widgets/messages/index.js.map +7 -0
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +55 -1
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +60 -1
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +2 -19
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestDetail.js +112 -0
- package/dist/modules/staff/components/LeaveRequestDetail.js.map +7 -0
- package/dist/modules/staff/components/LeaveRequestForm.js +3 -1
- package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestPreview.js +43 -0
- package/dist/modules/staff/components/LeaveRequestPreview.js.map +7 -0
- package/dist/modules/staff/lib/messageObjectPreviews.js +148 -0
- package/dist/modules/staff/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/staff/message-objects.js +104 -0
- package/dist/modules/staff/message-objects.js.map +7 -0
- package/dist/modules/staff/message-types.js +23 -0
- package/dist/modules/staff/message-types.js.map +7 -0
- package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js +51 -0
- package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js.map +7 -0
- package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js +34 -0
- package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js.map +7 -0
- package/dist/modules/staff/widgets/messages/index.js +7 -0
- package/dist/modules/staff/widgets/messages/index.js.map +7 -0
- package/generated/entities/message/index.ts +31 -0
- package/generated/entities/message_access_token/index.ts +8 -0
- package/generated/entities/message_confirmation/index.ts +9 -0
- package/generated/entities/message_object/index.ts +10 -0
- package/generated/entities/message_recipient/index.ts +14 -0
- package/generated/entities.ids.generated.ts +8 -0
- package/generated/entity-fields-registry.ts +10 -0
- package/jest.setup.ts +5 -0
- package/package.json +2 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +20 -4
- package/src/modules/customers/i18n/de.json +4 -0
- package/src/modules/customers/i18n/en.json +4 -0
- package/src/modules/customers/i18n/es.json +4 -0
- package/src/modules/customers/i18n/pl.json +4 -0
- package/src/modules/customers/lib/messageObjectPreviews.ts +154 -0
- package/src/modules/customers/message-objects.ts +70 -0
- package/src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx +57 -0
- package/src/modules/customers/widgets/messages/CustomerMessageObjectPreview.tsx +49 -0
- package/src/modules/customers/widgets/messages/index.ts +2 -0
- package/src/modules/messages/acl.ts +11 -0
- package/src/modules/messages/api/[id]/actions/[actionId]/route.ts +103 -0
- package/src/modules/messages/api/[id]/archive/route.ts +138 -0
- package/src/modules/messages/api/[id]/attachments/route.ts +217 -0
- package/src/modules/messages/api/[id]/confirmation/route.ts +73 -0
- package/src/modules/messages/api/[id]/conversation/archive/route.ts +69 -0
- package/src/modules/messages/api/[id]/conversation/read/route.ts +69 -0
- package/src/modules/messages/api/[id]/conversation/route.ts +69 -0
- package/src/modules/messages/api/[id]/forward/route.ts +87 -0
- package/src/modules/messages/api/[id]/forward-preview/route.ts +75 -0
- package/src/modules/messages/api/[id]/read/route.ts +138 -0
- package/src/modules/messages/api/[id]/reply/route.ts +89 -0
- package/src/modules/messages/api/[id]/route.ts +401 -0
- package/src/modules/messages/api/object-types/route.ts +54 -0
- package/src/modules/messages/api/openapi.ts +261 -0
- package/src/modules/messages/api/route.ts +374 -0
- package/src/modules/messages/api/token/[token]/route.ts +103 -0
- package/src/modules/messages/api/types/route.ts +39 -0
- package/src/modules/messages/api/unread-count/route.ts +55 -0
- package/src/modules/messages/backend/messages/[id]/page.meta.ts +12 -0
- package/src/modules/messages/backend/messages/[id]/page.tsx +12 -0
- package/src/modules/messages/backend/messages/compose/page.meta.ts +13 -0
- package/src/modules/messages/backend/messages/compose/page.tsx +12 -0
- package/src/modules/messages/backend/page.meta.ts +31 -0
- package/src/modules/messages/backend/page.tsx +12 -0
- package/src/modules/messages/commands/actions.ts +307 -0
- package/src/modules/messages/commands/attachments.ts +227 -0
- package/src/modules/messages/commands/confirmations.ts +183 -0
- package/src/modules/messages/commands/conversation.ts +292 -0
- package/src/modules/messages/commands/messages.ts +845 -0
- package/src/modules/messages/commands/recipients.ts +281 -0
- package/src/modules/messages/commands/shared.ts +350 -0
- package/src/modules/messages/commands/tokens.ts +80 -0
- package/src/modules/messages/components/ComposeMessagePageClient.tsx +23 -0
- package/src/modules/messages/components/MessageDetailPageClient.tsx +287 -0
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +469 -0
- package/src/modules/messages/components/confirmation/MessageConfirmationActions.tsx +35 -0
- package/src/modules/messages/components/confirmation/MessageConfirmationContent.tsx +88 -0
- package/src/modules/messages/components/defaults/DefaultMessageActions.tsx +37 -0
- package/src/modules/messages/components/defaults/DefaultMessageContent.tsx +21 -0
- package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +102 -0
- package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +114 -0
- package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +74 -0
- package/src/modules/messages/components/message-detail/detail-panels.ts +13 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetails.ts +56 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsActions.ts +367 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +134 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.ts +102 -0
- package/src/modules/messages/components/message-detail/panels/MainMessageHeader.tsx +108 -0
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +144 -0
- package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +63 -0
- package/src/modules/messages/components/message-detail/panels/actions-panel.tsx +66 -0
- package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +86 -0
- package/src/modules/messages/components/message-detail/panels/body-panel.tsx +32 -0
- package/src/modules/messages/components/message-detail/panels/composer-dialogs.tsx +42 -0
- package/src/modules/messages/components/message-detail/panels/dialogs.tsx +107 -0
- package/src/modules/messages/components/message-detail/panels/index.ts +11 -0
- package/src/modules/messages/components/message-detail/panels/meta-panel.tsx +19 -0
- package/src/modules/messages/components/message-detail/panels/objects-panel.tsx +65 -0
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +65 -0
- package/src/modules/messages/components/message-detail/types.ts +114 -0
- package/src/modules/messages/components/message-detail/utils.ts +62 -0
- package/src/modules/messages/components/utils/PriorityBadge.tsx +63 -0
- package/src/modules/messages/components/utils/typeUiRegistry.ts +106 -0
- package/src/modules/messages/data/entities.ts +284 -0
- package/src/modules/messages/data/validators.ts +297 -0
- package/src/modules/messages/emails/MessageEmail.tsx +143 -0
- package/src/modules/messages/events.ts +24 -0
- package/src/modules/messages/frontend/messages/view/[token]/page.meta.ts +5 -0
- package/src/modules/messages/frontend/messages/view/[token]/page.tsx +389 -0
- package/src/modules/messages/i18n/de.json +240 -0
- package/src/modules/messages/i18n/en.json +240 -0
- package/src/modules/messages/i18n/es.json +240 -0
- package/src/modules/messages/i18n/pl.json +240 -0
- package/src/modules/messages/index.ts +19 -0
- package/src/modules/messages/lib/actions.ts +204 -0
- package/src/modules/messages/lib/attachments.ts +197 -0
- package/src/modules/messages/lib/constants.ts +2 -0
- package/src/modules/messages/lib/email-sender.ts +255 -0
- package/src/modules/messages/lib/forwarding.ts +240 -0
- package/src/modules/messages/lib/message-objects-registry.ts +60 -0
- package/src/modules/messages/lib/message-types-registry.ts +48 -0
- package/src/modules/messages/lib/object-validation.ts +26 -0
- package/src/modules/messages/lib/operationMetadata.ts +43 -0
- package/src/modules/messages/lib/priorityUtils.ts +76 -0
- package/src/modules/messages/lib/routeHelpers.ts +65 -0
- package/src/modules/messages/message-objects.ts +5 -0
- package/src/modules/messages/message-types.ts +65 -0
- package/src/modules/messages/migrations/.snapshot-open-mercato.json +957 -0
- package/src/modules/messages/migrations/Migration20260213181243.ts +34 -0
- package/src/modules/messages/migrations/Migration20260215165126.ts +16 -0
- package/src/modules/messages/notifications.ts +25 -0
- package/src/modules/messages/setup.ts +19 -0
- package/src/modules/messages/subscribers/message-notification.ts +138 -0
- package/src/modules/messages/workers/send-email.worker.ts +321 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +23 -7
- package/src/modules/sales/commands/payments.ts +12 -6
- package/src/modules/sales/i18n/de.json +3 -0
- package/src/modules/sales/i18n/en.json +3 -0
- package/src/modules/sales/i18n/es.json +3 -0
- package/src/modules/sales/i18n/pl.json +3 -0
- package/src/modules/sales/lib/messageObjectPreviews.ts +150 -0
- package/src/modules/sales/message-objects.ts +56 -0
- package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +57 -0
- package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +46 -0
- package/src/modules/sales/widgets/messages/index.ts +2 -0
- package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +54 -0
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +58 -0
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +2 -32
- package/src/modules/staff/components/LeaveRequestDetail.tsx +135 -0
- package/src/modules/staff/components/LeaveRequestForm.tsx +3 -0
- package/src/modules/staff/components/LeaveRequestPreview.tsx +74 -0
- package/src/modules/staff/i18n/de.json +8 -0
- package/src/modules/staff/i18n/en.json +8 -0
- package/src/modules/staff/i18n/es.json +8 -0
- package/src/modules/staff/i18n/pl.json +8 -0
- package/src/modules/staff/lib/messageObjectPreviews.ts +182 -0
- package/src/modules/staff/message-objects.ts +102 -0
- package/src/modules/staff/message-types.ts +21 -0
- package/src/modules/staff/widgets/messages/StaffMessageObjectDetail.tsx +57 -0
- package/src/modules/staff/widgets/messages/StaffMessageObjectPreview.tsx +44 -0
- package/src/modules/staff/widgets/messages/index.ts +2 -0
|
@@ -431,21 +431,27 @@ const updatePaymentCommand = {
|
|
|
431
431
|
},
|
|
432
432
|
async execute(rawInput, ctx) {
|
|
433
433
|
const input = paymentUpdateSchema.parse(rawInput ?? {});
|
|
434
|
-
ensureTenantScope(ctx, input.tenantId);
|
|
435
|
-
ensureOrganizationScope(ctx, input.organizationId);
|
|
436
434
|
const em = ctx.container.resolve("em").fork();
|
|
437
435
|
const { translate } = await resolveTranslations();
|
|
436
|
+
const scopeSeed = assertFound(
|
|
437
|
+
await em.findOne(SalesPayment, { id: input.id }),
|
|
438
|
+
"sales.payments.not_found"
|
|
439
|
+
);
|
|
440
|
+
const resolvedTenantId = input.tenantId ?? scopeSeed.tenantId;
|
|
441
|
+
const resolvedOrganizationId = input.organizationId ?? scopeSeed.organizationId;
|
|
442
|
+
ensureTenantScope(ctx, resolvedTenantId);
|
|
443
|
+
ensureOrganizationScope(ctx, resolvedOrganizationId);
|
|
438
444
|
const payment = assertFound(
|
|
439
445
|
await findOneWithDecryption(
|
|
440
446
|
em,
|
|
441
447
|
SalesPayment,
|
|
442
448
|
{ id: input.id },
|
|
443
449
|
{ populate: ["order"] },
|
|
444
|
-
{ tenantId:
|
|
450
|
+
{ tenantId: resolvedTenantId, organizationId: resolvedOrganizationId }
|
|
445
451
|
),
|
|
446
452
|
"sales.payments.not_found"
|
|
447
453
|
);
|
|
448
|
-
ensureSameScope(payment,
|
|
454
|
+
ensureSameScope(payment, resolvedOrganizationId, resolvedTenantId);
|
|
449
455
|
const previousOrder = payment.order;
|
|
450
456
|
if (input.orderId !== void 0) {
|
|
451
457
|
if (!input.orderId) {
|
|
@@ -455,7 +461,7 @@ const updatePaymentCommand = {
|
|
|
455
461
|
await em.findOne(SalesOrder, { id: input.orderId }),
|
|
456
462
|
"sales.payments.order_not_found"
|
|
457
463
|
);
|
|
458
|
-
ensureSameScope(order,
|
|
464
|
+
ensureSameScope(order, resolvedOrganizationId, resolvedTenantId);
|
|
459
465
|
if (order.currencyCode && input.currencyCode && order.currencyCode.toUpperCase() !== input.currencyCode.toUpperCase()) {
|
|
460
466
|
throw new CrudHttpError(400, {
|
|
461
467
|
error: translate("sales.payments.currency_mismatch", "Payment currency must match the order currency.")
|
|
@@ -472,7 +478,7 @@ const updatePaymentCommand = {
|
|
|
472
478
|
await em.findOne(SalesPaymentMethod, { id: input.paymentMethodId }),
|
|
473
479
|
"sales.payments.method_not_found"
|
|
474
480
|
);
|
|
475
|
-
ensureSameScope(method,
|
|
481
|
+
ensureSameScope(method, resolvedOrganizationId, resolvedTenantId);
|
|
476
482
|
payment.paymentMethod = method;
|
|
477
483
|
}
|
|
478
484
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/commands/payments.ts"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { loadCustomFieldValues } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { setRecordCustomFields } from '@open-mercato/core/modules/entities/lib/helpers'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n SalesInvoice,\n SalesOrder,\n SalesOrderLine,\n SalesPayment,\n SalesPaymentAllocation,\n SalesPaymentMethod,\n} from '../data/entities'\nimport {\n paymentCreateSchema,\n paymentUpdateSchema,\n type PaymentCreateInput,\n type PaymentUpdateInput,\n} from '../data/validators'\nimport {\n assertFound,\n cloneJson,\n ensureOrganizationScope,\n ensureSameScope,\n ensureTenantScope,\n extractUndoPayload,\n toNumericString,\n} from './shared'\nimport { resolveDictionaryEntryValue } from '../lib/dictionaries'\nimport { invalidateCrudCache } from '@open-mercato/shared/lib/crud/cache'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport type { CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveNotificationService } from '../../notifications/lib/notificationService'\nimport { buildFeatureNotificationFromType } from '../../notifications/lib/notificationBuilder'\nimport { notificationTypes } from '../notifications'\n\nexport type PaymentAllocationSnapshot = {\n id: string\n orderId: string | null\n invoiceId: string | null\n amount: number\n currencyCode: string\n metadata: Record<string, unknown> | null\n}\n\nexport type PaymentSnapshot = {\n id: string\n orderId: string | null\n organizationId: string\n tenantId: string\n paymentMethodId: string | null\n paymentReference: string | null\n statusEntryId: string | null\n status: string | null\n amount: number\n currencyCode: string\n capturedAmount: number\n refundedAmount: number\n receivedAt: string | null\n capturedAt: string | null\n metadata: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n customFieldSetId?: string | null\n allocations: PaymentAllocationSnapshot[]\n}\n\ntype PaymentUndoPayload = {\n before?: PaymentSnapshot | null\n after?: PaymentSnapshot | null\n}\n\nconst toNumber = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nconst normalizeCustomFieldsInput = (input: unknown): Record<string, unknown> =>\n input && typeof input === 'object' && !Array.isArray(input) ? (input as Record<string, unknown>) : {}\n\nconst paymentCrudEvents: CrudEventsConfig = {\n module: 'sales',\n entity: 'payment',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nconst ORDER_RESOURCE = 'sales.order'\n\nasync function invalidateOrderCache(container: any, order: SalesOrder | null | undefined, tenantId: string | null) {\n if (!order) return\n await invalidateCrudCache(\n container,\n ORDER_RESOURCE,\n { id: order.id, organizationId: order.organizationId, tenantId: order.tenantId },\n tenantId,\n 'updated'\n )\n}\n\nexport async function loadPaymentSnapshot(em: EntityManager, id: string): Promise<PaymentSnapshot | null> {\n const payment = await findOneWithDecryption(\n em,\n SalesPayment,\n { id },\n { populate: ['order', 'allocations', 'allocations.order', 'allocations.invoice'] },\n )\n if (!payment) return null\n const allocations: PaymentAllocationSnapshot[] = Array.from(payment.allocations ?? []).map((allocation) => ({\n id: allocation.id,\n orderId:\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? (allocation as any).order_id ?? null,\n invoiceId:\n typeof allocation.invoice === 'string'\n ? allocation.invoice\n : allocation.invoice?.id ?? (allocation as any).invoice_id ?? null,\n amount: toNumber(allocation.amount),\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n }))\n const customFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.sales.sales_payment,\n recordIds: [payment.id],\n tenantIdByRecord: { [payment.id]: payment.tenantId ?? null },\n organizationIdByRecord: { [payment.id]: payment.organizationId ?? null },\n })\n const customFields = customFieldValues[payment.id]\n const normalizedCustomFields =\n customFields && Object.keys(customFields).length ? customFields : null\n return {\n id: payment.id,\n orderId: typeof payment.order === 'string' ? payment.order : payment.order?.id ?? null,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n paymentMethodId:\n typeof payment.paymentMethod === 'string'\n ? payment.paymentMethod\n : payment.paymentMethod?.id ?? null,\n paymentReference: payment.paymentReference ?? null,\n statusEntryId: payment.statusEntryId ?? null,\n status: payment.status ?? null,\n amount: toNumber(payment.amount),\n currencyCode: payment.currencyCode,\n capturedAmount: toNumber(payment.capturedAmount),\n refundedAmount: toNumber(payment.refundedAmount),\n receivedAt: payment.receivedAt ? payment.receivedAt.toISOString() : null,\n capturedAt: payment.capturedAt ? payment.capturedAt.toISOString() : null,\n metadata: payment.metadata ? cloneJson(payment.metadata) : null,\n customFields: normalizedCustomFields,\n customFieldSetId: (payment as any).customFieldSetId ?? (payment as any).custom_field_set_id ?? null,\n allocations,\n }\n}\n\nexport async function restorePaymentSnapshot(em: EntityManager, snapshot: PaymentSnapshot): Promise<void> {\n const orderRef = snapshot.orderId ? em.getReference(SalesOrder, snapshot.orderId) : null\n const methodRef = snapshot.paymentMethodId\n ? em.getReference(SalesPaymentMethod, snapshot.paymentMethodId)\n : null\n const entity =\n (await em.findOne(SalesPayment, { id: snapshot.id })) ??\n em.create(SalesPayment, {\n id: snapshot.id,\n createdAt: new Date(),\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n })\n entity.order = orderRef\n entity.paymentMethod = methodRef\n entity.organizationId = snapshot.organizationId\n entity.tenantId = snapshot.tenantId\n entity.paymentReference = snapshot.paymentReference\n entity.statusEntryId = snapshot.statusEntryId\n entity.status = snapshot.status\n entity.amount = toNumericString(snapshot.amount) ?? '0'\n entity.currencyCode = snapshot.currencyCode\n entity.capturedAmount = toNumericString(snapshot.capturedAmount) ?? '0'\n entity.refundedAmount = toNumericString(snapshot.refundedAmount) ?? '0'\n entity.receivedAt = snapshot.receivedAt ? new Date(snapshot.receivedAt) : null\n entity.capturedAt = snapshot.capturedAt ? new Date(snapshot.capturedAt) : null\n entity.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null\n entity.customFieldSetId =\n (snapshot as any).customFieldSetId ?? (snapshot as any).custom_field_set_id ?? null\n entity.updatedAt = new Date()\n await em.flush()\n\n if ((snapshot as any).customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n values:\n snapshot.customFields && typeof snapshot.customFields === 'object'\n ? (snapshot.customFields as Record<string, unknown>)\n : {},\n })\n }\n\n const existingAllocations = await em.find(SalesPaymentAllocation, { payment: entity })\n existingAllocations.forEach((allocation) => em.remove(allocation))\n snapshot.allocations.forEach((allocation) => {\n const order =\n allocation.orderId && typeof allocation.orderId === 'string'\n ? em.getReference(SalesOrder, allocation.orderId)\n : null\n const invoice =\n allocation.invoiceId && typeof allocation.invoiceId === 'string'\n ? em.getReference(SalesInvoice, allocation.invoiceId)\n : null\n const newAllocation = em.create(SalesPaymentAllocation, {\n payment: entity,\n order,\n invoice,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(newAllocation)\n })\n em.persist(entity)\n}\n\nasync function recomputeOrderPaymentTotals(\n em: EntityManager,\n order: SalesOrder\n): Promise<{ paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number }> {\n const orderId = order.id\n const scope = { organizationId: order.organizationId, tenantId: order.tenantId }\n\n const allocations = await findWithDecryption(\n em,\n SalesPaymentAllocation,\n { ...scope, order: orderId },\n { populate: ['payment'] },\n scope,\n )\n\n const paymentIds = new Set<string>()\n allocations.forEach((allocation) => {\n const paymentRef = allocation.payment\n const paymentId =\n typeof paymentRef === 'object' && paymentRef !== null\n ? paymentRef.id\n : typeof paymentRef === 'string'\n ? paymentRef\n : null\n if (paymentId) paymentIds.add(paymentId)\n })\n\n const payments =\n paymentIds.size > 0\n ? await em.find(SalesPayment, { id: { $in: Array.from(paymentIds) }, deletedAt: null, ...scope })\n : await em.find(SalesPayment, { order: orderId, deletedAt: null, ...scope })\n\n const resolvePaidAmount = (payment: SalesPayment) => {\n const captured = toNumber(payment.capturedAmount)\n return captured > 0 ? captured : toNumber(payment.amount)\n }\n\n const activePaymentIds = new Set(payments.map((payment) => payment.id))\n const paidTotal =\n allocations.length > 0\n ? allocations.reduce((sum, allocation) => {\n const paymentRef = allocation.payment\n const paymentId =\n typeof paymentRef === 'object' && paymentRef !== null\n ? paymentRef.id\n : typeof paymentRef === 'string'\n ? paymentRef\n : null\n if (paymentId && !activePaymentIds.has(paymentId)) return sum\n return sum + toNumber(allocation.amount)\n }, 0)\n : payments.reduce((sum, payment) => sum + resolvePaidAmount(payment), 0)\n\n const refundedTotal = payments.reduce(\n (sum, payment) => sum + toNumber(payment.refundedAmount),\n 0\n )\n\n const grandTotal = toNumber(order.grandTotalGrossAmount)\n const outstanding = Math.max(grandTotal - paidTotal + refundedTotal, 0)\n order.paidTotalAmount = toNumericString(paidTotal) ?? '0'\n order.refundedTotalAmount = toNumericString(refundedTotal) ?? '0'\n order.outstandingAmount = toNumericString(outstanding) ?? '0'\n return {\n paidTotalAmount: paidTotal,\n refundedTotalAmount: refundedTotal,\n outstandingAmount: outstanding,\n }\n}\n\nconst createPaymentCommand: CommandHandler<\n PaymentCreateInput,\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.create',\n async execute(rawInput, ctx) {\n const input = paymentCreateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { translate } = await resolveTranslations()\n if (!input.orderId) {\n throw new CrudHttpError(400, { error: translate('sales.payments.order_required', 'Order is required for payments.') })\n }\n const order = assertFound(\n await em.findOne(SalesOrder, { id: input.orderId }),\n 'sales.payments.order_not_found'\n )\n ensureSameScope(order, input.organizationId, input.tenantId)\n if (order.deletedAt) {\n throw new CrudHttpError(404, { error: 'sales.payments.order_not_found' })\n }\n if (\n order.currencyCode &&\n input.currencyCode &&\n order.currencyCode.toUpperCase() !== input.currencyCode.toUpperCase()\n ) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.currency_mismatch', 'Payment currency must match the order currency.'),\n })\n }\n let paymentMethod = null\n if (input.paymentMethodId) {\n const method = assertFound(\n await em.findOne(SalesPaymentMethod, { id: input.paymentMethodId }),\n 'sales.payments.method_not_found'\n )\n ensureSameScope(method, input.organizationId, input.tenantId)\n paymentMethod = method\n }\n if (input.documentStatusEntryId !== undefined) {\n const orderStatus = await resolveDictionaryEntryValue(em, input.documentStatusEntryId ?? null)\n if (input.documentStatusEntryId && !orderStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n order.statusEntryId = input.documentStatusEntryId ?? null\n order.status = orderStatus\n order.updatedAt = new Date()\n em.persist(order)\n }\n if (input.lineStatusEntryId !== undefined) {\n const lineStatus = await resolveDictionaryEntryValue(em, input.lineStatusEntryId ?? null)\n if (input.lineStatusEntryId && !lineStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n const orderLines = await em.find(SalesOrderLine, { order })\n orderLines.forEach((line) => {\n line.statusEntryId = input.lineStatusEntryId ?? null\n line.status = lineStatus\n line.updatedAt = new Date()\n })\n orderLines.forEach((line) => em.persist(line))\n }\n const status = await resolveDictionaryEntryValue(em, input.statusEntryId ?? null)\n const payment = em.create(SalesPayment, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n order,\n paymentMethod,\n paymentReference: input.paymentReference ?? null,\n statusEntryId: input.statusEntryId ?? null,\n status,\n amount: toNumericString(input.amount) ?? '0',\n currencyCode: input.currencyCode,\n capturedAmount: toNumericString(input.capturedAmount) ?? '0',\n refundedAmount: toNumericString(input.refundedAmount) ?? '0',\n receivedAt: input.receivedAt ?? null,\n capturedAt: input.capturedAt ?? null,\n metadata: input.metadata ? cloneJson(input.metadata) : null,\n customFieldSetId: input.customFieldSetId ?? null,\n })\n const allocationInputs = Array.isArray(input.allocations) ? input.allocations : []\n const allocations = allocationInputs.length\n ? allocationInputs\n : [\n {\n orderId: input.orderId,\n invoiceId: null,\n amount: input.amount,\n currencyCode: input.currencyCode,\n metadata: null,\n },\n ]\n allocations.forEach((allocation) => {\n const orderRef = allocation.orderId ? em.getReference(SalesOrder, allocation.orderId) : order\n const invoiceRef = allocation.invoiceId ? em.getReference(SalesInvoice, allocation.invoiceId) : null\n const entity = em.create(SalesPaymentAllocation, {\n payment,\n order: orderRef,\n invoice: invoiceRef,\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(entity)\n })\n em.persist(payment)\n if (input.customFields !== undefined) {\n if (!payment.id) {\n await em.flush()\n }\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: payment.id,\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n values: normalizeCustomFieldsInput(input.customFields),\n })\n }\n await em.flush()\n const totals = await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n await invalidateOrderCache(ctx.container, order, ctx.auth?.tenantId ?? null)\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'created',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n\n // Create notification for payment received\n try {\n const notificationService = resolveNotificationService(ctx.container)\n const typeDef = notificationTypes.find((type) => type.type === 'sales.payment.received')\n if (typeDef) {\n const amountDisplay = payment.amount && payment.currencyCode\n ? `${payment.currencyCode} ${payment.amount}`\n : ''\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: 'sales.orders.manage',\n bodyVariables: {\n orderNumber: order.orderNumber ?? '',\n amount: amountDisplay,\n },\n sourceEntityType: 'sales:order',\n sourceEntityId: order.id,\n linkHref: `/backend/sales/orders/${order.id}`,\n })\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: payment.tenantId,\n organizationId: payment.organizationId ?? null,\n })\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error('[sales.payments.create] Failed to create notification:', err)\n }\n\n return { paymentId: payment.id, orderTotals: totals }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.paymentId ? loadPaymentSnapshot(em, result.paymentId) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as PaymentSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.payments.create', 'Create payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: after.orderId ?? null,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: { undo: { after } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await em.findOne(SalesPayment, { id: after.id })\n if (existing) {\n const orderRef =\n typeof existing.order === 'string' ? existing.order : existing.order?.id ?? null\n const allocations = await em.find(SalesPaymentAllocation, { payment: existing })\n const allocationOrders = allocations\n .map((allocation) =>\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? null\n )\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n\n allocations.forEach((allocation) => em.remove(allocation))\n await em.flush()\n\n em.remove(existing)\n await em.flush()\n\n const orderIds = Array.from(\n new Set(\n [\n orderRef,\n ...allocationOrders,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n for (const id of orderIds) {\n const order = await em.findOne(SalesOrder, { id })\n if (!order) continue\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nconst updatePaymentCommand: CommandHandler<\n PaymentUpdateInput,\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.update',\n async prepare(rawInput, ctx) {\n const parsed = paymentUpdateSchema.parse(rawInput ?? {})\n if (!parsed.id) return {}\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadPaymentSnapshot(em, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = paymentUpdateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { translate } = await resolveTranslations()\n const payment = assertFound(\n await findOneWithDecryption(\n em,\n SalesPayment,\n { id: input.id },\n { populate: ['order'] },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n ),\n 'sales.payments.not_found'\n )\n ensureSameScope(payment, input.organizationId, input.tenantId)\n const previousOrder = payment.order as SalesOrder | null\n if (input.orderId !== undefined) {\n if (!input.orderId) {\n payment.order = null\n } else {\n const order = assertFound(\n await em.findOne(SalesOrder, { id: input.orderId }),\n 'sales.payments.order_not_found'\n )\n ensureSameScope(order, input.organizationId, input.tenantId)\n if (\n order.currencyCode &&\n input.currencyCode &&\n order.currencyCode.toUpperCase() !== input.currencyCode.toUpperCase()\n ) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.currency_mismatch', 'Payment currency must match the order currency.'),\n })\n }\n payment.order = order\n }\n }\n if (input.paymentMethodId !== undefined) {\n if (!input.paymentMethodId) {\n payment.paymentMethod = null\n } else {\n const method = assertFound(\n await em.findOne(SalesPaymentMethod, { id: input.paymentMethodId }),\n 'sales.payments.method_not_found'\n )\n ensureSameScope(method, input.organizationId, input.tenantId)\n payment.paymentMethod = method\n }\n }\n const currentOrder = payment.order as SalesOrder | null\n if ((input.documentStatusEntryId !== undefined || input.lineStatusEntryId !== undefined) && !currentOrder) {\n throw new CrudHttpError(400, { error: translate('sales.payments.order_required', 'Order is required for payments.') })\n }\n if (currentOrder && input.documentStatusEntryId !== undefined) {\n const orderStatus = await resolveDictionaryEntryValue(em, input.documentStatusEntryId ?? null)\n if (input.documentStatusEntryId && !orderStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n currentOrder.statusEntryId = input.documentStatusEntryId ?? null\n currentOrder.status = orderStatus\n currentOrder.updatedAt = new Date()\n em.persist(currentOrder)\n }\n if (currentOrder && input.lineStatusEntryId !== undefined) {\n const lineStatus = await resolveDictionaryEntryValue(em, input.lineStatusEntryId ?? null)\n if (input.lineStatusEntryId && !lineStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n const orderLines = await em.find(SalesOrderLine, { order: currentOrder })\n orderLines.forEach((line) => {\n line.statusEntryId = input.lineStatusEntryId ?? null\n line.status = lineStatus\n line.updatedAt = new Date()\n })\n orderLines.forEach((line) => em.persist(line))\n }\n if (input.paymentReference !== undefined) payment.paymentReference = input.paymentReference ?? null\n if (input.statusEntryId !== undefined) {\n payment.statusEntryId = input.statusEntryId ?? null\n payment.status = await resolveDictionaryEntryValue(em, input.statusEntryId ?? null)\n }\n if (input.amount !== undefined) payment.amount = toNumericString(input.amount) ?? '0'\n if (input.currencyCode !== undefined) payment.currencyCode = input.currencyCode\n if (input.capturedAmount !== undefined) {\n payment.capturedAmount = toNumericString(input.capturedAmount) ?? '0'\n }\n if (input.refundedAmount !== undefined) {\n payment.refundedAmount = toNumericString(input.refundedAmount) ?? '0'\n }\n if (input.receivedAt !== undefined) payment.receivedAt = input.receivedAt ?? null\n if (input.capturedAt !== undefined) payment.capturedAt = input.capturedAt ?? null\n if (input.metadata !== undefined) {\n payment.metadata = input.metadata ? cloneJson(input.metadata) : null\n }\n if (input.customFieldSetId !== undefined) {\n payment.customFieldSetId = input.customFieldSetId ?? null\n }\n if (input.customFields !== undefined) {\n if (!payment.id) {\n await em.flush()\n }\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n values: normalizeCustomFieldsInput(input.customFields),\n })\n }\n if (input.allocations !== undefined) {\n const existingAllocations = await em.find(SalesPaymentAllocation, { payment })\n existingAllocations.forEach((allocation) => em.remove(allocation))\n const allocationInputs = Array.isArray(input.allocations) ? input.allocations : []\n allocationInputs.forEach((allocation) => {\n const orderRef =\n allocation.orderId ??\n (typeof payment.order === 'string' ? payment.order : payment.order?.id) ??\n null\n const order =\n orderRef && typeof orderRef === 'string' ? em.getReference(SalesOrder, orderRef) : null\n const invoice = allocation.invoiceId\n ? em.getReference(SalesInvoice, allocation.invoiceId)\n : null\n const entity = em.create(SalesPaymentAllocation, {\n payment,\n order,\n invoice,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(entity)\n })\n }\n payment.updatedAt = new Date()\n await em.flush()\n\n const nextOrder =\n (payment.order as SalesOrder | null) ??\n (typeof payment.order === 'string'\n ? await em.findOne(SalesOrder, { id: payment.order })\n : null)\n let totals: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } | undefined\n if (nextOrder) {\n totals = await recomputeOrderPaymentTotals(em, nextOrder)\n await em.flush()\n await invalidateOrderCache(ctx.container, nextOrder, ctx.auth?.tenantId ?? null)\n }\n if (previousOrder && (!nextOrder || previousOrder.id !== nextOrder.id)) {\n await recomputeOrderPaymentTotals(em, previousOrder)\n await em.flush()\n await invalidateOrderCache(ctx.container, previousOrder, ctx.auth?.tenantId ?? null)\n }\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'updated',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n\n return { paymentId: payment.id, orderTotals: totals }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.paymentId ? loadPaymentSnapshot(em, result.paymentId) : null\n },\n buildLog: async ({ snapshots, result }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as PaymentSnapshot | undefined\n const after = snapshots.after as PaymentSnapshot | undefined\n return {\n actionLabel: translate('sales.audit.payments.update', 'Update payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: after?.orderId ?? before?.orderId ?? null,\n tenantId: after?.tenantId ?? before?.tenantId ?? null,\n organizationId: after?.organizationId ?? before?.organizationId ?? null,\n snapshotBefore: before ?? null,\n snapshotAfter: after ?? null,\n payload: { undo: { before, after } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n await restorePaymentSnapshot(em, before)\n await em.flush()\n if (before.orderId) {\n const order = await em.findOne(SalesOrder, { id: before.orderId })\n if (order) {\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nconst deletePaymentCommand: CommandHandler<\n { id: string; orderId?: string | null; organizationId: string; tenantId: string },\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.delete',\n async prepare(rawInput, ctx) {\n const parsed = paymentUpdateSchema.parse(rawInput ?? {})\n if (!parsed.id) return {}\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadPaymentSnapshot(em, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = paymentUpdateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const payment = assertFound(\n await findOneWithDecryption(\n em,\n SalesPayment,\n { id: input.id },\n { populate: ['order'] },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n ),\n 'sales.payments.not_found'\n )\n ensureSameScope(payment, input.organizationId, input.tenantId)\n const order = payment.order as SalesOrder | null\n const allocations = await em.find(SalesPaymentAllocation, { payment })\n const allocationOrders = allocations\n .map((allocation) =>\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? null\n )\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n allocations.forEach((allocation) => em.remove(allocation))\n await em.flush()\n em.remove(payment)\n await em.flush()\n let totals: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } | undefined\n const orderIds = Array.from(\n new Set(\n [\n order && typeof order === 'object' ? order.id : null,\n ...allocationOrders,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const primaryOrderId = order && typeof order === 'object' ? order.id : null\n for (const orderId of orderIds) {\n const target = typeof order === 'object' && order.id === orderId ? order : await em.findOne(SalesOrder, { id: orderId })\n if (!target) continue\n const recomputed = await recomputeOrderPaymentTotals(em, target)\n if (!totals || (primaryOrderId && orderId === primaryOrderId)) {\n totals = recomputed\n }\n await em.flush()\n await invalidateOrderCache(ctx.container, target, ctx.auth?.tenantId ?? null)\n }\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n if (allocations.length) {\n await Promise.all(\n allocations.map((allocation) =>\n emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: allocation,\n identifiers: {\n id: allocation.id,\n organizationId: allocation.organizationId ?? null,\n tenantId: allocation.tenantId ?? null,\n },\n indexer: { entityType: E.sales.sales_payment_allocation },\n })\n )\n )\n }\n return { paymentId: payment.id, orderTotals: totals }\n },\n buildLog: async ({ snapshots, result }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as PaymentSnapshot | undefined\n return {\n actionLabel: translate('sales.audit.payments.delete', 'Delete payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: before?.orderId ?? null,\n tenantId: before?.tenantId ?? null,\n organizationId: before?.organizationId ?? null,\n snapshotBefore: before ?? null,\n payload: { undo: { before } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n await restorePaymentSnapshot(em, before)\n await em.flush()\n if (before.orderId) {\n const order = await em.findOne(SalesOrder, { id: before.orderId })\n if (order) {\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nexport const paymentCommands = [createPaymentCommand, updatePaymentCommand, deletePaymentCommand]\n\nregisterCommand(createPaymentCommand)\nregisterCommand(updatePaymentCommand)\nregisterCommand(deletePaymentCommand)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { loadCustomFieldValues } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { setRecordCustomFields } from '@open-mercato/core/modules/entities/lib/helpers'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n SalesInvoice,\n SalesOrder,\n SalesOrderLine,\n SalesPayment,\n SalesPaymentAllocation,\n SalesPaymentMethod,\n} from '../data/entities'\nimport {\n paymentCreateSchema,\n paymentUpdateSchema,\n type PaymentCreateInput,\n type PaymentUpdateInput,\n} from '../data/validators'\nimport {\n assertFound,\n cloneJson,\n ensureOrganizationScope,\n ensureSameScope,\n ensureTenantScope,\n extractUndoPayload,\n toNumericString,\n} from './shared'\nimport { resolveDictionaryEntryValue } from '../lib/dictionaries'\nimport { invalidateCrudCache } from '@open-mercato/shared/lib/crud/cache'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport type { CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveNotificationService } from '../../notifications/lib/notificationService'\nimport { buildFeatureNotificationFromType } from '../../notifications/lib/notificationBuilder'\nimport { notificationTypes } from '../notifications'\n\nexport type PaymentAllocationSnapshot = {\n id: string\n orderId: string | null\n invoiceId: string | null\n amount: number\n currencyCode: string\n metadata: Record<string, unknown> | null\n}\n\nexport type PaymentSnapshot = {\n id: string\n orderId: string | null\n organizationId: string\n tenantId: string\n paymentMethodId: string | null\n paymentReference: string | null\n statusEntryId: string | null\n status: string | null\n amount: number\n currencyCode: string\n capturedAmount: number\n refundedAmount: number\n receivedAt: string | null\n capturedAt: string | null\n metadata: Record<string, unknown> | null\n customFields?: Record<string, unknown> | null\n customFieldSetId?: string | null\n allocations: PaymentAllocationSnapshot[]\n}\n\ntype PaymentUndoPayload = {\n before?: PaymentSnapshot | null\n after?: PaymentSnapshot | null\n}\n\nconst toNumber = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nconst normalizeCustomFieldsInput = (input: unknown): Record<string, unknown> =>\n input && typeof input === 'object' && !Array.isArray(input) ? (input as Record<string, unknown>) : {}\n\nconst paymentCrudEvents: CrudEventsConfig = {\n module: 'sales',\n entity: 'payment',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nconst ORDER_RESOURCE = 'sales.order'\n\nasync function invalidateOrderCache(container: any, order: SalesOrder | null | undefined, tenantId: string | null) {\n if (!order) return\n await invalidateCrudCache(\n container,\n ORDER_RESOURCE,\n { id: order.id, organizationId: order.organizationId, tenantId: order.tenantId },\n tenantId,\n 'updated'\n )\n}\n\nexport async function loadPaymentSnapshot(em: EntityManager, id: string): Promise<PaymentSnapshot | null> {\n const payment = await findOneWithDecryption(\n em,\n SalesPayment,\n { id },\n { populate: ['order', 'allocations', 'allocations.order', 'allocations.invoice'] },\n )\n if (!payment) return null\n const allocations: PaymentAllocationSnapshot[] = Array.from(payment.allocations ?? []).map((allocation) => ({\n id: allocation.id,\n orderId:\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? (allocation as any).order_id ?? null,\n invoiceId:\n typeof allocation.invoice === 'string'\n ? allocation.invoice\n : allocation.invoice?.id ?? (allocation as any).invoice_id ?? null,\n amount: toNumber(allocation.amount),\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n }))\n const customFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.sales.sales_payment,\n recordIds: [payment.id],\n tenantIdByRecord: { [payment.id]: payment.tenantId ?? null },\n organizationIdByRecord: { [payment.id]: payment.organizationId ?? null },\n })\n const customFields = customFieldValues[payment.id]\n const normalizedCustomFields =\n customFields && Object.keys(customFields).length ? customFields : null\n return {\n id: payment.id,\n orderId: typeof payment.order === 'string' ? payment.order : payment.order?.id ?? null,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n paymentMethodId:\n typeof payment.paymentMethod === 'string'\n ? payment.paymentMethod\n : payment.paymentMethod?.id ?? null,\n paymentReference: payment.paymentReference ?? null,\n statusEntryId: payment.statusEntryId ?? null,\n status: payment.status ?? null,\n amount: toNumber(payment.amount),\n currencyCode: payment.currencyCode,\n capturedAmount: toNumber(payment.capturedAmount),\n refundedAmount: toNumber(payment.refundedAmount),\n receivedAt: payment.receivedAt ? payment.receivedAt.toISOString() : null,\n capturedAt: payment.capturedAt ? payment.capturedAt.toISOString() : null,\n metadata: payment.metadata ? cloneJson(payment.metadata) : null,\n customFields: normalizedCustomFields,\n customFieldSetId: (payment as any).customFieldSetId ?? (payment as any).custom_field_set_id ?? null,\n allocations,\n }\n}\n\nexport async function restorePaymentSnapshot(em: EntityManager, snapshot: PaymentSnapshot): Promise<void> {\n const orderRef = snapshot.orderId ? em.getReference(SalesOrder, snapshot.orderId) : null\n const methodRef = snapshot.paymentMethodId\n ? em.getReference(SalesPaymentMethod, snapshot.paymentMethodId)\n : null\n const entity =\n (await em.findOne(SalesPayment, { id: snapshot.id })) ??\n em.create(SalesPayment, {\n id: snapshot.id,\n createdAt: new Date(),\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n })\n entity.order = orderRef\n entity.paymentMethod = methodRef\n entity.organizationId = snapshot.organizationId\n entity.tenantId = snapshot.tenantId\n entity.paymentReference = snapshot.paymentReference\n entity.statusEntryId = snapshot.statusEntryId\n entity.status = snapshot.status\n entity.amount = toNumericString(snapshot.amount) ?? '0'\n entity.currencyCode = snapshot.currencyCode\n entity.capturedAmount = toNumericString(snapshot.capturedAmount) ?? '0'\n entity.refundedAmount = toNumericString(snapshot.refundedAmount) ?? '0'\n entity.receivedAt = snapshot.receivedAt ? new Date(snapshot.receivedAt) : null\n entity.capturedAt = snapshot.capturedAt ? new Date(snapshot.capturedAt) : null\n entity.metadata = snapshot.metadata ? cloneJson(snapshot.metadata) : null\n entity.customFieldSetId =\n (snapshot as any).customFieldSetId ?? (snapshot as any).custom_field_set_id ?? null\n entity.updatedAt = new Date()\n await em.flush()\n\n if ((snapshot as any).customFields !== undefined) {\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n values:\n snapshot.customFields && typeof snapshot.customFields === 'object'\n ? (snapshot.customFields as Record<string, unknown>)\n : {},\n })\n }\n\n const existingAllocations = await em.find(SalesPaymentAllocation, { payment: entity })\n existingAllocations.forEach((allocation) => em.remove(allocation))\n snapshot.allocations.forEach((allocation) => {\n const order =\n allocation.orderId && typeof allocation.orderId === 'string'\n ? em.getReference(SalesOrder, allocation.orderId)\n : null\n const invoice =\n allocation.invoiceId && typeof allocation.invoiceId === 'string'\n ? em.getReference(SalesInvoice, allocation.invoiceId)\n : null\n const newAllocation = em.create(SalesPaymentAllocation, {\n payment: entity,\n order,\n invoice,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(newAllocation)\n })\n em.persist(entity)\n}\n\nasync function recomputeOrderPaymentTotals(\n em: EntityManager,\n order: SalesOrder\n): Promise<{ paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number }> {\n const orderId = order.id\n const scope = { organizationId: order.organizationId, tenantId: order.tenantId }\n\n const allocations = await findWithDecryption(\n em,\n SalesPaymentAllocation,\n { ...scope, order: orderId },\n { populate: ['payment'] },\n scope,\n )\n\n const paymentIds = new Set<string>()\n allocations.forEach((allocation) => {\n const paymentRef = allocation.payment\n const paymentId =\n typeof paymentRef === 'object' && paymentRef !== null\n ? paymentRef.id\n : typeof paymentRef === 'string'\n ? paymentRef\n : null\n if (paymentId) paymentIds.add(paymentId)\n })\n\n const payments =\n paymentIds.size > 0\n ? await em.find(SalesPayment, { id: { $in: Array.from(paymentIds) }, deletedAt: null, ...scope })\n : await em.find(SalesPayment, { order: orderId, deletedAt: null, ...scope })\n\n const resolvePaidAmount = (payment: SalesPayment) => {\n const captured = toNumber(payment.capturedAmount)\n return captured > 0 ? captured : toNumber(payment.amount)\n }\n\n const activePaymentIds = new Set(payments.map((payment) => payment.id))\n const paidTotal =\n allocations.length > 0\n ? allocations.reduce((sum, allocation) => {\n const paymentRef = allocation.payment\n const paymentId =\n typeof paymentRef === 'object' && paymentRef !== null\n ? paymentRef.id\n : typeof paymentRef === 'string'\n ? paymentRef\n : null\n if (paymentId && !activePaymentIds.has(paymentId)) return sum\n return sum + toNumber(allocation.amount)\n }, 0)\n : payments.reduce((sum, payment) => sum + resolvePaidAmount(payment), 0)\n\n const refundedTotal = payments.reduce(\n (sum, payment) => sum + toNumber(payment.refundedAmount),\n 0\n )\n\n const grandTotal = toNumber(order.grandTotalGrossAmount)\n const outstanding = Math.max(grandTotal - paidTotal + refundedTotal, 0)\n order.paidTotalAmount = toNumericString(paidTotal) ?? '0'\n order.refundedTotalAmount = toNumericString(refundedTotal) ?? '0'\n order.outstandingAmount = toNumericString(outstanding) ?? '0'\n return {\n paidTotalAmount: paidTotal,\n refundedTotalAmount: refundedTotal,\n outstandingAmount: outstanding,\n }\n}\n\nconst createPaymentCommand: CommandHandler<\n PaymentCreateInput,\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.create',\n async execute(rawInput, ctx) {\n const input = paymentCreateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { translate } = await resolveTranslations()\n if (!input.orderId) {\n throw new CrudHttpError(400, { error: translate('sales.payments.order_required', 'Order is required for payments.') })\n }\n const order = assertFound(\n await em.findOne(SalesOrder, { id: input.orderId }),\n 'sales.payments.order_not_found'\n )\n ensureSameScope(order, input.organizationId, input.tenantId)\n if (order.deletedAt) {\n throw new CrudHttpError(404, { error: 'sales.payments.order_not_found' })\n }\n if (\n order.currencyCode &&\n input.currencyCode &&\n order.currencyCode.toUpperCase() !== input.currencyCode.toUpperCase()\n ) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.currency_mismatch', 'Payment currency must match the order currency.'),\n })\n }\n let paymentMethod = null\n if (input.paymentMethodId) {\n const method = assertFound(\n await em.findOne(SalesPaymentMethod, { id: input.paymentMethodId }),\n 'sales.payments.method_not_found'\n )\n ensureSameScope(method, input.organizationId, input.tenantId)\n paymentMethod = method\n }\n if (input.documentStatusEntryId !== undefined) {\n const orderStatus = await resolveDictionaryEntryValue(em, input.documentStatusEntryId ?? null)\n if (input.documentStatusEntryId && !orderStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n order.statusEntryId = input.documentStatusEntryId ?? null\n order.status = orderStatus\n order.updatedAt = new Date()\n em.persist(order)\n }\n if (input.lineStatusEntryId !== undefined) {\n const lineStatus = await resolveDictionaryEntryValue(em, input.lineStatusEntryId ?? null)\n if (input.lineStatusEntryId && !lineStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n const orderLines = await em.find(SalesOrderLine, { order })\n orderLines.forEach((line) => {\n line.statusEntryId = input.lineStatusEntryId ?? null\n line.status = lineStatus\n line.updatedAt = new Date()\n })\n orderLines.forEach((line) => em.persist(line))\n }\n const status = await resolveDictionaryEntryValue(em, input.statusEntryId ?? null)\n const payment = em.create(SalesPayment, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n order,\n paymentMethod,\n paymentReference: input.paymentReference ?? null,\n statusEntryId: input.statusEntryId ?? null,\n status,\n amount: toNumericString(input.amount) ?? '0',\n currencyCode: input.currencyCode,\n capturedAmount: toNumericString(input.capturedAmount) ?? '0',\n refundedAmount: toNumericString(input.refundedAmount) ?? '0',\n receivedAt: input.receivedAt ?? null,\n capturedAt: input.capturedAt ?? null,\n metadata: input.metadata ? cloneJson(input.metadata) : null,\n customFieldSetId: input.customFieldSetId ?? null,\n })\n const allocationInputs = Array.isArray(input.allocations) ? input.allocations : []\n const allocations = allocationInputs.length\n ? allocationInputs\n : [\n {\n orderId: input.orderId,\n invoiceId: null,\n amount: input.amount,\n currencyCode: input.currencyCode,\n metadata: null,\n },\n ]\n allocations.forEach((allocation) => {\n const orderRef = allocation.orderId ? em.getReference(SalesOrder, allocation.orderId) : order\n const invoiceRef = allocation.invoiceId ? em.getReference(SalesInvoice, allocation.invoiceId) : null\n const entity = em.create(SalesPaymentAllocation, {\n payment,\n order: orderRef,\n invoice: invoiceRef,\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(entity)\n })\n em.persist(payment)\n if (input.customFields !== undefined) {\n if (!payment.id) {\n await em.flush()\n }\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: payment.id,\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n values: normalizeCustomFieldsInput(input.customFields),\n })\n }\n await em.flush()\n const totals = await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n await invalidateOrderCache(ctx.container, order, ctx.auth?.tenantId ?? null)\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'created',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n\n // Create notification for payment received\n try {\n const notificationService = resolveNotificationService(ctx.container)\n const typeDef = notificationTypes.find((type) => type.type === 'sales.payment.received')\n if (typeDef) {\n const amountDisplay = payment.amount && payment.currencyCode\n ? `${payment.currencyCode} ${payment.amount}`\n : ''\n const notificationInput = buildFeatureNotificationFromType(typeDef, {\n requiredFeature: 'sales.orders.manage',\n bodyVariables: {\n orderNumber: order.orderNumber ?? '',\n amount: amountDisplay,\n },\n sourceEntityType: 'sales:order',\n sourceEntityId: order.id,\n linkHref: `/backend/sales/orders/${order.id}`,\n })\n\n await notificationService.createForFeature(notificationInput, {\n tenantId: payment.tenantId,\n organizationId: payment.organizationId ?? null,\n })\n }\n } catch (err) {\n // Notification creation is non-critical, don't fail the command\n console.error('[sales.payments.create] Failed to create notification:', err)\n }\n\n return { paymentId: payment.id, orderTotals: totals }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.paymentId ? loadPaymentSnapshot(em, result.paymentId) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as PaymentSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.payments.create', 'Create payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: after.orderId ?? null,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: { undo: { after } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await em.findOne(SalesPayment, { id: after.id })\n if (existing) {\n const orderRef =\n typeof existing.order === 'string' ? existing.order : existing.order?.id ?? null\n const allocations = await em.find(SalesPaymentAllocation, { payment: existing })\n const allocationOrders = allocations\n .map((allocation) =>\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? null\n )\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n\n allocations.forEach((allocation) => em.remove(allocation))\n await em.flush()\n\n em.remove(existing)\n await em.flush()\n\n const orderIds = Array.from(\n new Set(\n [\n orderRef,\n ...allocationOrders,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n for (const id of orderIds) {\n const order = await em.findOne(SalesOrder, { id })\n if (!order) continue\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nconst updatePaymentCommand: CommandHandler<\n PaymentUpdateInput,\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.update',\n async prepare(rawInput, ctx) {\n const parsed = paymentUpdateSchema.parse(rawInput ?? {})\n if (!parsed.id) return {}\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadPaymentSnapshot(em, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = paymentUpdateSchema.parse(rawInput ?? {})\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { translate } = await resolveTranslations()\n const scopeSeed = assertFound(\n await em.findOne(SalesPayment, { id: input.id }),\n 'sales.payments.not_found'\n )\n const resolvedTenantId = input.tenantId ?? scopeSeed.tenantId\n const resolvedOrganizationId = input.organizationId ?? scopeSeed.organizationId\n ensureTenantScope(ctx, resolvedTenantId)\n ensureOrganizationScope(ctx, resolvedOrganizationId)\n const payment = assertFound(\n await findOneWithDecryption(\n em,\n SalesPayment,\n { id: input.id },\n { populate: ['order'] },\n { tenantId: resolvedTenantId, organizationId: resolvedOrganizationId },\n ),\n 'sales.payments.not_found'\n )\n ensureSameScope(payment, resolvedOrganizationId, resolvedTenantId)\n const previousOrder = payment.order as SalesOrder | null\n if (input.orderId !== undefined) {\n if (!input.orderId) {\n payment.order = null\n } else {\n const order = assertFound(\n await em.findOne(SalesOrder, { id: input.orderId }),\n 'sales.payments.order_not_found'\n )\n ensureSameScope(order, resolvedOrganizationId, resolvedTenantId)\n if (\n order.currencyCode &&\n input.currencyCode &&\n order.currencyCode.toUpperCase() !== input.currencyCode.toUpperCase()\n ) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.currency_mismatch', 'Payment currency must match the order currency.'),\n })\n }\n payment.order = order\n }\n }\n if (input.paymentMethodId !== undefined) {\n if (!input.paymentMethodId) {\n payment.paymentMethod = null\n } else {\n const method = assertFound(\n await em.findOne(SalesPaymentMethod, { id: input.paymentMethodId }),\n 'sales.payments.method_not_found'\n )\n ensureSameScope(method, resolvedOrganizationId, resolvedTenantId)\n payment.paymentMethod = method\n }\n }\n const currentOrder = payment.order as SalesOrder | null\n if ((input.documentStatusEntryId !== undefined || input.lineStatusEntryId !== undefined) && !currentOrder) {\n throw new CrudHttpError(400, { error: translate('sales.payments.order_required', 'Order is required for payments.') })\n }\n if (currentOrder && input.documentStatusEntryId !== undefined) {\n const orderStatus = await resolveDictionaryEntryValue(em, input.documentStatusEntryId ?? null)\n if (input.documentStatusEntryId && !orderStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n currentOrder.statusEntryId = input.documentStatusEntryId ?? null\n currentOrder.status = orderStatus\n currentOrder.updatedAt = new Date()\n em.persist(currentOrder)\n }\n if (currentOrder && input.lineStatusEntryId !== undefined) {\n const lineStatus = await resolveDictionaryEntryValue(em, input.lineStatusEntryId ?? null)\n if (input.lineStatusEntryId && !lineStatus) {\n throw new CrudHttpError(400, {\n error: translate('sales.documents.detail.statusInvalid', 'Selected status could not be found.'),\n })\n }\n const orderLines = await em.find(SalesOrderLine, { order: currentOrder })\n orderLines.forEach((line) => {\n line.statusEntryId = input.lineStatusEntryId ?? null\n line.status = lineStatus\n line.updatedAt = new Date()\n })\n orderLines.forEach((line) => em.persist(line))\n }\n if (input.paymentReference !== undefined) payment.paymentReference = input.paymentReference ?? null\n if (input.statusEntryId !== undefined) {\n payment.statusEntryId = input.statusEntryId ?? null\n payment.status = await resolveDictionaryEntryValue(em, input.statusEntryId ?? null)\n }\n if (input.amount !== undefined) payment.amount = toNumericString(input.amount) ?? '0'\n if (input.currencyCode !== undefined) payment.currencyCode = input.currencyCode\n if (input.capturedAmount !== undefined) {\n payment.capturedAmount = toNumericString(input.capturedAmount) ?? '0'\n }\n if (input.refundedAmount !== undefined) {\n payment.refundedAmount = toNumericString(input.refundedAmount) ?? '0'\n }\n if (input.receivedAt !== undefined) payment.receivedAt = input.receivedAt ?? null\n if (input.capturedAt !== undefined) payment.capturedAt = input.capturedAt ?? null\n if (input.metadata !== undefined) {\n payment.metadata = input.metadata ? cloneJson(input.metadata) : null\n }\n if (input.customFieldSetId !== undefined) {\n payment.customFieldSetId = input.customFieldSetId ?? null\n }\n if (input.customFields !== undefined) {\n if (!payment.id) {\n await em.flush()\n }\n await setRecordCustomFields(em, {\n entityId: E.sales.sales_payment,\n recordId: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n values: normalizeCustomFieldsInput(input.customFields),\n })\n }\n if (input.allocations !== undefined) {\n const existingAllocations = await em.find(SalesPaymentAllocation, { payment })\n existingAllocations.forEach((allocation) => em.remove(allocation))\n const allocationInputs = Array.isArray(input.allocations) ? input.allocations : []\n allocationInputs.forEach((allocation) => {\n const orderRef =\n allocation.orderId ??\n (typeof payment.order === 'string' ? payment.order : payment.order?.id) ??\n null\n const order =\n orderRef && typeof orderRef === 'string' ? em.getReference(SalesOrder, orderRef) : null\n const invoice = allocation.invoiceId\n ? em.getReference(SalesInvoice, allocation.invoiceId)\n : null\n const entity = em.create(SalesPaymentAllocation, {\n payment,\n order,\n invoice,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n amount: toNumericString(allocation.amount) ?? '0',\n currencyCode: allocation.currencyCode,\n metadata: allocation.metadata ? cloneJson(allocation.metadata) : null,\n })\n em.persist(entity)\n })\n }\n payment.updatedAt = new Date()\n await em.flush()\n\n const nextOrder =\n (payment.order as SalesOrder | null) ??\n (typeof payment.order === 'string'\n ? await em.findOne(SalesOrder, { id: payment.order })\n : null)\n let totals: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } | undefined\n if (nextOrder) {\n totals = await recomputeOrderPaymentTotals(em, nextOrder)\n await em.flush()\n await invalidateOrderCache(ctx.container, nextOrder, ctx.auth?.tenantId ?? null)\n }\n if (previousOrder && (!nextOrder || previousOrder.id !== nextOrder.id)) {\n await recomputeOrderPaymentTotals(em, previousOrder)\n await em.flush()\n await invalidateOrderCache(ctx.container, previousOrder, ctx.auth?.tenantId ?? null)\n }\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'updated',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n\n return { paymentId: payment.id, orderTotals: totals }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.paymentId ? loadPaymentSnapshot(em, result.paymentId) : null\n },\n buildLog: async ({ snapshots, result }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as PaymentSnapshot | undefined\n const after = snapshots.after as PaymentSnapshot | undefined\n return {\n actionLabel: translate('sales.audit.payments.update', 'Update payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: after?.orderId ?? before?.orderId ?? null,\n tenantId: after?.tenantId ?? before?.tenantId ?? null,\n organizationId: after?.organizationId ?? before?.organizationId ?? null,\n snapshotBefore: before ?? null,\n snapshotAfter: after ?? null,\n payload: { undo: { before, after } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n await restorePaymentSnapshot(em, before)\n await em.flush()\n if (before.orderId) {\n const order = await em.findOne(SalesOrder, { id: before.orderId })\n if (order) {\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nconst deletePaymentCommand: CommandHandler<\n { id: string; orderId?: string | null; organizationId: string; tenantId: string },\n { paymentId: string; orderTotals?: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } }\n> = {\n id: 'sales.payments.delete',\n async prepare(rawInput, ctx) {\n const parsed = paymentUpdateSchema.parse(rawInput ?? {})\n if (!parsed.id) return {}\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadPaymentSnapshot(em, parsed.id)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = paymentUpdateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const payment = assertFound(\n await findOneWithDecryption(\n em,\n SalesPayment,\n { id: input.id },\n { populate: ['order'] },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n ),\n 'sales.payments.not_found'\n )\n ensureSameScope(payment, input.organizationId, input.tenantId)\n const order = payment.order as SalesOrder | null\n const allocations = await em.find(SalesPaymentAllocation, { payment })\n const allocationOrders = allocations\n .map((allocation) =>\n typeof allocation.order === 'string'\n ? allocation.order\n : allocation.order?.id ?? null\n )\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n allocations.forEach((allocation) => em.remove(allocation))\n await em.flush()\n em.remove(payment)\n await em.flush()\n let totals: { paidTotalAmount: number; refundedTotalAmount: number; outstandingAmount: number } | undefined\n const orderIds = Array.from(\n new Set(\n [\n order && typeof order === 'object' ? order.id : null,\n ...allocationOrders,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const primaryOrderId = order && typeof order === 'object' ? order.id : null\n for (const orderId of orderIds) {\n const target = typeof order === 'object' && order.id === orderId ? order : await em.findOne(SalesOrder, { id: orderId })\n if (!target) continue\n const recomputed = await recomputeOrderPaymentTotals(em, target)\n if (!totals || (primaryOrderId && orderId === primaryOrderId)) {\n totals = recomputed\n }\n await em.flush()\n await invalidateOrderCache(ctx.container, target, ctx.auth?.tenantId ?? null)\n }\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: payment,\n identifiers: {\n id: payment.id,\n organizationId: payment.organizationId,\n tenantId: payment.tenantId,\n },\n indexer: { entityType: E.sales.sales_payment },\n events: paymentCrudEvents,\n })\n if (allocations.length) {\n await Promise.all(\n allocations.map((allocation) =>\n emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: allocation,\n identifiers: {\n id: allocation.id,\n organizationId: allocation.organizationId ?? null,\n tenantId: allocation.tenantId ?? null,\n },\n indexer: { entityType: E.sales.sales_payment_allocation },\n })\n )\n )\n }\n return { paymentId: payment.id, orderTotals: totals }\n },\n buildLog: async ({ snapshots, result }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as PaymentSnapshot | undefined\n return {\n actionLabel: translate('sales.audit.payments.delete', 'Delete payment'),\n resourceKind: 'sales.payment',\n resourceId: result.paymentId,\n parentResourceKind: 'sales.order',\n parentResourceId: before?.orderId ?? null,\n tenantId: before?.tenantId ?? null,\n organizationId: before?.organizationId ?? null,\n snapshotBefore: before ?? null,\n payload: { undo: { before } satisfies PaymentUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<PaymentUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n await restorePaymentSnapshot(em, before)\n await em.flush()\n if (before.orderId) {\n const order = await em.findOne(SalesOrder, { id: before.orderId })\n if (order) {\n await recomputeOrderPaymentTotals(em, order)\n await em.flush()\n }\n }\n },\n}\n\nexport const paymentCommands = [createPaymentCommand, updatePaymentCommand, deletePaymentCommand]\n\nregisterCommand(createPaymentCommand)\nregisterCommand(updatePaymentCommand)\nregisterCommand(deletePaymentCommand)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
|
|
2
|
+
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
3
|
+
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
4
|
+
import { SalesOrder, SalesQuote } from "../data/entities.js";
|
|
5
|
+
function resolveCustomerName(snapshot) {
|
|
6
|
+
if (!snapshot) return null;
|
|
7
|
+
const customer = snapshot.customer;
|
|
8
|
+
const contact = snapshot.contact;
|
|
9
|
+
const displayName = typeof customer?.displayName === "string" ? customer.displayName : null;
|
|
10
|
+
if (displayName && displayName.trim().length > 0) return displayName.trim();
|
|
11
|
+
const first = typeof contact?.firstName === "string" ? contact.firstName : null;
|
|
12
|
+
const last = typeof contact?.lastName === "string" ? contact.lastName : null;
|
|
13
|
+
const preferred = typeof contact?.preferredName === "string" ? contact.preferredName : null;
|
|
14
|
+
const parts = [preferred ?? first, last].map((part) => typeof part === "string" ? part.trim() : "").filter((part) => part.length > 0);
|
|
15
|
+
return parts.length > 0 ? parts.join(" ") : null;
|
|
16
|
+
}
|
|
17
|
+
function formatTotal(amount, currency) {
|
|
18
|
+
if (!amount) return null;
|
|
19
|
+
const value = Number(amount);
|
|
20
|
+
if (!Number.isFinite(value)) return currency ? `${amount} ${currency}` : amount;
|
|
21
|
+
if (!currency) return value.toLocaleString();
|
|
22
|
+
try {
|
|
23
|
+
return new Intl.NumberFormat(void 0, { style: "currency", currency }).format(value);
|
|
24
|
+
} catch {
|
|
25
|
+
return `${value.toLocaleString()} ${currency}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function statusColor(status) {
|
|
29
|
+
if (!status) return void 0;
|
|
30
|
+
const value = status.toLowerCase();
|
|
31
|
+
if (value.includes("approved") || value.includes("paid") || value.includes("fulfilled") || value.includes("accepted")) {
|
|
32
|
+
return "green";
|
|
33
|
+
}
|
|
34
|
+
if (value.includes("cancel") || value.includes("rejected") || value.includes("void")) {
|
|
35
|
+
return "red";
|
|
36
|
+
}
|
|
37
|
+
if (value.includes("draft") || value.includes("pending") || value.includes("open") || value.includes("sent")) {
|
|
38
|
+
return "amber";
|
|
39
|
+
}
|
|
40
|
+
return "blue";
|
|
41
|
+
}
|
|
42
|
+
async function buildPreview(kind, entityId, record) {
|
|
43
|
+
const { t } = await resolveTranslations();
|
|
44
|
+
const defaultTitle = kind === "quote" ? t("sales.messageObjects.quote.title") : t("sales.messageObjects.order.title");
|
|
45
|
+
if (!record) {
|
|
46
|
+
return {
|
|
47
|
+
title: defaultTitle,
|
|
48
|
+
subtitle: entityId,
|
|
49
|
+
status: t("sales.messageObjects.notFound"),
|
|
50
|
+
statusColor: "gray"
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const number = kind === "quote" ? record.quoteNumber : record.orderNumber;
|
|
54
|
+
const customerName = resolveCustomerName(record.customerSnapshot ?? null);
|
|
55
|
+
const total = formatTotal(record.grandTotalGrossAmount, record.currencyCode);
|
|
56
|
+
const subtitleParts = [customerName, total].filter((part) => Boolean(part && part.trim().length > 0));
|
|
57
|
+
const subtitle = subtitleParts.length > 0 ? subtitleParts.join(" \u2022 ") : entityId;
|
|
58
|
+
const metadata = {};
|
|
59
|
+
if (number) metadata.Number = number;
|
|
60
|
+
if (customerName) metadata.Customer = customerName;
|
|
61
|
+
if (total) metadata.Total = total;
|
|
62
|
+
return {
|
|
63
|
+
title: number && number.trim().length > 0 ? number : defaultTitle,
|
|
64
|
+
subtitle,
|
|
65
|
+
status: record.status ?? void 0,
|
|
66
|
+
statusColor: statusColor(record.status),
|
|
67
|
+
metadata: Object.keys(metadata).length > 0 ? metadata : void 0
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async function loadDocumentRecord(kind, entityId, ctx) {
|
|
71
|
+
if (!ctx.organizationId) return null;
|
|
72
|
+
const { resolve } = await createRequestContainer();
|
|
73
|
+
const em = resolve("em");
|
|
74
|
+
const scope = { tenantId: ctx.tenantId, organizationId: ctx.organizationId };
|
|
75
|
+
if (kind === "quote") {
|
|
76
|
+
return await findOneWithDecryption(
|
|
77
|
+
em,
|
|
78
|
+
SalesQuote,
|
|
79
|
+
{
|
|
80
|
+
id: entityId,
|
|
81
|
+
tenantId: ctx.tenantId,
|
|
82
|
+
organizationId: ctx.organizationId,
|
|
83
|
+
deletedAt: null
|
|
84
|
+
},
|
|
85
|
+
void 0,
|
|
86
|
+
scope
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
return await findOneWithDecryption(
|
|
90
|
+
em,
|
|
91
|
+
SalesOrder,
|
|
92
|
+
{
|
|
93
|
+
id: entityId,
|
|
94
|
+
tenantId: ctx.tenantId,
|
|
95
|
+
organizationId: ctx.organizationId,
|
|
96
|
+
deletedAt: null
|
|
97
|
+
},
|
|
98
|
+
void 0,
|
|
99
|
+
scope
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
async function loadSalesQuotePreview(entityId, ctx) {
|
|
103
|
+
const record = await loadDocumentRecord("quote", entityId, ctx);
|
|
104
|
+
return await buildPreview("quote", entityId, record);
|
|
105
|
+
}
|
|
106
|
+
async function loadSalesOrderPreview(entityId, ctx) {
|
|
107
|
+
const record = await loadDocumentRecord("order", entityId, ctx);
|
|
108
|
+
return await buildPreview("order", entityId, record);
|
|
109
|
+
}
|
|
110
|
+
export {
|
|
111
|
+
loadSalesOrderPreview,
|
|
112
|
+
loadSalesQuotePreview
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=messageObjectPreviews.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/sales/lib/messageObjectPreviews.ts"],
|
|
4
|
+
"sourcesContent": ["import { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport type { ObjectPreviewData } from '@open-mercato/shared/modules/messages/types'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { SalesOrder, SalesQuote } from '../data/entities'\n\ntype PreviewContext = {\n tenantId: string\n organizationId?: string | null\n}\n\ntype DocumentKind = 'order' | 'quote'\n\ntype SalesDocumentPreviewRecord = {\n id: string\n status?: string | null\n customerSnapshot?: Record<string, unknown> | null\n currencyCode?: string | null\n grandTotalGrossAmount?: string | null\n orderNumber?: string\n quoteNumber?: string\n}\n\nfunction resolveCustomerName(snapshot: Record<string, unknown> | null): string | null {\n if (!snapshot) return null\n const customer = snapshot.customer as Record<string, unknown> | undefined\n const contact = snapshot.contact as Record<string, unknown> | undefined\n const displayName = typeof customer?.displayName === 'string' ? customer.displayName : null\n if (displayName && displayName.trim().length > 0) return displayName.trim()\n const first = typeof contact?.firstName === 'string' ? contact.firstName : null\n const last = typeof contact?.lastName === 'string' ? contact.lastName : null\n const preferred = typeof contact?.preferredName === 'string' ? contact.preferredName : null\n const parts = [preferred ?? first, last]\n .map((part) => (typeof part === 'string' ? part.trim() : ''))\n .filter((part) => part.length > 0)\n return parts.length > 0 ? parts.join(' ') : null\n}\n\nfunction formatTotal(amount: string | null | undefined, currency: string | null | undefined): string | null {\n if (!amount) return null\n const value = Number(amount)\n if (!Number.isFinite(value)) return currency ? `${amount} ${currency}` : amount\n if (!currency) return value.toLocaleString()\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(value)\n } catch {\n return `${value.toLocaleString()} ${currency}`\n }\n}\n\nfunction statusColor(status: string | null | undefined): string | undefined {\n if (!status) return undefined\n const value = status.toLowerCase()\n if (value.includes('approved') || value.includes('paid') || value.includes('fulfilled') || value.includes('accepted')) {\n return 'green'\n }\n if (value.includes('cancel') || value.includes('rejected') || value.includes('void')) {\n return 'red'\n }\n if (value.includes('draft') || value.includes('pending') || value.includes('open') || value.includes('sent')) {\n return 'amber'\n }\n return 'blue'\n}\n\nasync function buildPreview(kind: DocumentKind, entityId: string, record: SalesDocumentPreviewRecord | null): Promise<ObjectPreviewData> {\n const { t } = await resolveTranslations()\n const defaultTitle = kind === 'quote' ? t('sales.messageObjects.quote.title') : t('sales.messageObjects.order.title')\n if (!record) {\n return {\n title: defaultTitle,\n subtitle: entityId,\n status: t('sales.messageObjects.notFound'),\n statusColor: 'gray',\n }\n }\n\n const number = kind === 'quote' ? record.quoteNumber : record.orderNumber\n const customerName = resolveCustomerName(record.customerSnapshot ?? null)\n const total = formatTotal(record.grandTotalGrossAmount, record.currencyCode)\n\n const subtitleParts = [customerName, total].filter((part): part is string => Boolean(part && part.trim().length > 0))\n const subtitle = subtitleParts.length > 0 ? subtitleParts.join(' \u2022 ') : entityId\n\n const metadata: Record<string, string> = {}\n if (number) metadata.Number = number\n if (customerName) metadata.Customer = customerName\n if (total) metadata.Total = total\n\n return {\n title: number && number.trim().length > 0 ? number : defaultTitle,\n subtitle,\n status: record.status ?? undefined,\n statusColor: statusColor(record.status),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n }\n}\n\nasync function loadDocumentRecord(\n kind: DocumentKind,\n entityId: string,\n ctx: PreviewContext,\n): Promise<SalesDocumentPreviewRecord | null> {\n if (!ctx.organizationId) return null\n\n const { resolve } = await createRequestContainer()\n const em = resolve('em') as EntityManager\n const scope = { tenantId: ctx.tenantId, organizationId: ctx.organizationId }\n\n if (kind === 'quote') {\n return await findOneWithDecryption(\n em,\n SalesQuote,\n {\n id: entityId,\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n }\n\n return await findOneWithDecryption(\n em,\n SalesOrder,\n {\n id: entityId,\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nexport async function loadSalesQuotePreview(entityId: string, ctx: PreviewContext): Promise<ObjectPreviewData> {\n const record = await loadDocumentRecord('quote', entityId, ctx)\n return await buildPreview('quote', entityId, record)\n}\n\nexport async function loadSalesOrderPreview(entityId: string, ctx: PreviewContext): Promise<ObjectPreviewData> {\n const record = await loadDocumentRecord('order', entityId, ctx)\n return await buildPreview('order', entityId, record)\n}\n\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SalesDocumentMessageDetail } from "./widgets/messages/SalesDocumentMessageDetail.js";
|
|
2
|
+
import { SalesDocumentMessagePreview } from "./widgets/messages/SalesDocumentMessagePreview.js";
|
|
3
|
+
const objectMessageTypes = ["default", "messages.defaultWithObjects"];
|
|
4
|
+
const messageObjectTypes = [
|
|
5
|
+
{
|
|
6
|
+
module: "sales",
|
|
7
|
+
entityType: "order",
|
|
8
|
+
messageTypes: objectMessageTypes,
|
|
9
|
+
entityId: "sales:sales_order",
|
|
10
|
+
optionLabelField: "number",
|
|
11
|
+
optionSubtitleField: "status",
|
|
12
|
+
labelKey: "sales.documents.detail.order",
|
|
13
|
+
icon: "receipt-text",
|
|
14
|
+
PreviewComponent: SalesDocumentMessagePreview,
|
|
15
|
+
DetailComponent: SalesDocumentMessageDetail,
|
|
16
|
+
actions: [],
|
|
17
|
+
loadPreview: async (entityId, ctx) => {
|
|
18
|
+
if (typeof window !== "undefined") {
|
|
19
|
+
return {
|
|
20
|
+
title: "Sales order",
|
|
21
|
+
subtitle: entityId
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const { loadSalesOrderPreview } = await import("./lib/messageObjectPreviews.js");
|
|
25
|
+
return loadSalesOrderPreview(entityId, ctx);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
module: "sales",
|
|
30
|
+
entityType: "quote",
|
|
31
|
+
messageTypes: objectMessageTypes,
|
|
32
|
+
entityId: "sales:sales_quote",
|
|
33
|
+
optionLabelField: "number",
|
|
34
|
+
optionSubtitleField: "status",
|
|
35
|
+
labelKey: "sales.documents.detail.quote",
|
|
36
|
+
icon: "file-text",
|
|
37
|
+
PreviewComponent: SalesDocumentMessagePreview,
|
|
38
|
+
DetailComponent: SalesDocumentMessageDetail,
|
|
39
|
+
actions: [],
|
|
40
|
+
loadPreview: async (entityId, ctx) => {
|
|
41
|
+
if (typeof window !== "undefined") {
|
|
42
|
+
return {
|
|
43
|
+
title: "Sales quote",
|
|
44
|
+
subtitle: entityId
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const { loadSalesQuotePreview } = await import("./lib/messageObjectPreviews.js");
|
|
48
|
+
return loadSalesQuotePreview(entityId, ctx);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
];
|
|
52
|
+
var message_objects_default = messageObjectTypes;
|
|
53
|
+
export {
|
|
54
|
+
message_objects_default as default,
|
|
55
|
+
messageObjectTypes
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=message-objects.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/sales/message-objects.ts"],
|
|
4
|
+
"sourcesContent": ["import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\nimport { SalesDocumentMessageDetail } from './widgets/messages/SalesDocumentMessageDetail'\nimport { SalesDocumentMessagePreview } from './widgets/messages/SalesDocumentMessagePreview'\n\nconst objectMessageTypes = ['default', 'messages.defaultWithObjects']\n\nexport const messageObjectTypes: MessageObjectTypeDefinition[] = [\n {\n module: 'sales',\n entityType: 'order',\n messageTypes: objectMessageTypes,\n entityId: 'sales:sales_order',\n optionLabelField: 'number',\n optionSubtitleField: 'status',\n labelKey: 'sales.documents.detail.order',\n icon: 'receipt-text',\n PreviewComponent: SalesDocumentMessagePreview,\n DetailComponent: SalesDocumentMessageDetail,\n actions: [],\n loadPreview: async (entityId, ctx) => {\n if (typeof window !== 'undefined') {\n return {\n title: 'Sales order',\n subtitle: entityId,\n }\n }\n const { loadSalesOrderPreview } = await import('./lib/messageObjectPreviews')\n return loadSalesOrderPreview(entityId, ctx)\n },\n },\n {\n module: 'sales',\n entityType: 'quote',\n messageTypes: objectMessageTypes,\n entityId: 'sales:sales_quote',\n optionLabelField: 'number',\n optionSubtitleField: 'status',\n labelKey: 'sales.documents.detail.quote',\n icon: 'file-text',\n PreviewComponent: SalesDocumentMessagePreview,\n DetailComponent: SalesDocumentMessageDetail,\n actions: [],\n loadPreview: async (entityId, ctx) => {\n if (typeof window !== 'undefined') {\n return {\n title: 'Sales quote',\n subtitle: entityId,\n }\n }\n const { loadSalesQuotePreview } = await import('./lib/messageObjectPreviews')\n return loadSalesQuotePreview(entityId, ctx)\n },\n },\n]\n\nexport default messageObjectTypes\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,kCAAkC;AAC3C,SAAS,mCAAmC;AAE5C,MAAM,qBAAqB,CAAC,WAAW,6BAA6B;AAE7D,MAAM,qBAAoD;AAAA,EAC/D;AAAA,IACE,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,SAAS,CAAC;AAAA,IACV,aAAa,OAAO,UAAU,QAAQ;AACpC,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AACA,YAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,6BAA6B;AAC5E,aAAO,sBAAsB,UAAU,GAAG;AAAA,IAC5C;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,SAAS,CAAC;AAAA,IACV,aAAa,OAAO,UAAU,QAAQ;AACpC,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AACA,YAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,6BAA6B;AAC5E,aAAO,sBAAsB,UAAU,GAAG;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,IAAO,0BAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
+
import { SalesDocumentMessagePreview } from "./SalesDocumentMessagePreview.js";
|
|
7
|
+
function SalesDocumentMessageDetail(props) {
|
|
8
|
+
const t = useT();
|
|
9
|
+
const [executingActionId, setExecutingActionId] = React.useState(null);
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-3 rounded border p-3", children: [
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
SalesDocumentMessagePreview,
|
|
13
|
+
{
|
|
14
|
+
entityId: props.entityId,
|
|
15
|
+
entityModule: props.entityModule,
|
|
16
|
+
entityType: props.entityType,
|
|
17
|
+
snapshot: props.snapshot,
|
|
18
|
+
previewData: props.previewData,
|
|
19
|
+
actionRequired: props.actionRequired,
|
|
20
|
+
actionType: props.actionType,
|
|
21
|
+
actionLabel: props.actionLabel
|
|
22
|
+
}
|
|
23
|
+
),
|
|
24
|
+
props.actions.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: props.actions.map((action) => /* @__PURE__ */ jsx(
|
|
25
|
+
Button,
|
|
26
|
+
{
|
|
27
|
+
type: "button",
|
|
28
|
+
size: "sm",
|
|
29
|
+
variant: action.variant ?? "default",
|
|
30
|
+
disabled: executingActionId !== null,
|
|
31
|
+
onClick: async () => {
|
|
32
|
+
if (executingActionId) return;
|
|
33
|
+
setExecutingActionId(action.id);
|
|
34
|
+
try {
|
|
35
|
+
await props.onAction(action.id, { id: props.entityId });
|
|
36
|
+
} finally {
|
|
37
|
+
setExecutingActionId(null);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
children: executingActionId === action.id ? t("messages.actions.executing", "Executing...") : t(action.labelKey ?? action.id, action.id)
|
|
41
|
+
},
|
|
42
|
+
action.id
|
|
43
|
+
)) }) : null
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
var SalesDocumentMessageDetail_default = SalesDocumentMessageDetail;
|
|
47
|
+
export {
|
|
48
|
+
SalesDocumentMessageDetail,
|
|
49
|
+
SalesDocumentMessageDetail_default as default
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=SalesDocumentMessageDetail.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ObjectDetailProps } from '@open-mercato/shared/modules/messages/types'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { SalesDocumentMessagePreview } from './SalesDocumentMessagePreview'\n\nexport function SalesDocumentMessageDetail(props: ObjectDetailProps) {\n const t = useT()\n const [executingActionId, setExecutingActionId] = React.useState<string | null>(null)\n\n return (\n <div className=\"space-y-3 rounded border p-3\">\n <SalesDocumentMessagePreview\n entityId={props.entityId}\n entityModule={props.entityModule}\n entityType={props.entityType}\n snapshot={props.snapshot}\n previewData={props.previewData}\n actionRequired={props.actionRequired}\n actionType={props.actionType}\n actionLabel={props.actionLabel}\n />\n\n {props.actions.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {props.actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? 'default'}\n disabled={executingActionId !== null}\n onClick={async () => {\n if (executingActionId) return\n setExecutingActionId(action.id)\n try {\n await props.onAction(action.id, { id: props.entityId })\n } finally {\n setExecutingActionId(null)\n }\n }}\n >\n {executingActionId === action.id\n ? t('messages.actions.executing', 'Executing...')\n : t(action.labelKey ?? action.id, action.id)}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default SalesDocumentMessageDetail\n\n"],
|
|
5
|
+
"mappings": ";AAaI,SACE,KADF;AAXJ,YAAY,WAAW;AACvB,SAAS,YAAY;AAErB,SAAS,cAAc;AACvB,SAAS,mCAAmC;AAErC,SAAS,2BAA2B,OAA0B;AACnE,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAwB,IAAI;AAEpF,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,MAAM;AAAA,QAChB,cAAc,MAAM;AAAA,QACpB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,QACnB,gBAAgB,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA;AAAA,IACrB;AAAA,IAEC,MAAM,QAAQ,SAAS,IACtB,oBAAC,SAAI,WAAU,wBACZ,gBAAM,QAAQ,IAAI,CAAC,WAClB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAS,OAAO,WAAW;AAAA,QAC3B,UAAU,sBAAsB;AAAA,QAChC,SAAS,YAAY;AACnB,cAAI,kBAAmB;AACvB,+BAAqB,OAAO,EAAE;AAC9B,cAAI;AACF,kBAAM,MAAM,SAAS,OAAO,IAAI,EAAE,IAAI,MAAM,SAAS,CAAC;AAAA,UACxD,UAAE;AACA,iCAAqB,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,QAEC,gCAAsB,OAAO,KAC1B,EAAE,8BAA8B,cAAc,IAC9C,EAAE,OAAO,YAAY,OAAO,IAAI,OAAO,EAAE;AAAA;AAAA,MAjBxC,OAAO;AAAA,IAkBd,CACD,GACH,IACE;AAAA,KACN;AAEJ;AAEA,IAAO,qCAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|