Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajustes para o novo Danfe refatorado #607

Merged
merged 1 commit into from
May 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading