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.
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 owner | NEXUS |
metadata.event | FranchisePartnerRemoved |
| Consumer groups | economic-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, withperson.birthDateasYYYY-MM-DD, but declaresstatic readonly version = '1.0.0', sometadata.versionreads1.0.0.stagingdeclares1.1.0(cna-br/cna-nexus#587). The 1.2.0 payload, withisPrimaryContact, is on cna-nexus branchjc/feature/CWH-52595-publish-primary-contact-in-partner-events(pull request pending) and declares1.2.0. No pin: cna-nexus is the producer. This note goes when the class declaring1.2.0is in production. - cna-one
api/app/events/nexus/franchise/FranchisePartnerRemoved.tsonstaging(cna-br/cna-one#903, not yet in production) declaresversion = '1.1.0'and has noisPrimaryContact; it also typesrolesandperson.documentTypeasstringinstead of the enums. cna-one’sreceivesis pinned to 1.1.0 until a copy carryingisPrimaryContactis in production (no pull request yet).
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 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. |
Franchise id (UUID). Kafka message key.
Roles of the partner in this unit (FranchisePartnerRole). Never empty.
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.
Snapshot of the person (common.persons).