Skip to content

DiogoGraciano/NfePhpLaravel

Repository files navigation

NfePhp Laravel

Tests Latest Version on Packagist Total Downloads PHP Version License

Um pacote Laravel elegante e pratico para integracao com o NFePHP, facilitando a emissao e gestao de Notas Fiscais Eletronicas (NFe) e Notas Fiscais de Consumidor Eletronicas (NFCe) em aplicacoes Laravel.

Caracteristicas

  • Integracao simplificada com o NFePHP
  • 5 Facades independentes para separacao clara de responsabilidades
  • Geracao de DANFE (PDF) para NFe, NFCe, DANFE simplificado e eventos
  • Gerenciamento de contingencias automatico e manual
  • Validacoes robustas para CNPJ, CPF e chaves de acesso
  • Helpers utilitarios para formatacao e manipulacao de dados
  • Gerenciamento de certificados digitais
  • Configuracao flexivel via arquivo de configuracao
  • Testes abrangentes com PHPUnit

Requisitos

  • PHP 8.3 ou superior
  • Laravel 12.0 ou 13.0
  • NFePHP 5.1 ou superior
  • SPED-DA 1.0 ou superior (geracao de DANFE)

Instalação

Instale o pacote via Composer:

composer require diogo-graciano/nfephp-laravel

Publicar configuracoes

php artisan vendor:publish --provider="DiogoGraciano\Nfephp\NfephpServiceProvider" --tag="config"

Configurar variaveis de ambiente

Adicione as seguintes variaveis ao seu arquivo .env:

# Configuracoes basicas
NFEPHP_TP_AMB=2
NFEPHP_RAZAO_SOCIAL="Sua Razao Social"
NFEPHP_CNPJ="12345678000195"
NFEPHP_IE="123456789"
NFEPHP_SIGLA_UF="SP"
NFEPHP_SCHEMES="PL_009_V4"
NFEPHP_VERSAO="4.00"

# Certificado digital
NFEPHP_CERTIFICATE_PATH="/path/to/your/certificate.pfx"
NFEPHP_CERTIFICATE_PASSWORD="sua_senha"

# DANFE (logo opcional)
NFEPHP_DANFE_LOGO_PATH="/path/to/logo.png"

# Configuracoes opcionais
NFEPHP_TOKEN_IBPT="seu_token_ibpt"
NFEPHP_CSC="seu_csc"
NFEPHP_CSC_ID="seu_csc_id"

Arquitetura

O pacote utiliza 5 facades independentes, cada uma com responsabilidade bem definida:

Facade Binding Classe Responsabilidade
Nfe 'nfe' NfeManager Operacoes NFe (criar, enviar, consultar, cancelar, inutilizar, manifestar)
Danfe 'danfe' DanfeManager Geracao de PDF (DANFE, DANFCe, DANFESimples, DAEvento)
Contingency 'contingency' ContingencyManager Ativar/desativar/verificar contingencia
Certificate 'certificate' CertificateManager Info, validade e expiracao do certificado
Utils 'nfe-utils' UtilsManager Validacao, formatacao, helpers de UF

Contexto compartilhado (NfeContext)

O NfeContext e um singleton que gerencia o estado compartilhado entre as facades NFe:

NfeContext (singleton)
├── config[]
├── Certificate ──compartilhado──> CertificateManager (facade Certificate)
├── Tools (NFePHP\NFe\Tools) ──usado por──> NfeManager
├── ContingencyManager ──callback──> NfeContext.reinitialize()

Quando a contingencia e ativada/desativada, o NfeContext reinicializa automaticamente o Tools.

Uso

Facade Nfe - Operacoes NFe/NFCe

use DiogoGraciano\Nfephp\Facades\Nfe;

// Criar XML da NFe
$make = Nfe::createNFe();

// Criar XML da NFCe
$make = Nfe::createNFCe();

// Enviar NFe (lote)
$response = Nfe::sendNFe([$xmlAssinado1, $xmlAssinado2]);

// Consultar NFe
$response = Nfe::consultNFe('12345678901234567890123456789012345678901234');

// Cancelar NFe
$response = Nfe::cancelNFe(
    '12345678901234567890123456789012345678901234',
    'Justificativa do cancelamento',
    '123456789012345'
);

// Inutilizar numeracao
$response = Nfe::inutilizeNFe(1, 1, 10, 'Justificativa da inutilizacao');

// Distribuicao DFe
$response = Nfe::distributionDFe(0);

// Manifestacao do destinatario
Nfe::confirmNFe($chaveNFe);         // Confirmacao da operacao
Nfe::acknowledgeNFe($chaveNFe);     // Ciencia da operacao
Nfe::unknownNFe($chaveNFe);         // Desconhecimento da operacao
Nfe::notPerformedNFe($chaveNFe, 'Justificativa'); // Operacao nao realizada

// Manifestacao em lote
Nfe::manifestNFeBatch($std);

// Gerar QR Code
Nfe::generateQRCode($dom, $token, $id, $versao, $urlQR, $urlChave);
Nfe::generateNFeQRCode($dom, $token, $id, $versao, $urlQR, $urlChave);

// Padronizar resposta XML
$response = Nfe::standardizeResponse($xmlResponse);

// Configuracao
$config = Nfe::getConfig();
$nfeConfig = Nfe::getNFeConfig();
Nfe::setConfig(['chave' => 'valor']);
Nfe::setNFeConfig(['tpAmb' => 1]);

// Obter Tools diretamente
$tools = Nfe::getTools();

Facade Danfe - Geracao de PDF

use DiogoGraciano\Nfephp\Facades\Danfe;

$xmlAutorizado = '...'; // XML autorizado da NFe

// Gerar PDF do DANFE (retorna string binaria do PDF)
$pdf = Danfe::generateDanfe($xmlAutorizado);

// Salvar DANFE no Storage do Laravel
Danfe::saveDanfe($xmlAutorizado, 'danfes/nota-001.pdf');         // disco padrao
Danfe::saveDanfe($xmlAutorizado, 'danfes/nota-001.pdf', 's3');   // disco especifico

// Retornar como download HTTP
return Danfe::downloadDanfe($xmlAutorizado, 'nota-001.pdf');

// Retornar para visualizacao inline no navegador
return Danfe::renderDanfe($xmlAutorizado, 'nota-001.pdf');

DANFE para NFCe

$pdf = Danfe::generateDanfce($xmlNfce);
Danfe::saveDanfce($xmlNfce, 'danfces/cupom-001.pdf');
return Danfe::downloadDanfce($xmlNfce, 'cupom-001.pdf');
return Danfe::renderDanfce($xmlNfce, 'cupom-001.pdf');

DANFE Simplificado

$pdf = Danfe::generateDanfeSimples($xmlAutorizado);
Danfe::saveDanfeSimples($xmlAutorizado, 'danfes/simples-001.pdf');
return Danfe::downloadDanfeSimples($xmlAutorizado, 'simples-001.pdf');
return Danfe::renderDanfeSimples($xmlAutorizado, 'simples-001.pdf');

Documento de Evento (Cancelamento, CCe, etc.)

$xmlEvento = '...';

$dadosEmitente = [
    'razao' => 'Empresa Teste LTDA',
    'logradouro' => 'Rua Exemplo',
    'numero' => '123',
    'complemento' => 'Sala 1',
    'bairro' => 'Centro',
    'CEP' => '01001000',
    'municipio' => 'Sao Paulo',
    'UF' => 'SP',
    'telefone' => '1199999999',
    'email' => 'contato@empresa.com',
];

$pdf = Danfe::generateDaevento($xmlEvento, $dadosEmitente);
Danfe::saveDaevento($xmlEvento, 'eventos/cancelamento-001.pdf', $dadosEmitente);
return Danfe::downloadDaevento($xmlEvento, $dadosEmitente, 'cancelamento-001.pdf');
return Danfe::renderDaevento($xmlEvento, $dadosEmitente, 'cancelamento-001.pdf');

Logo do DANFE

// Via .env: NFEPHP_DANFE_LOGO_PATH="/path/to/logo.png"

// Ou em tempo de execucao
Danfe::setLogo('/path/to/logo.png');
Danfe::setLogo(null); // remover logo

Facade Contingency - Gerenciamento de Contingencia

use DiogoGraciano\Nfephp\Facades\Contingency;

// Ativar contingencia
$json = Contingency::activate('SP', 'SEFAZ fora do ar', 'SVCAN');

// Verificar se esta em contingencia
if (Contingency::isActive()) {
    echo "Sistema em modo de contingencia";
}

// Obter informacoes da contingencia ativa
$info = Contingency::getInfo();
// Retorna: ['type' => 'SVCAN', 'motive' => '...', 'timestamp' => '...', 'tpEmis' => '...']

// Ajustar XML para contingencia
$xmlAjustado = Contingency::adjustXml($xml);

// Carregar contingencia de JSON salvo
Contingency::load($jsonContingencia);

// Desativar contingencia
Contingency::deactivate();

Facade Certificate - Gerenciamento de Certificado

use DiogoGraciano\Nfephp\Facades\Certificate;

// Verificar se o certificado esta valido
if (Certificate::isValid()) {
    echo "Certificado valido!";
}

// Obter informacoes do certificado
$info = Certificate::getInfo();
// Retorna: ['cnpj', 'cpf', 'name', 'valid_from', 'valid_to', 'icp', 'ca_url', 'csp']

// Dias para expirar
$dias = Certificate::getDaysToExpire();

// Verificar se esta proximo do vencimento
if (Certificate::isNearExpiration(30)) {
    echo "Certificado expira em menos de 30 dias!";
}

// Obter dados especificos
$cnpj = Certificate::getCnpj();
$cpf = Certificate::getCpf();
$empresa = Certificate::getCompanyName();

Facade Utils - Validacoes e Helpers (NFe + NFSe)

use DiogoGraciano\Nfephp\Facades\Utils;

// Validacoes
Utils::validateCnpj('12345678000195');
Utils::validateCpf('12345678901');
Utils::validateNFeKey('12345678901234567890123456789012345678901234');
Utils::validateXml($xmlString);

// Formatacao
$cnpj = Utils::formatCnpj('12345678000195');  // 12.345.678/0001-95
$cpf = Utils::formatCpf('12345678901');         // 123.456.789-01

// Manipulacao de strings
$limpa = Utils::cleanString('Texto com acentos!@#');
$ascii = Utils::stringToAscii('Texto com acentuacao');
$params = Utils::equilizeParameters($string, $length);

// Helpers de UF
$codigo = Utils::getUfCode('SP');              // 35
$uf = Utils::getUfByCode(35);                  // SP
$timezone = Utils::getTimezoneByUf('SP');       // America/Sao_Paulo

// Gerar chave de acesso
$chave = Utils::generateNFeKey('35', '2401', '12345678000195', '55', '1', '1', '1', '12345678');

Uso sem Facade (injecao de dependencia)

// Via container
$nfe = app('nfe');           // NfeManager
$danfe = app('danfe');       // DanfeManager
$contingency = app('contingency'); // ContingencyManager
$certificate = app('certificate'); // CertificateManager
$utils = app('nfe-utils');   // UtilsManager

// Ou via type-hint no construtor/metodo
use DiogoGraciano\Nfephp\NfeContext;

public function __construct(NfeContext $context)
{
    $tools = $context->getTools();
    $cert = $context->getCertificate();
}

Testes

Execute os testes com:

composer test

Para executar com cobertura de codigo:

composer test-coverage

Estrutura do Pacote

src/
├── Helpers/
│   ├── StringHelper.php        # Helpers para manipulacao de strings
│   ├── UfHelper.php            # Helpers para codigos de UF
│   └── ValidationHelper.php    # Helpers para validacoes
├── Managers/
│   ├── CertificateManager.php  # Gerenciamento de certificados
│   ├── ContingencyManager.php  # Gerenciamento de contingencias
│   ├── DanfeManager.php        # Geracao de DANFE (PDF)
│   ├── NfeManager.php          # Operacoes NFe/NFCe
│   └── UtilsManager.php        # Validacoes e helpers
├── Facades/
│   ├── Nfe.php                 # Facade NFe
│   ├── Danfe.php               # Facade DANFE
│   ├── Contingency.php         # Facade Contingencia
│   ├── Certificate.php         # Facade Certificado
│   └── Utils.php               # Facade Utils
├── NfeContext.php               # Contexto compartilhado (singleton)
└── NfephpServiceProvider.php    # Service Provider

Migracao da versao anterior

Se voce usava a facade Nfephp unica, atualize para as novas facades:

Antes (Nfephp::) Agora
Nfephp::createNFe() Nfe::createNFe()
Nfephp::sendNFe() Nfe::sendNFe()
Nfephp::generateDanfe() Danfe::generateDanfe()
Nfephp::saveDanfe() Danfe::saveDanfe()
Nfephp::activateContingency() Contingency::activate()
Nfephp::isInContingency() Contingency::isActive()
Nfephp::deactivateContingency() Contingency::deactivate()
Nfephp::isCertificateValid() Certificate::isValid()
Nfephp::getCertificateInfo() Certificate::getInfo()
Nfephp::validateCnpj() Utils::validateCnpj()
Nfephp::formatCnpj() Utils::formatCnpj()
Nfephp::getUfCode() Utils::getUfCode()
Nfephp::setDanfeLogo() Danfe::setLogo()

Troubleshooting

Problemas Comuns

  1. Erro de certificado invalido

    • Verifique se o caminho do certificado esta correto
    • Confirme se a senha esta correta
    • Verifique se o certificado nao expirou
    • Use Certificate::getDaysToExpire() para verificar a validade
  2. Erro de contingencia

    • Verifique se a sigla da UF esta correta
    • Confirme se o motivo tem entre 15-255 caracteres
    • Verifique se o tipo de contingencia e valido (SVCAN, SVCRS)
  3. Tools nao inicializado

    • O certificado precisa estar configurado para usar operacoes NFe
    • Verifique as variaveis NFEPHP_CERTIFICATE_PATH e NFEPHP_CERTIFICATE_PASSWORD

Documentacao Adicional

Contribuindo

Contribuicoes sao bem-vindas! Por favor, leia o guia de contribuicao antes de enviar pull requests.

Processo de Contribuicao

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/AmazingFeature)
  3. Commit suas mudancas (git commit -m 'Add some AmazingFeature')
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abra um Pull Request

Seguranca

Se voce descobrir alguma vulnerabilidade de seguranca, por favor envie um email para diogo.dg691@gmail.com ao inves de usar o issue tracker.

Changelog

Veja o CHANGELOG para informacoes sobre mudancas recentes.

Creditos

Licenca

Este projeto esta licenciado sob a Licenca MIT - veja o arquivo LICENSE para detalhes.


Se este pacote foi util para voce, considere dar uma estrela no GitHub!

About

Um pacote Laravel elegante e prático para integração com o NFePHP, facilitando a emissão e gestão de Notas Fiscais Eletrônicas (NFe), Notas Fiscais de Consumidor Eletrônicas (NFCe), permitindo uma gestão unificada de documentos fiscais em aplicações Laravel.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages