# Backlog - Módulo de Geração de Notas Fiscais (NFSe)

## Objetivo
Criar módulo completo para geração de Notas Fiscais de Serviços (NFSe) com preenchimento de todas as tabelas necessárias antes de consumir a API de terceiros.

---

## 📋 Épico 1: Preparação e Validação de Dados

### Tarefa 1.1: Validar e buscar dados do nosso número
- [ ] Validar se o nosso número existe no banco de dados
- [ ] Validar se o plano associado tem `pla_emitirnotafiscal = 'S'`
- [ ] Buscar dados completos da fatura ou mensalidade conforme o tipo
- [ ] Carregar relacionamento com plano (já implementado no DataProvider)
- **Status**: ✅ Parcialmente implementado (DataProvider criado)

### Tarefa 1.2: Buscar lançamentos da fatura (apenas pessoa jurídica/cooperativa)
- [ ] Criar método para buscar todos os lançamentos de uma fatura
- [ ] Carregar relacionamento com `tb_lancam` (Lancamento)
- [ ] Agregar valores dos impostos por tipo de lançamento:
  - IR (lan_irrf = 'S')
  - PIS
  - COFINS
  - INSS (lan_inss = 'S')
  - CSLL
  - ISS
  - Outras retenções
- [ ] Calcular valores base, deduções, descontos
- **Dependências**: Relacionamento Fatura -> LancamentoFatura já criado

### Tarefa 1.3: Preparar dados para pessoa física (mensalidade)
- [ ] Mapear dados da mensalidade para estrutura de NFSe
- [ ] Definir valores padrão de impostos para pessoa física
- [ ] Validar dados obrigatórios da mensalidade

---

## 📋 Épico 2: Gerenciamento de Tomador

### Tarefa 2.1: Criar/Validar Tomador
- [ ] Buscar tomador pelo código do plano/cooperativa
- [ ] Se não existir, criar tomador usando dados do plano/cooperativa
- [ ] Validar dados do tomador antes de criar
- [ ] Garantir que tomador tenha todos os campos obrigatórios:
  - CPF/CNPJ
  - Nome/Razão Social
  - Email
  - Endereço completo
  - Código do município
- **Status**: ✅ Parcialmente implementado (método buscarTomador atualizado)

### Tarefa 2.2: Adaptar dados para pessoa física vs pessoa jurídica
- [ ] Criar lógica para identificar se é pessoa física ou jurídica
- [ ] Mapear dados de mensalidade para tomador (pessoa física)
- [ ] Mapear dados de plano/cooperativa para tomador (pessoa jurídica)
- [ ] Validar campos específicos por tipo

---

## 📋 Épico 3: Busca de Prestador

### Tarefa 3.1: Buscar Prestador
- [ ] Criar método para buscar prestador na `fiscal.tb_prestador`
- [ ] Validar se prestador existe
- [ ] Retornar `ptd_id` do prestador
- [ ] Definir regras de qual prestador usar (pode ter mais de um?)
- **Observação**: Não inserir, apenas buscar

---

## 📋 Épico 4: Busca de Serviço

### Tarefa 4.1: Buscar Serviço na tb_servico
- [ ] Verificar se existe modelo `Servico` para `fiscal.tb_servico`
- [ ] Criar modelo se não existir
- [ ] Criar método para buscar serviço padrão ou por código
- [ ] Validar qual serviço usar para cada tipo de nota
- [ ] Retornar `ser_id` do serviço

### Tarefa 4.2: Definir serviço padrão
- [ ] Definir qual serviço usar por padrão
- [ ] Configurar discriminação do serviço
- [ ] Definir alíquota padrão se necessário

---

## 📋 Épico 5: Criação do Registro NFSe (tb_nfse)

### Tarefa 5.1: Gerar ID da NFSe
- [ ] Criar método para gerar próximo `nfs_id`
- [ ] Garantir que seja sequencial e único

### Tarefa 5.2: Preencher dados da tb_nfse
- [ ] `nfs_id` - ID gerado
- [ ] `nfs_data_emissao` - Data atual
- [ ] `nfs_natureza_operacao` - Definir valor padrão (provavelmente 1)
- [ ] `nfs_regime_especial_tribut` - Definir valor padrão (provavelmente 4)
- [ ] `nfs_optante_simples_nacional` - Buscar do plano ou padrão
- [ ] `nfs_incentivador_cultural` - Valor padrão (0)
- [ ] `nfs_ptd_id` - ID do prestador (buscar)
- [ ] `nfs_tmd_id` - ID do tomador (buscar/criar)
- [ ] `nfs_numero_externo` - Nosso número (fatura ou mensalidade)
- [ ] `nfs_status` - Status inicial (0 = pendente)
- **Status**: ✅ Parcialmente implementado (método insertNFSE existe)

---

## 📋 Épico 6: Criação do Serviço NFSe (tb_nfse_servicos)

### Tarefa 6.1: Preparar dados do serviço para pessoa jurídica
- [ ] Buscar lançamentos da fatura
- [ ] Agregar valores por tipo de imposto:
  - IR: somar valores onde `lan_irrf = 'S'`
  - PIS: identificar lançamento de PIS e somar
  - COFINS: identificar lançamento de COFINS e somar
  - INSS: somar valores onde `lan_inss = 'S'`
  - CSLL: identificar e somar
  - ISS: identificar e calcular
- [ ] Calcular base de cálculo
- [ ] Calcular valor total do serviço
- [ ] Calcular deduções e descontos

### Tarefa 6.2: Preparar dados do serviço para pessoa física
- [ ] Mapear valores da mensalidade
- [ ] Definir valores padrão de impostos (ou zerados)
- [ ] Calcular valores necessários

### Tarefa 6.3: Inserir registro na tb_nfse_servicos
- [ ] `nfser_id` - Gerar próximo ID
- [ ] `nfser_nfs_id` - ID da NFSe criada
- [ ] `nfser_sequencia` - Sempre 1 (apenas 1 serviço por NFSe)
- [ ] `nfser_ser_id` - ID do serviço (buscar)
- [ ] `nfser_valor` - Valor total do serviço
- [ ] `nfser_deducao` - Valor de deduções
- [ ] `nfser_pis` - Valor de PIS
- [ ] `nfser_cofins` - Valor de COFINS
- [ ] `nfser_inss` - Valor de INSS
- [ ] `nfser_ir` - Valor de IR
- [ ] `nfser_csll` - Valor de CSLL
- [ ] `nfser_iss_retem` - Se ISS é retido (S/N)
- [ ] `nfser_iss` - Valor de ISS
- [ ] `nfser_iss_retido` - Valor de ISS retido
- [ ] `nfser_outras_retencoes` - Outras retenções
- [ ] `nfser_base_calculo` - Base de cálculo
- [ ] `nfser_aliquota` - Alíquota do serviço
- [ ] `nfser_desc_incond` - Desconto incondicionado
- [ ] `nfser_desc_cond` - Desconto condicionado
- [ ] `nfser_ser_discriminacao` - Descrição do serviço
- **Status**: ✅ Parcialmente implementado (método insertServicoNfse existe, mas precisa refatorar)

---

## 📋 Épico 7: Criação do Resultado NFSe (tb_resultado_nfse) - Opcional para V1

### Tarefa 7.1: Preparar registro inicial (se necessário)
- [ ] Decidir se criar registro inicial na primeira versão
- [ ] Se sim, criar registro com status inicial
- [ ] Campos principais:
  - `res_nfse_id` - ID da NFSe
  - `res_status` - Status inicial
  - `res_data_recebe_dados` - Data atual
- **Observação**: Pode ser criado apenas após consumir API na V2

---

## 📋 Épico 8: Refatoração e Integração

### Tarefa 8.1: Refatorar método `prosseguirGerarNfse`
- [ ] Adaptar para trabalhar com dados do DataProvider
- [ ] Separar lógica de pessoa física e pessoa jurídica
- [ ] Implementar fluxo completo:
  1. Buscar/criar tomador
  2. Buscar prestador
  3. Buscar serviço
  4. Criar registro na tb_nfse
  5. Criar registro na tb_nfse_servicos

### Tarefa 8.2: Criar DTOs/Services para mapeamento de dados
- [ ] Criar classe para mapear dados de fatura para NFSe
- [ ] Criar classe para mapear dados de mensalidade para NFSe
- [ ] Criar classe para agregar valores dos lançamentos
- [ ] Criar classe para calcular impostos e tributações

### Tarefa 8.3: Implementar validações de negócio
- [ ] Validar se já existe NFSe para o nosso número
- [ ] Validar se fatura/mensalidade está apta para gerar NFSe
- [ ] Validar dados obrigatórios antes de inserir
- [ ] Validar valores calculados

### Tarefa 8.4: Tratamento de erros
- [ ] Criar exceptions específicas para cada etapa
- [ ] Garantir rollback em caso de erro
- [ ] Logar erros detalhados
- **Status**: ✅ Parcialmente implementado (exceptions de dados não encontrados)

---

## 📋 Épico 9: Testes e Validação

### Tarefa 9.1: Testes unitários
- [ ] Testar busca de dados por tipo
- [ ] Testar criação de tomador
- [ ] Testar busca de prestador
- [ ] Testar cálculo de impostos
- [ ] Testar inserção de registros

### Tarefa 9.2: Testes de integração
- [ ] Testar fluxo completo para pessoa jurídica
- [ ] Testar fluxo completo para pessoa física
- [ ] Testar fluxo completo para cooperativa
- [ ] Validar dados inseridos nas tabelas

---

## 📋 Épico 10: Documentação

### Tarefa 10.1: Documentar estrutura
- [ ] Documentar fluxo de geração de NFSe
- [ ] Documentar mapeamento de dados
- [ ] Documentar cálculos de impostos
- [ ] Documentar regras de negócio

---

## 🎯 Priorização Sugerida

### Fase 1 - Fundação (Alta Prioridade)
1. ✅ Tarefa 1.1 - Validar e buscar dados (já implementado)
2. Tarefa 2.1 - Criar/Validar Tomador (parcialmente implementado)
3. Tarefa 3.1 - Buscar Prestador
4. Tarefa 4.1 - Buscar Serviço
5. Tarefa 5.2 - Preencher tb_nfse

### Fase 2 - Cálculos e Agregações (Alta Prioridade)
6. Tarefa 1.2 - Buscar lançamentos da fatura
7. Tarefa 6.1 - Preparar dados do serviço para pessoa jurídica
8. Tarefa 6.2 - Preparar dados do serviço para pessoa física
9. Tarefa 6.3 - Inserir tb_nfse_servicos

### Fase 3 - Integração e Refatoração (Média Prioridade)
10. Tarefa 8.1 - Refatorar método prosseguirGerarNfse
11. Tarefa 8.2 - Criar DTOs/Services
12. Tarefa 8.3 - Implementar validações

### Fase 4 - Testes e Qualidade (Média Prioridade)
13. Tarefa 9.1 - Testes unitários
14. Tarefa 9.2 - Testes de integração

---

## 📝 Observações Importantes

1. **tb_nfse_servicos**: Sempre terá apenas 1 serviço relacionado a cada NFSe
2. **tb_prestador**: Apenas buscar, não inserir
3. **tb_tomador**: Criar automaticamente se não existir
4. **Lançamentos**: Apenas para pessoa jurídica (fatura), pessoa física usa valores da mensalidade
5. **Impostos**: Valores vêm dos lançamentos da fatura (IR, PIS, COFINS, INSS, CSLL, ISS)
6. **Resultado**: Pode ser criado na V2 quando consumir API

---

## 🔄 Próximos Passos (V2 - Integração com API)

- Consumir API de terceiros para gerar NFSe
- Atualizar tb_resultado_nfse com resposta da API
- Atualizar status da NFSe conforme resposta
- Processar erros e retornos da API
- Gerar XML da nota fiscal
- Disponibilizar DANFSe

