v1.2.0: develop → release #43

Merged
caio merged 5 commits from develop into release 2026-10-10 22:55:59 -03:00
Owner

Versão 1.2.0.

  • Leitor de QR local (sem internet), que fica aberto até ler e espera a confirmação; Chart.js e fontes também locais.
  • Controle de QR Codes no Painel e no Ikarus37, aceitando QR de qualquer formato.
  • Motivo da falta escolhido num painel de botões, no app e no Painel (#41).
  • Livro do Dia em três níveis com validação: esquadrilha → esquadrão → Corpo de Alunos (#42). Migration 020.
  • Postos de serviço com quem está de serviço agora (migration 019).

🤖 Generated with Claude Code

Versão 1.2.0. - Leitor de QR local (sem internet), que fica aberto até ler e espera a confirmação; Chart.js e fontes também locais. - Controle de QR Codes no Painel e no Ikarus37, aceitando QR de qualquer formato. - Motivo da falta escolhido num painel de botões, no app e no Painel (#41). - Livro do Dia em três níveis com validação: esquadrilha → esquadrão → Corpo de Alunos (#42). Migration 020. - Postos de serviço com quem está de serviço agora (migration 019). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Controle de QR codes no Painel e no Ikarus37, aceitando QR de qualquer formato
All checks were successful
CI / Lint (debian) (push) Successful in 21s
CI / Lint (ubuntu-latest) (push) Successful in 23s
CI / Testes (ubuntu-latest) (push) Successful in 40s
CI / Testes (debian) (push) Successful in 37s
8812a19d48
Em produção nenhum aluno tinha QR cadastrado, e o sistema só aceitava QR
cujo conteúdo fosse um código de 64 caracteres hexadecimais.

- O login do app passa a mandar o conteúdo do QR como foi lido (campo
  "qrcode"); o servidor calcula a impressão digital (sha256) e compara com
  a do cadastro. Qualquer formato e tamanho até 4096 caracteres. O conteúdo
  nunca é gravado. "qrcode_hash" continua aceito, e um QR que já é um
  código de 64 caracteres vale como está (os QR do seed seguem funcionando).
- Tela QR Codes (Painel, pra quem edita o efetivo; Ikarus37, pro
  administrador técnico): cobertura por esquadrão, lista com filtro,
  cadastrar/trocar lendo com a câmera, leitor de mesa ou colando, remover,
  conferir de quem é um QR e quantos caracteres tem, e cadastro em lote.
- Trocar ou remover o QR de um aluno derruba as sessões abertas dele.

Refs #40

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leitor de QR local e que espera a confirmação; nada mais vem da internet
All checks were successful
CI / Lint (debian) (push) Successful in 21s
CI / Lint (ubuntu-latest) (push) Successful in 20s
CI / Testes (debian) (push) Successful in 37s
CI / Testes (ubuntu-latest) (push) Successful in 38s
57983ebed0
O leitor de QR nunca funcionou onde dependia do jsQR: o endereço de onde o
app baixava a biblioteca (cdnjs) responde 404, e quando o download falhava
a câmera era desligada na hora — abria e fechava em 0,3 s.

- jsQR passa a ser servido pelo próprio sistema (web/app/vendor/jsQR.js, do
  pacote npm jsqr 1.4.0, integridade conferida). BarcodeDetector nativo
  continua sendo usado quando existe, com o jsQR de reserva se ele falhar.
- A câmera fica aberta até ler. Quando lê, a imagem congela, aparece "QR
  identificado" com o tamanho do conteúdo e nada é enviado até confirmar;
  "Ler de novo" volta a procurar. Vale pro login do app e pro leitor da
  tela de QR Codes. Login recusado não fecha mais a câmera.
- O sistema vai rodar em intranet, então nada mais é buscado fora: Chart.js
  (web/vendor/) e as fontes Barlow Semi Condensed, IBM Plex Sans e IBM Plex
  Mono (web/fonts/ + web/css/fontes.css) também ficam no projeto, com as
  licenças ao lado. Um teste reprova qualquer página que carregue recurso
  externo.

Refs #40

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leitor de QR: jsQR confere junto com o detector nativo e lê quadro reduzido
All checks were successful
CI / Lint (debian) (push) Successful in 21s
CI / Lint (ubuntu-latest) (push) Successful in 20s
CI / Testes (debian) (push) Successful in 36s
CI / Testes (ubuntu-latest) (push) Successful in 36s
d81d7e20f1
O BarcodeDetector só é usado se o navegador disser que lê QR, e mesmo
assim o jsQR confere de tempos em tempos. O quadro vai reduzido pro jsQR
(celular trava com a imagem inteira) e a câmera é pedida em 1280x720.

Refs #40

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Motivo da falta escolhido num painel de botões, no app e no Painel
All checks were successful
CI / Lint (debian) (push) Successful in 21s
CI / Lint (ubuntu-latest) (push) Successful in 20s
CI / Testes (debian) (push) Successful in 36s
CI / Testes (ubuntu-latest) (push) Successful in 35s
86338860ff
Sai a lista suspensa com mais de 30 motivos. Marcar falta abre um painel
com cada motivo como botão (sigla + nome), com busca; "Falta" vem
primeiro e em destaque. Se o motivo for Serviço, o painel pergunta o
posto em seguida. A linha do aluno mostra o motivo escolhido e reabre o
painel pra trocar. No app, fechar o painel sem escolher não marca falta.

Closes #41

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Livro do Dia em três níveis, com validação: esquadrilha, esquadrão e Corpo de Alunos
All checks were successful
CI / Lint (debian) (push) Successful in 24s
CI / Lint (ubuntu-latest) (push) Successful in 20s
CI / Testes (debian) (push) Successful in 37s
CI / Testes (ubuntu-latest) (push) Successful in 36s
CI / Lint (debian) (pull_request) Successful in 20s
CI / Lint (ubuntu-latest) (pull_request) Successful in 20s
CI / Testes (debian) (pull_request) Successful in 36s
CI / Testes (ubuntu-latest) (pull_request) Successful in 37s
8a0c889652
O Aluno de Dia à Esquadrilha envia o livro ao Aluno de Dia ao Esquadrão,
que valida (ou devolve com o motivo), reúne e envia ao Aluno de Dia ao
Corpo de Alunos, que valida, reúne e envia o Livro do Dia ao CA.

- A função (esquadrilha, esquadrão ou CA) é escolhida junto com o posto
  de serviço e fica na sessão.
- Tabela `livros`: situação, alterações e observações, quem enviou, quem
  validou e o texto como foi enviado (migration 020).
- Só o dono altera o livro, e só antes de enviar ou depois de devolvido;
  o Aluno de Dia ao CA pode reabrir o livro do CA.
- App: situação do meu livro, livros recebidos com Validar/Devolver,
  campo de alterações e observações.
- Painel: tramitação do dia na tela do Livro do Dia.

Closes #42

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
caio merged commit 506d94cba1 into release 2026-10-10 22:55:59 -03:00
Sign in to join this conversation.
No description provided.