MDX Limo
NFS-e Avulsa

NFS-e Avulsa — Plano de Implementação

Visão Geral

Nova funcionalidade no Módulo Fiscal da SMB Store para emissão manual de Notas Fiscais de Serviço Eletrônicas (NFSe). O prestador seleciona um tomador, seleciona o serviço, preenche dados fiscais e transmite a nota à prefeitura — tudo dentro do sistema.

Estado atual: o Módulo Fiscal suporta apenas NFe e NFCe (produtos). Esta release adiciona cobertura para serviços.

Integração: API Focus NFe — endpoints /v2/nfse (próprio) e /v2/nfsen (nacional).


Arquitetura de Referência do Codebase

CamadaPadrão AtualArquivos-chave
API FocusFactory + Contracts (third_party/NotaFiscal/)Notafiscal.php, CreateNfe.php, CancelNfe.php
ControllersCodeIgniter + Ws.php como hub de operaçõesWs.php, Nfes_manual.php, Dados_fiscais_v.php
ModelsGeneric_model com enums internosNotas_fiscais_model.php, Empresa_model.php
HelpersFunções procedurais por domíniomy_nota_fiscal_helper.php, my_webhook_nfe_helper.php
FrontendVue 3 (Composition API) + Mixins + Materialize CSSDadosFiscaisController_v.js, Mixin_nota_fiscal.js
PermissõesConstantes no Permissao_model (430–433 usados)Permissao_model.php
Rotasroutes.php + controllers nomeados$route['nfes-manual/(:num)']

Seleção de Ambiente pelo Usuário

Na tela de Dados Fiscais, um dropdown permite escolher entre dois ambientes de emissão:

OpçãoFlags na API de Empresas FocusEndpoint de emissão
Ambiente Nacionalhabilita_nfsen_producao: true, habilita_nfse: false/v2/nfsen
Ambiente Própriohabilita_nfsen_producao: false, habilita_nfse: true/v2/nfse

A escolha do ambiente é manual e direta: o usuário seleciona o dropdown, o sistema persiste a configuração e aplica o endpoint correspondente em toda emissão subsequente.

Regra MEI: empresas com regime tributário MEI (código 4) obrigatoriamente usam Ambiente Nacional, independente da configuração manual.


Fase 1 — Configuração e Cadastros

Entrega: A empresa está configurada para emitir NFSe. Serviços e clientes possuem dados fiscais completos. Permissões estão ativas.

1.1 Estrutura de Dados Base

Escopo: Migrações de banco, models, enums, constantes de permissão. Pré-requisito para tudo.

Novas colunas — tabela empresas

ColunaTipoDescrição
ativar_nfsetinyint(1) default 0Switch habilitar NFSe
is_nfse_prodtinyint(1) default 0Ambiente: 0=homolog, 1=prod
nfse_ambienteenum('nacional','proprio')Tipo de ambiente
nfse_numero_rpsint unsignedPróximo número RPS
nfse_login_prefeituravarchar(100)Login prefeitura
nfse_senha_prefeituratextSenha prefeitura (encriptada)
nfse_codigo_ibgevarchar(7)Código IBGE do município
nfse_info_adicionaistextInformações adicionais padrão

Campos reutilizados (já existentes): inscricao_municipal (varchar 30).

Novas colunas — tabela notas_fiscais

ColunaTipoDescrição
nfse_numerovarchar(20)Número oficial da NFSe
nfse_numero_rpsintNúmero RPS usado
nfse_codigo_verificacaovarchar(50)Código de verificação
nfse_urltextURL da nota na prefeitura
xml_nfselongtextXML armazenado localmente
nfse_natureza_operacaotinyintEnum 1–6
nfse_data_competenciadateData de competência
nfse_discriminacaotextDiscriminação dos serviços
nfse_substituida_idint unsigned nullFK nota substituída
nfse_valor_pisdecimal(15,2)Retenção PIS
nfse_valor_cofinsdecimal(15,2)Retenção COFINS
nfse_valor_irdecimal(15,2)Retenção IR
nfse_valor_cslldecimal(15,2)Retenção CSLL
nfse_valor_inssdecimal(15,2)Retenção INSS
nfse_valor_issdecimal(15,2)Valor ISS
nfse_valor_iss_retidodecimal(15,2)ISS retido

Campos reutilizados (já existentes): numero (número sequencial interno), is_prod (ambiente de emissão), valor_total, status, tipo (adicionar alias NFSE ao enum), justificativa_cancelamento.

Novas colunas — tabela nota_fiscal_itens

ColunaTipoDescrição
servico_codigo_lc116varchar(10)Código LC 116
servico_codigo_cnaevarchar(10)CNAE (snapshot)
servico_aliquota_issdecimal(5,2)Alíquota ISS (snapshot)
servico_iss_retidotinyint(1) default 0ISS retido (snapshot)
servico_codigo_tributario_municipiovarchar(20)CTM (snapshot)
servico_descricao_manualtextDescrição (serviço manual)
is_servico_manualtinyint(1) default 0Flag serviço avulso

Nota: Estes campos são snapshots dos dados fiscais do produto/serviço no momento da emissão, garantindo integridade histórica.

Novas colunas — tabela produtos

ColunaTipoDescrição
servico_codigo_lc116varchar(10)Código LC 116
servico_nbsvarchar(20)NBS
servico_reter_pistinyint(1) default 0Reter PIS
servico_reter_cofinstinyint(1) default 0Reter COFINS
servico_reter_irtinyint(1) default 0Reter IR
servico_reter_cslltinyint(1) default 0Reter CSLL
servico_reter_insstinyint(1) default 0Reter INSS

Campos reutilizados (já existentes): codigo_cnae, servico_aliquota (alíquota ISS), iss_retido, codigo_tributario_municipio.

Novas colunas — tabela clientes

ColunaTipoDescrição
codigo_ibge_municipiovarchar(7)Código IBGE do município

Campos reutilizados (já existentes): inscricao_municipal.

Nova tabela — servicos_lc116

ColunaTipo
idint PK auto_increment
codigovarchar(10) unique
descricaotext

Nova tabela — municipios_nfse

ColunaTipo
idint PK auto_increment
codigo_municipiovarchar(7) unique
nome_municipiovarchar(100)
sigla_ufchar(2)
nfse_habilitadatinyint(1)
requer_certificado_nfsetinyint(1)
possui_ambiente_homologacao_nfsetinyint(1)
possui_cancelamento_nfsetinyint(1)
provedor_nfsevarchar(50)
codigo_cnae_obrigatorio_nfsetinyint(1) null
item_lista_servico_obrigatorio_nfsetinyint(1) null
codigo_tributario_municipio_obrigatorio_nfsetinyint(1) null
status_nfsevarchar(20)
atualizado_emdatetime

Colunas reservadas — Reforma Tributária (IBS/CBS)

Adicionar nas tabelas notas_fiscais e nota_fiscal_itens sem lógica:

ColunaTipo
ibs_valordecimal(15,2) null
cbs_valordecimal(15,2) null

Enums

1class NfseNaturezaOperacaoEnum { 2 const TRIBUTACAO_MUNICIPIO = 1; 3 const TRIBUTACAO_FORA_MUNICIPIO = 2; 4 const ISENCAO = 3; 5 const IMUNE = 4; 6 const EXIGIBILIDADE_SUSPENSA_JUDICIAL = 5; 7 const EXIGIBILIDADE_SUSPENSA_ADMINISTRATIVA = 6; 8} 9 10class NfseRegimeTributacaoEnum { 11 const MICROEMPRESA_MUNICIPAL = 1; 12 const ESTIMATIVA = 2; 13 const SOCIEDADE_PROFISSIONAIS = 3; 14 const COOPERATIVA = 4; 15 const MEI_SIMPLES_NACIONAL = 5; 16 const ME_EPP_SIMPLES_NACIONAL = 6; 17}

Adicionar alias NFSE = 'nfse' no NotaFiscalTipoEnum. Adicionar status SUBSTITUIDO = '7' no NotaFiscalStatusEnum.

Constantes de Permissão

1const PERMISSAO_EMITIR_NFSE = 435; 2const PERMISSAO_CANCELAR_NFSE = 436; 3const PERMISSAO_GERENCIAR_CONF_NFSE = 437;

1.2 Configuração NFSe da Empresa

Escopo: Backend + Frontend para a tela de Dados Fiscais.

Wireframe — Seção NFSe em Dados Fiscais

DADOS FISCAIS DA EMPRESA
Empresa
Config Notas
Certificado
Backup Fiscal
NFe / NFCe (existente)
Campos existentes de NFe/NFCe permanecem inalterados...
NFS-e
Habilitar emissão de NFSe
Pré-requisito: Inscrição Municipal preenchida na aba Empresa.
Inscrição Municipal *
123456789
Máx 30 chars, numérico
Número Inicial do RPS *
1
Inteiro positivo, mín 1
Município (Código IBGE) *
🔍 Buscar município...
Autocomplete via cache de municípios Focus
Ambiente de Emissão
▾ Homologação
Homologação / Produção
Tipo de Ambiente
▾ Ambiente Próprio
Nacional / Próprio
Dados para Autenticação
Nem todas as prefeituras exigem login/senha. Em algumas, apenas um token é necessário (informar no campo Senha).
Login da Prefeitura
usuario_prefeitura
Opcional (máx 100)
Senha da Prefeitura
•••••••• 👁
Opcional (máx 100, mascarado)
Informações Adicionais Padrão
Texto padrão incluído em todas as NFSe...
Opcional
Município sem homologação: "O município configurado não possui ambiente de homologação. Notas em modo teste serão transmitidas para produção."

Fluxo de preenchimento do Código IBGE

Validações

  • Ativar switch: Inscrição Municipal deve estar preenchida. Caso contrário, alerta com link.
  • Número RPS: inteiro positivo, mínimo 1, obrigatório.
  • Senha da prefeitura: encriptada no backend antes de persistir.
  • Tipo de Ambiente: ao salvar, dispara UpdateCompany na Focus com flags corretas conforme tabela de ambientes.

Backend

  • Endpoints em Ws.php: set/salvar_config_nfse, get/config_nfse
  • Validação em my_nfse_helper.php: validar_empresa_nfse()
  • Encriptação da senha via helper existente do CodeIgniter

Frontend

  • Nova seção no DadosFiscaisController_v.js
  • Novo mixin Mixin_nfse.js com métodos de API
  • Campos condicionais vinculados ao switch ativar_nfse

1.3 Catálogo LC 116 e Dados Fiscais do Serviço

Escopo: Seed da LC 116, autocomplete, aba fiscal no cadastro de serviço.

Wireframe — Aba Dados Fiscais do Serviço

CADASTRO DE PRODUTO/SERVIÇO
Geral
Preços
Dados Fiscais
ℹ Aba visível APENAS quando Tipo = Serviço E Módulo Fiscal ativo.
Código do Serviço (LC 116) *
🔍 Buscar código ou descrição...
Autocomplete do catálogo (~200 itens). Ex: 17.06 - Propaganda e publicidade
CNAE
6201501
Formato CNAE 2.0
Alíquota ISS (%)
5.00
0–100, 2 decimais
Código Tributário Municipal
123
Máx 20 chars
NBS
1.0101.10.00
Nomenclatura Brasileira de Serviços
Retenções

Backend

  • Seed script: popular servicos_lc116 com ~200 itens da LC 116/2003
  • Endpoint: ws/get/ac_servicos_lc116?q= — busca por código ou texto
  • Método cadastro_completo_nfse() no model de produto: valida LC 116 + alíquota ISS preenchidos
  • Campos opcionais no cadastro — obrigatoriedade validada apenas na emissão

Frontend

  • Nova aba condicional no formulário de produto (visível quando is_servico = '1' e módulo fiscal ativo)
  • Autocomplete para LC 116 consumindo endpoint do catálogo
  • Indicador visual de cadastro fiscal incompleto (badge "Pendente")

1.4 Dados Fiscais do Cliente (Tomador)

Escopo: Campo Código IBGE no cadastro de cliente + auto-preenchimento via CEP.

Wireframe — Campo IBGE no Cadastro de Cliente

CADASTRO DE CLIENTE — Endereço
CEP
60000-000
Logradouro
Rua das Flores
Bairro
Centro
Cidade
Fortaleza
UF
CE
Número
100
Código IBGE do Município *
NOVO CAMPO
2304400 (auto-preenchido via CEP)
Obrigatório para emissão de NFSe

Backend

  • Método cadastro_completo_nfse() no model de cliente: valida CPF/CNPJ + endereço + código IBGE
  • Lógica: ao receber CEP, buscar código IBGE via tabela municipios_nfse ou fonte externa
  • Referência: municipios-brasileiros JSON

Frontend

  • Novo campo no bloco de endereço do ClienteController_v.js
  • Auto-preenchimento do IBGE ao completar CEP
  • Sinalização visual quando cadastro incompleto para NFSe

1.5 Permissões de Usuário

Escopo: 3 novas permissões no sistema existente.

IDConstanteDescrição
435PERMISSAO_EMITIR_NFSEEmitir NFSe Manual
436PERMISSAO_CANCELAR_NFSECancelar NFSe
437PERMISSAO_GERENCIAR_CONF_NFSEGerenciar Configuração NFSe
  • Checkboxes na tela de permissões, visíveis apenas quando NFSe habilitada no tenant.
  • Permissão 435 controla acesso ao módulo inteiro (menu, listagem, emissão).
  • Validação no backend via $this->session->permissoes.

1.6 Cache de Municípios Suportados

Escopo: Integração com GET /v2/municipios da Focus + cache local.

Backend

  • Nova classe ListMunicipios.php em third_party/NotaFiscal/ seguindo padrão factory
  • Contrato ListMunicipiosContract.php
  • Novo método listMunicipios() na Notafiscal.php
  • Sincronização: cache com validade de 30 dias na tabela municipios_nfse
  • Endpoint: ws/get/ac_municipios_nfse para autocomplete

Dados do endpoint de municípios da Focus

1{ 2 "codigo_municipio": "2304400", 3 "nome_municipio": "Fortaleza", 4 "sigla_uf": "CE", 5 "nfse_habilitada": true, 6 "requer_certificado_nfse": true, 7 "possui_ambiente_homologacao_nfse": true, 8 "possui_cancelamento_nfse": true, 9 "provedor_nfse": "FortalezaRt", 10 "codigo_cnae_obrigatorio_nfse": true, 11 "item_lista_servico_obrigatorio_nfse": true, 12 "codigo_tributario_municipio_obrigatorio_nfse": true, 13 "status_nfse": "ativo" 14}

Entrega da Fase 1

  • Migrações executadas e models atualizados
  • Tela de Dados Fiscais com seção NFSe funcional
  • Autocomplete de município com cache Focus
  • Catálogo LC 116 populado e endpoint de busca funcionando
  • Aba Dados Fiscais no cadastro de serviço
  • Campo Código IBGE no cadastro de cliente
  • Permissões 435/436/437 registradas e funcionais

Fase 2 — Emissão de NFSe Manual

Entrega: Usuário pode emitir NFSe selecionando tomador e serviço. Nota transmitida de forma assíncrona com retorno automático de status via webhook. XML armazenado localmente.

2.1 Integração com API Focus NFSe

Escopo: Classes de integração — backend puro, sem frontend.

Novos arquivos em third_party/NotaFiscal/

ArquivoContratoMétodo HTTPEndpoint Focus
CreateNfse.phpCreateNfseContract.phpPOST/v2/nfse?ref={REF}
CreateNfsen.phpCreateNfsenContract.phpPOST/v2/nfsen?ref={REF}
DetailNfse.phpDetailNfseContract.phpGET/v2/nfse/{REF}
CancelNfse.phpCancelNfseContract.phpDELETE/v2/nfse/{REF}
SubstituteNfse.phpSubstituteNfseContract.phpPOST/v2/nfse/{REF}/substitucao
DownloadNfsePdf.phpGETURL retornada pela Focus
DownloadNfseXml.phpGETURL retornada pela Focus
ListMunicipios.phpListMunicipiosContract.phpGET/v2/municipios

Factory — novos métodos em Notafiscal.php

1// Novos métodos — usam is_nfse_prod em vez de is_nf_prod 2public function createNfse($apiToken) { ... } 3public function createNfsen($apiToken) { ... } 4public function detailNfse($apiToken) { ... } 5public function cancelNfse($apiToken) { ... } 6public function substituteNfse($apiToken) { ... } 7public function listMunicipios() { ... }

Importante: o ambiente NFSe (is_nfse_prod) é independente do ambiente NFe (is_nf_prod).

Resolução de endpoint na emissão

O endpoint utilizado é determinado pelo campo nfse_ambiente da empresa:

  • nfse_ambiente = 'nacional'createNfsen() → POST /v2/nfsen
  • nfse_ambiente = 'proprio'createNfse() → POST /v2/nfse

Exceção MEI: se regime tributário = 4 (MEI), sempre usa createNfsen() independente da configuração.


2.2 Webhook de Autorização NFSe

Escopo: Receber callback da Focus e atualizar status + armazenar XML.

Fluxo do Webhook

Backend

  • Novo helper: my_webhook_nfse_helper.php seguindo padrão de my_webhook_nfe_helper.php
  • Novo case em Ws.php: case "webhook_nfse":
  • Obrigatório: ao receber autorização, fazer GET no XML e armazenar na coluna xml_nfse (Focus só gera backups mensais)
  • Armazenar: nfse_url, nfse_codigo_verificacao, nfse_numero
  • Idempotência: verificar se já processou o webhook (status já AUTORIZADO → ignorar)

2.3 Formulário de Emissão — Dados Gerais e Tomador

Escopo: Página de NFSe Manual + etapas 1 e 2 do formulário.

Wireframe — Listagem de NFSe (página principal)

NFSe Manual
Status
▾ Todos
Tomador
🔍 Nome, CPF ou CNPJ
De
01/04/2026
Até
30/04/2026
RPSDataTomadorValorStatus
421501/04/2026Empresa ABCR$ 1.500Autorizada
1601/04/2026João SilvaR$ 200Processando
411431/03/2026Maria LTDAR$ 1.000Erro
401330/03/2026Tech CorpR$ 750Cancelada
← 1 2 3 ... → · 20 itens por página

Wireframe — Modal de Emissão: Etapa 1 (Dados Gerais)

Nova NFSe ✕
1
Dados Gerais
2
Tomador
3
Serviço
4
Revisão
Número RPS
16
Automático, somente leitura
Data de Competência *
📅 01/04/2026
Não pode ser futura
Natureza da Operação *
▾ 1 - Tributação no município
1=Trib. município, 2=Fora, 3=Isenção, 4=Imune, 5=Susp. judicial, 6=Susp. administrativa
Regime Especial de Tributação
▾ 5 - MEI - Simples Nacional
1=Microempresa, 2=Estimativa, 3=Soc. prof., 4=Cooperativa, 5=MEI-SN, 6=ME EPP-SN
Discriminação dos Serviços
Descrição geral dos serviços prestados...
Máx 2000 caracteres. Opcional.

Wireframe — Modal de Emissão: Etapa 2 (Tomador)

Nova NFSe ✕
1
Dados Gerais
2
Tomador
3
Serviço
4
Revisão
Buscar tomador *
🔍 Nome, CPF ou CNPJ...
Autocomplete no cadastro de clientes
✓ Tomador selecionado
Nome: Empresa ABC LTDA
CNPJ: 12.345.678/0001-90
Município: Fortaleza - CE (IBGE: 2304400)
Endereço: Rua X, 100 - Centro
⚠ Cadastro incompleto para NFSe.
Campos faltantes: Código IBGE do Município
Corrigir cadastro ↗ (abre nova aba) ·

Backend

  • Controller: Nfse_manual.php + rota nfse-manual
  • Helper: my_nfse_helper.php com validar_empresa_nfse(), validar_tomador_nfse()
  • Endpoint: ws/get/dados_iniciais_nfse (empresa, enums, próximo RPS)

Frontend

  • Nova página: application/views/paginas/nfse-manual.php
  • Controller Vue: NfseManualController.js
  • Modal Controller: ModalEmitirNfseController.js
  • Mixin: Mixin_nfse.js
  • Item no menu: sidebar abaixo de "NF-e Manual", visível com permissão 435

2.4 Formulário de Emissão — Serviço e Retenções

Escopo: Etapa 3 do formulário de emissão.

Wireframe — Modal de Emissão: Etapa 3 (Serviço)

Nova NFSe ✕
1
Dados Gerais
2
Tomador
3
Serviço
4
Revisão
Buscar serviço do catálogo
🔍 Nome ou código do serviço...
Apenas itens com Tipo = Serviço
Serviço selecionado
ServiçoLC 116QtdV. Unit.Total
Consultoria TI
ISS: 5% · ISS Retido: Não
17.0610hR$ 150R$ 1.500✏ 🗑
Total: R$ 1.500,00

Regras de negócio — Serviço

  • Serviço único: cada NFSe permite apenas um único serviço
  • Serviço manual: dados efêmeros (não salva no catálogo), mas LC 116 e alíquota são obrigatórios
  • Pendência fiscal: serviço do catálogo sem LC 116 ou alíquota → badge de pendência + link para edição

Backend

  • validar_servico_nfse(): valida dados fiscais completos do serviço (LC 116 e alíquota ISS obrigatórios)
  • Validação: codigo_servico_lc116 e servico_aliquota_iss obrigatórios

2.5 Transmissão e Acompanhamento de Status

Escopo: Etapa 4 (revisão), envio à Focus, polling de status.

Wireframe — Modal de Emissão: Etapa 4 (Revisão)

Nova NFSe ✕
1
Dados Gerais
2
Tomador
3
Serviço
4
Revisão
Resumo
Tomador: Empresa ABC LTDA (12.345.678/0001-90)
RPS: 16 · Competência: 04/2026 · Nat. Op.: Tributação no município
Serviço
ServiçoLC 116DetalheTotal
Consultoria TI17.0610h × R$150R$ 1.500,00
Subtotal: R$ 1.500,00
Retenções (editáveis)
ISS (R$)
75,00
PIS (R$)
0,00
COFINS (R$)
0,00
IR (R$)
0,00
CSLL (R$)
0,00
INSS (R$)
0,00
ℹ Esta nota será transmitida pelo Ambiente Nacional NFSe, conforme obrigatoriedade para emitentes MEI.
VALOR TOTAL
R$ 1.425,00
Serviço − Retenções = Líquido

Fluxo completo de emissão

Backend — Funções principais

FunçãoResponsabilidade
set_emitir_nfse()Orquestra validação → gravação → transmissão
montar_payload_nfse()JSON conforme formato Focus
get_consultar_nfse()Consulta manual de status (fallback ao webhook)

Payload da Focus — Formato (endpoint /v2/nfse)

1{ 2 "data_emissao": "2026-04-01T10:00:00-03:00", 3 "prestador": { 4 "cnpj": "07504505000132", 5 "inscricao_municipal": "12345", 6 "codigo_municipio": "2304400" 7 }, 8 "tomador": { 9 "cnpj": "12345678000190", 10 "razao_social": "Empresa ABC LTDA", 11 "endereco": { "..." : "..." }, 12 "codigo_municipio": "3550308" 13 }, 14 "servico": { 15 "aliquota": 5.0, 16 "discriminacao": "Consultoria em TI...", 17 "iss_retido": false, 18 "item_lista_servico": "1706", 19 "codigo_cnae": "6201501", 20 "codigo_tributario_municipio": "123", 21 "valor_servicos": 1500.00 22 }, 23 "natureza_operacao": "1", 24 "regime_especial_tributacao": "5", 25 "valor_pis": 0, 26 "valor_cofins": 0, 27 "valor_ir": 0, 28 "valor_csll": 0, 29 "valor_inss": 0 30}

Cota mensal

NFSe consome a mesma franquia do pacote mensal (mesma contagem de NFe/NFCe). Verificar saldo antes de emitir.


Entrega da Fase 2

  • Classes Focus NFSe criadas e funcionais (Create, Detail, Cancel, Substitute)
  • Webhook NFSe processando autorizações e armazenando XML
  • Formulário completo de emissão (4 etapas)
  • Transmissão assíncrona com retorno de status
  • Polling + consulta manual de status
  • Regra MEI forçando Ambiente Nacional

Fase 3 — Gestão de NFSe

Entrega: Usuário pode listar, filtrar, visualizar detalhes, baixar PDF/XML, cancelar e substituir notas.

3.1 Listagem e Filtros

Wireframe da listagem apresentado na Fase 2 (seção 2.3). Complementos:

  • Filtros: período (data início/fim), status (dropdown), tomador (busca por nome/CPF/CNPJ)
  • Busca textual: por número da nota, número RPS, nome do tomador
  • Paginação: 20 itens por página

3.2 Visualização Detalhada e Downloads

Wireframe — Modal de Detalhes da NFSe

Detalhes da NFSe #42
Status: Autorizada
Nº NFSe: 42 · RPS: 15 · Cód. Verificação: ABC123
Data Emissão: 01/04/2026 · Competência: 04/2026
Prestador
SMB Store LTDA · CNPJ: 07.504.505/0001-32 · IM: 12345
Tomador
Empresa ABC LTDA · CNPJ: 12.345.678/0001-90 · Fortaleza - CE (IBGE: 2304400)
Serviço
ServiçoLC 116CNAEISSDetalheTotal
Consultoria TI17.0662015015%10h × R$150R$ 1.500
Retenções
ISS: R$75,00 · PIS: R$0 · COFINS: R$0 · IR: R$0 · CSLL: R$0 · INSS: R$0
Valor Total: R$ 1.425,00
Notas Vinculadas
NFSe #41 · 31/03/2026 · Substituído Ver ↗

Matriz de ações por status

AçãoEm processamentoAutorizadoErroCanceladoSubstituído
Baixar XML
Baixar PDF
Cancelar
Substituir

Backend — Downloads

  • XML: prioriza coluna xml_nfse (local); fallback via DetailNfse.php + GET
  • PDF: chama Focus API; se município não suporta PDF, redireciona para nfse_url
  • Cases em Ws.php: nfse_pdf, nfse_xml

3.3 Cancelamento

Wireframe — Modal de Cancelamento

Cancelar NFSe #42 ✕
Tomador: Empresa ABC LTDA
Valor: R$ 1.425,00
Data: 01/04/2026
⚠ Esta ação é irreversível.
Justificativa de cancelamento *
Informe o motivo do cancelamento...
Máx 255 caracteres
  • Município sem suporte a cancelamento: botão desabilitado com tooltip "Indisponível para este município. Entre em contato com a prefeitura."
  • Backend: CancelNfse.php → DELETE /v2/nfse/REF com justificativa.
  • Case Ws.php: cancelar_nfse

3.4 Substituição

  • Disponível para notas com status Erro ou Cancelado.
  • Abre formulário de nova NFSe pré-preenchido com dados da nota original.
  • Banner: "Você está substituindo a nota nº X."
  • Após transmissão: nota original → status SUBSTITUÍDO; nova nota → PROCESSANDO.
  • Backend: SubstituteNfse.php → POST /v2/nfse/REF/substitucao
  • Vínculo: nfse_substituida_id na nova nota.
  • Case Ws.php: substituir_nfse

Entrega da Fase 3

  • Listagem com filtros e paginação
  • Busca por número, RPS, tomador
  • Modal de detalhes com todos os dados
  • Download XML (local) e PDF (Focus)
  • Cancelamento com justificativa
  • Substituição com pré-preenchimento
  • Cadeia de notas vinculadas

Fase 4 — Dashboard Fiscal Unificado

Entrega: Dashboard apresenta visão consolidada de NFe + NFCe + NFSe com métricas, filtros e exportação de XMLs.

4.1 Métricas e Contadores NFSe

Wireframe — Cards no Dashboard

DASHBOARD FISCAL
NFCe
142
NFe Normal
28
NFe Dev.
3
NFe Ajuste
1
NFSe
12
NOVO
Notas no período
186
(inclui NFSe)
Cota mensal: 186/500 (37%)
NFe + NFCe + NFSe
Tipo
▾ Todas (inclui NFSe)
  • Card "NFSe" visível apenas com switch ativo.
  • NFSe autorizadas contam no total de "Notas emitidas no período".
  • Cota mensal inclui NFSe na contagem total.

4.2 Filtros e Navegação

  • Nova opção "NFSe" no seletor de tipo de documento no dashboard.
  • Link rápido "Emitir NFSe" na barra de ações.
  • Menu lateral: item "NFSe Manual" no grupo Módulo Fiscal.

4.3 Exportação de XMLs por Período

  • Botão "Exportar XMLs" com seletor de período.
  • Consulta coluna xml_nfse local, gera ZIP, serve para download.
  • Não depende da API Focus.

Entrega da Fase 4

  • Card contador "NFSe" no dashboard
  • NFSe na cota mensal
  • Filtro por tipo de documento incluindo NFSe
  • Link rápido "Emitir NFSe"
  • Exportação de XMLs em ZIP

Fase 5 — Testes, Validação e Rollout

Entrega: Módulo validado em homologação, regressão NFe/NFCe íntegra, rollout gradual para produção.

5.1 Testes Funcionais em Homologação

CenárioDescrição
Emissão básicaEmpresa SN, serviço simples, tomador PJ
Emissão MEISistema força Ambiente Nacional
ISS retido + retençõesPIS, COFINS, CSLL, IR, INSS preenchidos
Bloqueio dados incompletosServiço sem LC 116 → orientação
Webhook autorizaçãoStatus atualizado + XML armazenado
Webhook erroStatus erro + mensagem da Focus
Consulta manual statusFallback ao webhook
CancelamentoJustificativa + Focus API
SubstituiçãoPré-preenchimento + vínculo
Download PDFMunicípio com e sem suporte
Download XMLBase local e via API
CotaNFSe decrementa saldo do pacote
PermissõesSem permissão → menu oculto + rota bloqueada
Multi-tenantNFSe empresa A ≠ empresa B
Tomador sem IBGEBloqueio + orientação
Sem Inscrição MunicipalBloqueio ao ativar switch
Município não suportadoMensagem clara

5.2 Testes de Regressão

  • NFe/NFCe continua emitindo normalmente
  • Dashboard sem NFSe ativa não quebra
  • Produto tipo mercadoria não exibe aba serviço
  • Webhooks NFe/NFCe inalterados

5.3 Testes de Borda

  • Timeout da Focus → tratamento gracioso
  • NFSe com valor zero → bloqueio
  • Emissões simultâneas → sem duplicidade no RPS (lock/transação atômica)
  • Webhook duplicado → idempotência

5.4 Rollout Gradual

FaseEscopoCritério de entrada
Alpha3–5 clientes em municípios estáveis (SP, CWB)Testes em homolog aprovados
BetaClientes em cidades homologadas como estáveisAlpha sem bugs críticos
GA (Disponibilidade Geral)Toda a baseBeta estável por 2 semanas

Entrega da Fase 5

  • Todos os cenários de teste aprovados em homologação
  • Regressão NFe/NFCe sem impacto
  • Payloads validados com consultoria fiscal
  • Webhook NFSe configurado no painel Focus (homolog + prod)
  • Alpha concluído com sucesso
  • GA liberado

Fluxo Geral — Diagrama Completo


Dependências e Paralelismo

AtividadeDepende dePode rodar em paralelo com
1.1 Estrutura de dados
1.2 Config empresa1.11.3, 1.4, 1.5, 1.6
1.3 Catálogo LC 1161.11.2, 1.4, 1.5, 1.6
1.4 Dados cliente1.11.2, 1.3, 1.5, 1.6
1.5 Permissões1.11.2, 1.3, 1.4, 1.6
1.6 Cache municípios1.11.2, 1.3, 1.4, 1.5
2.1 Classes Focus1.12.2
2.2 Webhook1.12.1
2.3 Form (dados/tomador)1.2–1.6
2.4 Form (serviço)2.3
2.5 Transmissão2.1, 2.2, 2.4
3.1–3.42.53.3 ∥ 3.4
4.1–4.33.14.1 ∥ 4.2 ∥ 4.3
5.x4.x

Funcionalidades Futuras (pós Release 1)

FeatureRelease
Emissão de NFSe a partir de Ordem de ServiçoRelease 2
Clonagem de NFSe recorrenteFuturo
Cálculo automático de retenções federaisFuturo
Envio automático de e-mail com notaFuturo
Cálculo IBS/CBS (reforma tributária)Quando obrigatório