@open-mercato/core 0.4.11-develop.1355.50152f3ee9 → 0.4.11-develop.1362.574a071900
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/customers/api/companies/route.js +141 -3
- package/dist/modules/customers/api/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +52 -3
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/people/route.js +145 -3
- package/dist/modules/customers/api/people/route.js.map +2 -2
- package/dist/modules/customers/api/utils.js +195 -0
- package/dist/modules/customers/api/utils.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +171 -6
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +100 -7
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +180 -7
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +7 -0
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +1 -0
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +81 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/package.json +3 -3
- package/src/modules/customers/api/companies/route.ts +151 -3
- package/src/modules/customers/api/deals/route.ts +54 -3
- package/src/modules/customers/api/people/route.ts +160 -3
- package/src/modules/customers/api/utils.ts +286 -0
- package/src/modules/customers/backend/customers/companies/page.tsx +184 -9
- package/src/modules/customers/backend/customers/deals/page.tsx +127 -35
- package/src/modules/customers/backend/customers/people/page.tsx +191 -10
- package/src/modules/customers/commands/interactions.ts +7 -0
- package/src/modules/customers/components/detail/DealForm.tsx +1 -0
- package/src/modules/customers/i18n/de.json +12 -0
- package/src/modules/customers/i18n/en.json +15 -3
- package/src/modules/customers/i18n/es.json +12 -0
- package/src/modules/customers/i18n/pl.json +12 -0
- package/src/modules/query_index/lib/engine.ts +95 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/customers/commands/interactions.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport {\n parseWithCustomFields,\n setCustomFieldsIfAny,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n normalizeAuthorUserId,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { DefaultDataEngine, type DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CustomerInteraction } from '../data/entities'\nimport {\n interactionCreateSchema,\n interactionUpdateSchema,\n interactionCompleteSchema,\n interactionCancelSchema,\n type InteractionCreateInput,\n type InteractionUpdateInput,\n type InteractionCompleteInput,\n type InteractionCancelInput,\n} from '../data/validators'\nimport {\n ensureOrganizationScope,\n ensureTenantScope,\n requireCustomerEntity,\n extractUndoPayload,\n requireDealInScope,\n resolveParentResourceKind,\n} from './shared'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { recomputeNextInteraction } from '../lib/interactionProjection'\n\nconst INTERACTION_ENTITY_ID = 'customers:customer_interaction'\nconst interactionCrudIndexer: CrudIndexerConfig<CustomerInteraction> = {\n entityType: 'customers:customer_interaction' as const,\n}\n\nconst interactionCrudEvents: CrudEventsConfig = {\n module: 'customers',\n entity: 'interaction',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n entityId:\n ctx.entity && typeof ctx.entity === 'object' && 'entity' in (ctx.entity as Record<string, unknown>)\n ? (() => {\n const entityRef = (ctx.entity as CustomerInteraction).entity\n return typeof entityRef === 'string' ? entityRef : entityRef?.id ?? null\n })()\n : null,\n interactionType:\n ctx.entity && typeof ctx.entity === 'object' && 'interactionType' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).interactionType\n : null,\n status:\n ctx.entity && typeof ctx.entity === 'object' && 'status' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).status\n : null,\n source:\n ctx.entity && typeof ctx.entity === 'object' && 'source' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).source ?? null\n : null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n }),\n}\n\ntype InteractionSnapshot = {\n interaction: {\n id: string\n organizationId: string\n tenantId: string\n entityId: string\n entityKind: string | null\n dealId: string | null\n interactionType: string\n title: string | null\n body: string | null\n status: string\n scheduledAt: Date | null\n occurredAt: Date | null\n priority: number | null\n authorUserId: string | null\n ownerUserId: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n source: string | null\n }\n custom?: Record<string, unknown>\n}\n\ntype InteractionUndoPayload = {\n before?: InteractionSnapshot | null\n after?: InteractionSnapshot | null\n}\n\nasync function loadInteractionSnapshot(em: EntityManager, id: string): Promise<InteractionSnapshot | null> {\n const interaction = await em.findOne(CustomerInteraction, { id }, { populate: ['entity'] })\n if (!interaction) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n tenantId: interaction.tenantId,\n organizationId: interaction.organizationId,\n })\n const entityRef = interaction.entity\n const entityKind = (typeof entityRef === 'object' && entityRef !== null && 'kind' in entityRef)\n ? (entityRef as { kind: string }).kind\n : null\n return {\n interaction: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n entityId: typeof entityRef === 'string' ? entityRef : entityRef.id,\n entityKind,\n dealId: interaction.dealId ?? null,\n interactionType: interaction.interactionType,\n title: interaction.title ?? null,\n body: interaction.body ?? null,\n status: interaction.status,\n scheduledAt: interaction.scheduledAt ?? null,\n occurredAt: interaction.occurredAt ?? null,\n priority: interaction.priority ?? null,\n authorUserId: interaction.authorUserId ?? null,\n ownerUserId: interaction.ownerUserId ?? null,\n appearanceIcon: interaction.appearanceIcon ?? null,\n appearanceColor: interaction.appearanceColor ?? null,\n source: interaction.source ?? null,\n },\n custom,\n }\n}\n\nasync function setInteractionCustomFields(\n dataEngine: DataEngine,\n interactionId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>\n) {\n if (!values || !Object.keys(values).length) return\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: INTERACTION_ENTITY_ID,\n recordId: interactionId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nasync function emitLifecycleEvent(\n ctx: CommandRuntimeContext,\n eventId: string,\n payload: Record<string, unknown>\n): Promise<void> {\n let bus: { emitEvent(event: string, payload: unknown, options?: unknown): Promise<void> } | null = null\n try {\n bus = ctx.container.resolve('eventBus')\n } catch {\n bus = null\n }\n if (!bus) return\n await bus\n .emitEvent(eventId, payload, { persistent: true })\n .catch(() => undefined)\n}\n\nasync function emitInteractionRevertedEvent(\n ctx: CommandRuntimeContext,\n interaction: InteractionSnapshot['interaction'],\n): Promise<void> {\n await emitLifecycleEvent(ctx, 'customers.interaction.reverted', {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n entityId: interaction.entityId,\n interactionType: interaction.interactionType,\n source: interaction.source ?? null,\n status: interaction.status,\n occurredAt: interaction.occurredAt?.toISOString() ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n}\n\ntype InteractionIdentifiers = {\n id: string\n organizationId: string\n tenantId: string\n}\n\ntype InteractionProjectionMutation = {\n entityId: string\n nextInteractionId: string | null\n}\n\nfunction createTransactionalDataEngine(ctx: CommandRuntimeContext, em: EntityManager): DataEngine {\n const emWithConnection = em as EntityManager & { getConnection?: () => unknown }\n if (typeof emWithConnection.getConnection !== 'function') {\n return ctx.container.resolve('dataEngine') as DataEngine\n }\n return new DefaultDataEngine(em, ctx.container)\n}\n\nasync function runInTransaction<TResult>(\n em: EntityManager,\n operation: (trx: EntityManager) => Promise<TResult>,\n): Promise<TResult> {\n const transactionalEm = em as EntityManager & {\n transactional?: (callback: (trx: EntityManager) => Promise<TResult>) => Promise<TResult>\n }\n if (typeof transactionalEm.transactional === 'function') {\n return transactionalEm.transactional((trx) => operation(trx))\n }\n return operation(em)\n}\n\nasync function emitNextInteractionUpdatedEvent(\n ctx: CommandRuntimeContext,\n projection: InteractionProjectionMutation,\n identifiers: InteractionIdentifiers,\n): Promise<void> {\n await emitLifecycleEvent(ctx, 'customers.next_interaction.updated', {\n id: projection.entityId,\n entityId: projection.entityId,\n nextInteractionId: projection.nextInteractionId,\n organizationId: identifiers.organizationId,\n tenantId: identifiers.tenantId,\n })\n}\n\n// \u2500\u2500\u2500 Create \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst createInteractionCommand: CommandHandler<InteractionCreateInput, { interactionId: string; entityId: string }> = {\n id: 'customers.interactions.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(interactionCreateSchema, rawInput)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const normalizedAuthor = normalizeAuthorUserId(parsed.authorUserId ?? null, ctx.auth)\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const entity = await requireCustomerEntity(trx, parsed.entityId, undefined, 'Customer not found')\n ensureTenantScope(ctx, entity.tenantId)\n ensureOrganizationScope(ctx, entity.organizationId)\n\n if (parsed.dealId) {\n await requireDealInScope(trx, parsed.dealId, entity.tenantId, entity.organizationId)\n }\n\n const interaction = trx.create(CustomerInteraction, {\n ...(parsed.id ? { id: parsed.id } : {}),\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n entity,\n interactionType: parsed.interactionType,\n title: parsed.title ?? null,\n body: parsed.body ?? null,\n status: parsed.status ?? 'planned',\n scheduledAt: parsed.scheduledAt ?? null,\n occurredAt: parsed.occurredAt ?? null,\n priority: parsed.priority ?? null,\n authorUserId: normalizedAuthor,\n ownerUserId: parsed.ownerUserId ?? null,\n dealId: parsed.dealId ?? null,\n source: parsed.source ?? null,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n await trx.flush()\n\n await setInteractionCustomFields(\n createTransactionalDataEngine(ctx, trx),\n interaction.id,\n entity.organizationId,\n entity.tenantId,\n custom,\n )\n\n return {\n interaction,\n entityId: entity.id,\n }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n\n return { interactionId: interaction.id, entityId }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ result, snapshots }) => {\n const { translate } = await resolveTranslations()\n const snapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.create', 'Create interaction'),\n resourceKind: 'customers.interaction',\n resourceId: result.interactionId,\n parentResourceKind: resolveParentResourceKind(snapshot?.interaction?.entityKind),\n parentResourceId: snapshot?.interaction?.entityId ?? null,\n tenantId: snapshot?.interaction.tenantId ?? null,\n organizationId: snapshot?.interaction.organizationId ?? null,\n snapshotAfter: snapshot ?? null,\n payload: {\n undo: {\n after: snapshot,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const interactionId = logEntry?.resourceId\n if (!interactionId) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const record = await trx.findOne(CustomerInteraction, { id: interactionId })\n if (!record) return null\n const entityId = typeof record.entity === 'string' ? record.entity : record.entity.id\n trx.remove(record)\n await trx.flush()\n return {\n entityId,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }\n })\n if (!result) return\n const projection = await recomputeNextInteraction(em, result.entityId)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: result.entityId,\n nextInteractionId: projection.nextInteractionId,\n }, result.identifiers)\n },\n}\n\n// \u2500\u2500\u2500 Update \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst updateInteractionCommand: CommandHandler<InteractionUpdateInput, { interactionId: string }> = {\n id: 'customers.interactions.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(interactionUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(interactionUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n if (parsed.dealId !== undefined) {\n if (parsed.dealId) {\n await requireDealInScope(trx, parsed.dealId, interaction.tenantId, interaction.organizationId)\n }\n interaction.dealId = parsed.dealId ?? null\n }\n if (parsed.interactionType !== undefined) interaction.interactionType = parsed.interactionType\n if (parsed.title !== undefined) interaction.title = parsed.title ?? null\n if (parsed.body !== undefined) interaction.body = parsed.body ?? null\n if (parsed.status !== undefined) interaction.status = parsed.status\n if (parsed.scheduledAt !== undefined) interaction.scheduledAt = parsed.scheduledAt ?? null\n if (parsed.occurredAt !== undefined) interaction.occurredAt = parsed.occurredAt ?? null\n if (parsed.priority !== undefined) interaction.priority = parsed.priority ?? null\n if (parsed.authorUserId !== undefined) interaction.authorUserId = parsed.authorUserId ?? null\n if (parsed.ownerUserId !== undefined) interaction.ownerUserId = parsed.ownerUserId ?? null\n if (parsed.appearanceIcon !== undefined) interaction.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) interaction.appearanceColor = parsed.appearanceColor ?? null\n\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n await setInteractionCustomFields(\n createTransactionalDataEngine(ctx, trx),\n interaction.id,\n interaction.organizationId,\n interaction.tenantId,\n custom,\n )\n\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.update', 'Update interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, nextInteractionId } = await runInTransaction(em, async (trx) => {\n let interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n const entity = await requireCustomerEntity(trx, before.interaction.entityId, undefined, 'Customer not found')\n\n if (!interaction) {\n interaction = trx.create(CustomerInteraction, {\n id: before.interaction.id,\n organizationId: before.interaction.organizationId,\n tenantId: before.interaction.tenantId,\n entity,\n interactionType: before.interaction.interactionType,\n title: before.interaction.title,\n body: before.interaction.body,\n status: before.interaction.status,\n scheduledAt: before.interaction.scheduledAt,\n occurredAt: before.interaction.occurredAt,\n priority: before.interaction.priority,\n authorUserId: before.interaction.authorUserId,\n ownerUserId: before.interaction.ownerUserId,\n dealId: before.interaction.dealId,\n source: before.interaction.source,\n appearanceIcon: before.interaction.appearanceIcon,\n appearanceColor: before.interaction.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n } else {\n interaction.entity = entity\n interaction.interactionType = before.interaction.interactionType\n interaction.title = before.interaction.title\n interaction.body = before.interaction.body\n interaction.status = before.interaction.status\n interaction.scheduledAt = before.interaction.scheduledAt\n interaction.occurredAt = before.interaction.occurredAt\n interaction.priority = before.interaction.priority\n interaction.authorUserId = before.interaction.authorUserId\n interaction.ownerUserId = before.interaction.ownerUserId\n interaction.dealId = before.interaction.dealId\n interaction.source = before.interaction.source\n interaction.appearanceIcon = before.interaction.appearanceIcon\n interaction.appearanceColor = before.interaction.appearanceColor\n }\n\n await trx.flush()\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n\n const resetValues = buildCustomFieldResetMap(before.custom, payload?.after?.custom)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: createTransactionalDataEngine(ctx, trx),\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId,\n }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Complete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst completeInteractionCommand: CommandHandler<InteractionCompleteInput, { interactionId: string }> = {\n id: 'customers.interactions.complete',\n async prepare(rawInput, ctx) {\n const parsed = interactionCompleteSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const parsed = interactionCompleteSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n interaction.status = 'done'\n interaction.occurredAt = parsed.occurredAt ?? new Date()\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const identifiers = {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n }\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers,\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitLifecycleEvent(ctx, 'customers.interaction.completed', {\n ...identifiers,\n entityId,\n interactionType: interaction.interactionType,\n status: interaction.status,\n source: interaction.source ?? null,\n occurredAt: interaction.occurredAt?.toISOString() ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, identifiers)\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.complete', 'Complete interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) return null\n\n interaction.status = before.interaction.status\n interaction.occurredAt = before.interaction.occurredAt\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n if (!result) return\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: result.interaction,\n identifiers: {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitInteractionRevertedEvent(ctx, before.interaction)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId: result.nextInteractionId,\n }, {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Cancel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst cancelInteractionCommand: CommandHandler<InteractionCancelInput, { interactionId: string }> = {\n id: 'customers.interactions.cancel',\n async prepare(rawInput, ctx) {\n const parsed = interactionCancelSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const parsed = interactionCancelSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n interaction.status = 'canceled'\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const identifiers = {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n }\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers,\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitLifecycleEvent(ctx, 'customers.interaction.canceled', {\n ...identifiers,\n entityId,\n interactionType: interaction.interactionType,\n status: interaction.status,\n source: interaction.source ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, identifiers)\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.cancel', 'Cancel interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) return null\n\n interaction.status = before.interaction.status\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n if (!result) return\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: result.interaction,\n identifiers: {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitInteractionRevertedEvent(ctx, before.interaction)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId: result.nextInteractionId,\n }, {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Delete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst deleteInteractionCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, { interactionId: string }> =\n {\n id: 'customers.interactions.delete',\n async prepare(input, ctx) {\n const id = requireId(input, 'Interaction id required')\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const id = requireId(input, 'Interaction id required')\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n interaction.deletedAt = new Date()\n await trx.flush()\n\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n return { interactionId: interaction.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('customers.audit.interactions.delete', 'Delete interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, nextInteractionId } = await runInTransaction(em, async (trx) => {\n const entity = await requireCustomerEntity(trx, before.interaction.entityId, undefined, 'Customer not found')\n let interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) {\n interaction = trx.create(CustomerInteraction, {\n id: before.interaction.id,\n organizationId: before.interaction.organizationId,\n tenantId: before.interaction.tenantId,\n entity,\n interactionType: before.interaction.interactionType,\n title: before.interaction.title,\n body: before.interaction.body,\n status: before.interaction.status,\n scheduledAt: before.interaction.scheduledAt,\n occurredAt: before.interaction.occurredAt,\n priority: before.interaction.priority,\n authorUserId: before.interaction.authorUserId,\n ownerUserId: before.interaction.ownerUserId,\n dealId: before.interaction.dealId,\n source: before.interaction.source,\n appearanceIcon: before.interaction.appearanceIcon,\n appearanceColor: before.interaction.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n } else {\n interaction.deletedAt = null\n interaction.entity = entity\n interaction.interactionType = before.interaction.interactionType\n interaction.title = before.interaction.title\n interaction.body = before.interaction.body\n interaction.status = before.interaction.status\n interaction.scheduledAt = before.interaction.scheduledAt\n interaction.occurredAt = before.interaction.occurredAt\n interaction.priority = before.interaction.priority\n interaction.authorUserId = before.interaction.authorUserId\n interaction.ownerUserId = before.interaction.ownerUserId\n interaction.dealId = before.interaction.dealId\n interaction.source = before.interaction.source\n interaction.appearanceIcon = before.interaction.appearanceIcon\n interaction.appearanceColor = before.interaction.appearanceColor\n }\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n\n const resetValues = buildCustomFieldResetMap(before.custom, undefined)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: createTransactionalDataEngine(ctx, trx),\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId,\n }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n },\n }\n\n// \u2500\u2500\u2500 Recompute Next (internal repair) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst recomputeNextSchema = z.object({ entityId: z.string().min(1) })\n\nconst recomputeNextCommand: CommandHandler<{ entityId: string }, { entityId: string }> = {\n id: 'customers.interaction.recompute_next',\n async execute(rawInput, ctx) {\n const parsed = recomputeNextSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const projection = await recomputeNextInteraction(em, parsed.entityId)\n const entity = await requireCustomerEntity(em, parsed.entityId, undefined, 'Customer not found')\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: parsed.entityId,\n nextInteractionId: projection.nextInteractionId,\n }, {\n id: parsed.entityId,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n })\n return { entityId: parsed.entityId }\n },\n}\n\nregisterCommand(createInteractionCommand)\nregisterCommand(updateInteractionCommand)\nregisterCommand(completeInteractionCommand)\nregisterCommand(cancelInteractionCommand)\nregisterCommand(deleteInteractionCommand)\nregisterCommand(recomputeNextCommand)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport {\n parseWithCustomFields,\n setCustomFieldsIfAny,\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n requireId,\n normalizeAuthorUserId,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport { DefaultDataEngine, type DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CustomerInteraction } from '../data/entities'\nimport {\n interactionCreateSchema,\n interactionUpdateSchema,\n interactionCompleteSchema,\n interactionCancelSchema,\n type InteractionCreateInput,\n type InteractionUpdateInput,\n type InteractionCompleteInput,\n type InteractionCancelInput,\n} from '../data/validators'\nimport {\n ensureOrganizationScope,\n ensureTenantScope,\n requireCustomerEntity,\n extractUndoPayload,\n emitQueryIndexUpsertEvents,\n requireDealInScope,\n resolveParentResourceKind,\n} from './shared'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport {\n loadCustomFieldSnapshot,\n buildCustomFieldResetMap,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { recomputeNextInteraction } from '../lib/interactionProjection'\n\nconst INTERACTION_ENTITY_ID = 'customers:customer_interaction'\nconst interactionCrudIndexer: CrudIndexerConfig<CustomerInteraction> = {\n entityType: 'customers:customer_interaction' as const,\n}\n\nconst interactionCrudEvents: CrudEventsConfig = {\n module: 'customers',\n entity: 'interaction',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n entityId:\n ctx.entity && typeof ctx.entity === 'object' && 'entity' in (ctx.entity as Record<string, unknown>)\n ? (() => {\n const entityRef = (ctx.entity as CustomerInteraction).entity\n return typeof entityRef === 'string' ? entityRef : entityRef?.id ?? null\n })()\n : null,\n interactionType:\n ctx.entity && typeof ctx.entity === 'object' && 'interactionType' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).interactionType\n : null,\n status:\n ctx.entity && typeof ctx.entity === 'object' && 'status' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).status\n : null,\n source:\n ctx.entity && typeof ctx.entity === 'object' && 'source' in (ctx.entity as Record<string, unknown>)\n ? (ctx.entity as CustomerInteraction).source ?? null\n : null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n }),\n}\n\ntype InteractionSnapshot = {\n interaction: {\n id: string\n organizationId: string\n tenantId: string\n entityId: string\n entityKind: string | null\n dealId: string | null\n interactionType: string\n title: string | null\n body: string | null\n status: string\n scheduledAt: Date | null\n occurredAt: Date | null\n priority: number | null\n authorUserId: string | null\n ownerUserId: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n source: string | null\n }\n custom?: Record<string, unknown>\n}\n\ntype InteractionUndoPayload = {\n before?: InteractionSnapshot | null\n after?: InteractionSnapshot | null\n}\n\nasync function loadInteractionSnapshot(em: EntityManager, id: string): Promise<InteractionSnapshot | null> {\n const interaction = await em.findOne(CustomerInteraction, { id }, { populate: ['entity'] })\n if (!interaction) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n tenantId: interaction.tenantId,\n organizationId: interaction.organizationId,\n })\n const entityRef = interaction.entity\n const entityKind = (typeof entityRef === 'object' && entityRef !== null && 'kind' in entityRef)\n ? (entityRef as { kind: string }).kind\n : null\n return {\n interaction: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n entityId: typeof entityRef === 'string' ? entityRef : entityRef.id,\n entityKind,\n dealId: interaction.dealId ?? null,\n interactionType: interaction.interactionType,\n title: interaction.title ?? null,\n body: interaction.body ?? null,\n status: interaction.status,\n scheduledAt: interaction.scheduledAt ?? null,\n occurredAt: interaction.occurredAt ?? null,\n priority: interaction.priority ?? null,\n authorUserId: interaction.authorUserId ?? null,\n ownerUserId: interaction.ownerUserId ?? null,\n appearanceIcon: interaction.appearanceIcon ?? null,\n appearanceColor: interaction.appearanceColor ?? null,\n source: interaction.source ?? null,\n },\n custom,\n }\n}\n\nasync function setInteractionCustomFields(\n dataEngine: DataEngine,\n interactionId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>\n) {\n if (!values || !Object.keys(values).length) return\n await setCustomFieldsIfAny({\n dataEngine,\n entityId: INTERACTION_ENTITY_ID,\n recordId: interactionId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nasync function emitLifecycleEvent(\n ctx: CommandRuntimeContext,\n eventId: string,\n payload: Record<string, unknown>\n): Promise<void> {\n let bus: { emitEvent(event: string, payload: unknown, options?: unknown): Promise<void> } | null = null\n try {\n bus = ctx.container.resolve('eventBus')\n } catch {\n bus = null\n }\n if (!bus) return\n await bus\n .emitEvent(eventId, payload, { persistent: true })\n .catch(() => undefined)\n}\n\nasync function emitInteractionRevertedEvent(\n ctx: CommandRuntimeContext,\n interaction: InteractionSnapshot['interaction'],\n): Promise<void> {\n await emitLifecycleEvent(ctx, 'customers.interaction.reverted', {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n entityId: interaction.entityId,\n interactionType: interaction.interactionType,\n source: interaction.source ?? null,\n status: interaction.status,\n occurredAt: interaction.occurredAt?.toISOString() ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n}\n\ntype InteractionIdentifiers = {\n id: string\n organizationId: string\n tenantId: string\n}\n\ntype InteractionProjectionMutation = {\n entityId: string\n nextInteractionId: string | null\n}\n\nfunction createTransactionalDataEngine(ctx: CommandRuntimeContext, em: EntityManager): DataEngine {\n const emWithConnection = em as EntityManager & { getConnection?: () => unknown }\n if (typeof emWithConnection.getConnection !== 'function') {\n return ctx.container.resolve('dataEngine') as DataEngine\n }\n return new DefaultDataEngine(em, ctx.container)\n}\n\nasync function runInTransaction<TResult>(\n em: EntityManager,\n operation: (trx: EntityManager) => Promise<TResult>,\n): Promise<TResult> {\n const transactionalEm = em as EntityManager & {\n transactional?: (callback: (trx: EntityManager) => Promise<TResult>) => Promise<TResult>\n }\n if (typeof transactionalEm.transactional === 'function') {\n return transactionalEm.transactional((trx) => operation(trx))\n }\n return operation(em)\n}\n\nasync function emitNextInteractionUpdatedEvent(\n ctx: CommandRuntimeContext,\n projection: InteractionProjectionMutation,\n identifiers: InteractionIdentifiers,\n): Promise<void> {\n await emitQueryIndexUpsertEvents(ctx, [{\n entityType: 'customers:customer_entity',\n recordId: projection.entityId,\n organizationId: identifiers.organizationId,\n tenantId: identifiers.tenantId,\n }])\n await emitLifecycleEvent(ctx, 'customers.next_interaction.updated', {\n id: projection.entityId,\n entityId: projection.entityId,\n nextInteractionId: projection.nextInteractionId,\n organizationId: identifiers.organizationId,\n tenantId: identifiers.tenantId,\n })\n}\n\n// \u2500\u2500\u2500 Create \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst createInteractionCommand: CommandHandler<InteractionCreateInput, { interactionId: string; entityId: string }> = {\n id: 'customers.interactions.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(interactionCreateSchema, rawInput)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const normalizedAuthor = normalizeAuthorUserId(parsed.authorUserId ?? null, ctx.auth)\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const entity = await requireCustomerEntity(trx, parsed.entityId, undefined, 'Customer not found')\n ensureTenantScope(ctx, entity.tenantId)\n ensureOrganizationScope(ctx, entity.organizationId)\n\n if (parsed.dealId) {\n await requireDealInScope(trx, parsed.dealId, entity.tenantId, entity.organizationId)\n }\n\n const interaction = trx.create(CustomerInteraction, {\n ...(parsed.id ? { id: parsed.id } : {}),\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n entity,\n interactionType: parsed.interactionType,\n title: parsed.title ?? null,\n body: parsed.body ?? null,\n status: parsed.status ?? 'planned',\n scheduledAt: parsed.scheduledAt ?? null,\n occurredAt: parsed.occurredAt ?? null,\n priority: parsed.priority ?? null,\n authorUserId: normalizedAuthor,\n ownerUserId: parsed.ownerUserId ?? null,\n dealId: parsed.dealId ?? null,\n source: parsed.source ?? null,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n await trx.flush()\n\n await setInteractionCustomFields(\n createTransactionalDataEngine(ctx, trx),\n interaction.id,\n entity.organizationId,\n entity.tenantId,\n custom,\n )\n\n return {\n interaction,\n entityId: entity.id,\n }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n\n return { interactionId: interaction.id, entityId }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ result, snapshots }) => {\n const { translate } = await resolveTranslations()\n const snapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.create', 'Create interaction'),\n resourceKind: 'customers.interaction',\n resourceId: result.interactionId,\n parentResourceKind: resolveParentResourceKind(snapshot?.interaction?.entityKind),\n parentResourceId: snapshot?.interaction?.entityId ?? null,\n tenantId: snapshot?.interaction.tenantId ?? null,\n organizationId: snapshot?.interaction.organizationId ?? null,\n snapshotAfter: snapshot ?? null,\n payload: {\n undo: {\n after: snapshot,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const interactionId = logEntry?.resourceId\n if (!interactionId) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const record = await trx.findOne(CustomerInteraction, { id: interactionId })\n if (!record) return null\n const entityId = typeof record.entity === 'string' ? record.entity : record.entity.id\n trx.remove(record)\n await trx.flush()\n return {\n entityId,\n identifiers: {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n },\n }\n })\n if (!result) return\n const projection = await recomputeNextInteraction(em, result.entityId)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: result.entityId,\n nextInteractionId: projection.nextInteractionId,\n }, result.identifiers)\n },\n}\n\n// \u2500\u2500\u2500 Update \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst updateInteractionCommand: CommandHandler<InteractionUpdateInput, { interactionId: string }> = {\n id: 'customers.interactions.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(interactionUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(interactionUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n if (parsed.dealId !== undefined) {\n if (parsed.dealId) {\n await requireDealInScope(trx, parsed.dealId, interaction.tenantId, interaction.organizationId)\n }\n interaction.dealId = parsed.dealId ?? null\n }\n if (parsed.interactionType !== undefined) interaction.interactionType = parsed.interactionType\n if (parsed.title !== undefined) interaction.title = parsed.title ?? null\n if (parsed.body !== undefined) interaction.body = parsed.body ?? null\n if (parsed.status !== undefined) interaction.status = parsed.status\n if (parsed.scheduledAt !== undefined) interaction.scheduledAt = parsed.scheduledAt ?? null\n if (parsed.occurredAt !== undefined) interaction.occurredAt = parsed.occurredAt ?? null\n if (parsed.priority !== undefined) interaction.priority = parsed.priority ?? null\n if (parsed.authorUserId !== undefined) interaction.authorUserId = parsed.authorUserId ?? null\n if (parsed.ownerUserId !== undefined) interaction.ownerUserId = parsed.ownerUserId ?? null\n if (parsed.appearanceIcon !== undefined) interaction.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) interaction.appearanceColor = parsed.appearanceColor ?? null\n\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n await setInteractionCustomFields(\n createTransactionalDataEngine(ctx, trx),\n interaction.id,\n interaction.organizationId,\n interaction.tenantId,\n custom,\n )\n\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.update', 'Update interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, nextInteractionId } = await runInTransaction(em, async (trx) => {\n let interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n const entity = await requireCustomerEntity(trx, before.interaction.entityId, undefined, 'Customer not found')\n\n if (!interaction) {\n interaction = trx.create(CustomerInteraction, {\n id: before.interaction.id,\n organizationId: before.interaction.organizationId,\n tenantId: before.interaction.tenantId,\n entity,\n interactionType: before.interaction.interactionType,\n title: before.interaction.title,\n body: before.interaction.body,\n status: before.interaction.status,\n scheduledAt: before.interaction.scheduledAt,\n occurredAt: before.interaction.occurredAt,\n priority: before.interaction.priority,\n authorUserId: before.interaction.authorUserId,\n ownerUserId: before.interaction.ownerUserId,\n dealId: before.interaction.dealId,\n source: before.interaction.source,\n appearanceIcon: before.interaction.appearanceIcon,\n appearanceColor: before.interaction.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n } else {\n interaction.entity = entity\n interaction.interactionType = before.interaction.interactionType\n interaction.title = before.interaction.title\n interaction.body = before.interaction.body\n interaction.status = before.interaction.status\n interaction.scheduledAt = before.interaction.scheduledAt\n interaction.occurredAt = before.interaction.occurredAt\n interaction.priority = before.interaction.priority\n interaction.authorUserId = before.interaction.authorUserId\n interaction.ownerUserId = before.interaction.ownerUserId\n interaction.dealId = before.interaction.dealId\n interaction.source = before.interaction.source\n interaction.appearanceIcon = before.interaction.appearanceIcon\n interaction.appearanceColor = before.interaction.appearanceColor\n }\n\n await trx.flush()\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n\n const resetValues = buildCustomFieldResetMap(before.custom, payload?.after?.custom)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: createTransactionalDataEngine(ctx, trx),\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId,\n }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Complete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst completeInteractionCommand: CommandHandler<InteractionCompleteInput, { interactionId: string }> = {\n id: 'customers.interactions.complete',\n async prepare(rawInput, ctx) {\n const parsed = interactionCompleteSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const parsed = interactionCompleteSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n interaction.status = 'done'\n interaction.occurredAt = parsed.occurredAt ?? new Date()\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const identifiers = {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n }\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers,\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitLifecycleEvent(ctx, 'customers.interaction.completed', {\n ...identifiers,\n entityId,\n interactionType: interaction.interactionType,\n status: interaction.status,\n source: interaction.source ?? null,\n occurredAt: interaction.occurredAt?.toISOString() ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, identifiers)\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.complete', 'Complete interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) return null\n\n interaction.status = before.interaction.status\n interaction.occurredAt = before.interaction.occurredAt\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n if (!result) return\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: result.interaction,\n identifiers: {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitInteractionRevertedEvent(ctx, before.interaction)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId: result.nextInteractionId,\n }, {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Cancel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst cancelInteractionCommand: CommandHandler<InteractionCancelInput, { interactionId: string }> = {\n id: 'customers.interactions.cancel',\n async prepare(rawInput, ctx) {\n const parsed = interactionCancelSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const parsed = interactionCancelSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: parsed.id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n interaction.status = 'canceled'\n await trx.flush()\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const identifiers = {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n }\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: interaction,\n identifiers,\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitLifecycleEvent(ctx, 'customers.interaction.canceled', {\n ...identifiers,\n entityId,\n interactionType: interaction.interactionType,\n status: interaction.status,\n source: interaction.source ?? null,\n ...(ctx.syncOrigin ? { syncOrigin: ctx.syncOrigin } : {}),\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, identifiers)\n\n return { interactionId: interaction.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadInteractionSnapshot(em, result.interactionId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as InteractionSnapshot | undefined\n return {\n actionLabel: translate('customers.audit.interactions.cancel', 'Cancel interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const result = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) return null\n\n interaction.status = before.interaction.status\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n if (!result) return\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: result.interaction,\n identifiers: {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitInteractionRevertedEvent(ctx, before.interaction)\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId: result.nextInteractionId,\n }, {\n id: result.interaction.id,\n organizationId: result.interaction.organizationId,\n tenantId: result.interaction.tenantId,\n })\n },\n}\n\n// \u2500\u2500\u2500 Delete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst deleteInteractionCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, { interactionId: string }> =\n {\n id: 'customers.interactions.delete',\n async prepare(input, ctx) {\n const id = requireId(input, 'Interaction id required')\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadInteractionSnapshot(em, id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const id = requireId(input, 'Interaction id required')\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, entityId } = await runInTransaction(em, async (trx) => {\n const interaction = await trx.findOne(CustomerInteraction, { id, deletedAt: null })\n if (!interaction) throw new CrudHttpError(404, { error: 'Interaction not found' })\n ensureTenantScope(ctx, interaction.tenantId)\n ensureOrganizationScope(ctx, interaction.organizationId)\n\n const entityId = typeof interaction.entity === 'string' ? interaction.entity : interaction.entity.id\n interaction.deletedAt = new Date()\n await trx.flush()\n\n return { interaction, entityId }\n })\n\n const projection = await recomputeNextInteraction(em, entityId)\n const nextInteractionId = projection.nextInteractionId\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, { entityId, nextInteractionId }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n return { interactionId: interaction.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as InteractionSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('customers.audit.interactions.delete', 'Delete interaction'),\n resourceKind: 'customers.interaction',\n resourceId: before.interaction.id,\n parentResourceKind: resolveParentResourceKind(before.interaction.entityKind),\n parentResourceId: before.interaction.entityId ?? null,\n tenantId: before.interaction.tenantId,\n organizationId: before.interaction.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies InteractionUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<InteractionUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const { interaction, nextInteractionId } = await runInTransaction(em, async (trx) => {\n const entity = await requireCustomerEntity(trx, before.interaction.entityId, undefined, 'Customer not found')\n let interaction = await trx.findOne(CustomerInteraction, { id: before.interaction.id })\n if (!interaction) {\n interaction = trx.create(CustomerInteraction, {\n id: before.interaction.id,\n organizationId: before.interaction.organizationId,\n tenantId: before.interaction.tenantId,\n entity,\n interactionType: before.interaction.interactionType,\n title: before.interaction.title,\n body: before.interaction.body,\n status: before.interaction.status,\n scheduledAt: before.interaction.scheduledAt,\n occurredAt: before.interaction.occurredAt,\n priority: before.interaction.priority,\n authorUserId: before.interaction.authorUserId,\n ownerUserId: before.interaction.ownerUserId,\n dealId: before.interaction.dealId,\n source: before.interaction.source,\n appearanceIcon: before.interaction.appearanceIcon,\n appearanceColor: before.interaction.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n trx.persist(interaction)\n } else {\n interaction.deletedAt = null\n interaction.entity = entity\n interaction.interactionType = before.interaction.interactionType\n interaction.title = before.interaction.title\n interaction.body = before.interaction.body\n interaction.status = before.interaction.status\n interaction.scheduledAt = before.interaction.scheduledAt\n interaction.occurredAt = before.interaction.occurredAt\n interaction.priority = before.interaction.priority\n interaction.authorUserId = before.interaction.authorUserId\n interaction.ownerUserId = before.interaction.ownerUserId\n interaction.dealId = before.interaction.dealId\n interaction.source = before.interaction.source\n interaction.appearanceIcon = before.interaction.appearanceIcon\n interaction.appearanceColor = before.interaction.appearanceColor\n }\n await trx.flush()\n\n const projection = await recomputeNextInteraction(trx, before.interaction.entityId)\n\n const resetValues = buildCustomFieldResetMap(before.custom, undefined)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: createTransactionalDataEngine(ctx, trx),\n entityId: INTERACTION_ENTITY_ID,\n recordId: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n\n return {\n interaction,\n nextInteractionId: projection.nextInteractionId,\n }\n })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: interaction,\n identifiers: {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n },\n syncOrigin: ctx.syncOrigin,\n indexer: interactionCrudIndexer,\n events: interactionCrudEvents,\n })\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: before.interaction.entityId,\n nextInteractionId,\n }, {\n id: interaction.id,\n organizationId: interaction.organizationId,\n tenantId: interaction.tenantId,\n })\n },\n }\n\n// \u2500\u2500\u2500 Recompute Next (internal repair) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst recomputeNextSchema = z.object({ entityId: z.string().min(1) })\n\nconst recomputeNextCommand: CommandHandler<{ entityId: string }, { entityId: string }> = {\n id: 'customers.interaction.recompute_next',\n async execute(rawInput, ctx) {\n const parsed = recomputeNextSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const projection = await recomputeNextInteraction(em, parsed.entityId)\n const entity = await requireCustomerEntity(em, parsed.entityId, undefined, 'Customer not found')\n await emitNextInteractionUpdatedEvent(ctx, {\n entityId: parsed.entityId,\n nextInteractionId: projection.nextInteractionId,\n }, {\n id: parsed.entityId,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n })\n return { entityId: parsed.entityId }\n },\n}\n\nregisterCommand(createInteractionCommand)\nregisterCommand(updateInteractionCommand)\nregisterCommand(completeInteractionCommand)\nregisterCommand(cancelInteractionCommand)\nregisterCommand(deleteInteractionCommand)\nregisterCommand(recomputeNextCommand)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["interaction", "entityId"]
|
|
7
7
|
}
|
|
@@ -271,6 +271,7 @@ function EntityMultiSelect({
|
|
|
271
271
|
onMouseDown: (event) => event.preventDefault(),
|
|
272
272
|
onClick: () => addOption(option),
|
|
273
273
|
disabled,
|
|
274
|
+
"aria-label": option.label,
|
|
274
275
|
children: /* @__PURE__ */ jsxs("span", { className: "flex flex-col items-start", children: [
|
|
275
276
|
/* @__PURE__ */ jsx("span", { children: option.label }),
|
|
276
277
|
option.subtitle ? /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: option.subtitle }) : null
|