> ## 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.

# Invite

> Tokens de convite e ativação: membro, motorista ou ativação de conta

## Campos

| Campo             | Tipo         | Descrição                                                                  |
| ----------------- | ------------ | -------------------------------------------------------------------------- |
| `inviteId`        | `UUID`       | Identificador único                                                        |
| `invitedByUserId` | `UUID`       | Usuário que emitiu ou originou o token                                     |
| `invitedUserId`   | `UUID?`      | Usuário convidado ou ativado                                               |
| `organizationId`  | `UUID?`      | Organização do convite — ausente em convites internos e ativações de conta |
| `roleId`          | `UUID?`      | Role atribuída no aceite — usada apenas por `MEMBER`                       |
| `type`            | `InviteType` | Tipo do token (`MEMBER`, `DRIVER` ou `ACCOUNT_ACTIVATION`)                 |
| `token`           | `String`     | Token único usado no link                                                  |
| `email`           | `String?`    | Email do convidado ou usuário ativado, quando informado                    |
| `phoneIso`        | `String`     | Código ISO do país do telefone (padrão `BR`)                               |
| `phoneDdi`        | `String`     | DDI do telefone                                                            |
| `phoneNumber`     | `String`     | Número do telefone                                                         |
| `expiresAt`       | `DateTime`   | Data de expiração do token                                                 |
| `acceptedAt`      | `DateTime?`  | Data em que o token foi aceito                                             |
| `revokedAt`       | `DateTime?`  | Data de revogação                                                          |
| `rejectedAt`      | `DateTime?`  | Data de rejeição                                                           |
| `createdBy`       | `UUID?`      | Usuário que criou o registro, quando aplicável                             |
| `updatedBy`       | `UUID?`      | Usuário que fez a última atualização, quando aplicável                     |
| `createdAt`       | `DateTime`   | Data de criação                                                            |

## Relacionamentos

* Relaciona-se com [User](/data-modelling/identity/user) *(como `invitedBy` — emissor ou responsável pelo token)*
* Relaciona-se com [User](/data-modelling/identity/user) *(como `invitedUser` — usuário convidado ou ativado, opcional)*
* Relaciona-se com [Organization](/data-modelling/tenant/organization) *(opcional — apenas convites de organização)*
* Relaciona-se com [Role](/data-modelling/authorization/role) *(opcional — apenas `type=MEMBER`)*

## Regras de Negócio

* O Invite é baseado em token único, com telefone obrigatório (`phoneDdi` + `phoneNumber`) e email opcional.
* Possui data de expiração (`expiresAt`, padrão 7 dias) — após o vencimento, o token não pode ser aceito.
* Pode ser **revogado** (`revokedAt`) ou **rejeitado** (`rejectedAt`) enquanto ainda não foi aceito.
* `organizationId` diferencia convites de organização dos fluxos sem organização:
  * `null` + `type=MEMBER` representa convite interno de BackOffice.
  * preenchido + `type=MEMBER` representa convite de membro de organização.
  * preenchido + `type=DRIVER` representa convite de motorista.
  * `null` + `type=ACCOUNT_ACTIVATION` representa ativação de uma conta já criada.
* `roleId` é obrigatório para `MEMBER` e ausente para `DRIVER` e `ACCOUNT_ACTIVATION`.
* `invitedUserId` é preenchido no aceite de `MEMBER` e `DRIVER`, quando o User é resolvido por telefone/email ou criado. Em `ACCOUNT_ACTIVATION`, ele já referencia a conta que será ativada.
* O `type` determina o efeito do aceite:
  * `MEMBER` -> concede [Membership](/data-modelling/tenant/membership) `ACTIVE` com a `roleId` do convite. Convites internos usam Role `INTERNAL`; convites de organização usam Role `ENVIRONMENT` ou `ORGANIZATION`.
  * `DRIVER` -> garante [Driver](/data-modelling/fleet/driver) e ativa o vínculo [DriverCompany](/data-modelling/fleet/driver-company). A Company associada vem da relação `Organization -> Company` no momento do aceite. **Não concede Membership**.
  * `ACCOUNT_ACTIVATION` -> define a senha da conta referenciada por `invitedUserId` e torna o usuário apto a autenticar.
* Claims de acesso não são gravados no Invite. Eles são derivados pelo [Profile](/data-modelling/identity/profile) a partir do resultado do aceite.
* O Invite **não carrega `companyId`**. Para convites `type=DRIVER`, o `companyId` é resolvido no aceite via `organizationId -> Company`.
* O modelo **não possui** campo `updatedAt`.

## Enums

### InviteType

| Valor                | Descrição                                                             |
| -------------------- | --------------------------------------------------------------------- |
| `MEMBER`             | Convite para membro — concede Membership `ACTIVE` com role            |
| `DRIVER`             | Convite para motorista — garante Driver e ativa vínculo DriverCompany |
| `ACCOUNT_ACTIVATION` | Token para ativação de conta criada sem senha                         |

### InviteStatus (derivado)

O status é calculado a partir dos timestamps (`acceptedAt`, `revokedAt`, `rejectedAt`, `expiresAt`).

| Valor      | Condição                    |
| ---------- | --------------------------- |
| `ACCEPTED` | `acceptedAt` preenchido     |
| `REVOKED`  | `revokedAt` preenchido      |
| `REJECTED` | `rejectedAt` preenchido     |
| `EXPIRED`  | `expiresAt` no passado      |
| `PENDING`  | nenhuma das condições acima |

## Example

```json theme={null}
{
  "inviteId": "0197a804-414d-79a3-a5c0-bb5c52185d23",
  "invitedByUserId": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "invitedUserId": null,
  "organizationId": "0197a7f7-7291-7a43-96db-2c8580b80c5d",
  "roleId": "0197a7f8-15d1-7320-9b60-02497d7a0d61",
  "type": "MEMBER",
  "token": "invite_8dW2nQ4pL6",
  "email": "mariana.costa@example.com",
  "phoneIso": "BR",
  "phoneDdi": "55",
  "phoneNumber": "11987654321",
  "expiresAt": "2026-07-10T13:30:00.000Z",
  "acceptedAt": null,
  "revokedAt": null,
  "rejectedAt": null,
  "createdBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "updatedBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "createdAt": "2026-07-03T13:30:00.000Z"
}
```
