Claude-skill-registry Fiscalzen SEFAZ
Integrações SEFAZ (NF-e/CT-e/MDF-e) no padrão FiscalZen: DistDFe, Manifestação e eventos — com certificados A1, SOAP, retry/backoff e persistência no produto.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/fiscalzen-sefaz" ~/.claude/skills/majiayu000-claude-skill-registry-fiscalzen-sefaz && rm -rf "$T"
manifest:
skills/data/fiscalzen-sefaz/SKILL.mdsource content
🏗️ Contexto do Projeto (como o FiscalZen é estruturado)
- Monorepo com pnpm-workspace + Turborepo
- Código em TypeScript (ESM
)"type": "module" - Backend: Fastify 4 (apps/api)
- Jobs: BullMQ (workers + scheduler)
- Persistência: Drizzle ORM + PostgreSQL
- Cache/queues: Redis
- Logging: Pino
- Pacote fiscal principal:
(NF-e/CT-e/MDF-e)@fiscalzen/sefaz-client - Parser fiscal:
(usado pelo sefaz-client e api)@fiscalzen/xml-parser
✅ Regra: alterações de SEFAZ geralmente tocam packages/ (cliente) e/ou apps/api/ (orquestração + persistência).
🎯 Objetivo (o que esta skill resolve)
Aplicar mudanças relacionadas a SEFAZ mantendo consistência com a codebase:
- Preferir abstrações internas (
) em vez de reimplementar SOAP/assinatura/certificado@fiscalzen/sefaz-client - Validar certificado e permissões no backend antes de chamar SEFAZ
- Respeitar retry/backoff e throttling
- Persistir eventos e atualizar documentos do jeito do produto
- Garantir validação (unit/integration + homolog)
🧭 Onde mexer (mapa rápido)
Cliente SEFAZ (packages/sefaz-client)
→ política de timeout/retry/backoff,packages/sefaz-client/src/client.ts
,https.Agent
, loggingdispose()
+packages/sefaz-client/src/soap-client.ts
→ SOAP + envelopesrc/soap/envelope.ts
→ implementações por domínio:packages/sefaz-client/src/services/*
(DistDFe NF-e)nfe-distdfe.ts
,cte-distdfe.ts
(DistDFe CT-e/MDF-e)mdfe-distdfe.ts
(eventos do destinatário)manifestacao.ts
(consulta eventos)event-query.ts
(eventos CT-e)cte-events.ts
→ contratos + erros tipados (packages/sefaz-client/src/types.ts
,SefazError
,TimeoutError
, etc.)CertificadoError
→ A1 (PFX), cache/invalidação, validaçõespackages/sefaz-client/src/certificate.ts
→ digest/assinatura (helpers)packages/sefaz-client/src/signature.ts
Produto (apps/api)
→ fluxo real de manifestação + persistênciaapps/api/src/modules/manifestacao/service.ts
→ validação de certificados (gate antes de SEFAZ)apps/api/src/modules/certificates/*
→ documento + status/manifestaçõesapps/api/src/modules/documents/*
→ criação/agenda de jobs SEFAZapps/api/src/jobs/queues.ts
+apps/api/src/modules/nsu/*
→ controle de NSU/syncpackages/database/src/schema/nsu-control.ts
✅ Regras obrigatórias (gates)
1) Sempre validar certificado antes de chamar SEFAZ (no produto)
Se a chamada vier do
apps/api, não chame SEFAZ sem passar pelo gate:
- empresa existe
ecompany.certificate
existemcompany.certificatePassword- certificado não expirou
- (se aplicável) tenantId correto (multi-tenant)
2) Não vazar segredo (PFX/senha)
- nunca logar senha do certificado
- nunca logar buffer do PFX
- ao logar erro, sanitize campos sensíveis
3) TLS estrito
- não desabilitar validação TLS (
)rejectUnauthorized
4) Erros externos padronizados
No
apps/api, problemas da SEFAZ devem virar erro de serviço externo (padrão do projeto), mantendo mensagem útil.
🔁 Retry/Backoff e Throttling (padrão FiscalZen)
Ponto único de política: packages/sefaz-client/src/client.ts
packages/sefaz-client/src/client.ts✅ Regra: se você precisar mudar retry/backoff/timeout, faça no client (não espalhe retry pelos services).
Throttling (ex.: cStat 656)
Recomendação de implementação consistente:
- tratar como erro recuperável
- aplicar retry com backoff exponencial + jitter
- evitar tempestade: preferir job/queue para processar em série por empresa/UF
📦 DistDFe (Golden Path) — como fazer no FiscalZen
Cenários típicos
- Consulta por último NSU (sync contínuo)
- Consulta por NSU específico
- Consulta por chave (pontual)
Padrão de implementação
- Validar parâmetros (CNPJ, chave, nsu/ultNSU)
- Montar request XML conforme tipo de consulta
- Enviar via
/SoapClient
(abstração interna)SefazClient - Parsear retorno (cStat/xMotivo/ultNSU/maxNSU)
- Extrair
e:docZip- decodificar
- detectar schema
- derivar tipo/chave usando
@fiscalzen/xml-parser
- Retornar
consistenteDistDFeResponse - Se estiver no produto (apps/api): persistir e atualizar controle de NSU
Regras de robustez
ensu
sempre como string com 15 dígitos (ultNSU
)padStart(15,'0')- docZip inválido não deve derrubar o lote inteiro (registrar erro e seguir)
- ao tratar throttling, preferir política central no client
🧾 Manifestação do Destinatário (Golden Path) — padrão do produto
Passo a passo (apps/api)
- obter empresa com certificado (gate)
- buscar documento por chave com tenantId
- montar
no formato doCertificadoA1@fiscalzen/sefaz-client - usar
env.SEFAZ_AMBIENTE - chamar o client do pacote
- se
: lançarsucesso=falseExternalServiceError('SEFAZ', xMotivo) - persistir em
+ atualizardocumentEventsdocuments.manifestacao
Regras específicas
- eventos devem ser idempotentes na camada do produto (não duplicar o mesmo evento sem necessidade)
- manter rastreabilidade (documentId/chave/tipoEvento/protocolo/dataRegistro)
🧪 Validação (Fase V) — mínimo obrigatório
Unit / pacote (sefaz-client)
- validar
(CNPJ/chave)validateParams - validar montagem de request por ultNSU/nsu/chave
- validar parsing de resposta (cStat e campos)
- validar docZip: sucesso e falha isolada
Integration / produto (apps/api)
- empresa sem certificado → erro de validação
- certificado expirado → erro de validação
- documento inexistente → NotFound
- retorno
da SEFAZ → ExternalServiceErrorsucesso=false - persistência: criou event + atualizou documento
Homologação
- testar ao menos:
- DistDFe por ultNSU
- Manifestação (um evento)
- cenário de throttling (se possível reproduzir)
🧰 Prompt templates (como invocar a skill)
Manifestação (produto)
“Aplique a skill
para ajustar o fluxo de manifestação emfiscalzen-sefaz.apps/api
Preserve o gate de certificado + multi-tenant e mapeie falhas SEFAZ para erro externo padrão. Atualize persistência emedocumentEvents.”documents.manifestacao
DistDFe (pacote)
“Aplique a skill
para modificarfiscalzen-sefaz.packages/sefaz-client/src/services/nfe-distdfe.ts
Preserve validações, padStart(15) e parsing docZip com. Se tratar 656, preferir política central no client.”@fiscalzen/xml-parser