Skip to content

REF-901-08: ISSNet NFSe Integration (Brasília/DF)

ADR: ADR-901 — IntegrationsEscopo: Emissão de NFSe via SOAP (ABRASF 2.04), campos RPS, fluxo de emissão, tratamento de erros, ambientes


1. Contexto

ISSNet é o sistema de emissão de Nota Fiscal de Serviço Eletrônica (NFSe) da prefeitura de Brasília/DF, baseado no padrão ABRASF. middag-account emite NFSe automaticamente quando um pagamento é confirmado, vinculando TaxInvoice (domínio) à nota fiscal emitida.

Dependências:

  • Domínio TaxInvoice (ADR-301, REF-301-04)
  • Domínio Invoice (para dados financeiros)
  • Certificado digital A1 (.pfx) válido
  • Inscrição municipal ativa em Brasília/DF

2. Configuração (wp_options)

Armazenada com prefixo middag_issnet_*:

Option KeyTipoDescriçãoExemplo
middag_issnet_cnpj_prestadorstringCNPJ da empresa emissora (somente dígitos)12345678000190
middag_issnet_inscricao_municipalstringInscrição municipal do prestador0123456789
middag_issnet_certificado_pathstringCaminho absoluto do .pfx (fora do webroot)/etc/ssl/middag.pfx
middag_issnet_certificado_senhastringSenha do certificado A1 (encrypted em wp_options)***
middag_issnet_ambientestringhomologacao | producaohomologacao
middag_issnet_codigo_servicostringCódigo LC 116/20031.01
middag_issnet_aliquota_issdecimalAlíquota ISS aplicável0.05 (5%)

Segurança: certificado_path DEVE apontar para diretório fora do webroot. certificado_senha armazenada com encryption (wp_options não é plaintext para este campo).


3. Campos do RPS (Recibo Provisório de Serviço)

CampoTipoValor / Regra
NúmerointSequencial por série (auto-incrementado)
Sériestring"A" (configurável)
Tipoint1 (RPS)
Data de emissãodateY-m-d (data da emissão)
Statusint1 (Normal)
Prestador
└── CNPJstringmiddag_issnet_cnpj_prestador
└── Inscrição municipalstringmiddag_issnet_inscricao_municipal
Tomador
└── CPF ou CNPJstringDa Organization (billing_document)
└── Razão socialstringDa Organization (legal_name)
└── Endereço completostringDa Organization (billing_address)
DiscriminaçãotextDescription da TaxInvoice
Valor bruto dos serviçosdecimalValor total da TaxInvoice (10,2)
Valor ISS retidodecimal0.00 (prestador recolhe)
Alíquota ISSdecimalmiddag_issnet_aliquota_iss
Código do serviçostringmiddag_issnet_codigo_servico (LC 116/2003)
Código município prestadorstring5300108 (Brasília/DF — código IBGE)

4. Fluxo de Emissão

OrderService dispara evento `middag_order_payment_confirmed`


ISSNetListener recebe evento

    ├── Verifica: domínio TaxInvoice habilitado? Config ISSNet presente?
    │   └── NÃO → Log warning, retorna (graceful degradation)

    ├── Cria TaxInvoice com status PENDING


ISSNetService::generateRPS(TaxInvoice)

    ├── Monta XML RPS conforme §3
    ├── Assina XML com certificado A1 (.pfx)


SOAP POST `RecepcionarLoteRps`

    ├── Retorna protocolo de recebimento

    ├── TaxInvoice atualizado: status PROCESSING, protocolo armazenado


Polling via WP-Cron (intervalo: 30s, 1min, 2min, 5min — backoff)

    ├── SOAP `ConsultarSituacaoLoteRps` com protocolo

    ├── Status 1 (Não Recebido) → Aguardar próximo polling
    ├── Status 2 (Não Processado) → Aguardar próximo polling
    ├── Status 3 (Processado com Erro) → §5 tratamento de erros
    ├── Status 4 (Processado com Sucesso) →


SOAP `ConsultarNfseServicoPrestado`

    ├── Extrai: NumeroNfse, CodigoVerificacao, LinkNfse


TaxInvoice atualizado:
    ├── status → ISSUED
    ├── nfse_number → NumeroNfse
    ├── nfse_verification_code → CodigoVerificacao
    ├── nfse_url → LinkNfse
    └── nfse_issued_at → datetime da emissão

5. Erros e Retry

CenárioAção
Código de erro SOAPLog detalhado + TaxInvoice status → FAILED + mensagem em admin notice
Certificado expiradoBloquear emissão + notificar admin via email + admin notice
Timeout SOAPRetentar via WP-Cron (máximo 3 tentativas com backoff exponencial)
Config ISSNet incompletaLog warning + admin notice. Emissão não tentada.
CNPJ/CPF tomador inválidoTaxInvoice status → FAILED + mensagem específica
Certificado não encontradoBloquear emissão + notificar admin

Retry policy:

Tentativa 1: imediato (no mesmo request)
Tentativa 2: +2 minutos (WP-Cron)
Tentativa 3: +10 minutos (WP-Cron)
Após 3 falhas: TaxInvoice status → FAILED, admin notificado

Admin pode reprocessar manualmente via ação no admin UI.


6. Ambientes

Versão ABRASF: 2.04

AmbienteWSDL Endpoint
Homologaçãohttps://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx
ProduçãoConfigurável via middag_issnet_wsdl_producao em wp_options (mesmo host, path diferente)

Nota: Toggle middag_issnet_ambiente (homologacao | producao) seleciona o endpoint automaticamente. Endpoint de produção é configurável — MIDDAG pode trocar sem deploy. Testar em homologação antes de qualquer alteração em produção.


7. SOAP Operations

OperaçãoDireçãoQuando
RecepcionarLoteRpsSaídaSubmissão de lote (1 RPS por lote)
ConsultarSituacaoLoteRpsPollingVerificar status do lote (protocolo)
ConsultarNfseServicoPrestadoPollingObter dados da NFSe emitida
CancelarNfseSaídaCancelamento de NFSe (admin, com justificativa)

Cancelamento de NFSe

Prazo legal: 15 dias após emissão (Brasília/DF). Após 15 dias, cancelamento não é possível via SOAP — requer processo administrativo na prefeitura. Sistema deve bloquear ação de cancelamento após prazo expirado.


8. Hooks Disparados

HookQuandoPayload
middag_taxinvoice_pendingTaxInvoice criada$tax_invoice_id
middag_taxinvoice_issuedNFSe emitida com sucesso$tax_invoice_id, $nfse_number
middag_taxinvoice_failedEmissão falhou$tax_invoice_id, $error
middag_taxinvoice_cancelledNFSe cancelada$tax_invoice_id, $nfse_number
middag_issnet_certificate_expiringCertificado expira em < 30d$days_remaining

9. Herança do Tema

Implementação ISSNet no tema v4 estava quase pronta. Agente implementador pode herdar código do tema como referência — adaptar para DDD Light (Domain/ puro, WordPress/ como adapter).