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

# ems

> Painel de gestão do EMS (corpo paramédico) acessado pelo computador dos hospitais: prontuário do paciente (consultas, exames, plano médico, avatar), gestão de membros/hierarquia, especialidades, avisos, banco do grupo e permissões por cargo.

O **ems** é um painel NUI ligado ao vRP para a gestão do corpo paramédico. O servidor expõe a interface `ems` (Tunnel) e o cliente consome via `vSERVER`. O painel é aberto pelo recurso `dynamic` (computador do hospital), que dispara `ems:Open` com o grupo (`HospitalNorte`/`HospitalSul`). Cada registro é gravado com a coluna `Permission = Group`, isolando os dados por hospital.

<Warning>**Não há sistema de morte/revive aqui**: este recurso é o painel de gestão. Morte/revive é tratado em outros recursos (ex.: `survival`/`paramedic`).</Warning>

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Prontuário do Paciente" icon="file-medical">
    Consultas, exames, plano médico e avatar (foto) de cada paciente, pesquisáveis por passaporte ou nome.
  </Card>

  <Card title="Gestão de Membros" icon="users">
    Convites, hierarquia/cargos, demissões e especialidades atribuídas a cada membro do hospital.
  </Card>

  <Card title="Especialidades" icon="stethoscope">
    Crie e atribua especialidades médicas aos membros, com limite configurável (`MaxSpecialties`).
  </Card>

  <Card title="Banco do Grupo" icon="building-columns">
    Caixa do hospital com depósito, saque e transferência, aplicando as taxas configuradas.
  </Card>

  <Card title="Avisos" icon="bullhorn">
    Mural de avisos internos do hospital, com criação, edição e remoção.
  </Card>

  <Card title="Permissões por Cargo" icon="user-shield">
    Editor de permissões por nível de cargo, gravado em `EMS:Permissions:<Group>`.
  </Card>
</CardGroup>

***

## Dependências

<CardGroup cols={2}>
  <Card title="vrp" icon="cube">Framework base.</Card>
  <Card title="oxmysql" icon="database">Persistência dos registros.</Card>
  <Card title="PolyZone" icon="draw-polygon">Zonas e áreas.</Card>
  <Card title="screenshot-basic" icon="camera">Foto do avatar do paciente.</Card>
  <Card title="dynamic" icon="desktop">Computador do hospital que abre o painel.</Card>
</CardGroup>

<Info>Defina a convar `Discord_EMS` (webhook) no `server.cfg` para o upload do avatar.</Info>

***

## Configuração

<AccordionGroup>
  <Accordion title="shared-side/shared.lua — tabela Config" icon="sliders">
    ```lua theme={null}
    Config = {
        BankTaxWithdraw = 1.0,      -- multiplicador no saque (1.0 = sem taxa)
        BankTaxTransfer = 1.0,      -- multiplicador na transferência
        MedicPlanDuration = 604800, -- duração do plano médico (s) = 7 dias
        MaxSpecialties = 20,
    }
    ```
  </Accordion>

  <Accordion title="Permissões por cargo" icon="user-shield">
    Nível 1 (líder) e grupo `Admin` têm acesso total. Demais níveis seguem o que está salvo em `EMS:Permissions:<Group>` (categorias: `Management`, `Announcements`, `Specialties`, `Bank`, `Paramedic`, `Consultations`, `Exams`, `MedicPlan`).
  </Accordion>
</AccordionGroup>

***

## Comandos

Nenhum. O painel abre via evento `ems:Open` (recurso `dynamic`).

***

## Eventos

`Tunnel.bindInterface("ems", Core)` no servidor e no cliente. O cliente consome o servidor via `vSERVER`; cada callback de NUI repassa a chamada para a interface `Core`.

### Recebidos no servidor

| Evento            | Descrição                                                        |
| ----------------- | ---------------------------------------------------------------- |
| `ems:Open(Group)` | Valida permissão do jogador no grupo e abre o painel no cliente. |

### Cliente

| Evento                             | Descrição                         |
| ---------------------------------- | --------------------------------- |
| `ems:Open`                         | Abre a NUI do painel do hospital. |
| `ems:Notify(Title, Message, Type)` | Exibe notificação na NUI.         |

### NUI Callbacks

| Evento                | Descrição                                               |
| --------------------- | ------------------------------------------------------- |
| `Close`               | Fecha o painel e libera o foco.                         |
| `Home`                | Carrega a tela inicial.                                 |
| `Consultations`       | Lista as consultas do hospital.                         |
| `GetConsultation`     | Retorna os dados de uma consulta.                       |
| `CreateConsultation`  | Cria uma consulta.                                      |
| `UpdateConsultation`  | Atualiza uma consulta.                                  |
| `DestroyConsultation` | Remove uma consulta.                                    |
| `Exams`               | Lista os exames do hospital.                            |
| `GetExam`             | Retorna os dados de um exame.                           |
| `CreateExam`          | Cria um exame.                                          |
| `UpdateExam`          | Atualiza um exame.                                      |
| `DestroyExam`         | Remove um exame.                                        |
| `User`                | Retorna dados do paciente pesquisado.                   |
| `UserConsultations`   | Consultas do paciente.                                  |
| `UserExams`           | Exames do paciente.                                     |
| `Avatar`              | Captura/atualiza a foto do avatar (screenshot).         |
| `MedicPlan`           | Gerencia o plano médico do paciente.                    |
| `SearchUser`          | Pesquisa jogador por passaporte/nome.                   |
| `Members`             | Lista os membros do grupo.                              |
| `Specialties`         | Lista as especialidades.                                |
| `GetSpecialty`        | Retorna uma especialidade.                              |
| `CreateSpecialty`     | Cria uma especialidade.                                 |
| `UpdateSpecialty`     | Atualiza uma especialidade.                             |
| `AssignSpecialty`     | Atribui especialidade a um membro.                      |
| `RemoveSpecialty`     | Remove especialidade de um membro.                      |
| `DestroySpecialty`    | Exclui uma especialidade.                               |
| `Invite`              | Convida um jogador para o grupo.                        |
| `Hierarchy`           | Altera o cargo/nível de um membro.                      |
| `Dismiss`             | Demite um membro.                                       |
| `Announcements`       | Lista os avisos.                                        |
| `CreateAnnouncement`  | Cria um aviso.                                          |
| `UpdateAnnouncement`  | Atualiza um aviso.                                      |
| `DestroyAnnouncement` | Remove um aviso.                                        |
| `Bank`                | Retorna o caixa do grupo e o histórico.                 |
| `DepositBank`         | Deposita no caixa do grupo.                             |
| `WithdrawBank`        | Saca do caixa do grupo (aplica `BankTaxWithdraw`).      |
| `TransferBank`        | Transfere do caixa do grupo (aplica `BankTaxTransfer`). |
| `Permissions`         | Carrega as permissões por cargo.                        |
| `SavePermissions`     | Salva as permissões por cargo.                          |

***

## Banco de Dados

Todas as tabelas são isoladas por `Permission`.

| Tabela / origem                     | Uso                              |
| ----------------------------------- | -------------------------------- |
| `ems_creative_consultations`        | Consultas do hospital.           |
| `ems_creative_exams`                | Exames do hospital.              |
| `ems_creative_specialties`          | Especialidades do hospital.      |
| `avatars`                           | Fotos de avatar dos pacientes.   |
| `painel_creative_announcements`     | Avisos do hospital.              |
| `painel_creative_transactions`      | Histórico do banco do grupo.     |
| `characters`                        | Leitura dos dados dos jogadores. |
| `MedicPlan` (datatable)             | Plano médico do paciente.        |
| `EMS:Permissions:<Group>` (srvdata) | Permissões por cargo.            |
| `vRP.Permissions`                   | Caixa do grupo.                  |

***

## Customização

* **Taxas/plano:** `Config.BankTaxWithdraw`, `BankTaxTransfer`, `MedicPlanDuration`.
* **Hospitais que abrem o painel:** tabela `Events` no recurso `dynamic`.
* **Permissões por cargo:** editor na aba do painel (gravado em `EMS:Permissions:<Group>`).
* **Avatar:** webhook `Discord_EMS`.

<Note>A NUI fica em `web-side/` (HTML/CSS/JS direto, sem build). Edite os arquivos diretamente.</Note>
