# Fechamento Armazenagem — Processador de NF-e (Incotec & Croda)

Aplicação Web em PHP para leitura, processamento e consolidação por data de emissão de arquivos XML de NF-e (individuais ou em lote em ZIP), aplicando regras de cálculo de volume diferenciadas para os clientes **Incotec** e **Croda**.

---

## 1. Requisitos do Ambiente

* **PHP**: 8.1 ou superior
* **Servidor Web**: Apache (com módulo `mod_rewrite` habilitado)
* **Banco de Dados**: MySQL 5.7+ ou MariaDB 10.3+
* **Extensões PHP Obrigatórias**:
  * `pdo` & `pdo_mysql`
  * `simplexml` & `libxml`
  * `zip`
  * `json`
  * `mbstring`

---

## 2. Comandos do Composer

Para instalar a biblioteca de geração de planilhas Excel (`PhpSpreadsheet`) e gerar o autoloader PSR-4:

```bash
composer install
```

Caso queira adicionar a biblioteca em um ambiente novo:

```bash
composer require phpoffice/phpspreadsheet
```

---

## 3. Configuração do Banco de Dados

1. Crie o banco de dados e as tabelas importando o arquivo SQL:
   ```bash
   mysql -u root -p < database/schema.sql
   ```

2. Insira os clientes e o usuário administrador inicial:
   ```bash
   mysql -u root -p < database/seeds.sql
   ```

3. Duplique o arquivo `.env.example` para `.env` e ajuste as credenciais se necessário:
   ```ini
   DB_HOST=127.0.0.1
   DB_PORT=3306
   DB_NAME=fechamento_armazenagem
   DB_USER=root
   DB_PASS=
   ```

### Credenciais de Acesso Inicial:
* **Usuário**: `admin`
* **Senha**: `admin123`

---

## 4. Configuração no Apache

1. Aponte o **DocumentRoot** do Apache para a pasta `public/` do projeto:
   ```apache
   <VirtualHost *:80>
       ServerName fechamento-armazenagem.local
       DocumentRoot "C:/Users/danilo.faria/OneDrive - Transwar Transportes Ltda/Programação/Fechamento Armazenagem/public"
       
       <Directory "C:/Users/danilo.faria/OneDrive - Transwar Transportes Ltda/Programação/Fechamento Armazenagem/public">
           Options Indexes FollowSymLinks
           AllowOverride All
           Require all granted
       </Directory>
   </VirtualHost>
   ```

2. Certifique-se de que o `mod_rewrite` está ativo no `httpd.conf`:
   ```apache
   LoadModule rewrite_module modules/mod_rewrite.so
   ```

---

## 5. Estrutura dos Arquivos Criados

* `/public`
  * `index.php`: Front Controller e Roteamento simples de URLs
  * `.htaccess`: Reescrita de URLs Apache e proteção de diretórios
  * `assets/css/style.css`: Estilização responsiva e componentes de UI
  * `assets/js/app.js`: Lógica em JS puro para upload drag-and-drop e modais
* `/src`
  * `Config/Database.php`: Conexão singleton PDO com transações e logs
  * `Controllers/`: Controladores de Autenticação, Dashboard, Upload, Produtos, Pendências e Relatórios
  * `Services/`:
    * `XmlParser.php`: Leitura robusta de XML NF-e com suporte a Namespaces e `<qVol>`
    * `FileUploader.php`: Upload seguro de XML e extração higienizada de ZIPs sem Path Traversal
    * `IncotecVolumeCalculator.php`: Regra de somatório da tag `<qVol>`
    * `CrodaVolumeCalculator.php`: Regra por produto `CEIL(qCom / unidades_por_volume)`
    * `InvoiceProcessor.php`: Processamento em lote com transações e recálculo
    * `ExporterService.php`: Exportação em CSV e XLSX com 2 abas e formatação R$
  * `Models/`: Modelos de dados PDO (User, Client, Product, Invoice, InvoiceItem, Import)
  * `Views/`: Telas e componentes HTML
* `/database`
  * `schema.sql`: Estrutura das tabelas, índices únicos e chave primária/estrangeira
  * `seeds.sql`: Dados dos clientes Incotec e Croda, produtos de exemplo e usuário Admin
  * `test_runner.php`: Suíte de validação automatizada das regras de negócio
* `/storage`: Pastas para uploads armazenados, temporários e logs fora do acesso público

---

## 6. Validação e Testes Automatizados

Para executar os testes de validação automatizada das regras de negócio:

```bash
php database/test_runner.php
```

A suíte testará:
1. Leitura de XML individual válido com chave de 44 dígitos
2. Leitura de múltiplos XMLs e arquivo ZIP
3. NF da Incotec com somatório de múltiplos `<qVol>`
4. NF da Incotec sem `<qVol>` (com atribuição automática do status `PENDENTE`)
5. NF da Croda com cálculo `CEIL(qCom / unidades_por_volume)` por produto
6. NF da Croda com produto não cadastrado (marcando `PENDENTE`)
7. Recálculo da NF da Croda após inclusão da conversão do produto sem duplicidade
8. Geração de relatórios consolidados e exportação CSV / XLSX
