@open-mercato/core 0.6.4-develop.3996.1.430e257cfc → 0.6.4-develop.4011.1.4f3ed9ae3e

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 (65) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/auth/api/features.js +24 -2
  3. package/dist/modules/auth/api/features.js.map +2 -2
  4. package/dist/modules/auth/backend/users/[id]/edit/page.js +70 -57
  5. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  6. package/dist/modules/auth/components/AclDependencyDiagnosticsPanel.js +135 -0
  7. package/dist/modules/auth/components/AclDependencyDiagnosticsPanel.js.map +7 -0
  8. package/dist/modules/auth/components/AclEditor.js +10 -0
  9. package/dist/modules/auth/components/AclEditor.js.map +2 -2
  10. package/dist/modules/catalog/acl.js +30 -5
  11. package/dist/modules/catalog/acl.js.map +2 -2
  12. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +17 -5
  13. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  14. package/dist/modules/catalog/commands/offers.js +26 -7
  15. package/dist/modules/catalog/commands/offers.js.map +2 -2
  16. package/dist/modules/catalog/commands/prices.js +41 -26
  17. package/dist/modules/catalog/commands/prices.js.map +2 -2
  18. package/dist/modules/catalog/commands/productUnitConversions.js +7 -1
  19. package/dist/modules/catalog/commands/productUnitConversions.js.map +2 -2
  20. package/dist/modules/catalog/commands/products.js +2 -0
  21. package/dist/modules/catalog/commands/products.js.map +2 -2
  22. package/dist/modules/catalog/commands/shared.js +58 -11
  23. package/dist/modules/catalog/commands/shared.js.map +2 -2
  24. package/dist/modules/catalog/commands/variants.js +18 -5
  25. package/dist/modules/catalog/commands/variants.js.map +2 -2
  26. package/dist/modules/customers/acl.js +72 -12
  27. package/dist/modules/customers/acl.js.map +2 -2
  28. package/dist/modules/resources/backend/resources/resources/[id]/page.js +17 -2
  29. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  30. package/dist/modules/sales/acl.js +109 -16
  31. package/dist/modules/sales/acl.js.map +2 -2
  32. package/dist/modules/sales/backend/sales/documents/[id]/page.js +20 -1
  33. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  34. package/dist/modules/sales/setup.js +2 -0
  35. package/dist/modules/sales/setup.js.map +2 -2
  36. package/package.json +7 -7
  37. package/src/modules/auth/api/features.ts +34 -4
  38. package/src/modules/auth/backend/users/[id]/edit/page.tsx +28 -6
  39. package/src/modules/auth/components/AclDependencyDiagnosticsPanel.tsx +173 -0
  40. package/src/modules/auth/components/AclEditor.tsx +14 -4
  41. package/src/modules/auth/i18n/de.json +9 -0
  42. package/src/modules/auth/i18n/en.json +9 -0
  43. package/src/modules/auth/i18n/es.json +9 -0
  44. package/src/modules/auth/i18n/pl.json +9 -0
  45. package/src/modules/catalog/acl.ts +30 -5
  46. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +21 -5
  47. package/src/modules/catalog/commands/offers.ts +26 -7
  48. package/src/modules/catalog/commands/prices.ts +41 -26
  49. package/src/modules/catalog/commands/productUnitConversions.ts +7 -1
  50. package/src/modules/catalog/commands/products.ts +2 -0
  51. package/src/modules/catalog/commands/shared.ts +70 -6
  52. package/src/modules/catalog/commands/variants.ts +18 -5
  53. package/src/modules/catalog/i18n/de.json +1 -0
  54. package/src/modules/catalog/i18n/en.json +1 -0
  55. package/src/modules/catalog/i18n/es.json +1 -0
  56. package/src/modules/catalog/i18n/pl.json +1 -0
  57. package/src/modules/customers/acl.ts +72 -12
  58. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +21 -2
  59. package/src/modules/sales/acl.ts +109 -16
  60. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +28 -1
  61. package/src/modules/sales/i18n/de.json +3 -0
  62. package/src/modules/sales/i18n/en.json +3 -0
  63. package/src/modules/sales/i18n/es.json +3 -0
  64. package/src/modules/sales/i18n/pl.json +3 -0
  65. package/src/modules/sales/setup.ts +2 -0
@@ -1,23 +1,83 @@
1
1
  export const features = [
2
2
  { id: 'customers.people.view', title: 'View people', module: 'customers' },
3
- { id: 'customers.people.manage', title: 'Manage people', module: 'customers' },
3
+ {
4
+ id: 'customers.people.manage',
5
+ title: 'Manage people',
6
+ module: 'customers',
7
+ dependsOn: ['customers.people.view'],
8
+ },
4
9
  { id: 'customers.companies.view', title: 'View companies', module: 'customers' },
5
- { id: 'customers.companies.manage', title: 'Manage companies', module: 'customers' },
6
- { id: 'customers.deals.view', title: 'View deals', module: 'customers' },
7
- { id: 'customers.deals.manage', title: 'Manage deals', module: 'customers' },
10
+ {
11
+ id: 'customers.companies.manage',
12
+ title: 'Manage companies',
13
+ module: 'customers',
14
+ dependsOn: ['customers.companies.view'],
15
+ },
16
+ {
17
+ id: 'customers.deals.view',
18
+ title: 'View deals',
19
+ module: 'customers',
20
+ dependsOn: ['customers.people.view'],
21
+ },
22
+ {
23
+ id: 'customers.deals.manage',
24
+ title: 'Manage deals',
25
+ module: 'customers',
26
+ dependsOn: ['customers.deals.view'],
27
+ },
8
28
  { id: 'customers.activities.view', title: 'View activities', module: 'customers' },
9
- { id: 'customers.activities.manage', title: 'Manage activities', module: 'customers' },
29
+ {
30
+ id: 'customers.activities.manage',
31
+ title: 'Manage activities',
32
+ module: 'customers',
33
+ dependsOn: ['customers.activities.view'],
34
+ },
10
35
  { id: 'customers.settings.manage', title: 'Manage customer settings', module: 'customers' },
11
36
  { id: 'customers.pipelines.view', title: 'View pipelines', module: 'customers' },
12
- { id: 'customers.pipelines.manage', title: 'Manage pipelines', module: 'customers' },
13
- { id: 'customers.widgets.todos', title: 'Use customer todos widget', module: 'customers' },
14
- { id: 'customers.widgets.next-interactions', title: 'Use customer next interactions widget', module: 'customers' },
15
- { id: 'customers.widgets.new-customers', title: 'Use customer new customers widget', module: 'customers' },
16
- { id: 'customers.widgets.new-deals', title: 'Use customer new deals widget', module: 'customers' },
37
+ {
38
+ id: 'customers.pipelines.manage',
39
+ title: 'Manage pipelines',
40
+ module: 'customers',
41
+ dependsOn: ['customers.pipelines.view'],
42
+ },
43
+ {
44
+ id: 'customers.widgets.todos',
45
+ title: 'Use customer todos widget',
46
+ module: 'customers',
47
+ dependsOn: ['customers.activities.view'],
48
+ },
49
+ {
50
+ id: 'customers.widgets.next-interactions',
51
+ title: 'Use customer next interactions widget',
52
+ module: 'customers',
53
+ dependsOn: ['customers.interactions.view'],
54
+ },
55
+ {
56
+ id: 'customers.widgets.new-customers',
57
+ title: 'Use customer new customers widget',
58
+ module: 'customers',
59
+ dependsOn: ['customers.people.view'],
60
+ },
61
+ {
62
+ id: 'customers.widgets.new-deals',
63
+ title: 'Use customer new deals widget',
64
+ module: 'customers',
65
+ dependsOn: ['customers.deals.view'],
66
+ },
17
67
  { id: 'customers.interactions.view', title: 'View interactions', module: 'customers' },
18
- { id: 'customers.interactions.manage', title: 'Manage interactions', module: 'customers' },
68
+ {
69
+ id: 'customers.interactions.manage',
70
+ title: 'Manage interactions',
71
+ module: 'customers',
72
+ dependsOn: ['customers.interactions.view'],
73
+ },
19
74
  { id: 'customers.roles.view', title: 'View entity roles', module: 'customers' },
20
- { id: 'customers.roles.manage', title: 'Manage entity roles', module: 'customers' },
75
+ {
76
+ id: 'customers.roles.manage',
77
+ title: 'Manage entity roles',
78
+ module: 'customers',
79
+ dependsOn: ['customers.roles.view'],
80
+ },
21
81
  ]
22
82
 
23
83
  export default features
@@ -10,7 +10,7 @@ import { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customF
10
10
  import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'
11
11
  import { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'
12
12
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
13
- import { ActivitiesSection, NotesSection, type SectionAction, type TagOption } from '@open-mercato/ui/backend/detail'
13
+ import { ActivitiesSection, NotesSection, RecordNotFoundState, type SectionAction, type TagOption } from '@open-mercato/ui/backend/detail'
14
14
  import { VersionHistoryAction } from '@open-mercato/ui/backend/version-history'
15
15
  import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
16
16
  import { useT } from '@open-mercato/shared/lib/i18n/context'
@@ -83,6 +83,7 @@ export default function ResourcesResourceDetailPage({ params }: { params?: { id?
83
83
  const router = useRouter()
84
84
  const searchParams = useSearchParams()
85
85
  const [initialValues, setInitialValues] = React.useState<Record<string, unknown> | null>(null)
86
+ const [isNotFound, setIsNotFound] = React.useState(false)
86
87
  const [tags, setTags] = React.useState<TagOption[]>([])
87
88
  const [activeTab, setActiveTab] = React.useState<'details' | 'availability'>('details')
88
89
  const [activeDetailTab, setActiveDetailTab] = React.useState<'notes' | 'activities'>('notes')
@@ -411,6 +412,7 @@ export default function ResourcesResourceDetailPage({ params }: { params?: { id?
411
412
 
412
413
  React.useEffect(() => {
413
414
  if (!resourceId || !resourceTypesLoaded) return
415
+ setIsNotFound(false)
414
416
  let cancelled = false
415
417
  async function loadResource() {
416
418
  try {
@@ -421,7 +423,10 @@ export default function ResourcesResourceDetailPage({ params }: { params?: { id?
421
423
  const record = await readApiResultOrThrow<ResourceResponse>(`/api/resources/resources?${params.toString()}`)
422
424
  const resourceRaw = Array.isArray(record?.items) ? record.items[0] : null
423
425
  const resource = resourceRaw ? normalizeResourceRecord(resourceRaw) : null
424
- if (!resource) throw new Error(t('resources.resources.form.errors.notFound', 'Resource not found.'))
426
+ if (!resource) {
427
+ if (!cancelled) setIsNotFound(true)
428
+ return
429
+ }
425
430
  if (!cancelled) {
426
431
  const customValues = extractCustomFieldEntries(resource)
427
432
  setTags(Array.isArray(resource.tags) ? resource.tags : [])
@@ -479,6 +484,20 @@ export default function ResourcesResourceDetailPage({ params }: { params?: { id?
479
484
  ? initialValues.name.trim()
480
485
  : t('resources.resources.detail.untitled', 'Unnamed resource')
481
486
 
487
+ if (isNotFound) {
488
+ return (
489
+ <Page>
490
+ <PageBody>
491
+ <RecordNotFoundState
492
+ label={t('resources.resources.form.errors.notFound', 'Resource not found.')}
493
+ backHref="/backend/resources/resources"
494
+ backLabel={t('resources.resources.detail.back', 'Back to resources')}
495
+ />
496
+ </PageBody>
497
+ </Page>
498
+ )
499
+ }
500
+
482
501
  return (
483
502
  <Page>
484
503
  <PageBody>
@@ -1,20 +1,113 @@
1
1
  export const features = [
2
- { id: 'sales.orders.view', title: 'View sales orders', module: 'sales' },
3
- { id: 'sales.orders.manage', title: 'Manage sales orders', module: 'sales' },
4
- { id: 'sales.orders.approve', title: 'Approve sales orders', module: 'sales' },
5
- { id: 'sales.widgets.new-orders', title: 'View new orders widget', module: 'sales' },
6
- { id: 'sales.widgets.new-quotes', title: 'View new quotes widget', module: 'sales' },
7
- { id: 'sales.quotes.view', title: 'View sales quotes', module: 'sales' },
8
- { id: 'sales.quotes.manage', title: 'Manage sales quotes', module: 'sales' },
9
- { id: 'sales.documents.number.edit', title: 'Edit sales document numbers', module: 'sales' },
10
- { id: 'sales.shipments.manage', title: 'Manage order shipments', module: 'sales' },
11
- { id: 'sales.payments.manage', title: 'Manage order payments', module: 'sales' },
12
- { id: 'sales.returns.view', title: 'View order returns', module: 'sales' },
13
- { id: 'sales.returns.create', title: 'Create order returns', module: 'sales' },
14
- { id: 'sales.invoices.manage', title: 'Manage sales invoices', module: 'sales' },
15
- { id: 'sales.credit_memos.manage', title: 'Manage credit memos', module: 'sales' },
16
- { id: 'sales.channels.manage', title: 'Manage sales channels', module: 'sales' },
17
- { id: 'sales.settings.manage', title: 'Manage sales configuration', module: 'sales' },
2
+ {
3
+ id: 'sales.orders.view',
4
+ title: 'View sales orders',
5
+ module: 'sales',
6
+ dependsOn: [
7
+ 'sales.channels.view',
8
+ 'sales.settings.view',
9
+ 'customers.people.view',
10
+ 'catalog.products.view',
11
+ 'currencies.view',
12
+ ],
13
+ },
14
+ {
15
+ id: 'sales.orders.manage',
16
+ title: 'Manage sales orders',
17
+ module: 'sales',
18
+ dependsOn: ['sales.orders.view'],
19
+ },
20
+ {
21
+ id: 'sales.orders.approve',
22
+ title: 'Approve sales orders',
23
+ module: 'sales',
24
+ dependsOn: ['sales.orders.view'],
25
+ },
26
+ {
27
+ id: 'sales.widgets.new-orders',
28
+ title: 'View new orders widget',
29
+ module: 'sales',
30
+ dependsOn: ['sales.orders.view'],
31
+ },
32
+ {
33
+ id: 'sales.widgets.new-quotes',
34
+ title: 'View new quotes widget',
35
+ module: 'sales',
36
+ dependsOn: ['sales.quotes.view'],
37
+ },
38
+ {
39
+ id: 'sales.quotes.view',
40
+ title: 'View sales quotes',
41
+ module: 'sales',
42
+ dependsOn: [
43
+ 'sales.channels.view',
44
+ 'sales.settings.view',
45
+ 'customers.people.view',
46
+ 'catalog.products.view',
47
+ ],
48
+ },
49
+ {
50
+ id: 'sales.quotes.manage',
51
+ title: 'Manage sales quotes',
52
+ module: 'sales',
53
+ dependsOn: ['sales.quotes.view'],
54
+ },
55
+ {
56
+ id: 'sales.documents.number.edit',
57
+ title: 'Edit sales document numbers',
58
+ module: 'sales',
59
+ dependsOn: ['sales.orders.view'],
60
+ },
61
+ {
62
+ id: 'sales.shipments.manage',
63
+ title: 'Manage order shipments',
64
+ module: 'sales',
65
+ dependsOn: ['sales.orders.view', 'shipping_carriers.view'],
66
+ },
67
+ {
68
+ id: 'sales.payments.manage',
69
+ title: 'Manage order payments',
70
+ module: 'sales',
71
+ dependsOn: ['sales.orders.view', 'payment_gateways.view'],
72
+ },
73
+ {
74
+ id: 'sales.returns.view',
75
+ title: 'View order returns',
76
+ module: 'sales',
77
+ dependsOn: ['sales.orders.view'],
78
+ },
79
+ {
80
+ id: 'sales.returns.create',
81
+ title: 'Create order returns',
82
+ module: 'sales',
83
+ dependsOn: ['sales.returns.view', 'sales.orders.manage'],
84
+ },
85
+ {
86
+ id: 'sales.invoices.manage',
87
+ title: 'Manage sales invoices',
88
+ module: 'sales',
89
+ dependsOn: ['sales.orders.view'],
90
+ },
91
+ {
92
+ id: 'sales.credit_memos.manage',
93
+ title: 'Manage credit memos',
94
+ module: 'sales',
95
+ dependsOn: ['sales.invoices.manage'],
96
+ },
97
+ { id: 'sales.channels.view', title: 'View sales channels', module: 'sales' },
98
+ {
99
+ id: 'sales.channels.manage',
100
+ title: 'Manage sales channels',
101
+ module: 'sales',
102
+ dependsOn: ['sales.channels.view'],
103
+ },
104
+ { id: 'sales.settings.view', title: 'View sales configuration', module: 'sales' },
105
+ {
106
+ id: 'sales.settings.manage',
107
+ title: 'Manage sales configuration',
108
+ module: 'sales',
109
+ dependsOn: ['sales.settings.view'],
110
+ },
18
111
  ]
19
112
 
20
113
  export default features
@@ -11,6 +11,7 @@ import {
11
11
  ErrorMessage,
12
12
  InlineTextEditor,
13
13
  LoadingMessage,
14
+ RecordNotFoundState,
14
15
  TabEmptyState,
15
16
  TagsSection,
16
17
  type TagOption,
@@ -1876,6 +1877,7 @@ export default function SalesDocumentDetailPage({
1876
1877
  const searchParams = useSearchParams()
1877
1878
  const { confirm, ConfirmDialogElement } = useConfirmDialog()
1878
1879
  const [loading, setLoading] = React.useState(true)
1880
+ const [isNotFound, setIsNotFound] = React.useState(false)
1879
1881
  const [record, setRecord] = React.useState<DocumentRecord | null>(null)
1880
1882
  const [tags, setTags] = React.useState<TagOption[]>([])
1881
1883
  const [kind, setKind] = React.useState<'order' | 'quote'>('quote')
@@ -2483,6 +2485,7 @@ export default function SalesDocumentDetailPage({
2483
2485
  async function load() {
2484
2486
  setLoading(true)
2485
2487
  setError(null)
2488
+ setIsNotFound(false)
2486
2489
  const requestedKind = searchParams.get('kind')
2487
2490
  const preferredKind = requestedKind === 'order' ? 'order' : requestedKind === 'quote' ? 'quote' : initialKind ?? null
2488
2491
  const kindsToTry: Array<'order' | 'quote'> = preferredKind
@@ -2505,7 +2508,11 @@ export default function SalesDocumentDetailPage({
2505
2508
  }
2506
2509
  if (!cancelled) {
2507
2510
  setLoading(false)
2508
- setError(lastError ?? loadErrorMessage)
2511
+ if (lastError) {
2512
+ setError(lastError)
2513
+ } else {
2514
+ setIsNotFound(true)
2515
+ }
2509
2516
  }
2510
2517
  }
2511
2518
  load().catch((err) => {
@@ -4435,6 +4442,26 @@ export default function SalesDocumentDetailPage({
4435
4442
  )
4436
4443
  }
4437
4444
 
4445
+ if (isNotFound) {
4446
+ const backHref = (searchParams.get('kind') === 'order' || initialKind === 'order')
4447
+ ? '/backend/sales/orders'
4448
+ : '/backend/sales/quotes'
4449
+ const backLabel = (searchParams.get('kind') === 'order' || initialKind === 'order')
4450
+ ? t('sales.documents.detail.backToOrders', 'Back to orders')
4451
+ : t('sales.documents.detail.backToQuotes', 'Back to quotes')
4452
+ return (
4453
+ <Page>
4454
+ <PageBody>
4455
+ <RecordNotFoundState
4456
+ label={t('sales.documents.detail.notFound', 'Document not found.')}
4457
+ backHref={backHref}
4458
+ backLabel={backLabel}
4459
+ />
4460
+ </PageBody>
4461
+ </Page>
4462
+ )
4463
+ }
4464
+
4438
4465
  if (error) {
4439
4466
  return (
4440
4467
  <Page>
@@ -552,6 +552,8 @@
552
552
  "sales.documents.detail.adjustments.updated": "Anpassung aktualisiert.",
553
553
  "sales.documents.detail.back": "Zurück zu Sales",
554
554
  "sales.documents.detail.backToCreate": "Neues Dokument erstellen",
555
+ "sales.documents.detail.backToOrders": "Zurück zu Bestellungen",
556
+ "sales.documents.detail.backToQuotes": "Zurück zu Angeboten",
555
557
  "sales.documents.detail.billing": "Rechnungsadresse",
556
558
  "sales.documents.detail.channel": "Kanal",
557
559
  "sales.documents.detail.channelInvalid": "Ausgewählter Kanal wurde nicht gefunden.",
@@ -679,6 +681,7 @@
679
681
  "sales.documents.detail.items.variant": "Variante",
680
682
  "sales.documents.detail.items.variantSearch": "Variante suchen",
681
683
  "sales.documents.detail.loading": "Dokument wird geladen…",
684
+ "sales.documents.detail.notFound": "Dokument nicht gefunden.",
682
685
  "sales.documents.detail.number": "Dokumentnummer",
683
686
  "sales.documents.detail.numberEditForbidden": "Dokumentennummer kann nicht bearbeitet werden.",
684
687
  "sales.documents.detail.numberEmpty": "Noch keine Nummer",
@@ -552,6 +552,8 @@
552
552
  "sales.documents.detail.adjustments.updated": "Adjustment updated.",
553
553
  "sales.documents.detail.back": "Back to Sales",
554
554
  "sales.documents.detail.backToCreate": "Create a new document",
555
+ "sales.documents.detail.backToOrders": "Back to orders",
556
+ "sales.documents.detail.backToQuotes": "Back to quotes",
555
557
  "sales.documents.detail.billing": "Billing address",
556
558
  "sales.documents.detail.channel": "Channel",
557
559
  "sales.documents.detail.channelInvalid": "Selected channel could not be found.",
@@ -679,6 +681,7 @@
679
681
  "sales.documents.detail.items.variant": "Variant",
680
682
  "sales.documents.detail.items.variantSearch": "Search variant",
681
683
  "sales.documents.detail.loading": "Loading document…",
684
+ "sales.documents.detail.notFound": "Document not found.",
682
685
  "sales.documents.detail.number": "Document number",
683
686
  "sales.documents.detail.numberEditForbidden": "Document number cannot be edited.",
684
687
  "sales.documents.detail.numberEmpty": "No number yet",
@@ -552,6 +552,8 @@
552
552
  "sales.documents.detail.adjustments.updated": "Ajuste actualizado.",
553
553
  "sales.documents.detail.back": "Volver a Ventas",
554
554
  "sales.documents.detail.backToCreate": "Crear un nuevo documento",
555
+ "sales.documents.detail.backToOrders": "Volver a pedidos",
556
+ "sales.documents.detail.backToQuotes": "Volver a cotizaciones",
555
557
  "sales.documents.detail.billing": "Dirección de facturación",
556
558
  "sales.documents.detail.channel": "Canal",
557
559
  "sales.documents.detail.channelInvalid": "No se pudo encontrar el canal seleccionado.",
@@ -679,6 +681,7 @@
679
681
  "sales.documents.detail.items.variant": "Variante",
680
682
  "sales.documents.detail.items.variantSearch": "Buscar variante",
681
683
  "sales.documents.detail.loading": "Cargando documento…",
684
+ "sales.documents.detail.notFound": "Documento no encontrado.",
682
685
  "sales.documents.detail.number": "Número de documento",
683
686
  "sales.documents.detail.numberEditForbidden": "El número de documento no se puede editar.",
684
687
  "sales.documents.detail.numberEmpty": "Sin número aún",
@@ -552,6 +552,8 @@
552
552
  "sales.documents.detail.adjustments.updated": "Korekta zaktualizowana.",
553
553
  "sales.documents.detail.back": "Wróć do sprzedaży",
554
554
  "sales.documents.detail.backToCreate": "Utwórz nowy dokument",
555
+ "sales.documents.detail.backToOrders": "Powrót do zamówień",
556
+ "sales.documents.detail.backToQuotes": "Powrót do ofert",
555
557
  "sales.documents.detail.billing": "Adres rozliczeniowy",
556
558
  "sales.documents.detail.channel": "Kanał",
557
559
  "sales.documents.detail.channelInvalid": "Nie znaleziono wybranego kanału.",
@@ -679,6 +681,7 @@
679
681
  "sales.documents.detail.items.variant": "Wariant",
680
682
  "sales.documents.detail.items.variantSearch": "Szukaj wariantu",
681
683
  "sales.documents.detail.loading": "Ładowanie dokumentu…",
684
+ "sales.documents.detail.notFound": "Nie znaleziono dokumentu.",
682
685
  "sales.documents.detail.number": "Numer dokumentu",
683
686
  "sales.documents.detail.numberEditForbidden": "Numer dokumentu nie może być edytowany.",
684
687
  "sales.documents.detail.numberEmpty": "Brak numeru",
@@ -50,6 +50,8 @@ export const setup: ModuleSetupConfig = {
50
50
  defaultRoleFeatures: {
51
51
  admin: ['sales.*', 'sales.documents.number.edit'],
52
52
  employee: [
53
+ 'sales.channels.view',
54
+ 'sales.settings.view',
53
55
  'sales.orders.view',
54
56
  'sales.orders.manage',
55
57
  'sales.orders.approve',