Skip to content

Commit

Permalink
Merge pull request nfephp-org#607 from robmachado/master
Browse files Browse the repository at this point in the history
Ajustes para o novo Danfe refatorado
  • Loading branch information
robmachado authored May 31, 2024
2 parents fe0160d + f641c08 commit 026b1c4
Show file tree
Hide file tree
Showing 16 changed files with 2,557 additions and 113 deletions.
226 changes: 226 additions & 0 deletions docs/Danfe2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
# Danfe2

Classe que constroi o DANFE observando os paramêtros estabelecidos pela SEFAZ, com algums adicionais para facilitação de obtenção de informações para quem os recebe.

> NOTA: exclusivo para XML de NFe (modelo 55)
# Funções Publicas

## Instanciação

Na instanciação da classe DANFE é obrigatório a passagem do XML da NFe modelo 55.

```php

/**
* Construtor
* @param string $xml
* @throws \Exception
*/
//somente são aceitos documentos XML devidamente formados e apenas NFe modelo 55 com ou sem protocolo de autorização
$xml = file_exists(__DIR__. '/arquivo_xml_nfe_modelo_55.xml');
$danfe2 = new Danfe2($xml);

```

## Parametrização

```php

/**
* Define parametros de impressão
* Este método não necessita ser invocado pois é setado por padrão com as condições default
* use apenas se desejar alterar as condições default
* @param string $orientacao
* @param string $papel
* @param int $margSup
* @param int $margEsq
* @return void
*/
$orientacao = ''; //se deixar em branco será usada a orientação indicada no XML, default = '', opções 'P' ou 'L', qualquer outra opção será ignorada
$papel = 'A4'; //default = 'A4', opção 'LEGAL' => recomenda-se usar sempre A4, qualquer outra opção será ignorada
$margSup = 2; //default = 2, cuidado com margens muito grandes pois diminuem em excesso a área de impressão
$margEsq = 2; //default = 2, cuidado com margens muito grandes pois diminuem em excesso a área de impressão
$danfe2->printParameters($orientacao, $papel, $margSup, $margEsq);

//NOTA: as margens inferior e direita são iguais à superior e esquerda, usadas como referencia

```

## Modificadores

São os métodos que modificam e/ou acrescentam comportamentos e informações ao pdf que será criado.

Todos esses métodos são opcionais caso queira alterar o comportamento padrão da Danfe.

```php
/**
* Define a font padrão a ser usada
* @param string $font
* @return void
*/
$font = 'times'; //opções times é a fonte obrigatória segundo a SEFAZ !! mas existe escolha para arial ou helvetica (ambas são iguais)
$danfe2->setDefaultFont($font); //default times exigido pelas SEFAZ

/**
* Exibe ou não, os textos referentas as tag obsItem/obsCont e obsItem/obsFisco
* @param bool $val
* @return void
*/
$danfe2->exibirObservacoesNFe(false); //default true

/**
* Exibe ou não, textos referentes a fatura caso não existam duplicatas e exista fatura
* @param bool $val
* @return void
*/
$danfe2->exibirFaturaNFe(false); //default true

/**
* Exibe ou não, o email do destinatário no bloco infCpl, caso seja informado o email
* @param bool $val
* @return void
*/
$danfe2->exibirEmailDestinatarioNFe(false); //default true

/**
* Exibe ou não, os dados de rastreamento dos ??????medicamentos em cada item, se existirem
* @param bool $val
* @return void
*/
$danfe2->exibirRastroItem(false); //default true

/**
* Exibe ou não, os dados do pedido do destinatário em cada item, se existirem
* @param bool $val
* @return void
*/
$danfe2->exibirPedidoItem(false); //default true

/**
* Exibe ou não, os dados de unidade tributável de cada item onde a unidade tributável for diferente da unidade comercial
* @param bool $val
* @return void
*/
$danfe2->exibirDadosTributaveisItem(false); //default true

/**
* Exibe ou não, informações de impostos adicionais como FCP na descrição de cada item, se houverem
* @param bool $val
* @return void
*/
$danfe2->exibirImpostosAdicionaisItem(false); //default true

/**
* Exibe ou não, o numero do item junto com o codigo de cada item
* @param bool $val
* @return void
*/
$danfe2->exibirNumeroItem(false); //default true





```

## Elementos Adicionais

São métodos que incluem informações ao DANFE.

```php

/**
* Exibe ou não, os dados do integrador e a mensagem "Powered by NFePHP®"
* @param string $message
* @param bool $powered
* @return void
*/
$message = 'WEBNFe Sistemas - http://www.webnfe.com.br'; //dados do integrador no rodapé da pagina
$powered = false; //exibe ou não o texto "Powered by NFePHP®" no rodapé da página
$danfe->creditsIntegratorFooter($message, $powered);

/**
* Estabelece o logo e sua posição ou use o render para passar a imagem usando posição default
* Este método não necessita ser invocado apenas para inserir a logo sem alterar sua posição
* apenas use esse método caso deseja alterar a posição da logomarca
* Dê preferencia ao método render() para inserir a logo, nos padrões default
* @param string $logo
* @param string $logoAlign
* @param bool $mode_bw se true converte a imagem em branco e preto
* @return void
*/
//as imagens devem ser JPEG ou PNG obrigatóriamente e com um tamanho reazoável, evite imagens muito grandes ou com elevada resolução
$logo = 'path da imagem'; //usar um caminho à imagem ou 'data://text/plain;base64,'. {string da imagem em base64}
//logo = 'data://text/plain;base64,'. base64_encode(file_get_contents(__DIR__ . '/tulipas.png'));
$logoAlign = 'C'; //default C-centro, opções L-Left ou R-Right
$mode_bw = false; //default false, converte a imagem para preto e branco
$danfe2->logoParameters($logo, $logoAlign, $mode_bw);


$danfe2->setCancelFlag(true): //default false

```

## Finalizadores

```php
/**
* Renderizador, executa a montagem do PDF e retorna o pdf como string
* @param string $logo
* @return string
*/
$pdf = $danfe2->render($logo);



```

## Exemplo

```php


try {

//dados
$xml = file_get_contents(__DI__.'/arquivo_xml_nfe_modelo_55.xml');
$logo = 'data://text/plain;base64,'. base64_encode(file_get_contents(__DIR__ . '/tulipas.png'));

//inicialização
$danfe2 = new Danfe2($xml);

//Parametrização
//$orientacao = ''; //se deixar em branco será usada a orientação indicada no XML, default = '', opções 'P' ou 'L', qualquer outra opção será ignorada
//$papel = 'A4'; //default = 'A4', opção 'LEGAL' => recomenda-se usar sempre A4, qualquer outra opção será ignorada
//$margSup = 2; //default = 2, cuidado com margens muito grandes pois diminuem em excesso a área de impressão
//$margEsq = 2; //default = 2, cuidado com margens muito grandes pois diminuem em excesso a área de impressão
//$danfe2->printParameters($orientacao, $papel, $margSup, $margEsq);

//modificadores
$danfe2->exibirFatura(false); //default true
$danfe2->exibirRastro(false); //default true
$danfe2->exibirPedido(false); //default true
$danfe2->exibirUnidadeTributavel(false); //default true
$danfe2->exibirImpostosAdicionais(false); //default true
$danfe2->exibirEmail(false); //default true
$danfe2->exibirNumeroItem(false); //default true
$danfe2->exibirObservacoes(false); //default true

//adicionais
$danfe->creditsIntegratorFooter('WEBNFe Sistemas - http://www.webenf.com.br', true);
$danfe->logoParameters($logo, 'L', true);

//finalização
$pdf = $danfe->render();
//o pdf porde ser exibido como view no browser
//salvo em arquivo
//ou setado para download forçado no browser
//ou ainda gravado na base de dados
header('Content-Type: application/pdf');
echo $pdf;

} catch (\Exception $e) {
echo "Ocorreu um erro durante o processamento: " . $e->getMessage();
}
```
91 changes: 91 additions & 0 deletions src/Common/NfeStd.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?php

namespace NFePHP\DA\Common;

use stdClass;

class NfeStd
{
/**
* Converte o xml em um stdClass
* @param string|null $xml
* @return stdClass
* @throws \Exception
*/
public static function toStd(?string $xml = null): stdClass
{
if (empty($xml)) {
throw new \Exception("O XML está vazio.");
}
if ($xml[0] !== '<') {
throw new \Exception("XML mal formatado ou não é um XML.");
}
$node = self::getNode($xml);
$sxml = simplexml_load_string($node);
$json = str_replace(
'@attributes',
'attributes',
json_encode($sxml, JSON_PRETTY_PRINT)
);
$std = json_decode($json);
if (!is_object($std)) {
//não é um objeto entao algum erro ocorreu
throw new \Exception("Falhou a converção para stdClass. Documento: $xml");
}
return $std;
}

/**
* @param string $xml
* @return false|string|null
*/
protected static function getNode(string $xml)
{
$rootTagList = [
'nfeProc',
'NFe'
];
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
try {
$dom->loadXML($xml);
} catch (\Exception $e) {
return null;
}
foreach ($rootTagList as $key) {
$node = !empty($dom->getElementsByTagName($key)->item(0))
? $dom->getElementsByTagName($key)->item(0)
: '';
if (!empty($node)) {
return $dom->saveXML($node);
}
}
return null;
}

/**
* Return QRCODE and urlChave from XML
* @return array
*/
private static function getQRCode($xml): array
{
$resp = [
'qrCode' => '',
'urlChave' => ''
];
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->loadXML($xml);
$node = $dom->getElementsByTagName('infNFeSupl')->item(0);
if (!empty($node)) {
$resp = [
'qrCode' => $node->getElementsByTagName('qrCode')->item(0)->nodeValue,
'urlChave' => $node->getElementsByTagName('urlChave')->item(0)->nodeValue
];
}
return $resp;
}

}
Loading

0 comments on commit 026b1c4

Please sign in to comment.