event

Franchise Partner Removed

A person stopped being a partner of a franchise unit. One message per partner. Consumed by cna-nexus to invalidate the economic group statistics cache, which cannot see hard-deleted rows otherwise, and by cna-one to revoke the partner's access to the franchise.

Event Topic: FranchiseKey: franchiseIdPayload drift

Overview

Fact: a Franchise PartnerFranchise PartnerEntityv1.1.0The link between a franchise unit and a person behind it, with one or more roles - FRANCHISEE (leads the unit) or OPERAT...Ownercna-platformView docs row was deleted. Same payload as Franchise Partner AddedFranchise Partner AddedEventv1.2.0A person became a partner of a franchise unit, with their roles and whether they are a primary contact of the unit. One ...Ownercna-platformSchemaMapView docs, with the roles, the primary contact flag and the person as they were. Since 1.2.0 isPrimaryContact is the flag the partner had when removed; the flag goes with the row. Since 1.1.0 person.birthDate is a calendar day, YYYY-MM-DD, as on FranchisePartnerAdded.

When it is published. CNA NexusCNA NexusServicev1.0.0Franchise network back-office (franchises, economic groups, partners, contracts and amendments, document storage, AI doc...PublishesInviteUser, ContractActivationRequested +13SubscribesContractActivationRequested, AmendmentApplyRequested +4Ownercna-platformMapRepoView docs, in removePartners, inside replaceFranchisePartners or when an audit reversal undoes the addition of a partner, registered with manager.afterCommit(), one message per removed partner. Partner rows are hard-deleted, which is exactly why this event matters: the statistics cache is versioned by MAX(updated_at) across groups, franchises and partners, and a deleted row cannot move that timestamp.

What the consumer does. Same as for FranchisePartnerAdded: cna-nexus bumps the updatedAt of the franchise’s economic group, if any, so the statistics cache is recomputed on the next read. CNA OneCNA OneServicev1.0.0Franchise operating system (franchises and employees, pricing, products and learning books, school operations). Publishe...PublishesGrantApplicationAccess, EmployeeCreated +6SubscribesInviteUser, FranchiseCreated +12Ownercna-platformMapRepoView docs (group franchise-franchise-events, handler revokeFranchisePartner, on staging through cna-br/cna-one#903, not yet in production): correlates the partner by document and revokes their access to that franchise, ending the contract today in the franchise’s timezone; the person, the employee and their other links stay. Changes to the person’s own data are a different fact, Partner UpdatedPartner UpdatedEventv1.0.0The personal data of a franchise partner changed in CNA Nexus - name, legal name, e-mail, phone or birth date. Snapshot ...Ownercna-platformSchemaMapView docs on Partner (Kafka topic)Partner (Kafka topic)Channelv1.0.0Kafka topic for the Partner aggregate - a person in their capacity as partner of one or more franchise units. Carries Pa...Ownercna-platformView docs (target contract).

Kafka

Topic (aggregateRoot)Franchise
Message key (routingKey)payload.franchiseId
Contract ownerNEXUS
metadata.eventFranchisePartnerRemoved
Consumer groupseconomic-group-partner-touch (cna-nexus), franchise-franchise-events (cna-one, pinned to 1.1.0)

Payload schema

Same payload type as FranchisePartnerAdded (FranchisePartnerEventPayload).

Source of truth

import { FranchisePartnerEventPayload } from 'events/nexus/franchise/FranchisePartnerAdded';
export class FranchisePartnerRemoved extends Event<FranchisePartnerEventPayload> {
static readonly owner = 'NEXUS';
static readonly aggregateRoot = 'Franchise';
static readonly routingKey = 'franchiseId';
static readonly version = '1.2.0';
}

Known drift

Observed 2026-10-05.

  • cna-nexus api/app/events/nexus/franchise/FranchisePartnerRemoved.ts: production (v0.14.0) sends the 1.1.0 payload, with person.birthDate as YYYY-MM-DD, but declares static readonly version = '1.0.0', so metadata.version reads 1.0.0. staging declares 1.1.0 (cna-br/cna-nexus#587). The 1.2.0 payload, with isPrimaryContact, is on cna-nexus branch jc/feature/CWH-52595-publish-primary-contact-in-partner-events (pull request pending) and declares 1.2.0. No pin: cna-nexus is the producer. This note goes when the class declaring 1.2.0 is in production.
  • cna-one api/app/events/nexus/franchise/FranchisePartnerRemoved.ts on staging (cna-br/cna-one#903, not yet in production) declares version = '1.1.0' and has no isPrimaryContact; it also types roles and person.documentType as string instead of the enums. cna-one’s receives is pinned to 1.1.0 until a copy carrying isPrimaryContact is in production (no pull request yet).

Custom properties

PropertyValue
Contract Ownerx-contract-ownerNEXUS
Kafka Topicx-kafka-topicFranchise
Message Keyx-message-keyfranchiseId
Sourcex-sourcecna-nexus api/app/events/nexus/franchise/FranchisePartnerRemoved.ts
Driftx-driftcna-nexus production sends the 1.1.0 payload but its class declares version 1.0.0, and 1.2.0 (isPrimaryContact) is pending in a pull request; cna-one's copy is 1.1.0, without isPrimaryContact, and its receives is pinned to 1.1.0 until it is updated and in production.
13 properties
franchiseIdstring
required

Franchise id (UUID). Kafka message key.

rolesarray[string]
required

Roles of the partner in this unit (FranchisePartnerRole). Never empty.

isPrimaryContactboolean
required

Whether the partner was a primary contact of this franchise for the franchisor team when removed. Belongs to the link with this franchise, not to the person.

personobject
required

Snapshot of the person (common.persons).