# Relatório — Teste Visual das Telas Principais

- **Data:** 2026-07-15
- **Ambiente:** http://localhost:8082
- **Commit:** 1ef127d
- **Resultado:** 38/38 ✅ · 0 ❌

## Profissional

| # | Cenário | Entrada | Esperado | Obtido | Status |
|---|---|---|---|---|:---:|
| P1 | Profissional puro válido | campos válidos + perfil profissional + diária | salva e redireciona à lista | redirecionou p/ /profissional/index | ✅ |
| P2 | Líder válido | perfil líder + login + senha + bônus mensal | salva | redirecionou | ✅ |
| P3 | Administrativo válido | perfil administrativo + login + senha | salva | redirecionou | ✅ |
| P4 | Todos obrigatórios vazios | form vazio + perfil profissional | "não pode ficar em branco" | texto "não pode ficar em branco" presente | ✅ |
| P5 | Nenhum perfil marcado | campos válidos, zero perfis | mensagem "Selecione ao menos um perfil." visível | mensagem exibida | ✅ |
| P6 | CPF duplicado | CPF 111.111.713-19 (já do QA Líder) | "CPF já cadastrado." | texto "CPF já cadastrado." presente | ✅ |
| P7 | E-mail inválido | email = "abc@" | erro de e-mail | texto "endereço de e-mail válido" presente | ✅ |
| P8 | Profissional sem diária | perfil profissional, diária vazia | mensagem "Informe o valor da diária." (não deve salvar com 0) | mensagem exibida | ✅ |
| P9 | Líder sem bônus | perfil líder + login/senha, bônus vazio | mensagem "Informe o bônus mensal do líder." (não deve salvar com 0) | mensagem exibida | ✅ |
| P10 | Perfil com acesso sem login | perfil líder + bônus, login vazio | "Login é obrigatório para perfis com acesso." | texto "Login é obrigatório para perfis com acesso." presente | ✅ |
| P11 | Perfil com acesso sem senha | perfil líder + login, senha vazia | "Senha é obrigatória para perfis com acesso." | texto "Senha é obrigatória para perfis com acesso." presente | ✅ |
| P12 | Senha < 6 chars | senha = "123" | erro de mínimo 6 | texto "deve conter pelo menos 6" presente | ✅ |
| P13 | Login duplicado | login = "qa_lider_713191" (já do QA Líder) | erro de login já em uso | texto "já foi utilizado" presente | ✅ |
| P14 | Data de nascimento inválida | tentar preencher data = 2000-13-40 | o controle de data rejeita o valor inválido | input type=date rejeitou o valor malformado | ✅ |
| P15 | Máscara monetária/CPF formata em tela | CPF "12345678901" e diária digitada | CPF = 123.456.789-01 e diária no formato R$ …,… | CPF="123.456.789-01", diária="R$ 200.000,00" (formato moeda ok) | ✅ |
| P16 | Selecionar função dispara valor-funcao | selecionar 1ª função | chamada AJAX 200 e campo diária preenchido/válido | valor-funcao respondeu 200 | ✅ |

## Efetivo

| # | Cenário | Entrada | Esperado | Obtido | Status |
|---|---|---|---|---|:---:|
| E1 | Lançamento válido hoje (só entrada) | QA Trab 713191, entrada 08:00 | "Profissional lançado." | Profissional lançado. | ✅ |
| E2 | Entrada + saída válidas | entrada 08:00, saída 17:00 (dia distinto do E1 evita dobra) | "Profissional lançado." | Profissional lançado. | ✅ |
| E3 | Turno noturno (saída < entrada) | entrada 22:00, saída 06:00 | aceito | Profissional lançado. | ✅ |
| E4 | Sem hora de entrada | hora_entrada vazia | "não pode ficar em branco" | erro de obrigatório capturado | ✅ |
| E5 | Hora em formato errado | hora_entrada = "8h" | "Use o formato HH:MM." | mensagem de formato capturada | ✅ |
| E6 | Retroativo sem saída | 2026-07-14 entrada 08:00, sem saída | "Informe a hora de saída para lançamentos de dias anteriores." | mensagem retroativa capturada | ✅ |
| E7 | Retroativo com saída | 2026-07-14 entrada 08:00, saída 17:00 | aceito | Profissional lançado. | ✅ |
| E8 | Dobra com entrada anterior aberta | 2ª entrada 18:00 hoje (1ª sem saída) | "Há um lançamento em aberto..." | bloqueio de turno aberto capturado | ✅ |
| E9 | Dobra antes da saída anterior | 2026-07-14 nova entrada 16:00 (saída anterior 17:00) | "A nova entrada deve ser a partir de 17:00..." | trava de horário capturada | ✅ |
| E10 | Dobra válida (entrada ≥ saída anterior) | 2026-07-14 nova entrada 17:00, saída 21:00 | "Profissional lançado." | dobra válida aceita | ✅ |
| E11 | Dropdown de busca oculta turno aberto | buscar o trabalhador hoje (tem turno aberto do E1) | não aparece na busca de hoje; aparece em dia livre | hoje oculto=true, dia livre visível=true | ✅ |

## Card

| # | Cenário | Entrada | Esperado | Obtido | Status |
|---|---|---|---|---|:---:|
| C1 | Abrir card renderiza totais | card de QA Trab 713191 | página com "Valor a receber" e base de diárias | total em tela: R$ 1.000,00 | ✅ |
| C2 | Adicionar bônus recalcula e salva | bônus "QA Bônus" R$ 100,00 | total recalcula ao vivo e "Card salvo." | antes=R$ 1.000,00 depois=R$ 101.000,00; flash=true | ✅ |
| C3 | Desconto abate nota recalcula | desconto "QA Desc" R$ 50,00 + abate nota | valor da nota diminui e "Card salvo." | nota antes=R$ 101.000,00 depois=R$ 51.000,00; flash=true | ✅ |
| C4 | Bônus meio-preenchido bloqueia submit | novo bônus com só valor, sem descrição | alert "Preencha descrição e valor...", submit bloqueado e campo com .ci-invalid | alert="Preencha descrição e valor, ou limpe a linha de bônus/desconto."; no form=true; ci-invalid=1 | ✅ |
| C5 | Múltiplos itens somam; limpar remove | +2 bônus (30/20) +1 desconto (10); depois limpa 1 bônus | total confere e item some ao salvar | total(3 itens)=R$ 91.000,00; B1 mantido=true; B2 removido=true | ✅ |
| C6 | Editar quantidade de diária recalcula | alterar .js-diaria-qtd | subtotal e total recalculam ao vivo | total antes=R$ 71.000,00 depois=R$ 70.600,00 | ✅ |
| C11 | Filtro "somente sem NF" respeita status | rascunho vs. fechado, sem_nf=1 | rascunho NÃO aparece; após "Fechar card" aparece | rascunho na lista=false (esperado false); fechado na lista=true (esperado true) | ✅ |
| C10 | Anexo do desconto abre modal (mobile) | viewport 390px, clicar clip do desconto salvo | modal "Anexar comprovante" visível | modal #up-doc-90 visível=true | ✅ |
| C7 | Pagar e anexar NF | fechado→pago + doc tipo NF na seção de pagamento | badge "NF" ao lado do documento | badges NF encontrados=1 | ✅ |
| C8 | Salvar card fora do rascunho | POST /card/salvar com card pago | "Só é possível editar um card em rascunho." | guarda de rascunho capturada | ✅ |
| C9 | Transição de status inválida | POST status="banana" | flash de erro (transição recusada) | transição inválida não aplicada | ✅ |

## Problemas a resolver

Nenhum — todos os cenários passaram. 🎉
