# Estrutura Laravel recomendada

```txt
app/
  Services/NFe/
    CertificateService.php
    DfeDistributionService.php
    ManifestationService.php
    XmlDatabaseStorageService.php
  Jobs/
    QueryDfeByNsuJob.php
    ProcessDfePackageJob.php
  Models/
    Company.php
    FiscalCertificate.php
    NsuCursor.php
    NfeDocument.php
    NfeManifestation.php
  Http/Controllers/
    BuscaChaveController.php
    CompanyController.php
    CertificateController.php
    ManifestationController.php
```

## Services

`CertificateService`

- Le arquivo `.pfx`.
- Valida senha.
- Extrai validade e numero de serie.
- Entrega certificado para a NFePHP.

`DfeDistributionService`

- Monta configuracao da NFePHP.
- Executa consulta de Distribuicao DF-e por `ultNSU`.
- Atualiza `ult_nsu` e `max_nsu`.
- Encaminha pacotes retornados para processamento.

`ManifestationService`

- Envia evento da Manifestacao do Destinatario.
- Grava protocolo, status e XMLs de request/response.

`XmlDatabaseStorageService`

- Salva XML completo em `nfe_documents.xml_content`.
- Salva resumo recebido em `nfe_documents.raw_summary_xml`.
- Salva XML de envio em `nfe_manifestations.request_xml`.
- Salva XML de retorno em `nfe_manifestations.response_xml`.

## Jobs

`QueryDfeByNsuJob`

- Executado pelo scheduler.
- Consulta uma empresa por vez.
- Respeita intervalo minimo para evitar consumo indevido da SEFAZ.

`ProcessDfePackageJob`

- Processa cada pacote retornado pela SEFAZ.
- Identifica resumo, XML completo e eventos.
- Atualiza ou cria registro em `nfe_documents`.

## Eventos de manifestacao

Codigos usuais:

- `210210`: Ciencia da Operacao
- `210200`: Confirmacao da Operacao
- `210220`: Desconhecimento da Operacao
- `210240`: Operacao nao Realizada

Para `210240`, exigir justificativa.
