@open-mercato/core 0.6.1-develop.3287.1.450f4ffb56 → 0.6.1-develop.3306.1.9ad9ff2526

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 (122) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +14 -0
  3. package/dist/modules/auth/backend/roles/[id]/edit/page.js +2 -1
  4. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  5. package/dist/modules/auth/backend/users/[id]/edit/page.js +2 -5
  6. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  7. package/dist/modules/catalog/ai-agents.js +47 -5
  8. package/dist/modules/catalog/ai-agents.js.map +2 -2
  9. package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +2 -5
  10. package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
  11. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +4 -3
  12. package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
  13. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +2 -9
  14. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  15. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +2 -9
  16. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
  17. package/dist/modules/customers/ai-agents.js +174 -1
  18. package/dist/modules/customers/ai-agents.js.map +2 -2
  19. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +196 -0
  20. package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +7 -0
  21. package/dist/modules/customers/ai-tools.js +3 -1
  22. package/dist/modules/customers/ai-tools.js.map +2 -2
  23. package/dist/modules/customers/backend/customers/companies/page.js +11 -1
  24. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  25. package/dist/modules/customers/backend/customers/deals/page.js +11 -1
  26. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  27. package/dist/modules/customers/backend/customers/people/page.js +11 -1
  28. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  29. package/dist/modules/customers/commands/companies.js +37 -15
  30. package/dist/modules/customers/commands/companies.js.map +2 -2
  31. package/dist/modules/customers/components/detail/AiActionChips.js +2 -2
  32. package/dist/modules/customers/components/detail/AiActionChips.js.map +2 -2
  33. package/dist/modules/customers/components/detail/ChangelogTab.js +3 -9
  34. package/dist/modules/customers/components/detail/ChangelogTab.js.map +2 -2
  35. package/dist/modules/customers/components/detail/changelogValues.js +35 -0
  36. package/dist/modules/customers/components/detail/changelogValues.js.map +7 -0
  37. package/dist/modules/customers/components/detail/customFieldUtils.js +1 -1
  38. package/dist/modules/customers/components/detail/customFieldUtils.js.map +1 -1
  39. package/dist/modules/customers/components/formConfig.js +3 -2
  40. package/dist/modules/customers/components/formConfig.js.map +2 -2
  41. package/dist/modules/customers/widgets/injection/ai-assistant-trigger/widget.client.js +4 -9
  42. package/dist/modules/customers/widgets/injection/ai-assistant-trigger/widget.client.js.map +2 -2
  43. package/dist/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.client.js +302 -0
  44. package/dist/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.client.js.map +7 -0
  45. package/dist/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.js +17 -0
  46. package/dist/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.js.map +7 -0
  47. package/dist/modules/customers/widgets/injection/ai-deal-detail-trigger/widget.client.js +2 -2
  48. package/dist/modules/customers/widgets/injection/ai-deal-detail-trigger/widget.client.js.map +2 -2
  49. package/dist/modules/customers/widgets/injection-table.js +2 -2
  50. package/dist/modules/customers/widgets/injection-table.js.map +2 -2
  51. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +2 -5
  52. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
  53. package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js +2 -5
  54. package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js.map +2 -2
  55. package/dist/modules/resources/backend/resources/resources/[id]/page.js +2 -5
  56. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  57. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +2 -25
  58. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
  59. package/dist/modules/sales/components/channels/ChannelOfferForm.js +2 -43
  60. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
  61. package/dist/modules/sales/components/documents/LineItemDialog.js +162 -42
  62. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  63. package/dist/modules/sales/components/documents/customFieldHelpers.js +4 -31
  64. package/dist/modules/sales/components/documents/customFieldHelpers.js.map +2 -2
  65. package/package.json +15 -6
  66. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +2 -1
  67. package/src/modules/auth/backend/users/[id]/edit/page.tsx +2 -5
  68. package/src/modules/business_rules/migrations/.snapshot-open-mercato.json +746 -394
  69. package/src/modules/catalog/ai-agents.ts +62 -4
  70. package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +2 -5
  71. package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +4 -3
  72. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +2 -12
  73. package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +2 -10
  74. package/src/modules/catalog/migrations/.snapshot-open-mercato.json +2519 -1307
  75. package/src/modules/customer_accounts/migrations/.snapshot-open-mercato.json +828 -834
  76. package/src/modules/customers/AGENTS.md +6 -1
  77. package/src/modules/customers/ai-agents.ts +213 -6
  78. package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +286 -0
  79. package/src/modules/customers/ai-tools.ts +2 -0
  80. package/src/modules/customers/backend/customers/companies/page.tsx +10 -0
  81. package/src/modules/customers/backend/customers/deals/page.tsx +10 -0
  82. package/src/modules/customers/backend/customers/people/page.tsx +10 -0
  83. package/src/modules/customers/commands/companies.ts +38 -14
  84. package/src/modules/customers/components/detail/AiActionChips.tsx +2 -2
  85. package/src/modules/customers/components/detail/ChangelogTab.tsx +3 -10
  86. package/src/modules/customers/components/detail/changelogValues.ts +42 -0
  87. package/src/modules/customers/components/detail/customFieldUtils.ts +1 -1
  88. package/src/modules/customers/components/formConfig.tsx +3 -2
  89. package/src/modules/customers/i18n/de.json +7 -0
  90. package/src/modules/customers/i18n/en.json +7 -0
  91. package/src/modules/customers/i18n/es.json +7 -0
  92. package/src/modules/customers/i18n/pl.json +7 -0
  93. package/src/modules/customers/migrations/.snapshot-open-mercato.json +2313 -2336
  94. package/src/modules/customers/widgets/injection/ai-assistant-trigger/widget.client.tsx +4 -6
  95. package/src/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.client.tsx +358 -0
  96. package/src/modules/customers/widgets/injection/ai-deal-analyzer-trigger/widget.ts +34 -0
  97. package/src/modules/customers/widgets/injection/ai-deal-detail-trigger/widget.client.tsx +2 -2
  98. package/src/modules/customers/widgets/injection-table.ts +12 -9
  99. package/src/modules/data_sync/migrations/.snapshot-open-mercato.json +554 -210
  100. package/src/modules/dictionaries/migrations/.snapshot-open-mercato.json +146 -146
  101. package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +2 -5
  102. package/src/modules/directory/backend/directory/tenants/[id]/edit/page.tsx +2 -5
  103. package/src/modules/directory/migrations/.snapshot-open-mercato.json +273 -140
  104. package/src/modules/feature_toggles/migrations/.snapshot-open-mercato.json +242 -137
  105. package/src/modules/integrations/migrations/.snapshot-open-mercato.json +498 -195
  106. package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +158 -157
  107. package/src/modules/perspectives/migrations/.snapshot-open-mercato.json +274 -129
  108. package/src/modules/planner/migrations/.snapshot-open-mercato.json +327 -157
  109. package/src/modules/progress/AGENTS.md +72 -0
  110. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +2 -5
  111. package/src/modules/resources/migrations/.snapshot-open-mercato.json +920 -470
  112. package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +2 -27
  113. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +2 -49
  114. package/src/modules/sales/components/documents/LineItemDialog.tsx +214 -78
  115. package/src/modules/sales/components/documents/customFieldHelpers.ts +4 -43
  116. package/src/modules/sales/i18n/de.json +3 -0
  117. package/src/modules/sales/i18n/en.json +3 -0
  118. package/src/modules/sales/i18n/es.json +3 -0
  119. package/src/modules/sales/i18n/pl.json +3 -0
  120. package/src/modules/sales/migrations/.snapshot-open-mercato.json +4740 -4778
  121. package/src/modules/shipping_carriers/migrations/.snapshot-open-mercato.json +340 -81
  122. package/src/modules/staff/migrations/.snapshot-open-mercato.json +1439 -729
@@ -51,7 +51,7 @@ import {
51
51
  import type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'
52
52
  import { E } from '#generated/entities.ids.generated'
53
53
  import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
54
- import { CUSTOMER_ENTITY_ID } from '../lib/customFieldRouting'
54
+ import { CUSTOMER_ENTITY_ID, resolveCompanyCustomFieldRouting } from '../lib/customFieldRouting'
55
55
  import { CustomFieldValue } from '@open-mercato/core/modules/entities/data/entities'
56
56
 
57
57
  const COMPANY_ENTITY_ID = 'customers:customer_company_profile'
@@ -413,22 +413,46 @@ async function loadCompanySnapshot(em: EntityManager, id: string): Promise<Compa
413
413
 
414
414
  async function setCompanyCustomFields(
415
415
  ctx: CommandRuntimeContext,
416
+ entityId: string,
416
417
  profileId: string,
417
418
  organizationId: string,
418
419
  tenantId: string,
419
420
  values: Record<string, unknown>
420
421
  ) {
421
422
  if (!values || !Object.keys(values).length) return
423
+ const em = (ctx.container.resolve('em') as EntityManager)
424
+ const routing = await resolveCompanyCustomFieldRouting(em, tenantId, organizationId)
425
+ const entityScoped: Record<string, unknown> = {}
426
+ const profileScoped: Record<string, unknown> = {}
427
+ for (const [key, value] of Object.entries(values)) {
428
+ const target = routing.get(key) ?? COMPANY_ENTITY_ID
429
+ if (target === CUSTOMER_ENTITY_ID) entityScoped[key] = value
430
+ else profileScoped[key] = value
431
+ }
432
+
422
433
  const de = (ctx.container.resolve('dataEngine') as DataEngine)
423
- await setCustomFieldsIfAny({
424
- dataEngine: de,
425
- entityId: COMPANY_ENTITY_ID,
426
- recordId: profileId,
427
- organizationId,
428
- tenantId,
429
- values,
430
- notify: false,
431
- })
434
+ if (Object.keys(entityScoped).length) {
435
+ await setCustomFieldsIfAny({
436
+ dataEngine: de,
437
+ entityId: CUSTOMER_ENTITY_ID,
438
+ recordId: entityId,
439
+ organizationId,
440
+ tenantId,
441
+ values: entityScoped,
442
+ notify: false,
443
+ })
444
+ }
445
+ if (Object.keys(profileScoped).length) {
446
+ await setCustomFieldsIfAny({
447
+ dataEngine: de,
448
+ entityId: COMPANY_ENTITY_ID,
449
+ recordId: profileId,
450
+ organizationId,
451
+ tenantId,
452
+ values: profileScoped,
453
+ notify: false,
454
+ })
455
+ }
432
456
  }
433
457
 
434
458
  function normalizeOptionalString(value: string | null | undefined): string | null {
@@ -495,7 +519,7 @@ const createCompanyCommand: CommandHandler<CompanyCreateInput, { entityId: strin
495
519
 
496
520
  await syncEntityTags(em, entity, parsed.tags)
497
521
  await em.flush()
498
- await setCompanyCustomFields(ctx, profile.id, entity.organizationId, entity.tenantId, custom)
522
+ await setCompanyCustomFields(ctx, entity.id, profile.id, entity.organizationId, entity.tenantId, custom)
499
523
 
500
524
  const de = (ctx.container.resolve('dataEngine') as DataEngine)
501
525
  await emitCrudSideEffects({
@@ -622,7 +646,7 @@ const updateCompanyCommand: CommandHandler<CompanyUpdateInput, { entityId: strin
622
646
  await syncEntityTags(em, record, parsed.tags)
623
647
  await em.flush()
624
648
 
625
- await setCompanyCustomFields(ctx, profile.id, record.organizationId, record.tenantId, custom)
649
+ await setCompanyCustomFields(ctx, record.id, profile.id, record.organizationId, record.tenantId, custom)
626
650
 
627
651
  const de = (ctx.container.resolve('dataEngine') as DataEngine)
628
652
  await emitCrudSideEffects({
@@ -801,7 +825,7 @@ const updateCompanyCommand: CommandHandler<CompanyUpdateInput, { entityId: strin
801
825
 
802
826
  const resetValues = buildCustomFieldResetMap(before.custom, payload?.after?.custom)
803
827
  if (Object.keys(resetValues).length) {
804
- await setCompanyCustomFields(ctx, profile.id, entity.organizationId, entity.tenantId, resetValues)
828
+ await setCompanyCustomFields(ctx, entity.id, profile.id, entity.organizationId, entity.tenantId, resetValues)
805
829
  }
806
830
  },
807
831
  }
@@ -1329,7 +1353,7 @@ const deleteCompanyCommand: CommandHandler<{ body?: Record<string, unknown>; que
1329
1353
 
1330
1354
  const resetValues = buildCustomFieldResetMap(before.custom, undefined)
1331
1355
  if (Object.keys(resetValues).length) {
1332
- await setCompanyCustomFields(ctx, profile.id, entity.organizationId, entity.tenantId, resetValues)
1356
+ await setCompanyCustomFields(ctx, entity.id, profile.id, entity.organizationId, entity.tenantId, resetValues)
1333
1357
  }
1334
1358
  await emitQueryIndexUpsertEvents(ctx, [companyEntityIndexEntry(entity)])
1335
1359
  await emitQueryIndexUpsertEvents(ctx, childUpserts)
@@ -1,8 +1,8 @@
1
1
  'use client'
2
2
 
3
3
  import * as React from 'react'
4
- import { Sparkles } from 'lucide-react'
5
4
  import { useT } from '@open-mercato/shared/lib/i18n/context'
5
+ import { AiIcon } from '@open-mercato/ui/ai/AiIcon'
6
6
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@open-mercato/ui/primitives/tooltip'
7
7
  import { AI_TIMELINE_ACTIONS_BY_TYPE, resolveAiActions } from './aiActionCatalog'
8
8
 
@@ -27,7 +27,7 @@ export function AiActionChips({ activityType }: AiActionChipsProps) {
27
27
  type="button"
28
28
  className="inline-flex items-center gap-1 rounded-[4px] border border-dashed border-border bg-card pl-1.5 pr-[7px] py-[3px] text-[9px] font-medium text-muted-foreground/70 transition-colors hover:border-muted-foreground hover:text-foreground"
29
29
  >
30
- <Sparkles className="size-2.5 shrink-0" />
30
+ <AiIcon className="size-2.5 shrink-0" />
31
31
  {t(action.i18nKey, action.fallback)}
32
32
  </button>
33
33
  </TooltipTrigger>
@@ -14,6 +14,7 @@ import { ErrorMessage, LoadingMessage, TabEmptyState } from '@open-mercato/ui/ba
14
14
  import { ChangelogFilters } from './ChangelogFilters'
15
15
  import { ChangelogKpiCards } from './ChangelogKpiCards'
16
16
  import { ChangelogEntryRow } from './ChangelogEntryRow'
17
+ import { formatChangelogValue } from './changelogValues'
17
18
 
18
19
  type AuditAction = {
19
20
  id: string
@@ -95,14 +96,6 @@ const HEADER_COLUMNS: Array<{ field: SortField; key: string; fallback: string; a
95
96
  { field: 'source', key: 'customers.changelog.col.source', fallback: 'Source', align: 'right' },
96
97
  ]
97
98
 
98
- function formatValue(value: unknown): string {
99
- if (value == null) return ''
100
- if (value instanceof Date) return value.toISOString()
101
- if (Array.isArray(value)) return value.map((entry) => formatValue(entry)).filter(Boolean).join(', ')
102
- if (typeof value === 'object') return JSON.stringify(value)
103
- return String(value)
104
- }
105
-
106
99
  function formatFieldLabel(fieldName: string): string {
107
100
  return fieldName
108
101
  .replace(/\./g, ' ')
@@ -126,8 +119,8 @@ function mergeFilterOptions(...groups: FilterOption[][]): FilterOption[] {
126
119
  function mapAuditActionToEntry(action: AuditAction): ChangelogEntry {
127
120
  const changes = extractChangeRows(action.changes, action.snapshotBefore).map((change) => ({
128
121
  fieldName: change.field,
129
- oldValue: formatValue(change.from),
130
- newValue: formatValue(change.to),
122
+ oldValue: formatChangelogValue(change.from),
123
+ newValue: formatChangelogValue(change.to),
131
124
  }))
132
125
 
133
126
  return {
@@ -0,0 +1,42 @@
1
+ function isRecord(value: unknown): value is Record<string, unknown> {
2
+ return !!value && typeof value === 'object' && !Array.isArray(value)
3
+ }
4
+
5
+ function readString(record: Record<string, unknown>, ...keys: string[]): string | null {
6
+ for (const key of keys) {
7
+ const value = record[key]
8
+ if (typeof value === 'string' && value.trim().length > 0) {
9
+ return value.trim()
10
+ }
11
+ }
12
+ return null
13
+ }
14
+
15
+ function formatObjectSummary(record: Record<string, unknown>): string | null {
16
+ const personName = [readString(record, 'firstName'), readString(record, 'lastName')]
17
+ .filter(Boolean)
18
+ .join(' ')
19
+ .trim()
20
+ const label = readString(record, 'displayName', 'label', 'name', 'title', 'fullName')
21
+ ?? (personName || null)
22
+ ?? readString(record, 'email')
23
+ if (!label) return null
24
+ return record.isPrimary === true ? `${label} (primary)` : label
25
+ }
26
+
27
+ export function formatChangelogValue(value: unknown): string {
28
+ if (value == null) return ''
29
+ if (value instanceof Date) return value.toISOString()
30
+ if (Array.isArray(value)) {
31
+ return value
32
+ .map((entry) => formatChangelogValue(entry))
33
+ .filter(Boolean)
34
+ .join(', ')
35
+ }
36
+ if (isRecord(value)) {
37
+ const summary = formatObjectSummary(value)
38
+ if (summary) return summary
39
+ return JSON.stringify(value)
40
+ }
41
+ return String(value)
42
+ }
@@ -121,6 +121,6 @@ export function normalizeCustomFieldSubmitValue(value: unknown): unknown {
121
121
  if (Array.isArray(value)) {
122
122
  return value.filter((entry) => entry !== undefined)
123
123
  }
124
- if (value === undefined) return null
124
+ if (value === undefined) return undefined
125
125
  return value
126
126
  }
@@ -6,6 +6,7 @@ import Link from 'next/link'
6
6
  import { Check, Pencil, Plus, Settings } from 'lucide-react'
7
7
  import { useT } from '@open-mercato/shared/lib/i18n/context'
8
8
  import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
9
+ import { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'
9
10
  import { Button } from '@open-mercato/ui/primitives/button'
10
11
  import { Input } from '@open-mercato/ui/primitives/input'
11
12
  import { EmailInput } from '@open-mercato/ui/primitives/email-input'
@@ -1966,7 +1967,7 @@ export function mapCompanyOverviewToFormValues(overview: CompanyOverview): Parti
1966
1967
  industry: overview.profile?.industry ?? '',
1967
1968
  sizeBucket: overview.profile?.sizeBucket ?? '',
1968
1969
  annualRevenue: overview.profile?.annualRevenue ?? '',
1969
- ...overview.customFields,
1970
+ ...extractCustomFieldEntries({ customFields: overview.customFields }),
1970
1971
  }
1971
1972
  }
1972
1973
 
@@ -1989,6 +1990,6 @@ export function mapPersonOverviewToFormValues(overview: PersonOverview): Partial
1989
1990
  department: overview.profile?.department ?? '',
1990
1991
  linkedInUrl: overview.profile?.linkedInUrl ?? '',
1991
1992
  twitterUrl: overview.profile?.twitterUrl ?? '',
1992
- ...overview.customFields,
1993
+ ...extractCustomFieldEntries({ customFields: overview.customFields }),
1993
1994
  }
1994
1995
  }
@@ -536,6 +536,7 @@
536
536
  "customers.companies.list.bulkDelete.failedGroup": "{count} Unternehmen konnten nicht gelöscht werden: {message}",
537
537
  "customers.companies.list.bulkDelete.operationLabel": "{count} Unternehmen löschen",
538
538
  "customers.companies.list.bulkDelete.partial": "{deleted} von {total} Unternehmen gelöscht; {failed} fehlgeschlagen",
539
+ "customers.companies.list.bulkDelete.progressName": "Ausgewählte Unternehmen löschen",
539
540
  "customers.companies.list.bulkDelete.success": "{count} companies deleted",
540
541
  "customers.companies.list.bulkDelete.title": "Delete {count} companies?",
541
542
  "customers.companies.list.columns.email": "E-Mail",
@@ -660,6 +661,10 @@
660
661
  "customers.countries.it": "Italien",
661
662
  "customers.countries.pl": "Polen",
662
663
  "customers.countries.us": "Vereinigte Staaten",
664
+ "customers.deal_analyzer.dock.subtitle": "Deals",
665
+ "customers.deal_analyzer.sheet.dock": "Seitlich andocken",
666
+ "customers.deal_analyzer.sheet.title": "Deal-Analyse",
667
+ "customers.deal_analyzer.sheet.welcomeTitle": "Deal-Analyse",
663
668
  "customers.deals.create.error": "Deal konnte nicht erstellt werden.",
664
669
  "customers.deals.create.submit": "Deal erstellen",
665
670
  "customers.deals.create.title": "Deal erstellen",
@@ -872,6 +877,7 @@
872
877
  "customers.deals.list.bulkDelete.failedGroup": "{count} Deals konnten nicht gelöscht werden: {message}",
873
878
  "customers.deals.list.bulkDelete.operationLabel": "{count} Deals löschen",
874
879
  "customers.deals.list.bulkDelete.partial": "{deleted} von {total} Deals gelöscht; {failed} fehlgeschlagen",
880
+ "customers.deals.list.bulkDelete.progressName": "Ausgewählte Deals löschen",
875
881
  "customers.deals.list.bulkDelete.success": "{count} deals deleted",
876
882
  "customers.deals.list.bulkDelete.title": "Delete {count} deals?",
877
883
  "customers.deals.list.columns.companies": "Unternehmen",
@@ -1672,6 +1678,7 @@
1672
1678
  "customers.people.list.bulkDelete.failedGroup": "{count} Personen konnten nicht gelöscht werden: {message}",
1673
1679
  "customers.people.list.bulkDelete.operationLabel": "{count} Personen löschen",
1674
1680
  "customers.people.list.bulkDelete.partial": "{deleted} von {total} Personen gelöscht; {failed} fehlgeschlagen",
1681
+ "customers.people.list.bulkDelete.progressName": "Ausgewählte Personen löschen",
1675
1682
  "customers.people.list.bulkDelete.success": "{count} people deleted",
1676
1683
  "customers.people.list.bulkDelete.title": "Delete {count} people?",
1677
1684
  "customers.people.list.columns.email": "E-Mail",
@@ -536,6 +536,7 @@
536
536
  "customers.companies.list.bulkDelete.failedGroup": "{count} companies could not be deleted: {message}",
537
537
  "customers.companies.list.bulkDelete.operationLabel": "Delete {count} companies",
538
538
  "customers.companies.list.bulkDelete.partial": "{deleted} of {total} companies deleted; {failed} failed",
539
+ "customers.companies.list.bulkDelete.progressName": "Delete selected companies",
539
540
  "customers.companies.list.bulkDelete.success": "{count} companies deleted",
540
541
  "customers.companies.list.bulkDelete.title": "Delete {count} companies?",
541
542
  "customers.companies.list.columns.email": "Email",
@@ -660,6 +661,10 @@
660
661
  "customers.countries.it": "Italy",
661
662
  "customers.countries.pl": "Poland",
662
663
  "customers.countries.us": "United States",
664
+ "customers.deal_analyzer.dock.subtitle": "Deals",
665
+ "customers.deal_analyzer.sheet.dock": "Dock to side",
666
+ "customers.deal_analyzer.sheet.title": "Deal Analyzer",
667
+ "customers.deal_analyzer.sheet.welcomeTitle": "Deal Analyzer",
663
668
  "customers.deals.create.error": "Failed to create deal.",
664
669
  "customers.deals.create.submit": "Create deal",
665
670
  "customers.deals.create.title": "Create deal",
@@ -872,6 +877,7 @@
872
877
  "customers.deals.list.bulkDelete.failedGroup": "{count} deals could not be deleted: {message}",
873
878
  "customers.deals.list.bulkDelete.operationLabel": "Delete {count} deals",
874
879
  "customers.deals.list.bulkDelete.partial": "{deleted} of {total} deals deleted; {failed} failed",
880
+ "customers.deals.list.bulkDelete.progressName": "Delete selected deals",
875
881
  "customers.deals.list.bulkDelete.success": "{count} deals deleted",
876
882
  "customers.deals.list.bulkDelete.title": "Delete {count} deals?",
877
883
  "customers.deals.list.columns.companies": "Companies",
@@ -1672,6 +1678,7 @@
1672
1678
  "customers.people.list.bulkDelete.failedGroup": "{count} people could not be deleted: {message}",
1673
1679
  "customers.people.list.bulkDelete.operationLabel": "Delete {count} people",
1674
1680
  "customers.people.list.bulkDelete.partial": "{deleted} of {total} people deleted; {failed} failed",
1681
+ "customers.people.list.bulkDelete.progressName": "Delete selected people",
1675
1682
  "customers.people.list.bulkDelete.success": "{count} people deleted",
1676
1683
  "customers.people.list.bulkDelete.title": "Delete {count} people?",
1677
1684
  "customers.people.list.columns.email": "Email",
@@ -536,6 +536,7 @@
536
536
  "customers.companies.list.bulkDelete.failedGroup": "No se pudieron eliminar {count} empresas: {message}",
537
537
  "customers.companies.list.bulkDelete.operationLabel": "Eliminar {count} empresas",
538
538
  "customers.companies.list.bulkDelete.partial": "{deleted} de {total} empresas eliminadas; {failed} fallaron",
539
+ "customers.companies.list.bulkDelete.progressName": "Eliminar empresas seleccionadas",
539
540
  "customers.companies.list.bulkDelete.success": "{count} companies deleted",
540
541
  "customers.companies.list.bulkDelete.title": "Delete {count} companies?",
541
542
  "customers.companies.list.columns.email": "Correo electrónico",
@@ -660,6 +661,10 @@
660
661
  "customers.countries.it": "Italia",
661
662
  "customers.countries.pl": "Polonia",
662
663
  "customers.countries.us": "Estados Unidos",
664
+ "customers.deal_analyzer.dock.subtitle": "Negocios",
665
+ "customers.deal_analyzer.sheet.dock": "Anclar al lado",
666
+ "customers.deal_analyzer.sheet.title": "Analizador de negocios",
667
+ "customers.deal_analyzer.sheet.welcomeTitle": "Analizador de negocios",
663
668
  "customers.deals.create.error": "No se pudo crear la oportunidad.",
664
669
  "customers.deals.create.submit": "Crear oportunidad",
665
670
  "customers.deals.create.title": "Crear oportunidad",
@@ -872,6 +877,7 @@
872
877
  "customers.deals.list.bulkDelete.failedGroup": "No se pudieron eliminar {count} deals: {message}",
873
878
  "customers.deals.list.bulkDelete.operationLabel": "Eliminar {count} deals",
874
879
  "customers.deals.list.bulkDelete.partial": "{deleted} de {total} deals eliminados; {failed} fallaron",
880
+ "customers.deals.list.bulkDelete.progressName": "Eliminar negocios seleccionados",
875
881
  "customers.deals.list.bulkDelete.success": "{count} deals deleted",
876
882
  "customers.deals.list.bulkDelete.title": "Delete {count} deals?",
877
883
  "customers.deals.list.columns.companies": "Empresas",
@@ -1672,6 +1678,7 @@
1672
1678
  "customers.people.list.bulkDelete.failedGroup": "No se pudieron eliminar {count} personas: {message}",
1673
1679
  "customers.people.list.bulkDelete.operationLabel": "Eliminar {count} personas",
1674
1680
  "customers.people.list.bulkDelete.partial": "{deleted} de {total} personas eliminadas; {failed} fallaron",
1681
+ "customers.people.list.bulkDelete.progressName": "Eliminar personas seleccionadas",
1675
1682
  "customers.people.list.bulkDelete.success": "{count} people deleted",
1676
1683
  "customers.people.list.bulkDelete.title": "Delete {count} people?",
1677
1684
  "customers.people.list.columns.email": "Correo electrónico",
@@ -536,6 +536,7 @@
536
536
  "customers.companies.list.bulkDelete.failedGroup": "Nie udało się usunąć {count} firm: {message}",
537
537
  "customers.companies.list.bulkDelete.operationLabel": "Usuń {count} firm",
538
538
  "customers.companies.list.bulkDelete.partial": "Usunięto {deleted} z {total} firm; {failed} nie powiodło się",
539
+ "customers.companies.list.bulkDelete.progressName": "Usuń zaznaczone firmy",
539
540
  "customers.companies.list.bulkDelete.success": "{count} companies deleted",
540
541
  "customers.companies.list.bulkDelete.title": "Delete {count} companies?",
541
542
  "customers.companies.list.columns.email": "E-mail",
@@ -660,6 +661,10 @@
660
661
  "customers.countries.it": "Włochy",
661
662
  "customers.countries.pl": "Polska",
662
663
  "customers.countries.us": "Stany Zjednoczone",
664
+ "customers.deal_analyzer.dock.subtitle": "Transakcje",
665
+ "customers.deal_analyzer.sheet.dock": "Zadokuj z boku",
666
+ "customers.deal_analyzer.sheet.title": "Analizator transakcji",
667
+ "customers.deal_analyzer.sheet.welcomeTitle": "Analizator transakcji",
663
668
  "customers.deals.create.error": "Nie udało się utworzyć szansy.",
664
669
  "customers.deals.create.submit": "Utwórz szansę",
665
670
  "customers.deals.create.title": "Utwórz szansę",
@@ -872,6 +877,7 @@
872
877
  "customers.deals.list.bulkDelete.failedGroup": "Nie udało się usunąć {count} transakcji: {message}",
873
878
  "customers.deals.list.bulkDelete.operationLabel": "Usuń {count} transakcji",
874
879
  "customers.deals.list.bulkDelete.partial": "Usunięto {deleted} z {total} transakcji; {failed} nie powiodło się",
880
+ "customers.deals.list.bulkDelete.progressName": "Usuń zaznaczone transakcje",
875
881
  "customers.deals.list.bulkDelete.success": "{count} deals deleted",
876
882
  "customers.deals.list.bulkDelete.title": "Delete {count} deals?",
877
883
  "customers.deals.list.columns.companies": "Firmy",
@@ -1672,6 +1678,7 @@
1672
1678
  "customers.people.list.bulkDelete.failedGroup": "Nie udało się usunąć {count} osób: {message}",
1673
1679
  "customers.people.list.bulkDelete.operationLabel": "Usuń {count} osób",
1674
1680
  "customers.people.list.bulkDelete.partial": "Usunięto {deleted} z {total} osób; {failed} nie powiodło się",
1681
+ "customers.people.list.bulkDelete.progressName": "Usuń zaznaczone osoby",
1675
1682
  "customers.people.list.bulkDelete.success": "{count} people deleted",
1676
1683
  "customers.people.list.bulkDelete.title": "Delete {count} people?",
1677
1684
  "customers.people.list.columns.email": "E-mail",