# Instruções para GitHub Copilot — Nfe4 ## Idioma e Contexto - Responda sempre em **Português do Brasil (pt-BR)**. - Sistema legado: **PHP 5.3.3** + **MySQL 5.1.73-log**. Não use sintaxes nem funções de PHP 7/8+ a menos que o usuário peça explicitamente uma refatoração. - Não há Composer, autoloader, framework, nem sistema de testes. ## Arquitetura O projeto segue um MVC manual sem framework, organizado em quatro camadas principais: ``` model/ → Classes base de entidade e conexão com banco dao/ → Data Access Objects (herdam de SistemaNfe) control/ → Lógica de negócio (controllers simples) view/ → Scripts PHP invocados diretamente pelo browser (entry points) tipos/ → Helpers de formatação e renderização HTML ``` ### Camadas em detalhe **`model/`** - `SistemaNfe` — classe base com todas as propriedades (`$codigo`, `$cnpj`, `$ambiente`, `$danfe`, etc.) e seus getters/setters públicos. Todos os DAOs herdam dela. - `ConexaoBd` — abre conexão mysqli com o banco `notasEletronicas` (host `10.2.2.19`). - `ConexaoCertificado` — abre conexão mysqli com o banco `certificadosclientes` (mesmo host). **`dao/`** - `NfeDao extends SistemaNfe` — DAO principal; usa `ConexaoBd`. Método `Execute($sql)` executa qualquer query; `Selecionar($campos, $tabela, $where, $others)` monta SELECTs. - `FuncaoDao extends SistemaNfe` — DAO de funções auxiliares (fuso horário, correções). Duplica o helper `Selecionar()`. - `certificadoDAO extends SistemaNfe` — DAO para o banco de certificados; usa `ExecuteCert()` em vez de `Execute()`. **`control/`** - Cada arquivo define uma classe com métodos de negócio que instanciam DAOs internamente. - Exemplo de herança de controller: `pesquisarDadosFiscais extends inserirNotaFiscal`. - Dependências declaradas com `include_once` no topo do arquivo. **`view/`** - Scripts PHP chamados diretamente pela URL; fazem `require`/`include` dos controllers e libs. - Usam `$_SESSION` intensivamente para passar estado entre requisições (cliente, sequência, ambiente, certificado, etc.). - `view/libs/` contém a biblioteca NFePHP adaptada: `ToolsNFePHP.class.php`, `AutoToolsNFePHP.class.php` (estende Tools), `DanfeNFePHP.class.php`. **`tipos/modelos.php`** - Classe `Formatar`: helpers para renderizar HTML (formulários, inputs, selects, links, formatação de data/moeda). Usada nas views para gerar marcação. ### Dois bancos de dados | Banco | Classe de conexão | Uso | |---|---|---| | `notasEletronicas` | `ConexaoBd` | Notas fiscais, clientes, sequências, manifestos | | `certificadosclientes` | `ConexaoCertificado` | Certificados digitais A1 dos emitentes | ### Armazenamento de arquivos XML Os XMLs das NFes são gravados no filesystem de outro servidor/app (`/var/www/html/Nfe/`): - Entrada: `nfe/{producao|homologacao}/entradas/{codCliente}_{pedido}.xml` - Temporários: `nfe/{producao|homologacao}/temp/` - O ambiente (`producao` ou `homologacao`) vem do banco (`info_cliente.ambiente`) e é salvo em `$_SESSION['Arquivo']`. ## Convenções do Código ### Nomenclatura - **Arquivos de DAO:** PascalCase com sufixo `DAO` (ex.: `SistemaDAO.php`, `CertificadoDAO.php`). - **Arquivos de control/view:** camelCase (ex.: `insereNotaFiscal.php`, `gerarNota.php`), exceto alguns com PascalCase (ex.: `PesquisaAmbiente.php`). - **Classes:** geralmente PascalCase, mas há inconsistências históricas (`certificadoDAO`, `sistemaNfe` vs `SistemaNfe`). Ao referenciar, respeite o case exato de cada classe. - **Métodos:** camelCase. ### Padrão DAO Todo DAO segue este padrão: ```php // 1. Setar propriedades via setters herdados de SistemaNfe $dao = new NfeDao; $dao->setCodigo($codCliente); $dao->setDanfe($danfe); // 2. Chamar o método passando os getters como argumentos $dao->inserirManifesto($dao->getDanfe(), $dao->getCodigo(), ...); ``` Mesmo quando os valores já estão no objeto, os métodos os recebem como parâmetros explícitos. ### Includes manuais Não há autoloader. Toda dependência deve ser incluída explicitamente: ```php include_once("../model/SistemaNfe.php"); include_once("../model/ConexaoBd.php"); ``` Os caminhos são relativos ao arquivo atual. Use `include_once` para evitar redeclaração de classes. ### SQL Queries são montadas por interpolação direta de strings (sem prepared statements — padrão histórico do projeto). O helper `Selecionar()` dos DAOs monta SELECTs; INSERTs e UPDATEs são escritos inline. ### Sessões PHP O fluxo de uma NF-e passa por múltiplos scripts de view encadeados. O estado compartilhado trafega via `$_SESSION`: - `$_SESSION['idCliente']`, `$_SESSION['notaFiscal']`, `$_SESSION['tipoAmbiente']`, `$_SESSION['Arquivo']`, `$_SESSION['senhaCertificado']`, `$_SESSION['nNF']`, etc. ## Fiscal Brasileiro O sistema processa documentos fiscais eletrônicos usando a biblioteca NFePHP (em `view/libs/`): - **NFe** — Nota Fiscal Eletrônica (produtos); fluxo: `gerarNota.php` → `montaXml.php` → `enviarNf.php` → `enviarRecibo.php` - `AutoToolsNFePHP` é o ponto de entrada para operações SEFAZ (status, envio, consulta de recibo, cancelamento, carta de correção, manifesto, inutilização). - Certificados digitais A1 ficam no banco `certificadosclientes`; a senha é buscada via `certificadoDAO::pesquisaCertificado()`. - Ambientes: `1` = Produção, `2` = Homologação (armazenado na tabela `info_cliente.ambiente`). - Códigos de status SEFAZ relevantes: `107` = Serviço em operação, `100` = Autorizado, `101` = Cancelado, `202`/`4xx`/`9xx` = erros. ### Coluna `status_nota` (tabela `nota_fiscal`) | Valor | Significado | |---|---| | `p` | Pendente | | `e` | Em processamento | | `r` | Rejeitada | | `d` | Entregue/Autorizada | | `c` | Cancelada | | `f` | Finalizada | | `i` | Inutilizada | | `o` | Denegada | > O `.gitignore` exclui `/view/nfe/` — os XMLs gerados nunca são versionados.