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
| Camada | Padrão Atual | Arquivos-chave |
|---|---|---|
| API Focus | Factory + Contracts (third_party/NotaFiscal/) | Notafiscal.php, CreateNfe.php, CancelNfe.php |
| Controllers | CodeIgniter + Ws.php como hub de operações | Ws.php, Nfes_manual.php, Dados_fiscais_v.php |
| Models | Generic_model com enums internos | Notas_fiscais_model.php, Empresa_model.php |
| Helpers | Funções procedurais por domínio | my_nota_fiscal_helper.php, my_webhook_nfe_helper.php |
| Frontend | Vue 3 (Composition API) + Mixins + Materialize CSS | DadosFiscaisController_v.js, Mixin_nota_fiscal.js |
| Permissões | Constantes no Permissao_model (430–433 usados) | Permissao_model.php |
| Rotas | routes.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ção | Flags na API de Empresas Focus | Endpoint de emissão |
|---|---|---|
| Ambiente Nacional | habilita_nfsen_producao: true, habilita_nfse: false | /v2/nfsen |
| Ambiente Próprio | habilita_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
| Coluna | Tipo | Descrição |
|---|---|---|
ativar_nfse | tinyint(1) default 0 | Switch habilitar NFSe |
is_nfse_prod | tinyint(1) default 0 | Ambiente: 0=homolog, 1=prod |
nfse_ambiente | enum('nacional','proprio') | Tipo de ambiente |
nfse_numero_rps | int unsigned | Próximo número RPS |
nfse_login_prefeitura | varchar(100) | Login prefeitura |
nfse_senha_prefeitura | text | Senha prefeitura (encriptada) |
nfse_codigo_ibge | varchar(7) | Código IBGE do município |
nfse_info_adicionais | text | Informações adicionais padrão |
Campos reutilizados (já existentes):
inscricao_municipal(varchar 30).
Novas colunas — tabela notas_fiscais
| Coluna | Tipo | Descrição |
|---|---|---|
nfse_numero | varchar(20) | Número oficial da NFSe |
nfse_numero_rps | int | Número RPS usado |
nfse_codigo_verificacao | varchar(50) | Código de verificação |
nfse_url | text | URL da nota na prefeitura |
xml_nfse | longtext | XML armazenado localmente |
nfse_natureza_operacao | tinyint | Enum 1–6 |
nfse_data_competencia | date | Data de competência |
nfse_discriminacao | text | Discriminação dos serviços |
nfse_substituida_id | int unsigned null | FK nota substituída |
nfse_valor_pis | decimal(15,2) | Retenção PIS |
nfse_valor_cofins | decimal(15,2) | Retenção COFINS |
nfse_valor_ir | decimal(15,2) | Retenção IR |
nfse_valor_csll | decimal(15,2) | Retenção CSLL |
nfse_valor_inss | decimal(15,2) | Retenção INSS |
nfse_valor_iss | decimal(15,2) | Valor ISS |
nfse_valor_iss_retido | decimal(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
| Coluna | Tipo | Descrição |
|---|---|---|
servico_codigo_lc116 | varchar(10) | Código LC 116 |
servico_codigo_cnae | varchar(10) | CNAE (snapshot) |
servico_aliquota_iss | decimal(5,2) | Alíquota ISS (snapshot) |
servico_iss_retido | tinyint(1) default 0 | ISS retido (snapshot) |
servico_codigo_tributario_municipio | varchar(20) | CTM (snapshot) |
servico_descricao_manual | text | Descrição (serviço manual) |
is_servico_manual | tinyint(1) default 0 | Flag 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
| Coluna | Tipo | Descrição |
|---|---|---|
servico_codigo_lc116 | varchar(10) | Código LC 116 |
servico_nbs | varchar(20) | NBS |
servico_reter_pis | tinyint(1) default 0 | Reter PIS |
servico_reter_cofins | tinyint(1) default 0 | Reter COFINS |
servico_reter_ir | tinyint(1) default 0 | Reter IR |
servico_reter_csll | tinyint(1) default 0 | Reter CSLL |
servico_reter_inss | tinyint(1) default 0 | Reter INSS |
Campos reutilizados (já existentes):
codigo_cnae,servico_aliquota(alíquota ISS),iss_retido,codigo_tributario_municipio.
Novas colunas — tabela clientes
| Coluna | Tipo | Descrição |
|---|---|---|
codigo_ibge_municipio | varchar(7) | Código IBGE do município |
Campos reutilizados (já existentes):
inscricao_municipal.
Nova tabela — servicos_lc116
| Coluna | Tipo |
|---|---|
id | int PK auto_increment |
codigo | varchar(10) unique |
descricao | text |
Nova tabela — municipios_nfse
| Coluna | Tipo |
|---|---|
id | int PK auto_increment |
codigo_municipio | varchar(7) unique |
nome_municipio | varchar(100) |
sigla_uf | char(2) |
nfse_habilitada | tinyint(1) |
requer_certificado_nfse | tinyint(1) |
possui_ambiente_homologacao_nfse | tinyint(1) |
possui_cancelamento_nfse | tinyint(1) |
provedor_nfse | varchar(50) |
codigo_cnae_obrigatorio_nfse | tinyint(1) null |
item_lista_servico_obrigatorio_nfse | tinyint(1) null |
codigo_tributario_municipio_obrigatorio_nfse | tinyint(1) null |
status_nfse | varchar(20) |
atualizado_em | datetime |
Colunas reservadas — Reforma Tributária (IBS/CBS)
Adicionar nas tabelas notas_fiscais e nota_fiscal_itens sem lógica:
| Coluna | Tipo |
|---|---|
ibs_valor | decimal(15,2) null |
cbs_valor | decimal(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
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
UpdateCompanyna 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.jscom 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
Backend
- Seed script: popular
servicos_lc116com ~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
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_nfseou 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.
| ID | Constante | Descrição |
|---|---|---|
| 435 | PERMISSAO_EMITIR_NFSE | Emitir NFSe Manual |
| 436 | PERMISSAO_CANCELAR_NFSE | Cancelar NFSe |
| 437 | PERMISSAO_GERENCIAR_CONF_NFSE | Gerenciar 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.phpemthird_party/NotaFiscal/seguindo padrão factory - Contrato
ListMunicipiosContract.php - Novo método
listMunicipios()naNotafiscal.php - Sincronização: cache com validade de 30 dias na tabela
municipios_nfse - Endpoint:
ws/get/ac_municipios_nfsepara 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/
| Arquivo | Contrato | Método HTTP | Endpoint Focus |
|---|---|---|---|
CreateNfse.php | CreateNfseContract.php | POST | /v2/nfse?ref={REF} |
CreateNfsen.php | CreateNfsenContract.php | POST | /v2/nfsen?ref={REF} |
DetailNfse.php | DetailNfseContract.php | GET | /v2/nfse/{REF} |
CancelNfse.php | CancelNfseContract.php | DELETE | /v2/nfse/{REF} |
SubstituteNfse.php | SubstituteNfseContract.php | POST | /v2/nfse/{REF}/substitucao |
DownloadNfsePdf.php | — | GET | URL retornada pela Focus |
DownloadNfseXml.php | — | GET | URL retornada pela Focus |
ListMunicipios.php | ListMunicipiosContract.php | GET | /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/nfsennfse_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.phpseguindo padrão demy_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)
Wireframe — Modal de Emissão: Etapa 1 (Dados Gerais)
Wireframe — Modal de Emissão: Etapa 2 (Tomador)
Backend
- Controller:
Nfse_manual.php+ rotanfse-manual - Helper:
my_nfse_helper.phpcomvalidar_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)
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_lc116eservico_aliquota_issobrigató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)
Fluxo completo de emissão
Backend — Funções principais
| Função | Responsabilidade |
|---|---|
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
Matriz de ações por status
| Ação | Em processamento | Autorizado | Erro | Cancelado | Substituído |
|---|---|---|---|---|---|
| Baixar XML | — | ✓ | — | ✓ | ✓ |
| Baixar PDF | — | ✓ | — | — | — |
| Cancelar | — | ✓ | — | — | — |
| Substituir | — | — | ✓ | ✓ | — |
Backend — Downloads
- XML: prioriza coluna
xml_nfse(local); fallback viaDetailNfse.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
- 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/REFcom 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_idna 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
- 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_nfselocal, 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ário | Descrição |
|---|---|
| Emissão básica | Empresa SN, serviço simples, tomador PJ |
| Emissão MEI | Sistema força Ambiente Nacional |
| ISS retido + retenções | PIS, COFINS, CSLL, IR, INSS preenchidos |
| Bloqueio dados incompletos | Serviço sem LC 116 → orientação |
| Webhook autorização | Status atualizado + XML armazenado |
| Webhook erro | Status erro + mensagem da Focus |
| Consulta manual status | Fallback ao webhook |
| Cancelamento | Justificativa + Focus API |
| Substituição | Pré-preenchimento + vínculo |
| Download PDF | Município com e sem suporte |
| Download XML | Base local e via API |
| Cota | NFSe decrementa saldo do pacote |
| Permissões | Sem permissão → menu oculto + rota bloqueada |
| Multi-tenant | NFSe empresa A ≠ empresa B |
| Tomador sem IBGE | Bloqueio + orientação |
| Sem Inscrição Municipal | Bloqueio ao ativar switch |
| Município não suportado | Mensagem 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
| Fase | Escopo | Critério de entrada |
|---|---|---|
| Alpha | 3–5 clientes em municípios estáveis (SP, CWB) | Testes em homolog aprovados |
| Beta | Clientes em cidades homologadas como estáveis | Alpha sem bugs críticos |
| GA (Disponibilidade Geral) | Toda a base | Beta 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
| Atividade | Depende de | Pode rodar em paralelo com |
|---|---|---|
| 1.1 Estrutura de dados | — | — |
| 1.2 Config empresa | 1.1 | 1.3, 1.4, 1.5, 1.6 |
| 1.3 Catálogo LC 116 | 1.1 | 1.2, 1.4, 1.5, 1.6 |
| 1.4 Dados cliente | 1.1 | 1.2, 1.3, 1.5, 1.6 |
| 1.5 Permissões | 1.1 | 1.2, 1.3, 1.4, 1.6 |
| 1.6 Cache municípios | 1.1 | 1.2, 1.3, 1.4, 1.5 |
| 2.1 Classes Focus | 1.1 | 2.2 |
| 2.2 Webhook | 1.1 | 2.1 |
| 2.3 Form (dados/tomador) | 1.2–1.6 | — |
| 2.4 Form (serviço) | 2.3 | — |
| 2.5 Transmissão | 2.1, 2.2, 2.4 | — |
| 3.1–3.4 | 2.5 | 3.3 ∥ 3.4 |
| 4.1–4.3 | 3.1 | 4.1 ∥ 4.2 ∥ 4.3 |
| 5.x | 4.x | — |
Funcionalidades Futuras (pós Release 1)
| Feature | Release |
|---|---|
| Emissão de NFSe a partir de Ordem de Serviço | Release 2 |
| Clonagem de NFSe recorrente | Futuro |
| Cálculo automático de retenções federais | Futuro |
| Envio automático de e-mail com nota | Futuro |
| Cálculo IBS/CBS (reforma tributária) | Quando obrigatório |