<!-- AUTO-GENERATED by backend/scripts/generate_catalogs.py — do not edit by hand. Re-run the script after changing manifests, events, or permissions. CI fails if this file drifts. -->

# Events catalog

Every event declared in `app.core.events.types.EventType`, with its publishers (grepped from `event_bus.publish` callsites) and subscribers (modules that return the event from `get_event_handlers()`).

Maintained by `backend/scripts/generate_catalogs.py`.

## Summary

| Event | Constant | Publishers | Subscribers |
|-------|----------|------------|-------------|
| `agenda.visit_note_updated` | `EventType.AGENDA_VISIT_NOTE_UPDATED` | `agenda` | `patient_timeline` |
| `appointment.cabinet_changed` | `EventType.APPOINTMENT_CABINET_CHANGED` | `agenda` | — |
| `appointment.cancelled` | `EventType.APPOINTMENT_CANCELLED` | `agenda` | `copilot`, `notifications`, `patient_timeline`, `recalls`, `schedules` |
| `appointment.checked_in` | `EventType.APPOINTMENT_CHECKED_IN` | `agenda` | `patient_timeline` |
| `appointment.completed` | `EventType.APPOINTMENT_COMPLETED` | `agenda` | `patient_timeline`, `recalls`, `treatment_plan` |
| `appointment.confirmed` | `EventType.APPOINTMENT_CONFIRMED` | `agenda` | `patient_timeline` |
| `appointment.in_treatment` | `EventType.APPOINTMENT_IN_TREATMENT` | `agenda` | `patient_timeline` |
| `appointment.no_show` | `EventType.APPOINTMENT_NO_SHOW` | `agenda` | `patient_timeline` |
| `appointment.scheduled` | `EventType.APPOINTMENT_SCHEDULED` | `agenda` | `notifications`, `patient_timeline`, `recalls`, `schedules` |
| `appointment.status_changed` | `EventType.APPOINTMENT_STATUS_CHANGED` | `agenda` | — |
| `appointment.updated` | `EventType.APPOINTMENT_UPDATED` | `agenda` | `schedules` |
| `budget.accepted` | `EventType.BUDGET_ACCEPTED` | `budget` | `notifications`, `patient_timeline`, `treatment_plan` |
| `budget.created` | `EventType.BUDGET_CREATED` | — | — |
| `budget.expired` | `EventType.BUDGET_EXPIRED` | `budget` | `patient_timeline` |
| `budget.rejected` | `EventType.BUDGET_REJECTED` | `budget` | `patient_timeline`, `treatment_plan` |
| `budget.reminder_sent` | `EventType.BUDGET_REMINDER_SENT` | `budget` | `patient_timeline` |
| `budget.renegotiated` | `EventType.BUDGET_RENEGOTIATED` | `budget` | `patient_timeline`, `treatment_plan` |
| `budget.sent` | `EventType.BUDGET_SENT` | `budget` | `notifications`, `patient_timeline` |
| `budget.viewed` | `EventType.BUDGET_VIEWED` | `budget` | `patient_timeline` |
| `clinical_notes.administrative_created` | `EventType.CLINICAL_NOTE_ADMINISTRATIVE_CREATED` | `clinical_notes` | `patient_timeline` |
| `clinical_notes.appointment_administrative_created` | `EventType.CLINICAL_NOTE_APPOINTMENT_ADMINISTRATIVE_CREATED` | `clinical_notes` | — |
| `clinical_notes.appointment_clinical_created` | `EventType.CLINICAL_NOTE_APPOINTMENT_CLINICAL_CREATED` | `clinical_notes` | — |
| `clinical_notes.diagnosis_created` | `EventType.CLINICAL_NOTE_DIAGNOSIS_CREATED` | `clinical_notes` | `patient_timeline` |
| `clinical_notes.plan_created` | `EventType.CLINICAL_NOTE_PLAN_CREATED` | `clinical_notes` | `patient_timeline` |
| `clinical_notes.treatment_created` | `EventType.CLINICAL_NOTE_TREATMENT_CREATED` | `clinical_notes` | `patient_timeline` |
| `copilot.budget.threshold_reached` | `EventType.COPILOT_BUDGET_THRESHOLD_REACHED` | — | — |
| `copilot.digest.sent` | `EventType.COPILOT_DIGEST_SENT` | `copilot` | — |
| `copilot.session.ended` | `EventType.COPILOT_SESSION_ENDED` | `copilot` | — |
| `copilot.session.started` | `EventType.COPILOT_SESSION_STARTED` | `copilot` | — |
| `copilot.tool.invoked` | `EventType.COPILOT_TOOL_INVOKED` | — | — |
| `credit_note.issued` | `EventType.CREDIT_NOTE_ISSUED` | — | — |
| `document.archived` | `EventType.DOCUMENT_ARCHIVED` | — | — |
| `document.deleted` | `EventType.DOCUMENT_DELETED` | `media` | — |
| `document.uploaded` | `EventType.DOCUMENT_UPLOADED` | `media` | `patient_timeline` |
| `email.failed` | `EventType.EMAIL_FAILED` | `notifications` | `patient_timeline` |
| `email.sent` | `EventType.EMAIL_SENT` | `notifications` | `patient_timeline` |
| `invoice.cancelled` | `EventType.INVOICE_CANCELLED` | — | — |
| `invoice.created` | `EventType.INVOICE_CREATED` | — | — |
| `invoice.issued` | `EventType.INVOICE_ISSUED` | `billing` | `patient_timeline` |
| `invoice.paid` | `EventType.INVOICE_PAID` | `billing` | `patient_timeline`, `verifactu` |
| `invoice.partial_paid` | `EventType.INVOICE_PARTIAL_PAID` | — | — |
| `invoice.sent` | `EventType.INVOICE_SENT` | `billing` | `notifications` |
| `invoice.voided` | `EventType.INVOICE_VOIDED` | — | — |
| `media.attachment_linked` | `EventType.ATTACHMENT_LINKED` | `media` | — |
| `media.attachment_unlinked` | `EventType.ATTACHMENT_UNLINKED` | `media` | — |
| `media.pair_created` | `EventType.PAIR_CREATED` | `media` | `patient_timeline` |
| `media.pair_removed` | `EventType.PAIR_REMOVED` | `media` | — |
| `media.photo_uploaded` | `EventType.PHOTO_UPLOADED` | `media` | `patient_timeline` |
| `migration.binary.resolved` | `EventType.MIGRATION_BINARY_RESOLVED` | `migration_import` | — |
| `migration.entity.persisted` | `EventType.MIGRATION_ENTITY_PERSISTED` | `migration_import` | — |
| `migration.job.completed` | `EventType.MIGRATION_JOB_COMPLETED` | `migration_import` | — |
| `migration.job.failed` | `EventType.MIGRATION_JOB_FAILED` | `migration_import` | — |
| `migration.job.started` | `EventType.MIGRATION_JOB_STARTED` | `migration_import` | — |
| `notification.delivered` | `EventType.NOTIFICATION_DELIVERED` | `notifications` | — |
| `notification.failed` | `EventType.NOTIFICATION_FAILED` | `notifications` | — |
| `notification.queued` | `EventType.NOTIFICATION_QUEUED` | `notifications` | — |
| `notification.reply_received` | `EventType.NOTIFICATION_REPLY_RECEIVED` | `notifications` | `patient_timeline` |
| `notification.sent` | `EventType.NOTIFICATION_SENT` | `notifications` | — |
| `odontogram.condition.changed` | `EventType.ODONTOGRAM_CONDITION_CHANGED` | `odontogram` | — |
| `odontogram.surface.updated` | `EventType.ODONTOGRAM_SURFACE_UPDATED` | `odontogram` | — |
| `odontogram.tooth.updated` | `EventType.ODONTOGRAM_TOOTH_UPDATED` | `odontogram` | — |
| `odontogram.treatment.added` | `EventType.ODONTOGRAM_TREATMENT_ADDED` | `odontogram` | — |
| `odontogram.treatment.deleted` | `EventType.ODONTOGRAM_TREATMENT_DELETED` | `odontogram` | — |
| `odontogram.treatment.performed` | `EventType.ODONTOGRAM_TREATMENT_PERFORMED` | `odontogram` | `budget`, `patient_timeline`, `payments`, `periodontogram`, `treatment_plan` |
| `odontogram.treatment.status_changed` | `EventType.ODONTOGRAM_TREATMENT_STATUS_CHANGED` | `odontogram` | — |
| `patient.archived` | `EventType.PATIENT_ARCHIVED` | `patients` | `media`, `periodontogram`, `recalls` |
| `patient.created` | `EventType.PATIENT_CREATED` | `patients` | `notifications` |
| `patient.medical_updated` | `EventType.PATIENT_MEDICAL_UPDATED` | `patients_clinical` | `patient_timeline` |
| `patient.updated` | `EventType.PATIENT_UPDATED` | `patients` | — |
| `payment.allocated` | `EventType.PAYMENT_ALLOCATED` | `payments` | — |
| `payment.recorded` | `EventType.PAYMENT_RECORDED` | `payments` | — |
| `payment.refunded` | `EventType.PAYMENT_REFUNDED` | `payments` | `billing` |
| `payment.voided` | `EventType.PAYMENT_VOIDED` | — | — |
| `periodontogram.snapshot.closed` | `EventType.PERIODONTOGRAM_SNAPSHOT_CLOSED` | `periodontogram` | — |
| `recall.cancelled` | `EventType.RECALL_CANCELLED` | `recalls` | — |
| `recall.completed` | `EventType.RECALL_COMPLETED` | `recalls` | — |
| `recall.created` | `EventType.RECALL_CREATED` | `recalls` | — |
| `recall.due` | `EventType.RECALL_DUE` | — | — |
| `recall.snoozed` | `EventType.RECALL_SNOOZED` | `recalls` | — |
| `tenant.resolved` | `EventType.TENANT_RESOLVED` | — | — |
| `treatment.completed` | `EventType.TREATMENT_COMPLETED` | — | — |
| `treatment_plan.budget_sync_requested` | `EventType.TREATMENT_PLAN_BUDGET_SYNC_REQUESTED` | `treatment_plan` | `budget` |
| `treatment_plan.closed` | `EventType.TREATMENT_PLAN_CLOSED` | `treatment_plan` | `patient_timeline` |
| `treatment_plan.confirmed` | `EventType.TREATMENT_PLAN_CONFIRMED` | `treatment_plan` | `patient_timeline` |
| `treatment_plan.created` | `EventType.TREATMENT_PLAN_CREATED` | `treatment_plan` | `patient_timeline` |
| `treatment_plan.item_completed_without_note` | `EventType.TREATMENT_PLAN_ITEM_COMPLETED_WITHOUT_NOTE` | `treatment_plan` | `patient_timeline` |
| `treatment_plan.item_session_completed` | `EventType.TREATMENT_PLAN_ITEM_SESSION_COMPLETED` | `treatment_plan` | `payments` |
| `treatment_plan.items_reordered` | `EventType.TREATMENT_PLAN_ITEMS_REORDERED` | `treatment_plan` | — |
| `treatment_plan.reactivated` | `EventType.TREATMENT_PLAN_REACTIVATED` | `treatment_plan` | `patient_timeline` |
| `treatment_plan.status_changed` | `EventType.TREATMENT_PLAN_STATUS_CHANGED` | `treatment_plan` | — |
| `treatment_plan.treatment_added` | `EventType.TREATMENT_PLAN_TREATMENT_ADDED` | `treatment_plan` | `budget` |
| `treatment_plan.treatment_completed` | `EventType.TREATMENT_PLAN_TREATMENT_COMPLETED` | `treatment_plan` | `patient_timeline`, `recalls` |
| `treatment_plan.treatment_removed` | `EventType.TREATMENT_PLAN_TREATMENT_REMOVED` | `treatment_plan` | `budget` |
| `verifactu.record.rejected` | `EventType.VERIFACTU_RECORD_REJECTED` | `verifactu` | — |

## Detail

### `agenda.visit_note_updated`

- **Constant:** `EventType.AGENDA_VISIT_NOTE_UPDATED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:829`
- **Subscribers:**
  - `patient_timeline`

### `appointment.cabinet_changed`

- **Constant:** `EventType.APPOINTMENT_CABINET_CHANGED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:766`
- **Subscribers:** —

### `appointment.cancelled`

- **Constant:** `EventType.APPOINTMENT_CANCELLED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:704`
- **Subscribers:**
  - `copilot`
  - `notifications`
  - `patient_timeline`
  - `recalls`
  - `schedules`

### `appointment.checked_in`

- **Constant:** `EventType.APPOINTMENT_CHECKED_IN`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:701`
- **Subscribers:**
  - `patient_timeline`

### `appointment.completed`

- **Constant:** `EventType.APPOINTMENT_COMPLETED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:703`
- **Subscribers:**
  - `patient_timeline`
  - `recalls`
  - `treatment_plan`

### `appointment.confirmed`

- **Constant:** `EventType.APPOINTMENT_CONFIRMED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:700`
- **Subscribers:**
  - `patient_timeline`

### `appointment.in_treatment`

- **Constant:** `EventType.APPOINTMENT_IN_TREATMENT`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:702`
- **Subscribers:**
  - `patient_timeline`

### `appointment.no_show`

- **Constant:** `EventType.APPOINTMENT_NO_SHOW`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:705`
- **Subscribers:**
  - `patient_timeline`

### `appointment.scheduled`

- **Constant:** `EventType.APPOINTMENT_SCHEDULED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:471`
- **Subscribers:**
  - `notifications`
  - `patient_timeline`
  - `recalls`
  - `schedules`

### `appointment.status_changed`

- **Constant:** `EventType.APPOINTMENT_STATUS_CHANGED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:695`
- **Subscribers:** —

### `appointment.updated`

- **Constant:** `EventType.APPOINTMENT_UPDATED`
- **Publishers:**
  - `agenda` — `backend/app/modules/agenda/service.py:596`
- **Subscribers:**
  - `schedules`

### `budget.accepted`

- **Constant:** `EventType.BUDGET_ACCEPTED`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:298`
- **Subscribers:**
  - `notifications`
  - `patient_timeline`
  - `treatment_plan`

### `budget.created`

- **Constant:** `EventType.BUDGET_CREATED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `budget.expired`

- **Constant:** `EventType.BUDGET_EXPIRED`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:472`
- **Subscribers:**
  - `patient_timeline`

### `budget.rejected`

- **Constant:** `EventType.BUDGET_REJECTED`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:375`
- **Subscribers:**
  - `patient_timeline`
  - `treatment_plan`

### `budget.reminder_sent`

- **Constant:** `EventType.BUDGET_REMINDER_SENT`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:598`
- **Subscribers:**
  - `patient_timeline`

### `budget.renegotiated`

- **Constant:** `EventType.BUDGET_RENEGOTIATED`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:543`
- **Subscribers:**
  - `patient_timeline`
  - `treatment_plan`

### `budget.sent`

- **Constant:** `EventType.BUDGET_SENT`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:160`
- **Subscribers:**
  - `notifications`
  - `patient_timeline`

### `budget.viewed`

- **Constant:** `EventType.BUDGET_VIEWED`
- **Publishers:**
  - `budget` — `backend/app/modules/budget/workflow.py:571`
- **Subscribers:**
  - `patient_timeline`

### `clinical_notes.administrative_created`

- **Constant:** `EventType.CLINICAL_NOTE_ADMINISTRATIVE_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:81`
- **Subscribers:**
  - `patient_timeline`

### `clinical_notes.appointment_administrative_created`

- **Constant:** `EventType.CLINICAL_NOTE_APPOINTMENT_ADMINISTRATIVE_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:87`
- **Subscribers:** —

### `clinical_notes.appointment_clinical_created`

- **Constant:** `EventType.CLINICAL_NOTE_APPOINTMENT_CLINICAL_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:85`
- **Subscribers:** —

### `clinical_notes.diagnosis_created`

- **Constant:** `EventType.CLINICAL_NOTE_DIAGNOSIS_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:82`
- **Subscribers:**
  - `patient_timeline`

### `clinical_notes.plan_created`

- **Constant:** `EventType.CLINICAL_NOTE_PLAN_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:84`
- **Subscribers:**
  - `patient_timeline`

### `clinical_notes.treatment_created`

- **Constant:** `EventType.CLINICAL_NOTE_TREATMENT_CREATED`
- **Publishers:**
  - `clinical_notes` — `backend/app/modules/clinical_notes/service.py:83`
- **Subscribers:**
  - `patient_timeline`

### `copilot.budget.threshold_reached`

- **Constant:** `EventType.COPILOT_BUDGET_THRESHOLD_REACHED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `copilot.digest.sent`

- **Constant:** `EventType.COPILOT_DIGEST_SENT`
- **Publishers:**
  - `copilot` — `backend/app/modules/copilot/tasks.py:174`
- **Subscribers:** —

### `copilot.session.ended`

- **Constant:** `EventType.COPILOT_SESSION_ENDED`
- **Publishers:**
  - `copilot` — `backend/app/modules/copilot/router.py:194`
- **Subscribers:** —

### `copilot.session.started`

- **Constant:** `EventType.COPILOT_SESSION_STARTED`
- **Publishers:**
  - `copilot` — `backend/app/modules/copilot/router.py:134`
- **Subscribers:** —

### `copilot.tool.invoked`

- **Constant:** `EventType.COPILOT_TOOL_INVOKED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `credit_note.issued`

- **Constant:** `EventType.CREDIT_NOTE_ISSUED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `document.archived`

- **Constant:** `EventType.DOCUMENT_ARCHIVED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `document.deleted`

- **Constant:** `EventType.DOCUMENT_DELETED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:218`
- **Subscribers:** —

### `document.uploaded`

- **Constant:** `EventType.DOCUMENT_UPLOADED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:167`
- **Subscribers:**
  - `patient_timeline`

### `email.failed`

- **Constant:** `EventType.EMAIL_FAILED`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:562`
- **Subscribers:**
  - `patient_timeline`

### `email.sent`

- **Constant:** `EventType.EMAIL_SENT`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:560`
- **Subscribers:**
  - `patient_timeline`

### `invoice.cancelled`

- **Constant:** `EventType.INVOICE_CANCELLED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `invoice.created`

- **Constant:** `EventType.INVOICE_CREATED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `invoice.issued`

- **Constant:** `EventType.INVOICE_ISSUED`
- **Publishers:**
  - `billing` — `backend/app/modules/billing/workflow.py:277`
- **Subscribers:**
  - `patient_timeline`

### `invoice.paid`

- **Constant:** `EventType.INVOICE_PAID`
- **Publishers:**
  - `billing` — `backend/app/modules/billing/workflow.py:461`
- **Subscribers:**
  - `patient_timeline`
  - `verifactu`

### `invoice.partial_paid`

- **Constant:** `EventType.INVOICE_PARTIAL_PAID`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `invoice.sent`

- **Constant:** `EventType.INVOICE_SENT`
- **Publishers:**
  - `billing` — `backend/app/modules/billing/router.py:697`
- **Subscribers:**
  - `notifications`

### `invoice.voided`

- **Constant:** `EventType.INVOICE_VOIDED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `media.attachment_linked`

- **Constant:** `EventType.ATTACHMENT_LINKED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:510`
- **Subscribers:** —

### `media.attachment_unlinked`

- **Constant:** `EventType.ATTACHMENT_UNLINKED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:546`
- **Subscribers:** —

### `media.pair_created`

- **Constant:** `EventType.PAIR_CREATED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:382`
- **Subscribers:**
  - `patient_timeline`

### `media.pair_removed`

- **Constant:** `EventType.PAIR_REMOVED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:406`
- **Subscribers:** —

### `media.photo_uploaded`

- **Constant:** `EventType.PHOTO_UPLOADED`
- **Publishers:**
  - `media` — `backend/app/modules/media/service.py:181`
- **Subscribers:**
  - `patient_timeline`

### `migration.binary.resolved`

- **Constant:** `EventType.MIGRATION_BINARY_RESOLVED`
- **Publishers:**
  - `migration_import` — `backend/app/modules/migration_import/events.py:54`
- **Subscribers:** —

### `migration.entity.persisted`

- **Constant:** `EventType.MIGRATION_ENTITY_PERSISTED`
- **Publishers:**
  - `migration_import` — `backend/app/modules/migration_import/events.py:65`
- **Subscribers:** —

### `migration.job.completed`

- **Constant:** `EventType.MIGRATION_JOB_COMPLETED`
- **Publishers:**
  - `migration_import` — `backend/app/modules/migration_import/events.py:35`
- **Subscribers:** —

### `migration.job.failed`

- **Constant:** `EventType.MIGRATION_JOB_FAILED`
- **Publishers:**
  - `migration_import` — `backend/app/modules/migration_import/events.py:47`
- **Subscribers:** —

### `migration.job.started`

- **Constant:** `EventType.MIGRATION_JOB_STARTED`
- **Publishers:**
  - `migration_import` — `backend/app/modules/migration_import/events.py:26`
- **Subscribers:** —

### `notification.delivered`

- **Constant:** `EventType.NOTIFICATION_DELIVERED`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:322`
- **Subscribers:** —

### `notification.failed`

- **Constant:** `EventType.NOTIFICATION_FAILED`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:292`
- **Subscribers:** —

### `notification.queued`

- **Constant:** `EventType.NOTIFICATION_QUEUED`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:191`
- **Subscribers:** —

### `notification.reply_received`

- **Constant:** `EventType.NOTIFICATION_REPLY_RECEIVED`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:382`
- **Subscribers:**
  - `patient_timeline`

### `notification.sent`

- **Constant:** `EventType.NOTIFICATION_SENT`
- **Publishers:**
  - `notifications` — `backend/app/modules/notifications/gateway.py:279`
- **Subscribers:** —

### `odontogram.condition.changed`

- **Constant:** `EventType.ODONTOGRAM_CONDITION_CHANGED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:173`
- **Subscribers:** —

### `odontogram.surface.updated`

- **Constant:** `EventType.ODONTOGRAM_SURFACE_UPDATED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:207`
- **Subscribers:** —

### `odontogram.tooth.updated`

- **Constant:** `EventType.ODONTOGRAM_TOOTH_UPDATED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:275`
- **Subscribers:** —

### `odontogram.treatment.added`

- **Constant:** `EventType.ODONTOGRAM_TREATMENT_ADDED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:727`
- **Subscribers:** —

### `odontogram.treatment.deleted`

- **Constant:** `EventType.ODONTOGRAM_TREATMENT_DELETED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:887`
- **Subscribers:** —

### `odontogram.treatment.performed`

- **Constant:** `EventType.ODONTOGRAM_TREATMENT_PERFORMED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:828`
- **Subscribers:**
  - `budget`
  - `patient_timeline`
  - `payments`
  - `periodontogram`
  - `treatment_plan`

### `odontogram.treatment.status_changed`

- **Constant:** `EventType.ODONTOGRAM_TREATMENT_STATUS_CHANGED`
- **Publishers:**
  - `odontogram` — `backend/app/modules/odontogram/service.py:771`
- **Subscribers:** —

### `patient.archived`

- **Constant:** `EventType.PATIENT_ARCHIVED`
- **Publishers:**
  - `patients` — `backend/app/modules/patients/service.py:289`
- **Subscribers:**
  - `media`
  - `periodontogram`
  - `recalls`

### `patient.created`

- **Constant:** `EventType.PATIENT_CREATED`
- **Publishers:**
  - `patients` — `backend/app/modules/patients/service.py:256`
- **Subscribers:**
  - `notifications`

### `patient.medical_updated`

- **Constant:** `EventType.PATIENT_MEDICAL_UPDATED`
- **Publishers:**
  - `patients_clinical` — `backend/app/modules/patients_clinical/router.py:94`
- **Subscribers:**
  - `patient_timeline`

### `patient.updated`

- **Constant:** `EventType.PATIENT_UPDATED`
- **Publishers:**
  - `patients` — `backend/app/modules/patients/service.py:274`
- **Subscribers:** —

### `payment.allocated`

- **Constant:** `EventType.PAYMENT_ALLOCATED`
- **Publishers:**
  - `payments` — `backend/app/modules/payments/workflow.py:72`
- **Subscribers:** —

### `payment.recorded`

- **Constant:** `EventType.PAYMENT_RECORDED`
- **Publishers:**
  - `payments` — `backend/app/modules/payments/workflow.py:168`
- **Subscribers:** —

### `payment.refunded`

- **Constant:** `EventType.PAYMENT_REFUNDED`
- **Publishers:**
  - `payments` — `backend/app/modules/payments/workflow.py:329`
- **Subscribers:**
  - `billing`

### `payment.voided`

- **Constant:** `EventType.PAYMENT_VOIDED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `periodontogram.snapshot.closed`

- **Constant:** `EventType.PERIODONTOGRAM_SNAPSHOT_CLOSED`
- **Publishers:**
  - `periodontogram` — `backend/app/modules/periodontogram/service.py:374`
- **Subscribers:** —

### `recall.cancelled`

- **Constant:** `EventType.RECALL_CANCELLED`
- **Publishers:**
  - `recalls` — `backend/app/modules/recalls/service.py:376`
- **Subscribers:** —

### `recall.completed`

- **Constant:** `EventType.RECALL_COMPLETED`
- **Publishers:**
  - `recalls` — `backend/app/modules/recalls/service.py:393`
- **Subscribers:** —

### `recall.created`

- **Constant:** `EventType.RECALL_CREATED`
- **Publishers:**
  - `recalls` — `backend/app/modules/recalls/service.py:298`
- **Subscribers:** —

### `recall.due`

- **Constant:** `EventType.RECALL_DUE`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `recall.snoozed`

- **Constant:** `EventType.RECALL_SNOOZED`
- **Publishers:**
  - `recalls` — `backend/app/modules/recalls/service.py:356`
- **Subscribers:** —

### `tenant.resolved`

- **Constant:** `EventType.TENANT_RESOLVED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `treatment.completed`

- **Constant:** `EventType.TREATMENT_COMPLETED`
- **Publishers:** _none in tree — declared but unused_
- **Subscribers:** —

### `treatment_plan.budget_sync_requested`

- **Constant:** `EventType.TREATMENT_PLAN_BUDGET_SYNC_REQUESTED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:1274`
- **Subscribers:**
  - `budget`

### `treatment_plan.closed`

- **Constant:** `EventType.TREATMENT_PLAN_CLOSED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:1705`
- **Subscribers:**
  - `patient_timeline`

### `treatment_plan.confirmed`

- **Constant:** `EventType.TREATMENT_PLAN_CONFIRMED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:1612`
- **Subscribers:**
  - `patient_timeline`

### `treatment_plan.created`

- **Constant:** `EventType.TREATMENT_PLAN_CREATED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:339`
- **Subscribers:**
  - `patient_timeline`

### `treatment_plan.item_completed_without_note`

- **Constant:** `EventType.TREATMENT_PLAN_ITEM_COMPLETED_WITHOUT_NOTE`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:984`
- **Subscribers:**
  - `patient_timeline`

### `treatment_plan.item_session_completed`

- **Constant:** `EventType.TREATMENT_PLAN_ITEM_SESSION_COMPLETED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:884`
- **Subscribers:**
  - `payments`

### `treatment_plan.items_reordered`

- **Constant:** `EventType.TREATMENT_PLAN_ITEMS_REORDERED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:751`
- **Subscribers:** —

### `treatment_plan.reactivated`

- **Constant:** `EventType.TREATMENT_PLAN_REACTIVATED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:1751`
- **Subscribers:**
  - `patient_timeline`

### `treatment_plan.status_changed`

- **Constant:** `EventType.TREATMENT_PLAN_STATUS_CHANGED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:434`
- **Subscribers:** —

### `treatment_plan.treatment_added`

- **Constant:** `EventType.TREATMENT_PLAN_TREATMENT_ADDED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:615`
- **Subscribers:**
  - `budget`

### `treatment_plan.treatment_completed`

- **Constant:** `EventType.TREATMENT_PLAN_TREATMENT_COMPLETED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/events.py:87`
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:969`
- **Subscribers:**
  - `patient_timeline`
  - `recalls`

### `treatment_plan.treatment_removed`

- **Constant:** `EventType.TREATMENT_PLAN_TREATMENT_REMOVED`
- **Publishers:**
  - `treatment_plan` — `backend/app/modules/treatment_plan/service.py:815`
- **Subscribers:**
  - `budget`

### `verifactu.record.rejected`

- **Constant:** `EventType.VERIFACTU_RECORD_REJECTED`
- **Publishers:**
  - `verifactu` — `backend/app/modules/verifactu/services/submission_queue.py:271`
- **Subscribers:** —
