@open-mercato/core 0.6.8-develop.7101.1.bd9356828a → 0.7.1-develop.7102.1.b41f7e3e51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/auth/api/login.js +19 -0
  3. package/dist/modules/auth/api/login.js.map +2 -2
  4. package/dist/modules/auth/api/routeError.js +11 -0
  5. package/dist/modules/auth/api/routeError.js.map +7 -0
  6. package/dist/modules/auth/api/users/acl/route.js +23 -7
  7. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  8. package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
  9. package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
  10. package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
  11. package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
  12. package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
  13. package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
  14. package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
  15. package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
  16. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
  17. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
  18. package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
  19. package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
  20. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +525 -0
  21. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
  22. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
  23. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
  24. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
  25. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  26. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
  27. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  28. package/dist/modules/customer_accounts/extension-points.js +1 -1
  29. package/dist/modules/customer_accounts/extension-points.js.map +2 -2
  30. package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
  31. package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
  32. package/dist/modules/customers/backend/customers/companies/page.js +2 -2
  33. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  34. package/dist/modules/customers/backend/customers/deals/page.js +2 -2
  35. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  36. package/dist/modules/customers/backend/customers/people/page.js +2 -2
  37. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  38. package/dist/modules/customers/components/detail/AssignRoleDialog.js +33 -28
  39. package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
  40. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
  41. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
  42. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
  43. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
  44. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
  45. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
  46. package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
  47. package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
  48. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
  49. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
  50. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
  51. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
  52. package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
  53. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
  54. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
  55. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
  56. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
  57. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
  58. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
  59. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
  60. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
  61. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
  62. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
  63. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
  64. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
  65. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
  66. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
  67. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
  68. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
  69. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
  70. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
  71. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
  72. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
  73. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
  74. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
  75. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
  76. package/dist/modules/eudr/backend/eudr/statements/page.js +30 -25
  77. package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
  78. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
  79. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
  80. package/dist/modules/eudr/commands/statements.js +5 -3
  81. package/dist/modules/eudr/commands/statements.js.map +2 -2
  82. package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
  83. package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
  84. package/dist/modules/eudr/components/formConfig.js +6 -2
  85. package/dist/modules/eudr/components/formConfig.js.map +2 -2
  86. package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
  87. package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
  88. package/dist/modules/sales/components/documents/LineItemDialog.js +1 -1
  89. package/dist/modules/sales/components/documents/LineItemDialog.js.map +1 -1
  90. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
  91. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  92. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
  93. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  94. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
  95. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  96. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
  97. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
  98. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
  99. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  100. package/package.json +8 -8
  101. package/src/modules/auth/api/login.ts +23 -0
  102. package/src/modules/auth/api/routeError.ts +30 -0
  103. package/src/modules/auth/api/users/acl/route.ts +49 -9
  104. package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
  105. package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
  106. package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
  107. package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
  108. package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
  109. package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
  110. package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +601 -0
  111. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
  112. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
  113. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
  114. package/src/modules/customer_accounts/extension-points.ts +1 -1
  115. package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
  116. package/src/modules/customers/backend/customers/companies/page.tsx +2 -2
  117. package/src/modules/customers/backend/customers/deals/page.tsx +2 -2
  118. package/src/modules/customers/backend/customers/people/page.tsx +2 -2
  119. package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
  120. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
  121. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
  122. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
  123. package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
  124. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
  125. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
  126. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
  127. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
  128. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
  129. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
  130. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
  131. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
  132. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
  133. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
  134. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
  135. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
  136. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
  137. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
  138. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
  139. package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -26
  140. package/src/modules/eudr/commands/statements.ts +4 -2
  141. package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
  142. package/src/modules/eudr/components/formConfig.tsx +9 -1
  143. package/src/modules/eudr/i18n/de.json +3 -2
  144. package/src/modules/eudr/i18n/en.json +3 -2
  145. package/src/modules/eudr/i18n/es.json +3 -2
  146. package/src/modules/eudr/i18n/ko.json +3 -2
  147. package/src/modules/eudr/i18n/pl.json +3 -2
  148. package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
  149. package/src/modules/sales/components/documents/LineItemDialog.tsx +1 -1
  150. package/src/modules/sales/i18n/de.json +37 -0
  151. package/src/modules/sales/i18n/en.json +37 -0
  152. package/src/modules/sales/i18n/es.json +37 -0
  153. package/src/modules/sales/i18n/ko.json +37 -0
  154. package/src/modules/sales/i18n/pl.json +37 -0
  155. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
  156. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
  157. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
  158. package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
  159. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
@@ -18,7 +18,8 @@ import { StatusBadge } from "@open-mercato/ui/primitives/status-badge";
18
18
  import { Plus } from "lucide-react";
19
19
  import { useOrganizationScopeVersion } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
20
20
  import { useLocale, useT } from "@open-mercato/shared/lib/i18n/context";
21
- import { commodityOptions, statementStatusOptions, statusBadgeVariant } from "../../../components/formConfig.js";
21
+ import { commodityOptions, statementStatusOptions, statusBadgeVariant, translateEudrErrorMessage } from "../../../components/formConfig.js";
22
+ import { canDeleteStatement } from "../../../lib/statement-lifecycle.js";
22
23
  import {
23
24
  riskConclusionBadgeVariant,
24
25
  riskTierBadgeVariant
@@ -145,7 +146,11 @@ function EudrStatementsPage() {
145
146
  refreshRows();
146
147
  } catch (error) {
147
148
  if (surfaceRecordConflict(error, translate, { onRefresh: refreshRows })) return;
148
- flash(translate("eudr.statements.list.deleteError"), "error");
149
+ flash(
150
+ translateEudrErrorMessage(error, translate, translate("eudr.statements.list.deleteError")),
151
+ "error"
152
+ );
153
+ refreshRows();
149
154
  }
150
155
  }, [confirm, mutationContextId, refreshRows, retryLastMutation, runMutation, translate]);
151
156
  const columns = React.useMemo(() => [
@@ -243,31 +248,31 @@ function EudrStatementsPage() {
243
248
  /* @__PURE__ */ jsx(Plus, { className: "mr-2 h-4 w-4", "aria-hidden": true }),
244
249
  translate("eudr.statements.list.actions.create")
245
250
  ] }) }),
246
- rowActions: (row) => /* @__PURE__ */ jsx(
247
- RowActions,
248
- {
249
- items: [
250
- {
251
- id: "edit",
252
- label: translate("eudr.statements.list.actions.edit"),
253
- href: `/backend/eudr/statements/${row.id}`
254
- },
255
- {
256
- id: "duplicate",
257
- label: translate("eudr.statements.duplicateAction"),
258
- href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`
259
- },
260
- {
261
- id: "delete",
262
- label: translate("eudr.statements.list.actions.delete"),
263
- destructive: true,
264
- onSelect: () => {
265
- void handleDelete(row);
266
- }
251
+ rowActions: (row) => {
252
+ const items = [
253
+ {
254
+ id: "edit",
255
+ label: translate("eudr.statements.list.actions.edit"),
256
+ href: `/backend/eudr/statements/${row.id}`
257
+ },
258
+ {
259
+ id: "duplicate",
260
+ label: translate("eudr.statements.duplicateAction"),
261
+ href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`
262
+ }
263
+ ];
264
+ if (canDeleteStatement(row.status)) {
265
+ items.push({
266
+ id: "delete",
267
+ label: translate("eudr.statements.list.actions.delete"),
268
+ destructive: true,
269
+ onSelect: () => {
270
+ void handleDelete(row);
267
271
  }
268
- ]
272
+ });
269
273
  }
270
- ),
274
+ return /* @__PURE__ */ jsx(RowActions, { items });
275
+ },
271
276
  onRowClick: (row) => router.push(`/backend/eudr/statements/${row.id}`),
272
277
  rowClickActionIds: ["edit"],
273
278
  emptyState: /* @__PURE__ */ jsx(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/eudr/backend/eudr/statements/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus } from 'lucide-react'\nimport type { SortingState } from '@tanstack/react-table'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { EudrActivityType, EudrCommodity, EudrRiskConclusion, EudrRiskTier, EudrStatementStatus } from '../../../data/validators'\nimport { commodityOptions, statementStatusOptions, statusBadgeVariant } from '../../../components/formConfig'\nimport {\n riskConclusionBadgeVariant,\n riskTierBadgeVariant,\n} from '../../../components/StatementRiskSection'\n\ntype StatementRow = {\n id: string\n title: string\n commodity: EudrCommodity\n referenceNumber: string | null\n verificationNumber: string | null\n status: EudrStatementStatus\n activityType: EudrActivityType | null\n quantityKg: number | string | null\n orderId: string | null\n notes: string | null\n latestRisk: {\n conclusion: EudrRiskConclusion\n overallTier: EudrRiskTier\n reviewDueAt: string | null\n } | null\n createdAt: string\n updatedAt: string\n}\n\ntype StatementsResponse = {\n items: StatementRow[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nfunction formatDateTime(value: string | null | undefined, emptyLabel: string, locale: string): string {\n if (!value) return emptyLabel\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return emptyLabel\n return date.toLocaleString(locale || undefined)\n}\n\nfunction formatQuantityKg(value: number | string | null, emptyLabel: string): string {\n if (value === null || value === undefined) return emptyLabel\n if (typeof value === 'string' && !value.trim()) return emptyLabel\n return String(value)\n}\n\nexport default function EudrStatementsPage() {\n const translate = useT()\n const locale = useLocale()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [rows, setRows] = React.useState<StatementRow[]>([])\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [filters, setFilters] = React.useState<FilterValues>({})\n const [loading, setLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const mutationContextId = 'eudr-statements-list:delete'\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: translate('ui.forms.flash.saveBlocked'),\n })\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (search.trim()) params.set('search', search.trim())\n if (typeof filters.commodity === 'string' && filters.commodity.trim()) {\n params.set('commodity', filters.commodity.trim())\n }\n if (typeof filters.status === 'string' && filters.status.trim()) {\n params.set('status', filters.status.trim())\n }\n const firstSort = sorting[0]\n if (firstSort) {\n params.set('sortField', firstSort.id)\n params.set('sortDir', firstSort.desc ? 'desc' : 'asc')\n }\n return params.toString()\n }, [filters.commodity, filters.status, page, pageSize, search, sorting])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRows() {\n setLoading(true)\n try {\n const fallback: StatementsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<StatementsResponse>(\n `/api/eudr/statements?${queryParams}`,\n undefined,\n { fallback },\n )\n if (!call.ok) {\n flash(translate('eudr.statements.list.loadError'), 'error')\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setRows(Array.isArray(payload.items) ? payload.items : [])\n setTotal(typeof payload.total === 'number' ? payload.total : 0)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n setTotalIsCapped(payload?.totalIsCapped === true)\n } catch {\n if (!cancelled) flash(translate('eudr.statements.list.loadError'), 'error')\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n loadRows()\n return () => {\n cancelled = true\n }\n }, [queryParams, reloadToken, scopeVersion, translate])\n\n const refreshRows = React.useCallback(() => {\n setReloadToken((currentToken) => currentToken + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (row: StatementRow) => {\n const confirmed = await confirm({\n title: translate('eudr.statements.list.confirmDelete', { title: row.title }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(row.updatedAt),\n () => apiCall(\n `/api/eudr/statements?id=${encodeURIComponent(row.id)}`,\n { method: 'DELETE' },\n ),\n )\n if (!call.ok) {\n throw Object.assign(new Error('[internal] eudr statement delete failed'), {\n status: call.status,\n ...((call.result as Record<string, unknown> | null) ?? {}),\n })\n }\n return call\n },\n context: {\n formId: mutationContextId,\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: row.id,\n retryLastMutation,\n },\n mutationPayload: { id: row.id },\n })\n flash(translate('eudr.statements.list.deleteSuccess'), 'success')\n refreshRows()\n } catch (error) {\n if (surfaceRecordConflict(error, translate, { onRefresh: refreshRows })) return\n flash(translate('eudr.statements.list.deleteError'), 'error')\n }\n }, [confirm, mutationContextId, refreshRows, retryLastMutation, runMutation, translate])\n\n const columns = React.useMemo<ColumnDef<StatementRow>[]>(() => [\n {\n accessorKey: 'title',\n header: translate('eudr.statements.list.columns.title'),\n cell: ({ row }) => (\n <Link href={`/backend/eudr/statements/${row.original.id}`} className=\"font-medium hover:underline\">\n {row.original.title}\n </Link>\n ),\n meta: { maxWidth: '260px', truncate: true },\n },\n {\n accessorKey: 'commodity',\n header: translate('eudr.statements.list.columns.commodity'),\n cell: ({ row }) => translate(`eudr.commodity.${row.original.commodity}`),\n },\n {\n accessorKey: 'status',\n header: translate('eudr.statements.list.columns.status'),\n cell: ({ row }) => (\n <StatusBadge variant={statusBadgeVariant(row.original.status)} dot>\n {translate(`eudr.statementStatus.${row.original.status}`)}\n </StatusBadge>\n ),\n },\n {\n accessorKey: 'activityType',\n header: translate('eudr.statements.list.columns.activityType'),\n cell: ({ row }) => row.original.activityType\n ? translate(`eudr.activityType.${row.original.activityType}`)\n : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskConclusion',\n header: translate('eudr.statements.list.columns.latestRiskConclusion'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskConclusionBadgeVariant(row.original.latestRisk.conclusion)}>\n {translate(`eudr.conclusion.${row.original.latestRisk.conclusion}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskTier',\n header: translate('eudr.statements.list.columns.latestRiskTier'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskTierBadgeVariant(row.original.latestRisk.overallTier)}>\n {translate(`eudr.riskTier.${row.original.latestRisk.overallTier}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n accessorKey: 'referenceNumber',\n header: translate('eudr.statements.list.columns.referenceNumber'),\n cell: ({ row }) => row.original.referenceNumber || translate('eudr.common.empty'),\n },\n {\n accessorKey: 'quantityKg',\n header: translate('eudr.statements.list.columns.quantityKg'),\n cell: ({ row }) => formatQuantityKg(row.original.quantityKg, translate('eudr.common.empty')),\n },\n {\n accessorKey: 'updatedAt',\n header: translate('eudr.statements.list.columns.updatedAt'),\n cell: ({ row }) => formatDateTime(row.original.updatedAt, translate('eudr.common.empty'), locale),\n },\n ], [locale, translate])\n\n const filterDefs = React.useMemo<FilterDef[]>(() => [\n {\n id: 'commodity',\n label: translate('eudr.statements.list.filters.commodity'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allCommodities') },\n ...commodityOptions(translate),\n ],\n },\n {\n id: 'status',\n label: translate('eudr.statements.list.filters.status'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allStatuses') },\n ...statementStatusOptions(translate),\n ],\n },\n ], [locale, translate])\n\n return (\n <Page>\n <PageBody>\n <DataTable<StatementRow>\n title={translate('eudr.statements.list.title')}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(nextSearch) => {\n setSearch(nextSearch)\n setPage(1)\n }}\n searchPlaceholder={translate('eudr.statements.list.searchPlaceholder')}\n filters={filterDefs}\n filterValues={filters}\n onFiltersApply={(nextFilters) => {\n setFilters(nextFilters)\n setPage(1)\n }}\n onFiltersClear={() => {\n setFilters({})\n setPage(1)\n }}\n actions={(\n <Button asChild>\n <Link href=\"/backend/eudr/statements/create\">\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('eudr.statements.list.actions.create')}\n </Link>\n </Button>\n )}\n rowActions={(row) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: translate('eudr.statements.list.actions.edit'),\n href: `/backend/eudr/statements/${row.id}`,\n },\n {\n id: 'duplicate',\n label: translate('eudr.statements.duplicateAction'),\n href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`,\n },\n {\n id: 'delete',\n label: translate('eudr.statements.list.actions.delete'),\n destructive: true,\n onSelect: () => {\n void handleDelete(row)\n },\n },\n ]}\n />\n )}\n onRowClick={(row) => router.push(`/backend/eudr/statements/${row.id}`)}\n rowClickActionIds={['edit']}\n emptyState={(\n <ListEmptyState\n entityName={translate('eudr.statements.list.entityName')}\n createHref=\"/backend/eudr/statements/create\"\n createLabel={translate('eudr.statements.list.actions.create')}\n />\n )}\n sortable\n manualSorting\n sorting={sorting}\n onSortingChange={(nextSorting) => {\n setSorting(nextSorting)\n setPage(1)\n }}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n totalIsCapped,\n onPageChange: setPage,\n pageSizeOptions: [20, 50, 100],\n onPageSizeChange: (nextPageSize) => {\n setPageSize(nextPageSize)\n setPage(1)\n },\n }}\n isLoading={loading}\n perspective={{ tableId: 'eudr.statements.list' }}\n stickyActionsColumn\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { RowActions, type RowActionItem } from '@open-mercato/ui/backend/RowActions'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus } from 'lucide-react'\nimport type { SortingState } from '@tanstack/react-table'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { EudrActivityType, EudrCommodity, EudrRiskConclusion, EudrRiskTier, EudrStatementStatus } from '../../../data/validators'\nimport { commodityOptions, statementStatusOptions, statusBadgeVariant, translateEudrErrorMessage } from '../../../components/formConfig'\nimport { canDeleteStatement } from '../../../lib/statement-lifecycle'\nimport {\n riskConclusionBadgeVariant,\n riskTierBadgeVariant,\n} from '../../../components/StatementRiskSection'\n\ntype StatementRow = {\n id: string\n title: string\n commodity: EudrCommodity\n referenceNumber: string | null\n verificationNumber: string | null\n status: EudrStatementStatus\n activityType: EudrActivityType | null\n quantityKg: number | string | null\n orderId: string | null\n notes: string | null\n latestRisk: {\n conclusion: EudrRiskConclusion\n overallTier: EudrRiskTier\n reviewDueAt: string | null\n } | null\n createdAt: string\n updatedAt: string\n}\n\ntype StatementsResponse = {\n items: StatementRow[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nfunction formatDateTime(value: string | null | undefined, emptyLabel: string, locale: string): string {\n if (!value) return emptyLabel\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return emptyLabel\n return date.toLocaleString(locale || undefined)\n}\n\nfunction formatQuantityKg(value: number | string | null, emptyLabel: string): string {\n if (value === null || value === undefined) return emptyLabel\n if (typeof value === 'string' && !value.trim()) return emptyLabel\n return String(value)\n}\n\nexport default function EudrStatementsPage() {\n const translate = useT()\n const locale = useLocale()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [rows, setRows] = React.useState<StatementRow[]>([])\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [filters, setFilters] = React.useState<FilterValues>({})\n const [loading, setLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const mutationContextId = 'eudr-statements-list:delete'\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: translate('ui.forms.flash.saveBlocked'),\n })\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (search.trim()) params.set('search', search.trim())\n if (typeof filters.commodity === 'string' && filters.commodity.trim()) {\n params.set('commodity', filters.commodity.trim())\n }\n if (typeof filters.status === 'string' && filters.status.trim()) {\n params.set('status', filters.status.trim())\n }\n const firstSort = sorting[0]\n if (firstSort) {\n params.set('sortField', firstSort.id)\n params.set('sortDir', firstSort.desc ? 'desc' : 'asc')\n }\n return params.toString()\n }, [filters.commodity, filters.status, page, pageSize, search, sorting])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRows() {\n setLoading(true)\n try {\n const fallback: StatementsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<StatementsResponse>(\n `/api/eudr/statements?${queryParams}`,\n undefined,\n { fallback },\n )\n if (!call.ok) {\n flash(translate('eudr.statements.list.loadError'), 'error')\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setRows(Array.isArray(payload.items) ? payload.items : [])\n setTotal(typeof payload.total === 'number' ? payload.total : 0)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n setTotalIsCapped(payload?.totalIsCapped === true)\n } catch {\n if (!cancelled) flash(translate('eudr.statements.list.loadError'), 'error')\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n loadRows()\n return () => {\n cancelled = true\n }\n }, [queryParams, reloadToken, scopeVersion, translate])\n\n const refreshRows = React.useCallback(() => {\n setReloadToken((currentToken) => currentToken + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (row: StatementRow) => {\n const confirmed = await confirm({\n title: translate('eudr.statements.list.confirmDelete', { title: row.title }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(row.updatedAt),\n () => apiCall(\n `/api/eudr/statements?id=${encodeURIComponent(row.id)}`,\n { method: 'DELETE' },\n ),\n )\n if (!call.ok) {\n throw Object.assign(new Error('[internal] eudr statement delete failed'), {\n status: call.status,\n ...((call.result as Record<string, unknown> | null) ?? {}),\n })\n }\n return call\n },\n context: {\n formId: mutationContextId,\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: row.id,\n retryLastMutation,\n },\n mutationPayload: { id: row.id },\n })\n flash(translate('eudr.statements.list.deleteSuccess'), 'success')\n refreshRows()\n } catch (error) {\n if (surfaceRecordConflict(error, translate, { onRefresh: refreshRows })) return\n flash(\n translateEudrErrorMessage(error, translate, translate('eudr.statements.list.deleteError')),\n 'error',\n )\n refreshRows()\n }\n }, [confirm, mutationContextId, refreshRows, retryLastMutation, runMutation, translate])\n\n const columns = React.useMemo<ColumnDef<StatementRow>[]>(() => [\n {\n accessorKey: 'title',\n header: translate('eudr.statements.list.columns.title'),\n cell: ({ row }) => (\n <Link href={`/backend/eudr/statements/${row.original.id}`} className=\"font-medium hover:underline\">\n {row.original.title}\n </Link>\n ),\n meta: { maxWidth: '260px', truncate: true },\n },\n {\n accessorKey: 'commodity',\n header: translate('eudr.statements.list.columns.commodity'),\n cell: ({ row }) => translate(`eudr.commodity.${row.original.commodity}`),\n },\n {\n accessorKey: 'status',\n header: translate('eudr.statements.list.columns.status'),\n cell: ({ row }) => (\n <StatusBadge variant={statusBadgeVariant(row.original.status)} dot>\n {translate(`eudr.statementStatus.${row.original.status}`)}\n </StatusBadge>\n ),\n },\n {\n accessorKey: 'activityType',\n header: translate('eudr.statements.list.columns.activityType'),\n cell: ({ row }) => row.original.activityType\n ? translate(`eudr.activityType.${row.original.activityType}`)\n : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskConclusion',\n header: translate('eudr.statements.list.columns.latestRiskConclusion'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskConclusionBadgeVariant(row.original.latestRisk.conclusion)}>\n {translate(`eudr.conclusion.${row.original.latestRisk.conclusion}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n id: 'latestRiskTier',\n header: translate('eudr.statements.list.columns.latestRiskTier'),\n cell: ({ row }) => row.original.latestRisk ? (\n <StatusBadge variant={riskTierBadgeVariant(row.original.latestRisk.overallTier)}>\n {translate(`eudr.riskTier.${row.original.latestRisk.overallTier}`)}\n </StatusBadge>\n ) : translate('eudr.common.empty'),\n },\n {\n accessorKey: 'referenceNumber',\n header: translate('eudr.statements.list.columns.referenceNumber'),\n cell: ({ row }) => row.original.referenceNumber || translate('eudr.common.empty'),\n },\n {\n accessorKey: 'quantityKg',\n header: translate('eudr.statements.list.columns.quantityKg'),\n cell: ({ row }) => formatQuantityKg(row.original.quantityKg, translate('eudr.common.empty')),\n },\n {\n accessorKey: 'updatedAt',\n header: translate('eudr.statements.list.columns.updatedAt'),\n cell: ({ row }) => formatDateTime(row.original.updatedAt, translate('eudr.common.empty'), locale),\n },\n ], [locale, translate])\n\n const filterDefs = React.useMemo<FilterDef[]>(() => [\n {\n id: 'commodity',\n label: translate('eudr.statements.list.filters.commodity'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allCommodities') },\n ...commodityOptions(translate),\n ],\n },\n {\n id: 'status',\n label: translate('eudr.statements.list.filters.status'),\n type: 'select',\n options: [\n { value: '', label: translate('eudr.statements.list.filters.allStatuses') },\n ...statementStatusOptions(translate),\n ],\n },\n ], [locale, translate])\n\n return (\n <Page>\n <PageBody>\n <DataTable<StatementRow>\n title={translate('eudr.statements.list.title')}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(nextSearch) => {\n setSearch(nextSearch)\n setPage(1)\n }}\n searchPlaceholder={translate('eudr.statements.list.searchPlaceholder')}\n filters={filterDefs}\n filterValues={filters}\n onFiltersApply={(nextFilters) => {\n setFilters(nextFilters)\n setPage(1)\n }}\n onFiltersClear={() => {\n setFilters({})\n setPage(1)\n }}\n actions={(\n <Button asChild>\n <Link href=\"/backend/eudr/statements/create\">\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('eudr.statements.list.actions.create')}\n </Link>\n </Button>\n )}\n rowActions={(row) => {\n const items: RowActionItem[] = [\n {\n id: 'edit',\n label: translate('eudr.statements.list.actions.edit'),\n href: `/backend/eudr/statements/${row.id}`,\n },\n {\n id: 'duplicate',\n label: translate('eudr.statements.duplicateAction'),\n href: `/backend/eudr/statements/create?duplicateFrom=${encodeURIComponent(row.id)}`,\n },\n ]\n if (canDeleteStatement(row.status)) {\n items.push({\n id: 'delete',\n label: translate('eudr.statements.list.actions.delete'),\n destructive: true,\n onSelect: () => {\n void handleDelete(row)\n },\n })\n }\n return <RowActions items={items} />\n }}\n onRowClick={(row) => router.push(`/backend/eudr/statements/${row.id}`)}\n rowClickActionIds={['edit']}\n emptyState={(\n <ListEmptyState\n entityName={translate('eudr.statements.list.entityName')}\n createHref=\"/backend/eudr/statements/create\"\n createLabel={translate('eudr.statements.list.actions.create')}\n />\n )}\n sortable\n manualSorting\n sorting={sorting}\n onSortingChange={(nextSorting) => {\n setSorting(nextSorting)\n setPage(1)\n }}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n totalIsCapped,\n onPageChange: setPage,\n pageSizeOptions: [20, 50, 100],\n onPageSizeChange: (nextPageSize) => {\n setPageSize(nextPageSize)\n setPage(1)\n },\n }}\n isLoading={loading}\n perspective={{ tableId: 'eudr.statements.list' }}\n stickyActionsColumn\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -8,7 +8,10 @@ const metadata = {
8
8
  pagePriority: 10,
9
9
  pageOrder: 30,
10
10
  icon: "file-text",
11
- breadcrumb: [{ label: "Statements", labelKey: "eudr.nav.statements" }]
11
+ breadcrumb: [
12
+ { label: "EUDR", labelKey: "eudr.nav.module", href: "/backend/eudr" },
13
+ { label: "Statements", labelKey: "eudr.nav.statements" }
14
+ ]
12
15
  };
13
16
  export {
14
17
  metadata
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/eudr/backend/eudr/statements/page.meta.ts"],
4
- "sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['eudr.statements.view'],\n pageTitle: 'Statements',\n pageTitleKey: 'eudr.nav.statements',\n pageGroup: 'Compliance',\n pageGroupKey: 'eudr.nav.group',\n pagePriority: 10,\n pageOrder: 30,\n icon: 'file-text',\n breadcrumb: [{ label: 'Statements', labelKey: 'eudr.nav.statements' }],\n}\n"],
5
- "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,sBAAsB;AAAA,EACxC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY,CAAC,EAAE,OAAO,cAAc,UAAU,sBAAsB,CAAC;AACvE;",
4
+ "sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['eudr.statements.view'],\n pageTitle: 'Statements',\n pageTitleKey: 'eudr.nav.statements',\n pageGroup: 'Compliance',\n pageGroupKey: 'eudr.nav.group',\n pagePriority: 10,\n pageOrder: 30,\n icon: 'file-text',\n breadcrumb: [\n { label: 'EUDR', labelKey: 'eudr.nav.module', href: '/backend/eudr' },\n { label: 'Statements', labelKey: 'eudr.nav.statements' },\n ],\n}\n"],
5
+ "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,sBAAsB;AAAA,EACxC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,IACV,EAAE,OAAO,QAAQ,UAAU,mBAAmB,MAAM,gBAAgB;AAAA,IACpE,EAAE,OAAO,cAAc,UAAU,sBAAsB;AAAA,EACzD;AACF;",
6
6
  "names": []
7
7
  }
@@ -35,9 +35,11 @@ import {
35
35
  } from "../data/validators.js";
36
36
  import {
37
37
  EUDR_AMEND_GUARDED_FIELDS,
38
+ canDeleteStatement,
38
39
  canTransition,
39
40
  evaluateSubmissionGate,
40
- isAmendWindowOpen
41
+ isAmendWindowOpen,
42
+ isStatementReadOnly
41
43
  } from "../lib/statement-lifecycle.js";
42
44
  const STATEMENT_ENTITY_ID = "eudr:eudr_due_diligence_statement";
43
45
  const scopedCommandInputSchema = z.object({
@@ -345,7 +347,7 @@ async function validateStatementUpdate(em, record, parsed, custom) {
345
347
  throw new CrudHttpError(400, { error: "eudr.errors.invalidTransition" });
346
348
  }
347
349
  const hasBaseChanges = hasStatementFieldChanges(record, parsed);
348
- if (record.status === "archived" && (hasBaseChanges || Object.keys(custom).length > 0)) {
350
+ if (isStatementReadOnly(record.status) && (hasBaseChanges || Object.keys(custom).length > 0)) {
349
351
  throw new CrudHttpError(400, { error: "eudr.errors.archivedReadOnly" });
350
352
  }
351
353
  const patched = buildPatchedStatementView(record, parsed);
@@ -654,7 +656,7 @@ const deleteStatementCommand = {
654
656
  if (!record) throw new CrudHttpError(404, { error: "EUDR due diligence statement not found" });
655
657
  ensureTenantScope(ctx, record.tenantId);
656
658
  ensureOrganizationScope(ctx, record.organizationId);
657
- if (record.status === "archived") {
659
+ if (isStatementStatus(record.status) && !canDeleteStatement(record.status)) {
658
660
  throw new CrudHttpError(400, { error: "eudr.errors.archivedReadOnly" });
659
661
  }
660
662
  if (record.status === "available") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/eudr/commands/statements.ts"],
4
- "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { RequiredEntityData } from '@mikro-orm/core'\nimport {\n parseWithCustomFields,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n setCustomFieldsIfAny,\n snapshotsEqual,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport { runCrudCommandWrite } from '@open-mercato/shared/lib/commands/runCrudCommandWrite'\nimport { ensureOrganizationScope, ensureTenantScope } from '@open-mercato/shared/lib/commands/scope'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport type { CrudEventsConfig, CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { emitEudrLifecycleEvent } from './lifecycle-events'\nimport { E } from '#generated/entities.ids.generated'\nimport { sql } from 'kysely'\nimport { z } from 'zod'\nimport {\n EudrDueDiligenceStatement,\n EudrEvidenceSubmission,\n EudrMitigationAction,\n EudrRiskAssessment,\n} from '../data/entities'\nimport {\n EUDR_STATEMENT_STATUSES,\n statementCreateSchema,\n statementUpdateSchema,\n type EudrStatementStatus,\n type StatementCreateInput,\n type StatementUpdateInput,\n} from '../data/validators'\nimport {\n EUDR_AMEND_GUARDED_FIELDS,\n canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n type GateAssessmentView,\n type GateSubmissionView,\n} from '../lib/statement-lifecycle'\n\nconst STATEMENT_ENTITY_ID = 'eudr:eudr_due_diligence_statement'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype StatementSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n title: string\n commodity: string\n referenceNumber: string | null\n verificationNumber: string | null\n status: string\n activityType: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n quantityKg: string | null\n supplementaryUnit: string | null\n supplementaryQuantity: string | null\n orderId: string | null\n submittedAt: string | null\n referenceIssuedAt: string | null\n orderSnapshot: { orderNumber?: string | null } | null\n notes: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype StatementUndoPayload = {\n before?: StatementSnapshot | null\n after?: StatementSnapshot | null\n}\n\ntype ScopedStatementCreateInput = StatementCreateInput & ScopedCommandInput\ntype ScopedStatementUpdateInput = StatementUpdateInput & Partial<ScopedCommandInput>\n\ntype StatementCommandResult = {\n entityId: string\n updatedAt?: Date\n}\n\nconst scopedCommandInputSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst statementCrudIndexer: CrudIndexerConfig<EudrDueDiligenceStatement> = {\n entityType: E.eudr.eudr_due_diligence_statement,\n}\n\nconst statementCrudEvents: CrudEventsConfig<EudrDueDiligenceStatement> = {\n module: 'eudr',\n entity: 'due_diligence_statement',\n persistent: true,\n buildPayload: (emitContext) => ({\n id: emitContext.identifiers.id,\n entityId: emitContext.entity?.id ?? emitContext.identifiers.id,\n organizationId: emitContext.identifiers.organizationId,\n tenantId: emitContext.identifiers.tenantId,\n }),\n}\n\nfunction parseScopedCommandInput(input: unknown): ScopedCommandInput {\n return scopedCommandInputSchema.parse(input)\n}\n\nfunction toNumericString(value: number | null | undefined): string | null {\n return value == null ? null : String(value)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nfunction statementSeedFromSnapshot(snapshot: StatementSnapshot): RequiredEntityData<EudrDueDiligenceStatement> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n title: snapshot.title,\n commodity: snapshot.commodity,\n referenceNumber: snapshot.referenceNumber,\n verificationNumber: snapshot.verificationNumber,\n status: snapshot.status,\n activityType: snapshot.activityType,\n actorRole: snapshot.actorRole,\n referencedStatements: snapshot.referencedStatements.map((entry) => ({ ...entry })),\n quantityKg: snapshot.quantityKg,\n supplementaryUnit: snapshot.supplementaryUnit,\n supplementaryQuantity: snapshot.supplementaryQuantity,\n orderId: snapshot.orderId,\n submittedAt: toDate(snapshot.submittedAt),\n referenceIssuedAt: toDate(snapshot.referenceIssuedAt),\n orderSnapshot: snapshot.orderSnapshot,\n notes: snapshot.notes,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function loadStatementSnapshot(em: EntityManager, entityId: string): Promise<StatementSnapshot | null> {\n const record = await em.findOne(EudrDueDiligenceStatement, { id: entityId })\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: STATEMENT_ENTITY_ID,\n recordId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n })\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n title: record.title,\n commodity: record.commodity,\n referenceNumber: record.referenceNumber ?? null,\n verificationNumber: record.verificationNumber ?? null,\n status: record.status,\n activityType: record.activityType ?? null,\n actorRole: record.actorRole ?? null,\n referencedStatements: Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n quantityKg: record.quantityKg ?? null,\n supplementaryUnit: record.supplementaryUnit ?? null,\n supplementaryQuantity: record.supplementaryQuantity ?? null,\n orderId: record.orderId ?? null,\n submittedAt: record.submittedAt ? record.submittedAt.toISOString() : null,\n referenceIssuedAt: record.referenceIssuedAt ? record.referenceIssuedAt.toISOString() : null,\n orderSnapshot: record.orderSnapshot ?? null,\n notes: record.notes ?? null,\n createdAt: record.createdAt.toISOString(),\n updatedAt: record.updatedAt.toISOString(),\n deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,\n custom: Object.keys(custom).length ? custom : null,\n }\n}\n\nfunction applyStatementUpdate(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): void {\n if (parsed.title !== undefined) record.title = parsed.title\n if (parsed.commodity !== undefined) record.commodity = parsed.commodity\n if (parsed.referenceNumber !== undefined) record.referenceNumber = parsed.referenceNumber ?? null\n if (parsed.verificationNumber !== undefined) record.verificationNumber = parsed.verificationNumber ?? null\n if (parsed.status !== undefined) record.status = parsed.status\n if (parsed.activityType !== undefined) record.activityType = parsed.activityType ?? null\n if (parsed.actorRole !== undefined) record.actorRole = parsed.actorRole ?? null\n if (parsed.referencedStatements !== undefined) {\n record.referencedStatements = parsed.referencedStatements.map((entry) => ({ ...entry }))\n }\n if (parsed.quantityKg !== undefined) record.quantityKg = toNumericString(parsed.quantityKg)\n if (parsed.supplementaryUnit !== undefined) record.supplementaryUnit = parsed.supplementaryUnit ?? null\n if (parsed.supplementaryQuantity !== undefined) record.supplementaryQuantity = toNumericString(parsed.supplementaryQuantity)\n if (parsed.orderId !== undefined) record.orderId = parsed.orderId ?? null\n if (parsed.referenceIssuedAt !== undefined) record.referenceIssuedAt = parsed.referenceIssuedAt\n if (parsed.orderSnapshot !== undefined) record.orderSnapshot = parsed.orderSnapshot ?? null\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n}\n\nfunction restoreStatement(record: EudrDueDiligenceStatement, snapshot: StatementSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.title = snapshot.title\n record.commodity = snapshot.commodity\n record.referenceNumber = snapshot.referenceNumber\n record.verificationNumber = snapshot.verificationNumber\n record.status = snapshot.status\n record.activityType = snapshot.activityType\n record.actorRole = snapshot.actorRole\n record.referencedStatements = snapshot.referencedStatements.map((entry) => ({ ...entry }))\n record.quantityKg = snapshot.quantityKg\n record.supplementaryUnit = snapshot.supplementaryUnit\n record.supplementaryQuantity = snapshot.supplementaryQuantity\n record.orderId = snapshot.orderId\n record.submittedAt = toDate(snapshot.submittedAt)\n record.referenceIssuedAt = toDate(snapshot.referenceIssuedAt)\n record.orderSnapshot = snapshot.orderSnapshot\n record.notes = snapshot.notes\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setStatementCustomFields(\n dataEngine: DataEngine,\n entityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>,\n): Promise<void> {\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: STATEMENT_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\ntype PatchedStatementView = {\n referenceNumber: string | null\n verificationNumber: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n}\n\ntype StatementServerFields = {\n submittedAt?: Date\n referenceIssuedAt?: Date | null\n}\n\nconst STATEMENT_STATUS_SET = new Set<string>(EUDR_STATEMENT_STATUSES)\n\nconst STATEMENT_UPDATE_FIELDS = [\n 'title',\n 'commodity',\n 'referenceNumber',\n 'verificationNumber',\n 'status',\n 'activityType',\n 'actorRole',\n 'referencedStatements',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'orderId',\n 'referenceIssuedAt',\n 'orderSnapshot',\n 'notes',\n] as const\n\ntype StatementUpdateField = (typeof STATEMENT_UPDATE_FIELDS)[number]\n\nfunction isStatementStatus(value: string): value is EudrStatementStatus {\n return STATEMENT_STATUS_SET.has(value)\n}\n\nfunction isNonEmpty(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction dateValuesEqual(left: Date | null | undefined, right: Date | null | undefined): boolean {\n const leftTime = left ? left.getTime() : null\n const rightTime = right ? right.getTime() : null\n return leftTime === rightTime\n}\n\nfunction jsonValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left ?? null) === JSON.stringify(right ?? null)\n}\n\n// PG numeric columns read back scale-padded ('100.000'); compare numerically so\n// an unchanged echo from a whole-document save is not treated as an amendment.\nfunction numericValuesEqual(left: string | null | undefined, right: string | null | undefined): boolean {\n const leftNumber = left === null || left === undefined || left === '' ? null : Number(left)\n const rightNumber = right === null || right === undefined || right === '' ? null : Number(right)\n if (leftNumber === null || rightNumber === null) return leftNumber === rightNumber\n return Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && leftNumber === rightNumber\n}\n\nfunction referencedStatementsEqual(\n left: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n right: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n): boolean {\n return JSON.stringify(left ?? []) === JSON.stringify(right ?? [])\n}\n\nfunction statementFieldChanged(\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n field: StatementUpdateField,\n): boolean {\n switch (field) {\n case 'title':\n return parsed.title !== undefined && parsed.title !== record.title\n case 'commodity':\n return parsed.commodity !== undefined && parsed.commodity !== record.commodity\n case 'referenceNumber':\n return parsed.referenceNumber !== undefined && (parsed.referenceNumber ?? null) !== (record.referenceNumber ?? null)\n case 'verificationNumber':\n return parsed.verificationNumber !== undefined && (parsed.verificationNumber ?? null) !== (record.verificationNumber ?? null)\n case 'status':\n return parsed.status !== undefined && parsed.status !== record.status\n case 'activityType':\n return parsed.activityType !== undefined && (parsed.activityType ?? null) !== (record.activityType ?? null)\n case 'actorRole':\n return parsed.actorRole !== undefined && (parsed.actorRole ?? null) !== (record.actorRole ?? null)\n case 'referencedStatements':\n return parsed.referencedStatements !== undefined && !referencedStatementsEqual(parsed.referencedStatements, record.referencedStatements)\n case 'quantityKg':\n return parsed.quantityKg !== undefined && !numericValuesEqual(toNumericString(parsed.quantityKg), record.quantityKg ?? null)\n case 'supplementaryUnit':\n return parsed.supplementaryUnit !== undefined && (parsed.supplementaryUnit ?? null) !== (record.supplementaryUnit ?? null)\n case 'supplementaryQuantity':\n return parsed.supplementaryQuantity !== undefined && !numericValuesEqual(toNumericString(parsed.supplementaryQuantity), record.supplementaryQuantity ?? null)\n case 'orderId':\n return parsed.orderId !== undefined && (parsed.orderId ?? null) !== (record.orderId ?? null)\n case 'referenceIssuedAt':\n return parsed.referenceIssuedAt !== undefined && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n case 'orderSnapshot':\n return parsed.orderSnapshot !== undefined && !jsonValuesEqual(parsed.orderSnapshot ?? null, record.orderSnapshot ?? null)\n case 'notes':\n return parsed.notes !== undefined && (parsed.notes ?? null) !== (record.notes ?? null)\n }\n}\n\nfunction hasStatementFieldChanges(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return STATEMENT_UPDATE_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction buildPatchedStatementView(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): PatchedStatementView {\n return {\n referenceNumber: parsed.referenceNumber !== undefined ? parsed.referenceNumber ?? null : record.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber !== undefined ? parsed.verificationNumber ?? null : record.verificationNumber ?? null,\n actorRole: parsed.actorRole !== undefined ? parsed.actorRole ?? null : record.actorRole ?? null,\n referencedStatements: parsed.referencedStatements !== undefined\n ? parsed.referencedStatements.map((entry) => ({ ...entry }))\n : Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n }\n}\n\nfunction hasChangedAmendGuardedField(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return EUDR_AMEND_GUARDED_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction hasConcernAnswers(criteria: Record<string, { answer: string; note?: string | null }>): boolean {\n return Object.values(criteria).some((entry) => entry.answer === 'concern')\n}\n\nexport async function loadStatementSubmissionsForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateSubmissionView[]> {\n const submissions = await findWithDecryption(\n em,\n EudrEvidenceSubmission,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n return submissions.map((submission) => ({\n status: submission.status,\n completenessScore: submission.completenessScore,\n originCountry: submission.originCountry ?? null,\n }))\n}\n\nexport async function loadLatestAssessmentForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateAssessmentView> {\n const assessments = await findWithDecryption(\n em,\n EudrRiskAssessment,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n {\n orderBy: { assessedAt: 'desc', createdAt: 'desc' },\n limit: 1,\n },\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n const assessment = assessments[0]\n if (!assessment) return null\n const completedMitigationCount = await em.count(EudrMitigationAction, {\n riskAssessmentId: assessment.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n status: 'completed',\n deletedAt: null,\n })\n return {\n conclusion: assessment.conclusion,\n countryRisks: assessment.countryRisks.map((risk) => ({ country: risk.country, tier: risk.tier })),\n reviewDueAt: assessment.reviewDueAt ?? null,\n hasConcernAnswers: hasConcernAnswers(assessment.criteria),\n hasCompletedMitigation: completedMitigationCount > 0,\n }\n}\n\nasync function assertNoDownstreamReferences(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<void> {\n const referenceNumber = record.referenceNumber?.trim().toUpperCase() ?? ''\n if (!referenceNumber) return\n const db = em.getKysely<{\n eudr_due_diligence_statements: {\n id: string\n tenant_id: string\n organization_id: string\n deleted_at: Date | null\n referenced_statements: unknown\n }\n }>()\n const containment = JSON.stringify([{ referenceNumber }])\n const downstreamRow = await db\n .selectFrom('eudr_due_diligence_statements')\n .select(sql<number>`count(*)`.as('total'))\n .where('tenant_id', '=', record.tenantId)\n .where('organization_id', '=', record.organizationId)\n .where('deleted_at', 'is', null)\n .where('id', '!=', record.id)\n .where(sql<boolean>`referenced_statements @> ${containment}::jsonb`)\n .executeTakeFirst()\n if (Number(downstreamRow?.total ?? 0) > 0) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referencedDownstream' })\n }\n}\n\nasync function validateStatementUpdate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n custom: Record<string, unknown>,\n): Promise<StatementServerFields> {\n if (!isStatementStatus(record.status)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const requestedStatus = parsed.status\n const statusChanged = requestedStatus !== undefined && requestedStatus !== record.status\n if (statusChanged && (!isStatementStatus(requestedStatus) || !canTransition(record.status, requestedStatus))) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const hasBaseChanges = hasStatementFieldChanges(record, parsed)\n if (record.status === 'archived' && (hasBaseChanges || Object.keys(custom).length > 0)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n\n const patched = buildPatchedStatementView(record, parsed)\n const serverFields: StatementServerFields = {}\n const isSubmittedToAvailable = record.status === 'submitted' && requestedStatus === 'available'\n\n if (statusChanged) {\n if (record.status === 'draft' && requestedStatus === 'submitted') {\n const submissions = await loadStatementSubmissionsForGate(em, record)\n const latestAssessment = await loadLatestAssessmentForGate(em, record)\n const gate = evaluateSubmissionGate({\n actorRole: patched.actorRole,\n referencedStatementsCount: patched.referencedStatements.length,\n submissions,\n latestAssessment,\n })\n if (!gate.allowed) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.gateFailed',\n details: {\n reasons: gate.reasons.map((reason) => `eudr.gate.${reason}`),\n },\n })\n }\n serverFields.submittedAt = new Date()\n }\n\n if (isSubmittedToAvailable) {\n if (!isNonEmpty(patched.referenceNumber) || !isNonEmpty(patched.verificationNumber)) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.referenceNumbersRequired',\n details: {\n reasons: ['eudr.gate.referenceNumbersRequired'],\n },\n })\n }\n const issuedAt = parsed.referenceIssuedAt ?? new Date()\n if (issuedAt.getTime() > Date.now()) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtInvalid' })\n }\n serverFields.referenceIssuedAt = issuedAt\n }\n\n if (record.status === 'available' && requestedStatus === 'withdrawn') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(em, record)\n }\n }\n\n if (\n parsed.referenceIssuedAt !== undefined\n && !isSubmittedToAvailable\n && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtImmutable' })\n }\n\n // Guarded fields freeze once the amend window elapses, regardless of any\n // status transition requested in the same call (available\u2192archived must not\n // smuggle in a quantity/commodity change).\n if (\n record.status === 'available'\n && !isAmendWindowOpen(record.referenceIssuedAt ?? null)\n && hasChangedAmendGuardedField(record, parsed)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n\n return serverFields\n}\n\nconst createStatementCommand: CommandHandler<ScopedStatementCreateInput, StatementCommandResult> = {\n id: 'eudr.statements.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(statementCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n if (parsed.status !== undefined && parsed.status !== 'draft') {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrDueDiligenceStatement\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n () => {\n record = entityManager.create(EudrDueDiligenceStatement, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n title: parsed.title,\n commodity: parsed.commodity,\n referenceNumber: parsed.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber ?? null,\n status: parsed.status ?? 'draft',\n activityType: parsed.activityType ?? null,\n actorRole: parsed.actorRole ?? null,\n referencedStatements: parsed.referencedStatements ? parsed.referencedStatements.map((entry) => ({ ...entry })) : [],\n quantityKg: toNumericString(parsed.quantityKg),\n supplementaryUnit: parsed.supplementaryUnit ?? null,\n supplementaryQuantity: toNumericString(parsed.supplementaryQuantity),\n orderId: parsed.orderId ?? null,\n referenceIssuedAt: null,\n orderSnapshot: parsed.orderSnapshot ?? null,\n notes: parsed.notes ?? null,\n })\n entityManager.persist(record)\n },\n ],\n })\n\n return { entityId: record.id }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as StatementSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.create', 'Create EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: after.id })\n if (!record) return\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(undefined, after.custom ?? undefined)\n await setStatementCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrDueDiligenceStatement, StatementSnapshot, ScopedStatementCreateInput, StatementCommandResult>({\n entityClass: EudrDueDiligenceStatement,\n seedFromSnapshot: statementSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setStatementCustomFields(\n ctx.container.resolve('dataEngine') as DataEngine,\n entity.id,\n entity.organizationId,\n entity.tenantId,\n snapshot.custom,\n )\n },\n }),\n}\n\nconst updateStatementCommand: CommandHandler<ScopedStatementUpdateInput, StatementCommandResult> = {\n id: 'eudr.statements.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, 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 { parsed, custom } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: parsed.id, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n const previousStatus = record.status\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'updated',\n scope: { tenantId: record.tenantId, organizationId: record.organizationId },\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n const serverFields = await validateStatementUpdate(entityManager, record, parsed, custom)\n applyStatementUpdate(record, parsed)\n if (serverFields.submittedAt !== undefined) record.submittedAt = serverFields.submittedAt\n if (serverFields.referenceIssuedAt !== undefined) record.referenceIssuedAt = serverFields.referenceIssuedAt\n },\n ],\n })\n\n const lifecycleEventId = record.status === previousStatus\n ? null\n : previousStatus === 'draft' && record.status === 'submitted'\n ? 'eudr.due_diligence_statement.submitted'\n : previousStatus === 'submitted' && record.status === 'available'\n ? 'eudr.due_diligence_statement.reference_issued'\n : previousStatus === 'available' && record.status === 'withdrawn'\n ? 'eudr.due_diligence_statement.withdrawn'\n : null\n if (lifecycleEventId) {\n await emitEudrLifecycleEvent(ctx.container, lifecycleEventId, {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n referenceNumber: record.referenceNumber ?? null,\n })\n }\n\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n const after = snapshots.after as StatementSnapshot | undefined\n if (!before) return null\n if (after && snapshotsEqual(before, after)) return { skipLog: true }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.update', 'Update EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: { before, after: after ?? null } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(before.custom ?? undefined, payload?.after?.custom ?? undefined)\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'updated',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nconst deleteStatementCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, StatementCommandResult> = {\n id: 'eudr.statements.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: entityId, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n if (record.status === 'archived') {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n if (record.status === 'available') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(entityManager, record)\n }\n\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (snapshot?.custom) {\n const resetValues = buildCustomFieldResetMap(snapshot.custom, undefined)\n await setStatementCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues)\n }\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.delete', 'Delete EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom)\n }\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'created',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nregisterCommand(createStatementCommand)\nregisterCommand(updateStatementCommand)\nregisterCommand(deleteStatementCommand)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport type { RequiredEntityData } from '@mikro-orm/core'\nimport {\n parseWithCustomFields,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n setCustomFieldsIfAny,\n snapshotsEqual,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport { runCrudCommandWrite } from '@open-mercato/shared/lib/commands/runCrudCommandWrite'\nimport { ensureOrganizationScope, ensureTenantScope } from '@open-mercato/shared/lib/commands/scope'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport type { CrudEventsConfig, CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { emitEudrLifecycleEvent } from './lifecycle-events'\nimport { E } from '#generated/entities.ids.generated'\nimport { sql } from 'kysely'\nimport { z } from 'zod'\nimport {\n EudrDueDiligenceStatement,\n EudrEvidenceSubmission,\n EudrMitigationAction,\n EudrRiskAssessment,\n} from '../data/entities'\nimport {\n EUDR_STATEMENT_STATUSES,\n statementCreateSchema,\n statementUpdateSchema,\n type EudrStatementStatus,\n type StatementCreateInput,\n type StatementUpdateInput,\n} from '../data/validators'\nimport {\n EUDR_AMEND_GUARDED_FIELDS,\n canDeleteStatement,\n canTransition,\n evaluateSubmissionGate,\n isAmendWindowOpen,\n isStatementReadOnly,\n type GateAssessmentView,\n type GateSubmissionView,\n} from '../lib/statement-lifecycle'\n\nconst STATEMENT_ENTITY_ID = 'eudr:eudr_due_diligence_statement'\n\ntype ScopedCommandInput = {\n tenantId: string\n organizationId: string\n}\n\ntype StatementSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n title: string\n commodity: string\n referenceNumber: string | null\n verificationNumber: string | null\n status: string\n activityType: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n quantityKg: string | null\n supplementaryUnit: string | null\n supplementaryQuantity: string | null\n orderId: string | null\n submittedAt: string | null\n referenceIssuedAt: string | null\n orderSnapshot: { orderNumber?: string | null } | null\n notes: string | null\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n custom?: Record<string, unknown> | null\n}\n\ntype StatementUndoPayload = {\n before?: StatementSnapshot | null\n after?: StatementSnapshot | null\n}\n\ntype ScopedStatementCreateInput = StatementCreateInput & ScopedCommandInput\ntype ScopedStatementUpdateInput = StatementUpdateInput & Partial<ScopedCommandInput>\n\ntype StatementCommandResult = {\n entityId: string\n updatedAt?: Date\n}\n\nconst scopedCommandInputSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst statementCrudIndexer: CrudIndexerConfig<EudrDueDiligenceStatement> = {\n entityType: E.eudr.eudr_due_diligence_statement,\n}\n\nconst statementCrudEvents: CrudEventsConfig<EudrDueDiligenceStatement> = {\n module: 'eudr',\n entity: 'due_diligence_statement',\n persistent: true,\n buildPayload: (emitContext) => ({\n id: emitContext.identifiers.id,\n entityId: emitContext.entity?.id ?? emitContext.identifiers.id,\n organizationId: emitContext.identifiers.organizationId,\n tenantId: emitContext.identifiers.tenantId,\n }),\n}\n\nfunction parseScopedCommandInput(input: unknown): ScopedCommandInput {\n return scopedCommandInputSchema.parse(input)\n}\n\nfunction toNumericString(value: number | null | undefined): string | null {\n return value == null ? null : String(value)\n}\n\nfunction toDate(value: string | null): Date | null {\n return value ? new Date(value) : null\n}\n\nfunction statementSeedFromSnapshot(snapshot: StatementSnapshot): RequiredEntityData<EudrDueDiligenceStatement> {\n return {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n title: snapshot.title,\n commodity: snapshot.commodity,\n referenceNumber: snapshot.referenceNumber,\n verificationNumber: snapshot.verificationNumber,\n status: snapshot.status,\n activityType: snapshot.activityType,\n actorRole: snapshot.actorRole,\n referencedStatements: snapshot.referencedStatements.map((entry) => ({ ...entry })),\n quantityKg: snapshot.quantityKg,\n supplementaryUnit: snapshot.supplementaryUnit,\n supplementaryQuantity: snapshot.supplementaryQuantity,\n orderId: snapshot.orderId,\n submittedAt: toDate(snapshot.submittedAt),\n referenceIssuedAt: toDate(snapshot.referenceIssuedAt),\n orderSnapshot: snapshot.orderSnapshot,\n notes: snapshot.notes,\n createdAt: new Date(snapshot.createdAt),\n updatedAt: new Date(snapshot.updatedAt),\n deletedAt: toDate(snapshot.deletedAt),\n }\n}\n\nasync function loadStatementSnapshot(em: EntityManager, entityId: string): Promise<StatementSnapshot | null> {\n const record = await em.findOne(EudrDueDiligenceStatement, { id: entityId })\n if (!record) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: STATEMENT_ENTITY_ID,\n recordId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n })\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n title: record.title,\n commodity: record.commodity,\n referenceNumber: record.referenceNumber ?? null,\n verificationNumber: record.verificationNumber ?? null,\n status: record.status,\n activityType: record.activityType ?? null,\n actorRole: record.actorRole ?? null,\n referencedStatements: Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n quantityKg: record.quantityKg ?? null,\n supplementaryUnit: record.supplementaryUnit ?? null,\n supplementaryQuantity: record.supplementaryQuantity ?? null,\n orderId: record.orderId ?? null,\n submittedAt: record.submittedAt ? record.submittedAt.toISOString() : null,\n referenceIssuedAt: record.referenceIssuedAt ? record.referenceIssuedAt.toISOString() : null,\n orderSnapshot: record.orderSnapshot ?? null,\n notes: record.notes ?? null,\n createdAt: record.createdAt.toISOString(),\n updatedAt: record.updatedAt.toISOString(),\n deletedAt: record.deletedAt ? record.deletedAt.toISOString() : null,\n custom: Object.keys(custom).length ? custom : null,\n }\n}\n\nfunction applyStatementUpdate(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): void {\n if (parsed.title !== undefined) record.title = parsed.title\n if (parsed.commodity !== undefined) record.commodity = parsed.commodity\n if (parsed.referenceNumber !== undefined) record.referenceNumber = parsed.referenceNumber ?? null\n if (parsed.verificationNumber !== undefined) record.verificationNumber = parsed.verificationNumber ?? null\n if (parsed.status !== undefined) record.status = parsed.status\n if (parsed.activityType !== undefined) record.activityType = parsed.activityType ?? null\n if (parsed.actorRole !== undefined) record.actorRole = parsed.actorRole ?? null\n if (parsed.referencedStatements !== undefined) {\n record.referencedStatements = parsed.referencedStatements.map((entry) => ({ ...entry }))\n }\n if (parsed.quantityKg !== undefined) record.quantityKg = toNumericString(parsed.quantityKg)\n if (parsed.supplementaryUnit !== undefined) record.supplementaryUnit = parsed.supplementaryUnit ?? null\n if (parsed.supplementaryQuantity !== undefined) record.supplementaryQuantity = toNumericString(parsed.supplementaryQuantity)\n if (parsed.orderId !== undefined) record.orderId = parsed.orderId ?? null\n if (parsed.referenceIssuedAt !== undefined) record.referenceIssuedAt = parsed.referenceIssuedAt\n if (parsed.orderSnapshot !== undefined) record.orderSnapshot = parsed.orderSnapshot ?? null\n if (parsed.notes !== undefined) record.notes = parsed.notes ?? null\n}\n\nfunction restoreStatement(record: EudrDueDiligenceStatement, snapshot: StatementSnapshot): void {\n record.organizationId = snapshot.organizationId\n record.tenantId = snapshot.tenantId\n record.title = snapshot.title\n record.commodity = snapshot.commodity\n record.referenceNumber = snapshot.referenceNumber\n record.verificationNumber = snapshot.verificationNumber\n record.status = snapshot.status\n record.activityType = snapshot.activityType\n record.actorRole = snapshot.actorRole\n record.referencedStatements = snapshot.referencedStatements.map((entry) => ({ ...entry }))\n record.quantityKg = snapshot.quantityKg\n record.supplementaryUnit = snapshot.supplementaryUnit\n record.supplementaryQuantity = snapshot.supplementaryQuantity\n record.orderId = snapshot.orderId\n record.submittedAt = toDate(snapshot.submittedAt)\n record.referenceIssuedAt = toDate(snapshot.referenceIssuedAt)\n record.orderSnapshot = snapshot.orderSnapshot\n record.notes = snapshot.notes\n record.createdAt = new Date(snapshot.createdAt)\n record.updatedAt = new Date(snapshot.updatedAt)\n record.deletedAt = toDate(snapshot.deletedAt)\n}\n\nasync function setStatementCustomFields(\n dataEngine: DataEngine,\n entityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>,\n): Promise<void> {\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: STATEMENT_ENTITY_ID,\n recordId: entityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\ntype PatchedStatementView = {\n referenceNumber: string | null\n verificationNumber: string | null\n actorRole: string | null\n referencedStatements: Array<{ referenceNumber: string; verificationNumber?: string | null }>\n}\n\ntype StatementServerFields = {\n submittedAt?: Date\n referenceIssuedAt?: Date | null\n}\n\nconst STATEMENT_STATUS_SET = new Set<string>(EUDR_STATEMENT_STATUSES)\n\nconst STATEMENT_UPDATE_FIELDS = [\n 'title',\n 'commodity',\n 'referenceNumber',\n 'verificationNumber',\n 'status',\n 'activityType',\n 'actorRole',\n 'referencedStatements',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'orderId',\n 'referenceIssuedAt',\n 'orderSnapshot',\n 'notes',\n] as const\n\ntype StatementUpdateField = (typeof STATEMENT_UPDATE_FIELDS)[number]\n\nfunction isStatementStatus(value: string): value is EudrStatementStatus {\n return STATEMENT_STATUS_SET.has(value)\n}\n\nfunction isNonEmpty(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction dateValuesEqual(left: Date | null | undefined, right: Date | null | undefined): boolean {\n const leftTime = left ? left.getTime() : null\n const rightTime = right ? right.getTime() : null\n return leftTime === rightTime\n}\n\nfunction jsonValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left ?? null) === JSON.stringify(right ?? null)\n}\n\n// PG numeric columns read back scale-padded ('100.000'); compare numerically so\n// an unchanged echo from a whole-document save is not treated as an amendment.\nfunction numericValuesEqual(left: string | null | undefined, right: string | null | undefined): boolean {\n const leftNumber = left === null || left === undefined || left === '' ? null : Number(left)\n const rightNumber = right === null || right === undefined || right === '' ? null : Number(right)\n if (leftNumber === null || rightNumber === null) return leftNumber === rightNumber\n return Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && leftNumber === rightNumber\n}\n\nfunction referencedStatementsEqual(\n left: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n right: Array<{ referenceNumber: string; verificationNumber?: string | null }> | null | undefined,\n): boolean {\n return JSON.stringify(left ?? []) === JSON.stringify(right ?? [])\n}\n\nfunction statementFieldChanged(\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n field: StatementUpdateField,\n): boolean {\n switch (field) {\n case 'title':\n return parsed.title !== undefined && parsed.title !== record.title\n case 'commodity':\n return parsed.commodity !== undefined && parsed.commodity !== record.commodity\n case 'referenceNumber':\n return parsed.referenceNumber !== undefined && (parsed.referenceNumber ?? null) !== (record.referenceNumber ?? null)\n case 'verificationNumber':\n return parsed.verificationNumber !== undefined && (parsed.verificationNumber ?? null) !== (record.verificationNumber ?? null)\n case 'status':\n return parsed.status !== undefined && parsed.status !== record.status\n case 'activityType':\n return parsed.activityType !== undefined && (parsed.activityType ?? null) !== (record.activityType ?? null)\n case 'actorRole':\n return parsed.actorRole !== undefined && (parsed.actorRole ?? null) !== (record.actorRole ?? null)\n case 'referencedStatements':\n return parsed.referencedStatements !== undefined && !referencedStatementsEqual(parsed.referencedStatements, record.referencedStatements)\n case 'quantityKg':\n return parsed.quantityKg !== undefined && !numericValuesEqual(toNumericString(parsed.quantityKg), record.quantityKg ?? null)\n case 'supplementaryUnit':\n return parsed.supplementaryUnit !== undefined && (parsed.supplementaryUnit ?? null) !== (record.supplementaryUnit ?? null)\n case 'supplementaryQuantity':\n return parsed.supplementaryQuantity !== undefined && !numericValuesEqual(toNumericString(parsed.supplementaryQuantity), record.supplementaryQuantity ?? null)\n case 'orderId':\n return parsed.orderId !== undefined && (parsed.orderId ?? null) !== (record.orderId ?? null)\n case 'referenceIssuedAt':\n return parsed.referenceIssuedAt !== undefined && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n case 'orderSnapshot':\n return parsed.orderSnapshot !== undefined && !jsonValuesEqual(parsed.orderSnapshot ?? null, record.orderSnapshot ?? null)\n case 'notes':\n return parsed.notes !== undefined && (parsed.notes ?? null) !== (record.notes ?? null)\n }\n}\n\nfunction hasStatementFieldChanges(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return STATEMENT_UPDATE_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction buildPatchedStatementView(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): PatchedStatementView {\n return {\n referenceNumber: parsed.referenceNumber !== undefined ? parsed.referenceNumber ?? null : record.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber !== undefined ? parsed.verificationNumber ?? null : record.verificationNumber ?? null,\n actorRole: parsed.actorRole !== undefined ? parsed.actorRole ?? null : record.actorRole ?? null,\n referencedStatements: parsed.referencedStatements !== undefined\n ? parsed.referencedStatements.map((entry) => ({ ...entry }))\n : Array.isArray(record.referencedStatements)\n ? record.referencedStatements.map((entry) => ({ ...entry }))\n : [],\n }\n}\n\nfunction hasChangedAmendGuardedField(record: EudrDueDiligenceStatement, parsed: StatementUpdateInput): boolean {\n return EUDR_AMEND_GUARDED_FIELDS.some((field) => statementFieldChanged(record, parsed, field))\n}\n\nfunction hasConcernAnswers(criteria: Record<string, { answer: string; note?: string | null }>): boolean {\n return Object.values(criteria).some((entry) => entry.answer === 'concern')\n}\n\nexport async function loadStatementSubmissionsForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateSubmissionView[]> {\n const submissions = await findWithDecryption(\n em,\n EudrEvidenceSubmission,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n return submissions.map((submission) => ({\n status: submission.status,\n completenessScore: submission.completenessScore,\n originCountry: submission.originCountry ?? null,\n }))\n}\n\nexport async function loadLatestAssessmentForGate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<GateAssessmentView> {\n const assessments = await findWithDecryption(\n em,\n EudrRiskAssessment,\n {\n statementId: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n deletedAt: null,\n },\n {\n orderBy: { assessedAt: 'desc', createdAt: 'desc' },\n limit: 1,\n },\n { tenantId: record.tenantId, organizationId: record.organizationId },\n )\n const assessment = assessments[0]\n if (!assessment) return null\n const completedMitigationCount = await em.count(EudrMitigationAction, {\n riskAssessmentId: assessment.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n status: 'completed',\n deletedAt: null,\n })\n return {\n conclusion: assessment.conclusion,\n countryRisks: assessment.countryRisks.map((risk) => ({ country: risk.country, tier: risk.tier })),\n reviewDueAt: assessment.reviewDueAt ?? null,\n hasConcernAnswers: hasConcernAnswers(assessment.criteria),\n hasCompletedMitigation: completedMitigationCount > 0,\n }\n}\n\nasync function assertNoDownstreamReferences(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n): Promise<void> {\n const referenceNumber = record.referenceNumber?.trim().toUpperCase() ?? ''\n if (!referenceNumber) return\n const db = em.getKysely<{\n eudr_due_diligence_statements: {\n id: string\n tenant_id: string\n organization_id: string\n deleted_at: Date | null\n referenced_statements: unknown\n }\n }>()\n const containment = JSON.stringify([{ referenceNumber }])\n const downstreamRow = await db\n .selectFrom('eudr_due_diligence_statements')\n .select(sql<number>`count(*)`.as('total'))\n .where('tenant_id', '=', record.tenantId)\n .where('organization_id', '=', record.organizationId)\n .where('deleted_at', 'is', null)\n .where('id', '!=', record.id)\n .where(sql<boolean>`referenced_statements @> ${containment}::jsonb`)\n .executeTakeFirst()\n if (Number(downstreamRow?.total ?? 0) > 0) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referencedDownstream' })\n }\n}\n\nasync function validateStatementUpdate(\n em: EntityManager,\n record: EudrDueDiligenceStatement,\n parsed: StatementUpdateInput,\n custom: Record<string, unknown>,\n): Promise<StatementServerFields> {\n if (!isStatementStatus(record.status)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const requestedStatus = parsed.status\n const statusChanged = requestedStatus !== undefined && requestedStatus !== record.status\n if (statusChanged && (!isStatementStatus(requestedStatus) || !canTransition(record.status, requestedStatus))) {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const hasBaseChanges = hasStatementFieldChanges(record, parsed)\n if (isStatementReadOnly(record.status) && (hasBaseChanges || Object.keys(custom).length > 0)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n\n const patched = buildPatchedStatementView(record, parsed)\n const serverFields: StatementServerFields = {}\n const isSubmittedToAvailable = record.status === 'submitted' && requestedStatus === 'available'\n\n if (statusChanged) {\n if (record.status === 'draft' && requestedStatus === 'submitted') {\n const submissions = await loadStatementSubmissionsForGate(em, record)\n const latestAssessment = await loadLatestAssessmentForGate(em, record)\n const gate = evaluateSubmissionGate({\n actorRole: patched.actorRole,\n referencedStatementsCount: patched.referencedStatements.length,\n submissions,\n latestAssessment,\n })\n if (!gate.allowed) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.gateFailed',\n details: {\n reasons: gate.reasons.map((reason) => `eudr.gate.${reason}`),\n },\n })\n }\n serverFields.submittedAt = new Date()\n }\n\n if (isSubmittedToAvailable) {\n if (!isNonEmpty(patched.referenceNumber) || !isNonEmpty(patched.verificationNumber)) {\n throw new CrudHttpError(400, {\n error: 'eudr.errors.referenceNumbersRequired',\n details: {\n reasons: ['eudr.gate.referenceNumbersRequired'],\n },\n })\n }\n const issuedAt = parsed.referenceIssuedAt ?? new Date()\n if (issuedAt.getTime() > Date.now()) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtInvalid' })\n }\n serverFields.referenceIssuedAt = issuedAt\n }\n\n if (record.status === 'available' && requestedStatus === 'withdrawn') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(em, record)\n }\n }\n\n if (\n parsed.referenceIssuedAt !== undefined\n && !isSubmittedToAvailable\n && !dateValuesEqual(parsed.referenceIssuedAt, record.referenceIssuedAt ?? null)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.referenceIssuedAtImmutable' })\n }\n\n // Guarded fields freeze once the amend window elapses, regardless of any\n // status transition requested in the same call (available\u2192archived must not\n // smuggle in a quantity/commodity change).\n if (\n record.status === 'available'\n && !isAmendWindowOpen(record.referenceIssuedAt ?? null)\n && hasChangedAmendGuardedField(record, parsed)\n ) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n\n return serverFields\n}\n\nconst createStatementCommand: CommandHandler<ScopedStatementCreateInput, StatementCommandResult> = {\n id: 'eudr.statements.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(statementCreateSchema, rawInput)\n const scope = parseScopedCommandInput(rawInput)\n ensureTenantScope(ctx, scope.tenantId)\n ensureOrganizationScope(ctx, scope.organizationId)\n if (parsed.status !== undefined && parsed.status !== 'draft') {\n throw new CrudHttpError(400, { error: 'eudr.errors.invalidTransition' })\n }\n\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record!: EudrDueDiligenceStatement\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'created',\n scope,\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n () => {\n record = entityManager.create(EudrDueDiligenceStatement, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n title: parsed.title,\n commodity: parsed.commodity,\n referenceNumber: parsed.referenceNumber ?? null,\n verificationNumber: parsed.verificationNumber ?? null,\n status: parsed.status ?? 'draft',\n activityType: parsed.activityType ?? null,\n actorRole: parsed.actorRole ?? null,\n referencedStatements: parsed.referencedStatements ? parsed.referencedStatements.map((entry) => ({ ...entry })) : [],\n quantityKg: toNumericString(parsed.quantityKg),\n supplementaryUnit: parsed.supplementaryUnit ?? null,\n supplementaryQuantity: toNumericString(parsed.supplementaryQuantity),\n orderId: parsed.orderId ?? null,\n referenceIssuedAt: null,\n orderSnapshot: parsed.orderSnapshot ?? null,\n notes: parsed.notes ?? null,\n })\n entityManager.persist(record)\n },\n ],\n })\n\n return { entityId: record.id }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const after = snapshots.after as StatementSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.create', 'Create EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: after.id,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: {\n undo: { after } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: after.id })\n if (!record) return\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(undefined, after.custom ?? undefined)\n await setStatementCustomFields(dataEngine, after.id, after.organizationId, after.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n redo: makeCreateRedo<EudrDueDiligenceStatement, StatementSnapshot, ScopedStatementCreateInput, StatementCommandResult>({\n entityClass: EudrDueDiligenceStatement,\n seedFromSnapshot: statementSeedFromSnapshot,\n buildResult: (entity) => ({ entityId: entity.id }),\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n afterRestore: async ({ ctx, entity, snapshot }) => {\n if (!snapshot.custom || !Object.keys(snapshot.custom).length) return\n await setStatementCustomFields(\n ctx.container.resolve('dataEngine') as DataEngine,\n entity.id,\n entity.organizationId,\n entity.tenantId,\n snapshot.custom,\n )\n },\n }),\n}\n\nconst updateStatementCommand: CommandHandler<ScopedStatementUpdateInput, StatementCommandResult> = {\n id: 'eudr.statements.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, 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 { parsed, custom } = parseWithCustomFields(statementUpdateSchema, rawInput)\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: parsed.id, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n const previousStatus = record.status\n\n await runCrudCommandWrite({\n ctx,\n em: entityManager,\n entityId: STATEMENT_ENTITY_ID,\n action: 'updated',\n scope: { tenantId: record.tenantId, organizationId: record.organizationId },\n customFields: custom,\n events: statementCrudEvents,\n indexer: statementCrudIndexer,\n sideEffect: () => ({\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }),\n phases: [\n async () => {\n const serverFields = await validateStatementUpdate(entityManager, record, parsed, custom)\n applyStatementUpdate(record, parsed)\n if (serverFields.submittedAt !== undefined) record.submittedAt = serverFields.submittedAt\n if (serverFields.referenceIssuedAt !== undefined) record.referenceIssuedAt = serverFields.referenceIssuedAt\n },\n ],\n })\n\n const lifecycleEventId = record.status === previousStatus\n ? null\n : previousStatus === 'draft' && record.status === 'submitted'\n ? 'eudr.due_diligence_statement.submitted'\n : previousStatus === 'submitted' && record.status === 'available'\n ? 'eudr.due_diligence_statement.reference_issued'\n : previousStatus === 'available' && record.status === 'withdrawn'\n ? 'eudr.due_diligence_statement.withdrawn'\n : null\n if (lifecycleEventId) {\n await emitEudrLifecycleEvent(ctx.container, lifecycleEventId, {\n id: record.id,\n tenantId: record.tenantId,\n organizationId: record.organizationId,\n title: record.title,\n referenceNumber: record.referenceNumber ?? null,\n })\n }\n\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n captureAfter: async (_rawInput, result, ctx) => {\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n return loadStatementSnapshot(entityManager, result.entityId)\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n const after = snapshots.after as StatementSnapshot | undefined\n if (!before) return null\n if (after && snapshotsEqual(before, after)) return { skipLog: true }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.update', 'Update EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after ?? null,\n payload: {\n undo: { before, after: after ?? null } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n const resetValues = buildCustomFieldResetMap(before.custom ?? undefined, payload?.after?.custom ?? undefined)\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, resetValues)\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'updated',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nconst deleteStatementCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, StatementCommandResult> = {\n id: 'eudr.statements.delete',\n async prepare(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n if (snapshot) {\n ensureTenantScope(ctx, snapshot.tenantId)\n ensureOrganizationScope(ctx, snapshot.organizationId)\n }\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const entityId = requireId(input, 'EUDR due diligence statement id required')\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n const record = await entityManager.findOne(EudrDueDiligenceStatement, { id: entityId, deletedAt: null })\n if (!record) throw new CrudHttpError(404, { error: 'EUDR due diligence statement not found' })\n ensureTenantScope(ctx, record.tenantId)\n ensureOrganizationScope(ctx, record.organizationId)\n if (isStatementStatus(record.status) && !canDeleteStatement(record.status)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.archivedReadOnly' })\n }\n if (record.status === 'available') {\n if (!isAmendWindowOpen(record.referenceIssuedAt ?? null)) {\n throw new CrudHttpError(400, { error: 'eudr.errors.amendWindowElapsed' })\n }\n await assertNoDownstreamReferences(entityManager, record)\n }\n\n const snapshot = await loadStatementSnapshot(entityManager, entityId)\n record.deletedAt = new Date()\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (snapshot?.custom) {\n const resetValues = buildCustomFieldResetMap(snapshot.custom, undefined)\n await setStatementCustomFields(dataEngine, snapshot.id, snapshot.organizationId, snapshot.tenantId, resetValues)\n }\n await emitCrudSideEffects({\n dataEngine,\n action: 'deleted',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n return { entityId: record.id, updatedAt: record.updatedAt }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as StatementSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('eudr.audit.statements.delete', 'Delete EUDR due diligence statement'),\n resourceKind: 'eudr.due_diligence_statement',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: { before } satisfies StatementUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<StatementUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const entityManager = (ctx.container.resolve('em') as EntityManager).fork()\n let record = await entityManager.findOne(EudrDueDiligenceStatement, { id: before.id })\n if (!record) {\n record = entityManager.create(EudrDueDiligenceStatement, statementSeedFromSnapshot(before))\n entityManager.persist(record)\n } else {\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n restoreStatement(record, before)\n }\n await entityManager.flush()\n\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n if (before.custom) {\n await setStatementCustomFields(dataEngine, before.id, before.organizationId, before.tenantId, before.custom)\n }\n await emitCrudUndoSideEffects({\n dataEngine,\n action: 'created',\n entity: record,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n indexer: statementCrudIndexer,\n events: statementCrudEvents,\n })\n },\n}\n\nregisterCommand(createStatementCommand)\nregisterCommand(updateStatementCommand)\nregisterCommand(deleteStatementCommand)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,25 @@ function translateEudrErrorToken(token, translate) {
6
6
  const translated = translate(trimmed);
7
7
  return translated === trimmed ? token : translated;
8
8
  }
9
+ function readEudrErrorToken(err) {
10
+ if (err == null || typeof err !== "object") return null;
11
+ const candidates = [
12
+ err.error,
13
+ err.message
14
+ ];
15
+ for (const candidate of candidates) {
16
+ if (typeof candidate !== "string") continue;
17
+ const trimmed = candidate.trim();
18
+ if (EUDR_ERROR_KEY_PATTERN.test(trimmed)) return trimmed;
19
+ }
20
+ return null;
21
+ }
22
+ function translateEudrErrorMessage(err, translate, fallbackMessage) {
23
+ const token = readEudrErrorToken(err);
24
+ if (!token) return fallbackMessage;
25
+ const translated = translate(token);
26
+ return translated === token ? fallbackMessage : translated;
27
+ }
9
28
  function translateEudrCrudError(err, translate) {
10
29
  if (!(err instanceof Error)) return err;
11
30
  const rawMessage = typeof err.message === "string" ? err.message : "";
@@ -26,6 +45,7 @@ function translateEudrCrudError(err, translate) {
26
45
  return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors);
27
46
  }
28
47
  export {
29
- translateEudrCrudError
48
+ translateEudrCrudError,
49
+ translateEudrErrorMessage
30
50
  };
31
51
  //# sourceMappingURL=crudErrorI18n.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/eudr/components/crudErrorI18n.ts"],
4
- "sourcesContent": ["import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\n\ntype Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nconst EUDR_ERROR_KEY_PATTERN = /^eudr\\.errors\\.[A-Za-z0-9_.-]+$/\n\nfunction translateEudrErrorToken(token: string, translate: Translator): string {\n const trimmed = token.trim()\n if (!EUDR_ERROR_KEY_PATTERN.test(trimmed)) return token\n const translated = translate(trimmed)\n return translated === trimmed ? token : translated\n}\n\nexport function translateEudrCrudError(err: unknown, translate: Translator): unknown {\n if (!(err instanceof Error)) return err\n const rawMessage = typeof err.message === 'string' ? err.message : ''\n const translatedMessage = translateEudrErrorToken(rawMessage, translate)\n const rawFieldErrors = (err as { fieldErrors?: Record<string, string> }).fieldErrors\n let fieldErrorsChanged = false\n let translatedFieldErrors: Record<string, string> | undefined\n if (rawFieldErrors && typeof rawFieldErrors === 'object') {\n translatedFieldErrors = {}\n for (const [field, fieldMessage] of Object.entries(rawFieldErrors)) {\n if (typeof fieldMessage !== 'string') continue\n const translatedFieldMessage = translateEudrErrorToken(fieldMessage, translate)\n if (translatedFieldMessage !== fieldMessage) fieldErrorsChanged = true\n translatedFieldErrors[field] = translatedFieldMessage\n }\n }\n if (translatedMessage === rawMessage && !fieldErrorsChanged) return err\n return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors)\n}\n"],
5
- "mappings": "AAAA,SAAS,2BAA2B;AAQpC,MAAM,yBAAyB;AAE/B,SAAS,wBAAwB,OAAe,WAA+B;AAC7E,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAClD,QAAM,aAAa,UAAU,OAAO;AACpC,SAAO,eAAe,UAAU,QAAQ;AAC1C;AAEO,SAAS,uBAAuB,KAAc,WAAgC;AACnF,MAAI,EAAE,eAAe,OAAQ,QAAO;AACpC,QAAM,aAAa,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AACnE,QAAM,oBAAoB,wBAAwB,YAAY,SAAS;AACvE,QAAM,iBAAkB,IAAiD;AACzE,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,4BAAwB,CAAC;AACzB,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,cAAc,GAAG;AAClE,UAAI,OAAO,iBAAiB,SAAU;AACtC,YAAM,yBAAyB,wBAAwB,cAAc,SAAS;AAC9E,UAAI,2BAA2B,aAAc,sBAAqB;AAClE,4BAAsB,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,sBAAsB,cAAc,CAAC,mBAAoB,QAAO;AACpE,SAAO,oBAAoB,mBAAmB,yBAAyB,cAAc;AACvF;",
4
+ "sourcesContent": ["import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\n\ntype Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nconst EUDR_ERROR_KEY_PATTERN = /^eudr\\.errors\\.[A-Za-z0-9_.-]+$/\n\nfunction translateEudrErrorToken(token: string, translate: Translator): string {\n const trimmed = token.trim()\n if (!EUDR_ERROR_KEY_PATTERN.test(trimmed)) return token\n const translated = translate(trimmed)\n return translated === trimmed ? token : translated\n}\n\nfunction readEudrErrorToken(err: unknown): string | null {\n if (err == null || typeof err !== 'object') return null\n const candidates = [\n (err as { error?: unknown }).error,\n (err as { message?: unknown }).message,\n ]\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (EUDR_ERROR_KEY_PATTERN.test(trimmed)) return trimmed\n }\n return null\n}\n\n/**\n * Resolves the user-facing message for a rejected EUDR mutation, preferring the\n * server's `eudr.errors.*` token over the caller's generic copy so the reason\n * survives to the user. Falls back to `fallbackMessage` when the rejection\n * carries no known token (network errors, 5xx, unmapped tokens).\n */\nexport function translateEudrErrorMessage(\n err: unknown,\n translate: Translator,\n fallbackMessage: string,\n): string {\n const token = readEudrErrorToken(err)\n if (!token) return fallbackMessage\n const translated = translate(token)\n return translated === token ? fallbackMessage : translated\n}\n\nexport function translateEudrCrudError(err: unknown, translate: Translator): unknown {\n if (!(err instanceof Error)) return err\n const rawMessage = typeof err.message === 'string' ? err.message : ''\n const translatedMessage = translateEudrErrorToken(rawMessage, translate)\n const rawFieldErrors = (err as { fieldErrors?: Record<string, string> }).fieldErrors\n let fieldErrorsChanged = false\n let translatedFieldErrors: Record<string, string> | undefined\n if (rawFieldErrors && typeof rawFieldErrors === 'object') {\n translatedFieldErrors = {}\n for (const [field, fieldMessage] of Object.entries(rawFieldErrors)) {\n if (typeof fieldMessage !== 'string') continue\n const translatedFieldMessage = translateEudrErrorToken(fieldMessage, translate)\n if (translatedFieldMessage !== fieldMessage) fieldErrorsChanged = true\n translatedFieldErrors[field] = translatedFieldMessage\n }\n }\n if (translatedMessage === rawMessage && !fieldErrorsChanged) return err\n return createCrudFormError(translatedMessage, translatedFieldErrors ?? rawFieldErrors)\n}\n"],
5
+ "mappings": "AAAA,SAAS,2BAA2B;AAQpC,MAAM,yBAAyB;AAE/B,SAAS,wBAAwB,OAAe,WAA+B;AAC7E,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAClD,QAAM,aAAa,UAAU,OAAO;AACpC,SAAO,eAAe,UAAU,QAAQ;AAC1C;AAEA,SAAS,mBAAmB,KAA6B;AACvD,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACnD,QAAM,aAAa;AAAA,IAChB,IAA4B;AAAA,IAC5B,IAA8B;AAAA,EACjC;AACA,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,cAAc,SAAU;AACnC,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,uBAAuB,KAAK,OAAO,EAAG,QAAO;AAAA,EACnD;AACA,SAAO;AACT;AAQO,SAAS,0BACd,KACA,WACA,iBACQ;AACR,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,UAAU,KAAK;AAClC,SAAO,eAAe,QAAQ,kBAAkB;AAClD;AAEO,SAAS,uBAAuB,KAAc,WAAgC;AACnF,MAAI,EAAE,eAAe,OAAQ,QAAO;AACpC,QAAM,aAAa,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AACnE,QAAM,oBAAoB,wBAAwB,YAAY,SAAS;AACvE,QAAM,iBAAkB,IAAiD;AACzE,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACxD,4BAAwB,CAAC;AACzB,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,cAAc,GAAG;AAClE,UAAI,OAAO,iBAAiB,SAAU;AACtC,YAAM,yBAAyB,wBAAwB,cAAc,SAAS;AAC9E,UAAI,2BAA2B,aAAc,sBAAqB;AAClE,4BAAsB,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,sBAAsB,cAAc,CAAC,mBAAoB,QAAO;AACpE,SAAO,oBAAoB,mBAAmB,yBAAyB,cAAc;AACvF;",
6
6
  "names": []
7
7
  }