> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devmob.app.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Notification

> Notificação persistida para inbox e realtime dentro do produto

`Notification` representa o conteúdo e o contexto de uma notificação persistida no DEVMOB. Ela não substitui envios transacionais por email ou WhatsApp; esses canais continuam sendo responsabilidade do adapter de notificação externa.

## Campos

| Campo             | Tipo                   | Descrição                                                    |
| ----------------- | ---------------------- | ------------------------------------------------------------ |
| `notificationId`  | `UUID`                 | Identificador único                                          |
| `organizationId`  | `UUID?`                | Organização relacionada à notificação, quando aplicável      |
| `createdByUserId` | `UUID?`                | Usuário ou ator que originou a notificação, quando aplicável |
| `audience`        | `NotificationAudience` | Superfície onde a notificação deve aparecer                  |
| `type`            | `NotificationType`     | Tipo da notificação                                          |
| `priority`        | `NotificationPriority` | Prioridade de exibição                                       |
| `title`           | `String`               | Título exibido na inbox                                      |
| `body`            | `String`               | Texto exibido na inbox                                       |
| `resourceDomain`  | `String?`              | Domain do recurso relacionado                                |
| `resource`        | `String?`              | Entity ou recurso relacionado                                |
| `resourceId`      | `UUID?`                | ID do recurso relacionado                                    |
| `payload`         | `Json?`                | Dados extras para renderização ou roteamento no front        |
| `expiresAt`       | `DateTime?`            | Data de expiração da notificação                             |
| `status`          | `NotificationStatus`   | Status global da notificação                                 |
| `createdBy`       | `UUID?`                | Usuário que criou o registro, quando aplicável               |
| `createdAt`       | `DateTime`             | Data de criação                                              |
| `updatedBy`       | `UUID?`                | Usuário que fez a última atualização, quando aplicável       |
| `updatedAt`       | `DateTime`             | Data da última atualização                                   |
| `deletedBy`       | `UUID?`                | Usuário que removeu o registro, quando aplicável             |
| `deletedAt`       | `DateTime?`            | Data de remoção lógica                                       |

## Relacionamentos

* Relaciona-se com [Organization](/data-modelling/tenant/organization), quando a notificação está em escopo organizacional.
* Relaciona-se com [User](/data-modelling/identity/user) por `createdByUserId`, quando existe ator de origem.
* Relaciona-se com múltiplos [NotificationRecipient](/data-modelling/communication/notification-recipient).
* Pode referenciar qualquer recurso por `resourceDomain`, `resource` e `resourceId`, sem FK direta.

## Regras de negócio

* `Notification` guarda o conteúdo compartilhado entre todos os destinatários.
* O estado por usuário fica em [NotificationRecipient](/data-modelling/communication/notification-recipient).
* O front resolve a rota de abertura pelo `type` e pelo recurso relacionado; não existe `actionUrl`.
* `companyId` e `cooperativeId` não ficam na notificação. O escopo operacional é resolvido por `organizationId`, `audience`, memberships e recurso relacionado.
* `audience = OPS` representa o ambiente operacional usado por Company e Cooperative.
* Se o mesmo evento precisar aparecer em superfícies diferentes, deve criar uma `Notification` por `audience`.
* `payload` deve conter apenas dados não sensíveis e necessários para renderização.
* `status = CANCELED` impede novas entregas para destinatários.
* `status = EXPIRED` indica que a notificação não deve mais aparecer como ativa.
* Remoção lógica não deve apagar recipients já criados.

## Enums

### NotificationAudience

| Valor      | Descrição                          |
| ---------- | ---------------------------------- |
| `CUSTOMER` | App ou superfície do passageiro    |
| `DRIVER`   | App ou superfície do motorista     |
| `OPS`      | Operação de Company ou Cooperative |
| `BKO`      | BackOffice interno da plataforma   |

### NotificationType

| Valor                          | Descrição                               |
| ------------------------------ | --------------------------------------- |
| `SUPPORT_CASE_CREATED`         | Chamado de suporte criado               |
| `SUPPORT_CASE_MESSAGE_CREATED` | Nova mensagem em chamado de suporte     |
| `SUPPORT_CASE_ASSIGNED`        | Chamado atribuído a um atendente        |
| `SUPPORT_CASE_STATUS_CHANGED`  | Status do chamado alterado              |
| `ROUTE_APPROVAL_REQUESTED`     | Aprovação de rota solicitada            |
| `ROUTE_APPROVED`               | Rota aprovada                           |
| `ROUTE_REJECTED`               | Rota rejeitada                          |
| `TRIP_STATUS_CHANGED`          | Status da viagem alterado               |
| `TRIP_EVENT_RECORDED`          | Evento operacional da viagem registrado |
| `PAYMENT_CONFIRMED`            | Pagamento confirmado                    |
| `PAYMENT_FAILED`               | Pagamento falhou                        |
| `TRANSFER_PROCESSED`           | Transferência processada                |
| `TRANSFER_FAILED`              | Transferência falhou                    |
| `ORDER_CONFIRMED`              | Pedido confirmado                       |
| `ORDER_CANCELLED`              | Pedido cancelado                        |
| `TICKET_CANCELLED`             | Ticket cancelado                        |
| `BENEFIT_REQUEST_APPROVED`     | Solicitação de benefício aprovada       |
| `BENEFIT_REQUEST_REJECTED`     | Solicitação de benefício rejeitada      |
| `EXPORT_COMPLETED`             | Exportação concluída                    |
| `EXPORT_FAILED`                | Exportação falhou                       |

### NotificationPriority

| Valor    | Descrição             |
| -------- | --------------------- |
| `LOW`    | Informativa           |
| `NORMAL` | Prioridade padrão     |
| `HIGH`   | Requer atenção        |
| `URGENT` | Crítica para operação |

### NotificationStatus

| Valor      | Descrição                                        |
| ---------- | ------------------------------------------------ |
| `ACTIVE`   | Notificação ativa                                |
| `CANCELED` | Notificação cancelada antes ou durante a entrega |
| `EXPIRED`  | Notificação expirada                             |

## Example

```json theme={null}
{
  "notificationId": "0197fa00-3e63-7f58-a878-7ef7ecfa9bc1",
  "organizationId": "0197a801-1690-7590-b3cf-19599b9be3e4",
  "createdByUserId": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "audience": "OPS",
  "type": "SUPPORT_CASE_MESSAGE_CREATED",
  "priority": "NORMAL",
  "title": "Nova mensagem no chamado SUP-20260704-0001",
  "body": "O passageiro respondeu ao chamado de suporte.",
  "resourceDomain": "SUPPORT",
  "resource": "SUPPORT_CASE",
  "resourceId": "0197f150-40d6-7c1a-bdf2-c5884e07d401",
  "payload": {
    "supportCaseCode": "SUP-20260704-0001"
  },
  "expiresAt": null,
  "status": "ACTIVE",
  "createdBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "createdAt": "2026-07-04T16:00:00.000Z",
  "updatedBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "updatedAt": "2026-07-04T16:00:00.000Z",
  "deletedBy": null,
  "deletedAt": null
}
```
