# Demanda 14 — enquadramento da FATIA 1 (base + aula ao vivo)

Escrito pelo enquadrador em 24/09. Cards em `ENQUADRAMENTO-D14.cards.json`.
⚠️ O prefixo das chaves está **`SIGLA-`** de propósito: ⛔ não há projecto para este produto no
rastreador do dono (medido hoje: o sítio `mais-saude-salvador` tem **2 projectos — MPDD e MSS** e
⛔ nenhum menciona Capacita; 142 questões varridas, 0 acertos). Chave ⛔ não se improvisa.

## O chão técnico ⛔ NÃO foi escolhido por gosto — foi MEDIDO
`/srv/fab/bin/instanciadeclara.py:133-142` **crava** a forma de um produto desta casa a correr:

| lado | o que a casa executa | saúde |
|---|---|---|
| `backend/` | `npx prisma migrate deploy && npm run build && node dist/main` | `GET /api/v1/health` → 200 |
| `frontend/` | `npm run dev -- -H 0.0.0.0 -p <porta>` | `GET /` → 200 |

⟹ backend **Nest + Prisma**, frontend **Next**, prefixo **`/api/v1`**. Fora disto o epic ⛔ não
tem instância, e sem instância ⛔ nenhum dos seis factos do critério se exerce.
**Banco PRÓPRIO, em contentor próprio** (regra 42: bancos diferentes, máquinas diferentes) — o
`SIGLA-2` tem um aceite que **reprova** se o `docker-compose.yml` mencionar 1433, sqlserver ou
maisSaude.

## Os seis factos do critério → onde se exercem

| facto do critério de pronto | cards que o fecham |
|---|---|
| (1) 3 UPAs · link · CRM · 2 de 3 UPAs | `-5` `-6` · ecrãs `-14` `-15` |
| (2) pendente ⟹ 0 aulas, 0 calendário | `-8` (API) · `-17` (ecrã) |
| (3) só o coordenador da UPA escolhida aceita/tira; o da UPA C ⛔ não | `-7` · ecrã `-16` |
| (4) aula 80 min · S1 escreve 4 questões · troca para S2 · as 4 ficam | `-8` `-9` · ecrãs `-18` `-19` |
| (5) 60 min validados · 3·X · +2·Y · bloco mudo = 0 · errar ⛔ não tira | `-10` `-11` · ecrã `-20` |
| (6) dias=7 abre ao 7.º e ⛔ não ao 8.º · barra ⛔ não avança · aba perde foco ⟹ pára | `-12` · ecrã `-21` |

## O que cada teste dirigido TEM de afirmar (para o especificador)

- **`-4` identidade** — os quatro papéis (regra 55); médico nasce `pendente`; guarda de papel
  devolve 403 a quem ⛔ não é do papel; semente cria **uma** secretaria (é por onde tudo começa).
- **`-5` UPA** — só a **secretaria** cria/edita/tira UPA (coordenador e médico ⟹ 403); cada UPA
  tem **um** coordenador e **um** token de link só dela.
- **`-6` cadastro** — link válido ⟹ médico com CRM e **N UPAs** em `pendente`; link inválido ⟹ 404;
  ⛔ nenhuma consulta a cadastro de fora (regra 42: o CRM é **declarado** e conferido por pessoa).
- **`-7` vínculo** — coordenador da UPA A aceita e tira; coordenador da UPA C ⟹ **403** nas duas
  acções; aceite ⟹ `ativo`.
- **`-8` aula** — só a secretaria cadastra; trocar o responsável S1→S2 muda **só** o responsável;
  `duracao_min / 20` = nº de blocos (80 ⟹ 4); calendário: médico `ativo` vê, `pendente` vê **0**.
- **`-9` questões** — só o responsável escreve; nº de questões **segue a duração** (40 min recusa
  a 3.ª); depois da troca as questões têm **o mesmo id e o mesmo texto** (decisão 5 do quadro).
- **`-10` parâmetros** — a secretaria muda X, Y, `dias_gravacao` e o multiplicador **sem deploy**;
  coordenador ⟹ 403; há omissões gravadas.
- **`-11` participação** — responder valida **retroactivamente** os 20 min do bloco; 3 de 4 ⟹ **60**
  minutos; bloco mudo ⟹ **0** minutos e **0** pontos; respondeu ⟹ X, acertou ⟹ X+Y; **errar fica
  com X** e ⛔ não perde minutos; **mudar X no `-10` muda o ponto** (é a prova de que é parâmetro);
  os minutos validados **ficam guardados** — é o que a fatia do ranking vai somar.
- **`-12` gravação** — dias **por aula** com omissão global; com 7: abre ao 7.º dia, ⛔ não ao 8.º
  (relógio injectável, ⛔ não `sleep`); só médico `ativo`.
- **`-20` sala** — perguntas aos 20/40/60/80; o fim do ecrã **mostra** 60 min, 3·X e 2·Y contáveis.
- **`-21` leitor** — arrastar a barra à frente ⛔ não muda o tempo; `visibilitychange: hidden`
  **pára** o relógio; ao 8.º dia o ecrã ⛔ não abre.

## Porque é que a cerca do backend leva `backend/prisma/` e `app.module.ts`
O Prisma tem **um** `schema.prisma` e o Nest tem **um** `app.module.ts`: um card que traz tabela
nova ⛔ não consegue existir sem lhes tocar. A cerca continua estreita — é
`backend/src/modules/<x>/` **mais dois ficheiros nomeados**, ⛔ não `backend/src`.

## FORA desta fatia, de propósito
Gravadas permanentes · artigos em destaque · protocolos municipais · cursos presenciais ·
certificados · **o ranking** (os dois rankings, o decaimento e quem vê a lista nominal, regras 43 e
50) · **a pontuação da gravada** (decisões 3 e 4 do quadro: precisa da tabela de pontos do ranking)
· qualquer ligação ao maisSaúde (regra 42).
