Franchise Partner Removed
A person stopped being a partner of a franchise unit. One message per partner. Consumed by cna-nexus itself to invalidate the economic group statistics cache, which cannot see hard-deleted rows otherwise.
Overview
Fact: a Franchise PartnerFranchise PartnerEntityv1.0.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.1.0A person became a partner of a franchise unit, with their roles. One message per partner. Consumed by cna-nexus itself t...Ownercna-platformSchemaMapView docs, with the roles and person as they were. 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, 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. 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 owner | NEXUS |
metadata.event | FranchisePartnerRemoved |
| Consumer group | economic-group-partner-touch |
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.0.0'; // wire format is 1.1.0, bump pending (Known drift)}Known drift
Observed 2026-09-24.
- cna-nexus
api/app/events/nexus/franchise/FranchisePartnerRemoved.tsonstaging(cna-br/cna-nexus#562) sendsperson.birthDateasYYYY-MM-DD, the 1.1.0 contract, but still declaresstatic readonly version = '1.0.0', sometadata.versionwill read1.0.0. Production (v0.13.0) runs the 1.0.0 contract, with the ISO timestamp, until the next release. No pin: cna-nexus is the producer and the only consumer, and its handler reads onlyfranchiseId. The badge and this note go when the class declares1.1.0in production. - cna-one has no class for this event on
mainand drops it. Branchjl/feature/CWH-49388-consume-franchise-partner-events(not merged) typesbirthDateasYYYY-MM-DDtext, has nostatic version, and does not carryrolesorisFranchisee.
Custom properties
| Property | Value |
|---|---|
| Contract Ownerx-contract-owner | NEXUS |
| Kafka Topicx-kafka-topic | Franchise |
| Message Keyx-message-key | franchiseId |
| Sourcex-source | cna-nexus api/app/events/nexus/franchise/FranchisePartnerRemoved.ts |
| Driftx-drift | cna-nexus publishes birthDate as YYYY-MM-DD (cna-br/cna-nexus#562, staging) but its class still declares version 1.0.0, and production sends the ISO timestamp until the next release. |
Franchise id (UUID). Kafka message key.
Roles of the partner in this unit (FranchisePartnerRole). Never empty.
Snapshot of the person (common.persons).