documents/README.md
Breno Pires 9165f1e9ab feat: microservico documents — catalogo por UF, documentos com versoes, compliance e analise [skip ci]
Espelho do routines: NestJS 10 + Fastify + TypeORM, modulos catalog (override
por UF), document (versoes + storage GCS), compliance (mesmo score do painel),
alerts (regua de vencimento, envio e v1.2) e analise plugavel (KeywordAnalyzer
-> OCR/LLM). 38 testes. Deploy aguarda banco 'documents' e secrets no hml2 —
por isso o [skip ci] no bootstrap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 01:42:24 -03:00

43 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# documents
Serviço de documentos e licenças dos postos: catálogo legal (parametrizável por UF), documentos
com trilha de versões, resumo de conformidade, análise de upload e régua de alertas de vencimento.
É o backend do menu **Documentos** do painel (`clubpetro-frontend`, `REACT_APP_DOCUMENTS_API=true`).
Espelho do serviço [`routines`](../routines) — NestJS 10 + Fastify + TypeORM/PostgreSQL, exceções
mapeadas com prefixo `DOC`, upload em bucket GCS privado com URL assinada.
## Endpoints
| Método | Rota | O que faz |
|---|---|---|
| GET | `/catalog?uf=SP` | Catálogo legal com variação estadual aplicada |
| GET | `/documents?programId&storeId` | Documentos da loja (status derivado na leitura) |
| POST | `/documents` (multipart) | Cria obrigação ou registra renovação (versão nova, trilha preservada) |
| POST | `/documents/analyze` (multipart) | Sugere tipo/datas do arquivo (v1: keywords; v1.1: OCR/LLM) |
| POST | `/documents/:id/protocol` | Registra o protocolo de renovação no órgão (status → em renovação) |
| PATCH | `/documents/:id/details` | Responsável e observações |
| GET | `/compliance/summary?programId&storeId` | Score 0100 ponderado por criticidade + totais |
| GET | `/compliance/upcoming?days=90` | Vencimentos na janela, ordenados |
| GET | `/alerts/preview` | O que a régua (lead/30/15/7/1/vencido) enviaria hoje |
| GET | `/health` | Probe do Kubernetes |
Regras de negócio centrais em `src/modules/common/utils/status.util.ts` (status) e
`src/modules/compliance/compliance.service.ts` (score) — as mesmas do painel, agora com o backend
como fonte da verdade. O detalhe jurídico que o modelo carrega: **renovação protocolada no prazo
mantém o documento operante** (na LO da CETESB, protocolo ≥120 dias antes prorroga a validade).
## Rodar local
```bash
cp .env.example .env # preencher SECRET_TOKEN
yarn && yarn start:dev # migrations rodam no boot (TYPEORM_MIGRATIONS_RUN=true)
yarn test # 38 testes, cobertura mínima 65/73/73/73
```
## Deploy (lab)
`k8s/hml/` uma vez à mão; depois `branch → PR → merge → cd.yml` (Cloud Build). Pré-requisitos
novos no ambiente: database `documents` na instância `clubpetro-homologation` e bucket privado
`corepetro_store_documents`.