<?php
error_reporting(E_ALL); 
ini_set('display_errors', 'On');

require_once 'connect.php';
require_once 'messages.php';
require_once "nfecode_class.php"; 

$documentos_emitente = array();
$documentos_saida   = array();
$documentos_cliente = array();
$documentos_produto = array();
$documentos_transporte=array();
$documentos_volumes  = array();
$documentos_pagamentos=array();
$documentos_tributos  =array();

/* Regime Tributário da Empresa
1	Lucro Arbitrado
2	Lucro Real
3	Lucro Presumido
4	Simples Nacional
*/
$cRegTrib = 2;
$tpNF = '';
$tipo_ambiente= '2'; // Ambiente 1 Produção, 2 Homologação - Windows
$tipo_ambiente= $NfeCode->getAmbiente();

$path_nfephp = './api/nfephp'; // ../nfephp
$path_nfephp = $NfeCode->getPathNFEPHP();

require_once "$path_nfephp/bootstrap.php";


use NFePHP\NFe\MakeNFe;
use NFePHP\NFe\ToolsNFe;

$nfe = new MakeNFe();
// $nfeTools = new ToolsNFe("$path_nfephp/config/config.json") ;
$NfeCode = new NfeCode();
$set_msg = array();

  function getDados($id_documento){
    global $NfeCode;
    global $set_msg;
    global $documentos_emitente;
    global $documentos_saida   ;
    global $documentos_cliente ;
    global $documentos_produto ;
    global $documentos_transporte;
    global $documentos_volumes;
    global $documentos_pagamentos;
    global $documentos_tributos;
    global $tipo_ambiente;

    $r_getDados = true;

    // Obtendo as informações do BD para
      $NfeCode->setNrNota($id_documento);

      $documentos_emitente = $NfeCode->getEmitente();
      $documentos_saida    = $NfeCode->getDocumento();
      $documentos_cliente  = $NfeCode->getCliente();
      $documentos_produto  = $NfeCode->getProdutos();
      $documentos_transporte=$NfeCode->getTransporte(); // Edival Inclusão em: 23/01/2018 23:32
      $documentos_volumes   =$NfeCode->getVolumes(); 
      $documentos_pagamentos=$NfeCode->getPagamentos(); // Nfe4.00 { Não Obrigatória ! };
      $documentos_tributos  =$NfeCode->getTributos();
      
	  // $tipo_ambiente = $NfeCode->getAmbiente();

    if(count($documentos_emitente)==0){
      array_push($set_msg, "Não foi possível encontrar o emitente da NFE: $id_documento");
      $r_getDados = false;
    }

    if(count($documentos_saida)==0){
      array_push($set_msg, "Não foi possível encontrar o Dados da NFE: $id_documento");
      $r_getDados = false;
    }

    if(count($documentos_cliente)==0){
      array_push($set_msg, "Não foi possível encontrar o Cliente da NFE: $id_documento");
      $r_getDados = false;
    }

    if(count($documentos_produto)==0){
      array_push($set_msg, "Não foi possível encontrar os Produtos da NFE: $id_documento");
      $r_getDados = false;
    }
    return $r_getDados;
  }

  function nfe_GeraXml($id_documento){
  global $nfe;
  // global $nfeTools;
  global $chave;
  global $NfeCode;
  global $set_msg;
  global $documentos_emitente;
  global $documentos_saida   ;
  global $documentos_cliente ;
  global $documentos_produto ;
  global $documentos_transporte;
  global $documentos_volumes;
  global $documentos_pagamentos;
  global $tipo_ambiente;

  /* faz a numeração do item do produto, para nao ocasionar erros */
  $p_num_item = 1;
  foreach ($documentos_produto as $key => $value) {
    # code...
    $documentos_produto[$key]['nItem']=$p_num_item;
    $p_num_item ++;
  }

  // Informações do Emitente da Nota Fiscal
  foreach ($documentos_emitente as $key => $registro) {
      $cUF    = $registro['cUF']; // '52' //codigo numerico do estado
      $cMunFG = $registro['cMunFG'];

      $xLgr   = $registro['xLgr'];
      $nro    = '' . $registro['nro'];
      $xCpl   = '' . $registro['xCpl'];
      $xBairro= $registro['xBairro'];
      $cMun   = $registro['cMun'];
      $xMun   = $registro['xMun'];
      $UF     = $registro['UF'];
      $UFEmit = $registro['UF'];
      $CEP    = $registro['CEP'];
      $cPais  = $registro['cPais'];
      $xPais  = $registro['xPais'];
      $fone   = '' . $registro['fone'];
      $cRegTrib= $registro['cRegTrib'];
  }


  //Dados da NFe - infNFe
  foreach ($documentos_saida as $key => $registro) {
    global $tipo_ambiente;

    $mod    = $registro['mod'];
    $serie  = $registro['serie'] ;
    // {Removido e retirado de Parametors
    // $tipo_ambiente  = $registro['tpAmb'];
    $nNF    = $registro['nNF']; // numero da NFe

    $natOp  = $registro['natOp']; // 'Venda de Produto'; //natureza da operação
    $indPag = $registro['indPag']; //0=Pagamento à vista; 1=Pagamento a prazo; 2=Outros
    $tpNF   = $registro['tpNF']; // { 0 Entrada e 1 para Saida} 1
    $idDest = $registro['idDest']; //1=Operação interna; 2=Operação interestadual; 3=Operação com exterior.
    $tpImp  = $registro['tpImp']; //0=Sem geração de DANFE; 1=DANFE normal, Retrato; 2=DANFE normal, Paisagem;
                                    //3=DANFE Simplificado; 4=DANFE NFC-e; 5=DANFE NFC-e em mensagem eletrônica
                                    //(o envio de mensagem eletrônica pode ser feita de forma simultânea com a impressão do DANFE;
                                    //usar o tpImp=5 quando esta for a única forma de disponibilização do DANFE).
    $tpEmis = $registro['tpEmis']; //1=Emissão normal (não em contingência);
                                   //2=Contingência FS-IA, com impressão do DANFE em formulário de segurança;
                                   //3=Contingência SCAN (Sistema de Contingência do Ambiente Nacional);
                                   //4=Contingência DPEC (Declaração Prévia da Emissão em Contingência);
                                   //5=Contingência FS-DA, com impressão do DANFE em formulário de segurança;
                                   //6=Contingência SVC-AN (SEFAZ Virtual de Contingência do AN);
                                   //7=Contingência SVC-RS (SEFAZ Virtual de Contingência do RS);
                                   //9=Contingência off-line da NFC-e (as demais opções de contingência são válidas também para a NFC-e);
                                   //Nota: Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9.
    $finNFe   = $registro['finNfe']; //1=NF-e normal; 2=NF-e complementar; 3=NF-e de ajuste; 4=Devolução/Retorno.

    // Se finalidade for devolução, muda a série para 110
    if($finNFe=='4'){
      $serie = 110;
    }
    $indFinal = $registro['indFinal']; //0=Normal; 1=Consumidor final;
    $indPres  = $registro['indPres'];  //0=Não se aplica (por exemplo, Nota Fiscal complementar ou de ajuste);
                                       //1=Operação presencial;
                                       //2=Operação não presencial, pela Internet;
                                       //3=Operação não presencial, Teleatendimento;
                                       //4=NFC-e em operação com entrega a domicílio;
                                       //9=Operação não presencial, outros.

    $p_refNfe = $registro['refNfe']; // Número de Referencia para Nota de Devolução


    // Campos do Cabeçalho da Nota, Campos Padrões
    $procEmi = '0'; //0=Emissão de NF-e com aplicativo do contribuinte;
                                      //1=Emissão de NF-e avulsa pelo Fisco;
                                      //2=Emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco;
                                      //3=Emissão NF-e pelo contribuinte com aplicativo fornecido pelo Fisco.
    $verProc = '4.0.43'; //versão do aplicativo emissor 
    $dhCont = ''; //entrada em contingência AAAA-MM-DDThh:mm:ssTZD
    $xJust = ''; //Justificativa da entrada em contingência
    $infCpl = $registro['infCpl']; // Descrição Complementar para o Tipo de Nota
    $natOpID= $registro['natOpID'];// ID Natureza da Operação
    /*
    natOpID ==
    select * from erpc_cfop_categorias;

    1	Compra
    2	Consignacao
    3	Devolucao
    4	Remessa para industrialização, demonstração ou outra
    5	Transferencia
    6	Venda
    */

    //Numero e versão da NFe (infNFe)
    $dhEmi = date("Y-m-d\TH:i:sP");
    $dhSaiEnt = date("Y-m-d\TH:i:sP");
    $cNF    = substr("00000000" . $nNF, -8); //numero aleatório da NF

    $ano = date('y', strtotime($dhEmi));
    $mes = date('m', strtotime($dhEmi));

    $cnpj= preg_replace("/[^0-9]/", "", $documentos_emitente[0]['cnpj']); // $nfeTools->aConfig['cnpj']  ;


    $chave = $nfe->montaChave($cUF, $ano, $mes, $cnpj, $mod, $serie, $nNF, $tpEmis, $cNF);
    $versao = '4.00';
    $resp = $nfe->taginfNFe($chave, $versao);

    $xmlString = "";
    $xmlString .= "<br>taginfNFe" . $resp->nodeValue;

    $cDV = substr($chave, -1); //Digito Verificador da Chave de Acesso da NF-e, o DV é calculado com a aplicação do algoritmo módulo 11 (base 2,9) da Chave de Acesso.
  }
  //tag IDE
  
  $resp = $nfe->tagide($cUF, $cNF, $natOp, $indPag, $mod, $serie, $nNF, $dhEmi, $dhSaiEnt, $tpNF, $idDest, $cMunFG, $tpImp, $tpEmis, $cDV, $tipo_ambiente, $finNFe, $indFinal, $indPres, $procEmi, $verProc, $dhCont, $xJust);
  $xmlString .= "<br>tagide" . $resp->nodeValue;

  /* Referencia NFE no caso de Devolução - Obrigatório informar a chave de Acesso
  refNFe NFe referenciada
  //$refNFe = '12345678901234567890123456789012345678901234';
  //$resp = $nfe->tagrefNFe($refNFe);
  */

  if($finNFe=="4"){
    if($p_refNfe==""){
      echo "É obrigatório informar a chave de referencia da NFE";
      exit;
    }else{
      $resp = $nfe->tagrefNFe($p_refNfe);
      $xmlString .= "<br>tagrefNFe" . $resp->nodeValue;
    }
  }

  //refNF Nota Fiscal 1A referenciada
  //$cUF = '35';
  //$AAMM = '1312';
  //$CNPJ = '12345678901234';
  //$mod = '1A';
  //$serie = '0';
  //$nNF = '1234';
  //$resp = $nfe->tagrefNF($cUF, $AAMM, $CNPJ, $mod, $serie, $nNF);

  //NFPref Nota Fiscal Produtor Rural referenciada
  //$cUF = '35';
  //$AAMM = '1312';
  //$CNPJ = '12345678901234';
  //$CPF = '123456789';
  //$IE = '123456';
  //$mod = '1';
  //$serie = '0';
  //$nNF = '1234';
  //$resp = $nfe->tagrefNFP($cUF, $AAMM, $CNPJ, $CPF, $IE, $mod, $serie, $nNF);

  //CTeref CTe referenciada
  //$refCTe = '12345678901234567890123456789012345678901234';
  //$resp = $nfe->tagrefCTe($refCTe);

  //ECFref ECF referenciada
  //$mod = '90';
  //$nECF = '12243';
  //$nCOO = '111';
  //$resp = $nfe->tagrefECF($mod, $nECF, $nCOO);

  //Dados do emitente - (Importando dados do config.json)
  $CNPJ = preg_replace("/[^0-9]/", "", $documentos_emitente[0]['cnpj']); // $nfeTools->aConfig['cnpj'];
  $CPF = ''; // Utilizado para CPF na nota
  $xNome = sanitizeString($documentos_emitente[0]['razaosocial']); // $nfeTools->aConfig['razaosocial'];
  $xFant = sanitizeString($documentos_emitente[0]['nomefantasia']); //$nfeTools->aConfig['nomefantasia'];
  // $IE    = substr("000000000000" . $nfeTools->aConfig['ie'], -12);
  $IE    = substr("000000000000" . preg_replace("/[^0-9]/", "", $documentos_emitente[0]['ie']), -12);
  $IEST  = $documentos_emitente[0]['iest']; // $nfeTools->aConfig['iest'];
  $IM    = $documentos_emitente[0]['im']; // $nfeTools->aConfig['im'];
  $CNAE  = $documentos_emitente[0]['cnae']; // $nfeTools->aConfig['cnae'];
  $CRT   = $documentos_emitente[0]['regime']; // $nfeTools->aConfig['regime']; /* Teste 1 Simples Nacional ou */

  if(strlen($IEST)==0){$IEST='';}
  if(strlen($CNAE)==0){$CNAE='';}


  $resp = $nfe->tagemit($CNPJ, $CPF, $xNome, $xFant, $IE, $IEST, $IM, $CNAE, $CRT);

  $xmlString .= "<br>tagemit" . $resp->nodeValue;

  /* endereço do emitente { VINDO DO SELECT }*/
  $resp = $nfe->tagenderEmit($xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF, $CEP, $cPais, $xPais, $fone);
  $xmlString .= "<br>tagenderEmit" . $resp->nodeValue;

  // if(isset($_POST['incluir'])){
  // Obtendo as informações do Cliente ou Tomador na Nomenclatura da Nota Fiscal
  foreach ($documentos_cliente as $key => $registro) {
      global $fone;

      $CPF = '';
      $CNPJ= '';

      $cUF    = $registro['cUF']; // '35' SP '52' GO //codigo numerico do estado
      $cMunFG = $registro['cMunFG'];

      $xLgr   = $registro['xLgr'];
      $nro    = $registro['nro'];
      $xCpl   = ' ' . $registro['xCpl'];
      $xBairro= $registro['xBairro'];
      $cMun   = $registro['cMun'];
      $xMun   = $registro['xMun'];
      $UF     = $registro['UF'];
      $UFDest = $registro['UF'];
      $CEP    = $registro['CEP'];
      $cPais  = $registro['cPais'];
      $xPais  = $registro['xPais'];
      $fone   = $registro['fone'];

      /* destinatário
      if($tpNF=="1"){
        $CNPJ= preg_replace("/[^0-9]/", "", $registro['CNPJ']);
      }else{
        $CPF = preg_replace("/[^0-9]/", "", $registro['CPF']);
      }
      */

      // Remover Caracteres especiais do CNPJ ou CPF
      $CNPJ= preg_replace("/[^0-9]/", "", $registro['CNPJ']);
      $CPF = preg_replace("/[^0-9]/", "", $registro['CPF']);

      $xNome    = $registro['xNome'];
      $indIEDest= $registro['indIEDest']; 
      /*  1=Contribuinte ICMS (informar a IE do destinatário);
          2=Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
          9=Não Contribuinte*/
      $IE       = $registro['IE'];
      $ISUF         = '' . $registro['ISUF'];
      $idEstrangeiro= $registro['idEstrangeiro'];
      $IM           = $registro['IM'];// '4128095';
      $email        = '' . $registro['email'];

      //Endereço do destinatário
      $xLgr   = '' . $registro['xLgr'];
      $nro    = ''. (!strlen($registro['nro'])==0 ? $registro['nro'] : 'S/N');
      $xCpl   = '' . $registro['xCpl'];
      $xBairro= '' . $registro['xBairro'];
      $cMun   = '' . $registro['cMun'];
      $xMun   = '' . $registro['xMun'];
      $UF     = '' . $registro['UF'];
      $CEP    = '' . $registro['CEP'];
      $cPais  = '' . $registro['cPais'];
      $xPais  = '' . $registro['xPais'];
      $fone   = '' . $registro['fone'];

    }
  // }

  $resp = $nfe->tagdest($CNPJ, $CPF, $idEstrangeiro, $xNome, $indIEDest, $IE, $ISUF, $IM, $email);
  $xmlString .= "<br>tagdest" . $resp->nodeValue;

  $resp = $nfe->tagenderDest($xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF, $CEP, $cPais, $xPais, $fone);
  $xmlString .= "<br>tagenderdest" . $resp->nodeValue;

  //Identificação do local de retirada (se diferente do emitente)
  //$CNPJ = '12345678901234';
  //$CPF = '';
  //$xLgr = 'Rua Vanish';
  //$nro = '000';
  //$xCpl = 'Ghost';
  //$xBairro = 'Assombrado';
  //$cMun = '3509502';
  //$xMun = 'Campinas';
  //$UF = 'SP';
  //$resp = $nfe->tagretirada($CNPJ, $CPF, $xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF);

  //Identificação do local de Entrega (se diferente do destinatário)
  //$CNPJ = '12345678901234';
  //$CPF = '';
  //$xLgr = 'Viela Mixuruca';
  //$nro = '2';
  //$xCpl = 'Quabrada do malandro';
  //$xBairro = 'Favela Mau Olhado';
  //$cMun = '3509502';
  //$xMun = 'Campinas';
  //$UF = 'SP';
  //$resp = $nfe->tagentrega($CNPJ, $CPF, $xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF);

  //Identificação dos autorizados para fazer o download da NFe (somente versão 3.1)
  /*$aAut = array('23401454000170');
  foreach ($aAut as $aut) {
      if (strlen($aut) == 14) {
          $resp = $nfe->tagautXML($aut);
      } else {
          $resp = $nfe->tagautXML('', $aut);
      }
  }*/

  // $i_itens = Count($_POST['p_id_ite']);

  $id_cfop = '';

  if($finNFe==1){
    $id_cfop = '5101'; // venda de mercadorias
  }else {
    $id_cfop = '5411'; // Devolução de venda de mercadoria adquirida ou recebida de terceiros
  }

  /* retirado do post, agora direto com vinculo a view
  for($i = 0; $i < $i_itens; $i++){
  //produtos 1 (Limite da API é de 56 itens por Nota)
  $aP[] = array(
          'nItem' => $_POST['p_id_ite'][$i],
          'cProd' => $_POST['p_id_pro'][$i],
          'cEAN'  => $_POST['p_id_ean'][$i],
          'xProd' => $_POST['p_ds_pro'][$i],
          'NCM'   => $_POST['p_id_ncm'][$i],
          'EXTIPI' => '',
          'CFOP'   => $id_cfop, // $_POST['p_cfop'][$i],
          'uCom'   => 'UN', // $_POST['p_ds_uni'][$i],
          'qCom'   => $_POST['p_nr_qtd'][$i],
          'vUnCom' => $_POST['p_vl_uni'][$i],
          'vProd'  => $_POST['p_vl_tot'][$i],
          'cEANTrib' => '',
          'uTrib'   => 'UN', // $_POST['p_ds_uni'][$i],
          'qTrib'   => $_POST['p_nr_qtd'][$i],
          'vUnTrib' => $_POST['p_vl_uni'][$i],
          'vFrete'  => '',
          'vSeg'    => '',
          'vDesc'   => '',
          'vOutro'  => '',
          'indTot'  => $_POST['fl_indtotal'][$i],
          'xPed'    => '0',
          'nItemPed'=> $_POST['p_id_ite'][$i],
          'nFCI'    => '');
  }*/

  $vTotProd = 0;
  $vTotFrete= 0;    // Soma geral de todos os fretes de produtos
  $vTotPedFrete= 0; // Utilizado para comparar diferenças do total do frete x produtos

  foreach ($documentos_produto as $key => $prod) {
      $nItem = $prod['nItem'];
      $cProd = $prod['cProd'];
      $cEAN = $prod['cEAN'];
      $xProd = $prod['xProd'];
      $NCM = $prod['NCM'];
      $EXTIPI = (!strlen($prod['EXTIPI'])==0 ? $prod['EXTIPI'] : '');
      $CFOP = $prod['CFOP'];
      $uCom = $prod['uCom'];
      $qCom = $prod['qCom'];
      $vUnCom = $prod['vUnCom'];
      $vProd = number_format($prod['vProd'], 2, '.', '');
      $cEANTrib = $prod['cEANTrib'];
      $uTrib = $prod['uTrib'];
      $qTrib = $prod['qTrib'];
      $vUnTrib = $prod['vUnTrib'];
      $qPesoLiq= $prod['qPesoLiq'];

      if($cEAN==''){
        $cEAN = 'SEM GTIN';
      }

      if($cEANTrib==''){
        $cEANTrib = 'SEM GTIN';
      }

      if($prod['cProdANP']!=""){
        $uTrib = "KG";
        if($qPesoLiq==0){
          $qPesoLiq = 1;
        }
        $qConversao = $qCom * $qPesoLiq;
        $qTrib   = number_format($qConversao, 4, '.', '');
        $vUnTrib = number_format($vProd / $qConversao, 4, '.', '');
      }

      /* Incluir o Rateiro de Frete, Seguro, Desconto e Outros */
      $vFrete  = ''; // $prod['vFrete'];
      $vSeg    = ''; // $prod['vSeg'];
      $vDesc   = ''; // $prod['vDesc'];
      $vOutro  = ''; // $prod['vOutro'];

      /* Somente enviar a Tag de Frete do Produto caso maior que Zero */
      if($prod['vFrete']>0){
        $vFrete = number_format($prod['vFrete'], 2, '.', '');
        $vTotFrete += $vFrete;

        /* Total do Frete no Pedido */
        $vTotPedFrete = number_format($prod['vl_frete'], 2, '.', '');

        /* Ajustar diferença de 0.01 centavo do Frete para último Item */
        if($nItem == count($documentos_produto) && $vTotPedFrete > $vTotFrete ){
          $vFrete    += $vTotPedFrete - $vTotFrete;
          $vTotFrete += $vTotPedFrete - $vTotFrete;          
        }

          $vFrete    = number_format($vFrete   , 2, '.', '');
          $vTotFrete = number_format($vTotFrete, 2, '.', '');
          
          /*
          echo "<br>Item          $nItem de produtos: " . count($documentos_produto);
          echo "<br>vFrete        $vFrete";
          echo "<br>vTotFrete     $vTotFrete";
          echo "<br>vTotPedFrete  $vTotPedFrete";
          */          
      }   

      /* ====================== */
      $indTot  = $prod['indTot'];
      $xPed = $prod['xPed'];
      $nItemPed = $prod['nItem'];
      $nFCI = $prod['nFCI'];
      $resp = $nfe->tagprod($nItem, $cProd, $cEAN, $xProd, $NCM, $EXTIPI, $CFOP, $uCom, $qCom, $vUnCom, $vProd, $cEANTrib, $uTrib, $qTrib, $vUnTrib, $vFrete, $vSeg, $vDesc, $vOutro, $indTot, $xPed, $nItemPed, $nFCI);

      /* Gerar a Tag <comb> para GLP */
      if($prod['cProdANP']!=""){
        $cProdANP = $prod['cProdANP'];
        $descANP  = $prod['descANP'];
        $pGLP     = number_format($prod['pGLP']  , 2, '.', '');
        $pGNn     = number_format($prod['pGNn']  , 2, '.', '');
        $pGNi     = number_format($prod['pGNi']  , 2, '.', '');
        
        $vPart = number_format($vUnTrib, 2, '.', '');

        /*
        echo "<br>cProdANP|$cProdANP";
        echo "<br>vProd|$vProd";
        echo "<br>qCom|$qCom";
        echo "<br>uCom|$uCom";
        echo "<br>uTrib|$uTrib";
        echo "<br>qTrib|$qTrib";
        echo "<br>vPart|$vPart";
        exit;
        */

        $resp = $nfe->tagcomb( $nItem, $cProdANP, $descANP, $pGLP, $pGNn, $pGNi, $vPart, '', $UFDest);
      }

      $vTotProd += $vProd;

      $xmlString .= "<br>tagprod" . $resp->nodeValue;
  }

  // Informações adicionais na linha do Produto
  /*$nItem = 1; //produtos 1
  $vDesc = 'Barril 30 Litros Chopp Tipo Pilsen - documento Nº15';
  $resp = $nfe->taginfAdProd($nItem, $vDesc);
  $nItem = 2; //produtos 2
  $vDesc = 'Caixa com 1000 unidades';
  $resp = $nfe->taginfAdProd($nItem, $vDesc);*/

  //DI - Declaração de Importação
  /*$nItem = '1';
  $nDI = '234556786';
  $dDI = date('Y-m-d'); // Formato: “AAAA-MM-DD”
  $xLocDesemb = 'SANTOS';
  $UFDesemb = 'SP';
  $dDesemb = date('Y-m-d'); // Formato: “AAAA-MM-DD”
  $tpViaTransp = '1';
  $vAFRMM = '1.00';
  $tpIntermedio = '1';
  $CNPJ = '';
  $UFTerceiro = '';
  $cExportador = '111';
  $resp = $nfe->tagDI($nItem, $nDI, $dDI, $xLocDesemb, $UFDesemb, $dDesemb, $tpViaTransp, $vAFRMM, $tpIntermedio, $CNPJ, $UFTerceiro, $cExportador);*/

  //adi - Adições
  /*$nItem = '1';
  $nDI = '234556786';
  $nAdicao = '1';
  $nSeqAdicC = '123';
  $cFabricante = 'Klima Chopp';
  $vDescDI = '5.00';
  $nDraw = '9393939';
  $resp = $nfe->tagadi($nItem, $nDI, $nAdicao, $nSeqAdicC, $cFabricante, $vDescDI, $nDraw);*/

  //detExport
  //$nItem = '2';
  //$nDraw = '9393939';
  //$exportInd = '1';
  //$nRE = '2222';
  //$chNFe = '1234567890123456789012345678901234';
  //$qExport = '100';
  //$resp = $nfe->tagdetExport($nItem, $nDraw, $exportInd, $nRE, $chNFe, $qExport);

  /* Array de Tributos do Item ICMS e Substituição Tributaria
  for($t = 0; $t < Count($_POST['i_id_ite']); $t++){
  $aT[$t] = array(
          'nItem' => $_POST['i_id_ite'][$t],
          'orig'  => $_POST['id_origem'][$t],
          'trib'  => $_POST['id_tributo'][$t],
          'vBC'   => $_POST['i_vl_base'][$t],
          'pICMS' => preg_replace("/[^0-9]/", "",$_POST['i_vp_aliq'][$t]) / 100,
          'vICMS' => $_POST['i_vl_icms'][$t],
          'vBCST' => '',
          'pICMSST' =>'',
          'vICMSST' =>'');
  }

  // Array de Tributos Federais PIS e COFINS
  for($f = 0; $f < Count($_POST['f_id_ite']); $f++){
  $aF[] = array(
    'nItem'  => $_POST['f_id_ite'][$f],
    'cst'    => $_POST['f_id_cst'][$f],
    'vBC'    => $_POST['f_vl_bc'][$f],
    'pPIS'   => $_POST['f_vp_pis'][$f],
    'vPIS'   => $_POST['f_vl_pis'][$f],
    'pCof'   => $_POST['f_vp_cof'][$f],
    'vCof'   => $_POST['f_vl_cof'][$f],
    'pIPI'   => $_POST['f_vp_ipi'][$f],
    'vIPI'   => $_POST['f_vl_ipi'][$f]);
  }
  */


  // Faz loop por item para soma dos tributos de ICMS e Federal
  // antigo retirado do post, agora view ===> foreach ($aP as $prod) {
  foreach ($documentos_produto as $key => $prod) {
      $nItem = $prod['nItem'];
      $vItemTrib = 0;
      $vItemFede = 0;
      $vItemIPI  = 0;
      
      $iItem = $prod['nItem'];
      $tipo  = '' . $prod['trib'];
      
      $vItemTrib += $prod['vICMS'];
      $vItemTrib += $prod['vFCP'];
      $vItemTrib += $prod['vICMSST'];

      $vItemFede += $prod['vPIS'];
      $vItemFede += $prod['vCof'];
      $vItemIPI  += $prod['vIPI'];

      $vTotTrib = $vItemTrib + $vItemFede + $vItemIPI;

	    $vTribImposto = number_format($vTotTrib, 2, '.', '');

      if($finNFe=="1" and $cRegTrib=="4") {
        $resp = $nfe->tagimposto($nItem, "0");
      }else if($finNFe=="4" or ($cRegTrib!="4" && strpos("00,10,20,30,60,70,90", $tipo)>=0)){
        $resp = $nfe->tagimposto($nItem, $vTribImposto);
      }else {
		    $resp = $nfe->tagimposto($nItem, "0");
	    }
      $xmlString .= "<br>tagimposto" . $resp->nodeValue;
  }

  $vTotBCICMS = 0;
  $vTotVLICMS = 0;
  $vTotBCST   = 0;
  $vTotVLST   = 0;
  $vTotFCP    = 0;

  // Tributos de ICMS e ICMS 10
  // foreach($aT as $trib){
  foreach ($documentos_produto as $key => $trib) {
    $bincl = false;

    $cst = ''; // Tributado Integralmente
    $modBC = '3';
    $pRedBC = '';
    $vBC = ''; // = $qTrib * $vUnTrib
    $pICMS = '0.00'; // Alíquota do Estado de GO p/ 'NCM 2203.00.00 - Cervejas de Malte, inclusive Chope'
    $vICMS = '0.00'; // = $vBC * ( $pICMS / 100 )
    $vICMSDeson = '';
    $motDesICMS = '';
    $modBCST = '0';
    $pMVAST = '';
    $pRedBCST = '';
    $vBCST = '0.00';
    $pICMSST = '0.00';
    $vICMSST = '0.00';
    $pDif = '';
    $vICMSDif = '';
    $vICMSOp = '';
    $vBCSTRet = '';
    $vICMSSTRet = '';

    echo "<pre>";
    print_r($trib);
    echo "</pre>";

    $nItem = $trib['nItem'];    //  produtos 1
    $orig  = $trib['orig'];
    $cst   = $trib['trib'];     // '00'; // Tributado Integralmente
    $pFCP  = $trib['pFCP'];
    $vFCP  = $trib['vFCP'];
    $csosn = $trib['csosn']; // Código de Situação da Operação no Simples Nacional


    if($cRegTrib!="4"  && strpos("00,10,20,51,70,90", $cst)>=0){ 
      /* Nfe4.00, Fundo de Combate a Pobreza*/
      $vBCFCP= number_format($trib['vBCFCP'], 2, '.', '');
      $pFCP  = number_format($trib['pFCP'], 2, '.', '');
      $vFCP  = number_format($trib['vFCP'], 2, '.', '');

      $vTotFCP += $vFCP; // Totalizador na Nfe
    }

    $vBC   = number_format($trib['vBC'], 2, '.', '');   // = $qTrib * $vUnTrib

    if($cst=='00'){ // Tributado Integralmente
      $pICMS = $trib['pICMS']; // Alíquota do Estado de GO p/ 'NCM 2203.00.00 - Cervejas de Malte, inclusive Chope'
      $vICMS = $trib['vICMS']; // = $vBC * ( $pICMS / 100 )

      $vBCFCP= ''; /* Zerar Base de Cálculo*/

      $bincl = true;
    }else if($cst=='10'){ // SUBST TRIBUTARIA DO PRODUTO
      $orig  = $orig;
      $pICMS = $trib['pICMS']; 		// Alíquota do Estado de GO p/ 'NCM 2203.00.00 - Cervejas de Malte, inclusive Chope'
      $vICMS = $trib['vICMS']; 		// = $vBC * ( $pICMS / 100 )
      $modBCST = '5'; 				// Calculo Por Pauta (valor)
      $vBCST   = number_format($trib['vBCST']  , 2, '.', ''); 	// 1030.00 Pauta do Chope Claro 1000ml em GO R$ 8,59 x 60 Litros
      $pICMSST = number_format($trib['pICMSST'], 2, '.', ''); 	// GO para GO
      $vICMSST = number_format($trib['vICMSST'], 2, '.', '');	// '51.50'; // = (Valor da Pauta * Alíquota ICMS ST) - Valor ICMS Próprio

      $bincl = true;
    }

	$vTotBCST += $vBCST;
    $vTotVLST += $vICMSST;
    
    /*
	if(!$finNFe=="1"){
      $vTotBCST += $vBCST;
      $vTotVLST += $vICMSST;
    }
	else{
      $vTotBCST += $trib['vBCST'];
      $vTotVLST += $trib['vICMSST'];
    }*/

    // somente incluir o produto para calculos de icms 00 ou 10
    /* Trocar Código CST para Simples Nacional, utilizando a regra:
    40 - Isento no Lucro Real para 102 - Tributada pelo Simples Nacional sem permissão de crédito.
    Demais - 900 – Outros*/
    if($cRegTrib=="4"){
      /*Zerar Substituição tributária e ICMS para o Simples Nacional */
      $modBCST='';
      $vBCST  ='';
      $pICMSST='';
      $vICMSST='';
      $modBC= '';
      $vBC  = '';
      $pICMS= '';
      $vICMS= '';
      $pCredSN     = '';
      $vCredICMSSN = '';

      /* utilizar o csosn, caso informado no cadastro da TES */
      if($csosn==""){
        if($cst=="40"){
        $csosn = "102";
        }else if($cst=="90"){
          $csosn = "400";
        }else{
          $csosn  = "400";
        }  
      }else if(($csosn=="101" or $csosn=="201") and $indIEDest!="9"){
        $pCredSN    = number_format($trib['pICMS'], 2, '.', '');
        $vCredICMSSN= number_format($trib['vICMS'], 2, '.', '');
      }

      $resp = $nfe->tagICMSSN($nItem, $orig, $csosn, $modBC, $vBC, $pRedBC, $pICMS, $vICMS, $pCredSN, $vCredICMSSN, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $vBCSTRet, $vICMSSTRet,
        @$vBCFCP, $pFCP, $vFCP);
    }else{
      $resp = $nfe->tagICMS($nItem, $orig, $cst, $modBC, $pRedBC, $vBC, $pICMS, $vICMS, $vICMSDeson, $motDesICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pDif, $vICMSDif, $vICMSOp, $vBCSTRet, $vICMSSTRet,
        $vBCFCP, $pFCP, $vFCP);
    }

      // $xmlString .= "<br>tagICMS" . $resp->nodeValue;
    /* 
      Nota Técnica 2011.004
      Casos em que deve-se informar a base de cálculo  ICMSTot->vBC | $vTotBCICMS
      */
    if($cRegTrib!="4" && strpos("00,10,20,51,70,90", $cst)>=0){
      $vBCICMS     = number_format($trib['vProd'], 2, '.', '');
      $vTotBCICMS += $vBCICMS;
    }
    $vTotVLICMS += floatval($vICMS);
  }

	 // $xmlString .= "<br>tagICMS" . $resp->nodeValue;
  
  /*
  //ICMS - Imposto sobre Circulação de Mercadorias e Serviços
  $nItem = 1; //produtos 1
  $orig = '0';
  $cst = '00'; // Tributado Integralmente
  $modBC = '3';
  $pRedBC = '';
  $vBC = '840.00'; // = $qTrib * $vUnTrib
  $pICMS = '27.00'; // Alíquota do Estado de GO p/ 'NCM 2203.00.00 - Cervejas de Malte, inclusive Chope'
  $vICMS = '226.80'; // = $vBC * ( $pICMS / 100 )
  $vICMSDeson = '';
  $motDesICMS = '';
  $modBCST = '';
  $pMVAST = '';
  $pRedBCST = '';
  $vBCST = '';
  $pICMSST = '';
  $vICMSST = '';
  $pDif = '';
  $vICMSDif = '';
  $vICMSOp = '';
  $vBCSTRet = '';
  $vICMSSTRet = '';
  $resp = $nfe->tagICMS($nItem, $orig, $cst, $modBC, $pRedBC, $vBC, $pICMS, $vICMS, $vICMSDeson, $motDesICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pDif, $vICMSDif, $vICMSOp, $vBCSTRet, $vICMSSTRet);

  $nItem = 2; //produtos 2
  $orig = '0';
  $cst = '00';
  $modBC = '3';
  $pRedBC = '';
  $vBC = '360.00'; // = $qTrib * $vUnTrib
  $pICMS = '17.00'; // Alíquota Interna do Estado de GO
  $vICMS = '61.20'; // = $vBC * ( $pICMS / 100 )
  $vICMSDeson = '';
  $motDesICMS = '';
  $modBCST = '';
  $pMVAST = '';
  $pRedBCST = '';
  $vBCST = '';
  $pICMSST = '';
  $vICMSST = '';
  $pDif = '';
  $vICMSDif = '';
  $vICMSOp = '';
  $vBCSTRet = '';
  $vICMSSTRet = '';
  $resp = $nfe->tagICMS($nItem, $orig, $cst, $modBC, $pRedBC, $vBC, $pICMS, $vICMS, $vICMSDeson, $motDesICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pDif, $vICMSDif, $vICMSOp, $vBCSTRet, $vICMSSTRet);

  //ICMS 10
  $nItem = 1; //produtos 1
  $orig = '0';
  $cst = '10'; // Tributada e com cobrança do ICMS por substituição tributária
  $modBC = '3';
  $pRedBC = '';
  $vBC = '840.00';
  $pICMS = '27.00'; // Alíquota do Estado de GO p/ 'NCM 2203.00.00 - Cervejas de Malte, inclusive Chope'
  $vICMS = '226.80'; // = $vBC * ( $pICMS / 100 )
  $vICMSDeson = '';
  $motDesICMS = '';
  $modBCST = '5'; // Calculo Por Pauta (valor)
  $pMVAST = '';
  $pRedBCST = '';
  $vBCST = '1030.80'; // Pauta do Chope Claro 1000ml em GO R$ 8,59 x 60 Litros
  $pICMSST = '27.00'; // GO para GO
  $vICMSST = '51.50'; // = (Valor da Pauta * Alíquota ICMS ST) - Valor ICMS Próprio
  $pDif = '';
  $vICMSDif = '';
  $vICMSOp = '';
  $vBCSTRet = '';
  $vICMSSTRet = '';
  $resp = $nfe->tagICMS($nItem, $orig, $cst, $modBC, $pRedBC, $vBC, $pICMS, $vICMS, $vICMSDeson, $motDesICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pDif, $vICMSDif, $vICMSOp, $vBCSTRet, $vICMSSTRet);

  $vST = $vICMSST; // Total de ICMS ST
  */

  //ICMSPart - ICMS em Operações Interestaduais - CST 10
  //$resp = $nfe->tagICMSPart($nItem, $orig, $cst, $modBC, $vBC, $pRedBC, $pICMS, $vICMS, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $pBCOp, $ufST);

  //ICMSST - Tributação ICMS por Substituição Tributária (ST) - CST 40, 41, 50 e 51
  //$resp = $nfe->tagICMSST($nItem, $orig, $cst, $vBCSTRet, $vICMSSTRet, $vBCSTDest, $vICMSSTDest);

  //ICMSSN - Tributação ICMS pelo Simples Nacional - CST 30
  //$resp = $nfe->tagICMSSN($nItem, $orig, $csosn, $modBC, $vBC, $pRedBC, $pICMS, $vICMS, $pCredSN, $vCredICMSSN, $modBCST, $pMVAST, $pRedBCST, $vBCST, $pICMSST, $vICMSST, $vBCSTRet, $vICMSSTRet);


  $vTotIPI = 0;

  // Tributos Federais
  // foreach($aF as $fitem){
  foreach ($documentos_produto as $key => $fitem){
    $nite = '';
    $clEnq = '';
    $cnpjProd = '';
    $cSelo = '';
    $qSelo = '';
    $qUnid = '';
    $vUnid = '';
    $vBC   = '';
    $pIPI  = ''; //Calculo por alíquota - 6% Alíquota GO.
    $vIPI  = ''; // = $vBC * ( $pIPI / 100 )
    $cEnq = '999';

    //IPI - Imposto sobre Produto Industrializado
    $nite = $fitem['nItem'];
    	
    /* Trocar o CST em caso de Simples Nacional
    1 se Sim - 99 - Outras Operações de Saída
    0 se Não - Calcular conforme informado o IPI */
	   $vBC = "0";
     $pIPI= "0";
     $vIPI= "0";
	 
	if($cRegTrib=="4"){
      $cst = "99";
    }else{
      $pIPI = number_format($fitem['pIPI'],2, '.', '');

      if($pIPI=="0.00"){
        $cst  = '53'; // 53 - Saída Não-Tributada
      }else{
        $cst  = '50'; // 50 - Saída Tributada (Código da Situação Tributária)
        $vBC  = number_format($fitem['vBC'], 2, '.', '');
        $vIPI = number_format($fitem['vIPI'],2, '.', ''); // = $vBC * ( $pIPI / 100 )
      }
    }

    $resp = $nfe->tagIPI($nite, $cst, $clEnq, $cnpjProd, $cSelo, $qSelo, $cEnq, $vBC, $pIPI, $qUnid, $vUnid, $vIPI);
    $xmlString .= "<br>tagIPI" . $resp->nodeValue;

    $vTotIPI += $vIPI;
  }

  /*
  $nItem = 2; //produtos 2
  $cst = '53'; // 53 - Saída Não-Tributada
  $clEnq = '';
  $cnpjProd = '';
  $cSelo = '';
  $qSelo = '';
  $cEnq = '999';
  $vBC = '';
  $pIPI = '';
  $qUnid = '';
  $vUnid = '';
  $vIPI = ''; // = $vBC * ( $pIPI / 100 )
  $resp = $nfe->tagIPI($nItem, $cst, $clEnq, $cnpjProd, $cSelo, $qSelo, $cEnq, $vBC, $pIPI, $qUnid, $vUnid, $vIPI);
  */
  $vTotPIS   = 0;
  $vTotCofins= 0;

  // Informações de PIS
  // foreach($aF as $fede){
  foreach ($documentos_produto as $key => $fede) {
    $vBC       = '';
    $pPIS      = '';
    $vPIS      = '';
    $qBCProd   = '';
    $vAliqProd = '';

    $nItem = $fede['nItem'];
    $cst   = $fede['cst'];
	
    //PIS - Programa de Integração Social
    /* Trocar o CST em caso de Simples Nacional
    1 se Sim - 99 - Outras Operações de Saída
    0 se Não - Calcular conforme informado o PIS */
		$qBCProd  = number_format('0.00', 4, '.', '');
		$vAliqProd= number_format('0.00', 4, '.', '');
		$vPIS     = number_format('0.00', 2, '.', '');
	  
	if($cRegTrib=="4"){
      $cst = "99";
    }else{
      if($cst=='03'){        // Operação Tributável (base de cálculo = quantidade vendida x alíquota por unidade de produto)
        $qBCProd  = number_format($fede['vBC'], 2, '.', '');
        $vAliqProd= $fede['pPIS'];
        $vPIS     = $fede['vPIS'];
      }else if($cst=='01'){  // Operação Tributável (base de cálculo = (valor da operação * alíquota normal) / 100
        $vBC  = number_format($fede['vBC'], 2, '.', '');
        $pPIS = $fede['pPIS'];
        $vPIS = $fede['vPIS'];
      }
    }
    $resp = $nfe->tagPIS($nItem, $cst, $vBC, $pPIS, $vPIS, $qBCProd, $vAliqProd);
    $xmlString .= "<br>tagPIS" . $resp->nodeValue;

    $vTotPIS += $vPIS;
  }


  // Informações de COFINS
  // foreach ($aF as $fede) {
  foreach ($documentos_produto as $key => $fede) {
    /*$nItem    = 1; //produtos 1
    $cst      = '03'; //Operação Tributável (base de cálculo = quantidade vendida x alíquota por unidade de produto)*/
    $vBC      = '';
    $pCOFINS  = '';
    $vCOFINS  = '';
    $qBCProd  = '';
    $vAliqProd= '';

    $nItem= $fede['nItem'];
    $cst  = $fede['cst'];
	
    // COFINS
    /* Trocar o CST em caso de Simples Nacional
    1 se Sim - 99 - Outras Operações de Saída
    0 se Não - Calcular conforme informado o COFINS */
		$qBCProd  = number_format('0.00', 4, '.', '');
		$vAliqProd= number_format('0.00', 4, '.', '');
		$vCOFINS  = number_format('0.00', 2, '.', '');
	  
	if($cRegTrib=="4"){
      $cst = "99";
    }else{
      if($cst=='03'){        // Operação Tributável (base de cálculo = quantidade vendida x alíquota por unidade de produto)
        $qBCProd  = number_format($fede['vBC'], 2, '.', '');
        $vAliqProd= $fede['pCof'];
        $vCOFINS  = $fede['vCof'];
      }else if($cst=='01'){  // Operação Tributável (base de cálculo = (valor da operação * alíquota normal) / 100
        $vBC  = number_format($fede['vBC'], 2, '.', '');
        $pCOFINS = $fede['pCof'];
        $vCOFINS = $fede['vCof'];
      }
    }
    $resp = $nfe->tagCOFINS($nItem, $cst, $vBC, $pCOFINS, $vCOFINS, $qBCProd, $vAliqProd);
    $xmlString .= "<br>tagCOFINS" . $resp->nodeValue;

    $vTotCofins += $vCOFINS;
  }

  //PISST
  //$resp = $nfe->tagPISST($nItem, $vBC, $pPIS, $qBCProd, $vAliqProd, $vPIS);


  /*
  //COFINS - Contribuição para o Financiamento da Seguridade Social
  $nItem = 1; //produtos 1
  $cst = '03'; //Operação Tributável (base de cálculo = quantidade vendida x alíquota por unidade de produto)
  $vBC = '';
  $pCOFINS = '';
  $vCOFINS = '81.84';
  $qBCProd = '60.00';
  $vAliqProd = '0.682';
  $resp = $nfe->tagCOFINS($nItem, $cst, $vBC, $pCOFINS, $vCOFINS, $qBCProd, $vAliqProd);

  $nItem = 2; //produtos 2
  $cst = '01'; //Operação Tributável (base de cálculo = (valor da operação * alíquota normal) / 100
  $vBC = '180.00';
  $pCOFINS = '3.00';
  $vCOFINS = '10.80';
  $qBCProd = '';
  $vAliqProd = '';
  $resp = $nfe->tagCOFINS($nItem, $cst, $vBC, $pCOFINS, $vCOFINS, $qBCProd, $vAliqProd);
  */
  //COFINSST
  //$resp = $nfe->tagCOFINSST($nItem, $vBC, $pCOFINS, $qBCProd, $vAliqProd, $vCOFINS);

  //II
  //$resp = $nfe->tagII($nItem, $vBC, $vDespAdu, $vII, $vIOF);

  //ICMSTot
  //$resp = $nfe->tagICMSTot($vBC, $vICMS, $vICMSDeson, $vBCST, $vST, $vProd, $vFrete, $vSeg, $vDesc, $vII, $vIPI, $vPIS, $vCOFINS, $vOutro, $vNF, $vTotTrib);

  //ISSQNTot
  //$resp = $nfe->tagISSQNTot($vServ, $vBC, $vISS, $vPIS, $vCOFINS, $dCompet, $vDeducao, $vOutro, $vDescIncond, $vDescCond, $vISSRet, $cRegTrib);

  //retTrib
  //$resp = $nfe->tagretTrib($vRetPIS, $vRetCOFINS, $vRetCSLL, $vBCIRRF, $vIRRF, $vBCRetPrev, $vRetPrev);

  //Inicialização de váriaveis não declaradas...
  $vII    = isset($vII) ? $vII : 0;
  $vIOF   = isset($vIOF) ? $vIOF : 0;
  $vISS   = isset($vISS) ? $vISS : 0;

  $vIPI   = isset($vIPI) ? $vIPI : 0;
  $vPIS   = isset($vPIS) ? $vPIS : 0;
  $vCOFINS= isset($vCOFINS) ? $vCOFINS : 0;
  $vICMS  = isset($vICMS) ? $vICMS : 0;
  $vBCST  = isset($vBCST) ? $vBCST : 0;
  $vST    = isset($vST)   ? $vST   : 0;

  /* Nfe4.00 Totalizadores do FCP - Fundo de combate a pobreza */
  $vFCP     = isset($vTotFCP)   ? number_format($vTotFCP      , 2, '.', ''): '0.00';
  $vFCPST   = isset($vTotFCPST) ? number_format($vTotFCPST    , 2, '.', ''): '0.00';
  $vFCPSTRet= isset($vFCPSTRet) ? number_format($vTotFCPSTRet , 2, '.', ''): '0.00';
  $vIPIDevol= isset($vIPIDevol) ? number_format($vIPIDevol    , 2, '.', ''): '0.00';
  
  $vBC      = isset($vTotProd ) ? number_format($vTotProd     , 2, '.', ''): '0.00';
  $vBCST    = isset($vTotBCST ) ? number_format($vTotBCST     , 2, '.', ''): '0.00';
  $vIPI     = isset($vTotIPI  ) ? number_format($vTotIPI      , 2, '.', ''): '0.00';
  $vST      = isset($vTotVLST ) ? number_format($vTotVLST     , 2, '.', ''): '0.00';

  $vICMSDeson = '0.00';

  $vFrete = number_format($vTotFrete, 2, '.', ''); // '0.00';
  $vSeg   = '0.00';
  $vDesc  = '0.00';
  $vII    = '0.00';
  $vOutro = '0.00';

  
  // Nota Fiscal diferente de Nota de Devolução, para ST e IPI
  if(!$finNFe=="4"){
    $vBCST  = number_format($vTotBCST, 2, '.', '');   // '1030.80'; // $vST    = '51.50';
    $vIPI   = number_format($vTotIPI , 2, '.', '');    // '50.40';
    $vST    = number_format($vTotVLST, 2, '.', '');
    }

    $vProd  = number_format($vTotProd  , 2, '.', '');  // '1200.00';
    $vBCICMS= number_format($vTotBCICMS, 2, '.', '');
    $vICMS  = number_format($vTotVLICMS  , 2, '.', '');    // '288.00';
    $vPIS   = number_format($vTotPIS   , 2, '.', '');    // '41.70';
    $vCOFINS= number_format($vTotCofins, 2, '.', ''); // '92.64';
    $vIPI   = number_format($vTotIPI   , 2, '.', ''); // '92.64';
  
    $vNF     = number_format($vProd-$vDesc-$vICMSDeson+$vST+$vFrete+$vSeg+$vOutro+$vII+$vIPI, 2, '.', '');
    $vTotTrib= number_format($vICMS+$vST+$vII+$vIPI+$vPIS+$vCOFINS+$vIOF+$vISS+$vFCP, 2, '.', '');

    $vBC     = number_format($vBCICMS, 2, '.', '');

    /* Em Caso de Simples Nacional Finalidade 1 Não informar a BC do ICMS*/
    if($cRegTrib=="4" && $finNFe=="1"){
      $vBC = "0.00";
    }

    /* Em Caso de Regime Normal e ICMS = 0, não informar BC do ICMS */
    if($cRegTrib=="1" && $vICMS==0){
      $vBC = "0.00";
    }
    /*
	REMOVIDO EM 28/09/2018 09:46 | $vBC     = number_format($vBC, 2, '.', '');
    
    echo "<br>ICMSTot:vBC=$vBC";
    echo "<br>ICMSTot:vICMS=$vICMS";
    exit;
    */
    
    $resp     = $nfe->tagICMSTot(
          $vBC , $vICMS, $vICMSDeson, $vFCP, $vBCST    , $vST , $vFCPST , $vFCPSTRet, $vProd, $vFrete  , 
          $vSeg, $vDesc, $vII       , $vIPI, $vIPIDevol, $vPIS, $vCOFINS, $vOutro   , $vNF  , $vTotTrib);

    $xmlString .= "<br>tagICMSTot" . $resp->nodeValue;

  /* Dados para Conhecimento de Transporte na Danfe */
  if(count($documentos_transporte)==0){
	
	/* Envio obrigatório de modalidade = 0 */
	$modFrete = "0"; // 0=Por conta do emitente; 1=Por conta do destinatário/remetente; 2=Por conta de terceiros; 9=Sem Frete;
    $resp     = $nfe->tagtransp($modFrete);
	
  } else{
    foreach ($documentos_transporte as $key => $registro) {
    global $tipo_ambiente;

    $mod  = $registro['mod'];

    //frete
    $modFrete = $registro['modFrete']; //0=Por conta do emitente; 1=Por conta do destinatário/remetente; 2=Por conta de terceiros; 9=Sem Frete;
    $resp     = $nfe->tagtransp($modFrete);

    
    /* Somente se informar a Transportadora */
    // transportadora
      $CNPJ = preg_replace("/[^0-9]/", "", $registro['CNPJ']);
      $CPF  = preg_replace("/[^0-9]/", "", $registro['CPF']); 
    
    if($CNPJ!='' or $CPF!=''){
      $xNome= $registro['xNome'];
      $IE   = $registro['IE'];
      $xEnder=$registro['xEnder'];
      $xMun  =$registro['xMun'];
      $UF    =$registro['xUF'];
      $resp = $nfe->tagtransporta($CNPJ, $CPF, $xNome, $IE, $xEnder, $xMun, $UF);  

      // valores retidos para transporte
      $vServ   = number_format($registro['vServ']   , 2, '.', ''); // Valor do Serviço
      $vBCRet  = number_format($registro['vBCRet']  , 2, '.', ''); // BC da Retenção do ICMS
      $pICMSRet= number_format($registro['pICMSRet'], 2, '.', ''); // Alíquota da Retenção
      $vICMSRet= number_format($registro['vICMSRet'], 2, '.', ''); // Valor do ICMS Retido
      $CFOP   =  $registro['CFOP'];
      $cMunFG =  $registro['cMunFG'];     // Código do município de ocorrência do fato gerador do ICMS do transporte
      $resp = $nfe->tagretTransp($vServ, $vBCRet, $pICMSRet, $vICMSRet, $CFOP, $cMunFG);
    }

    /* Somente se informar a placa do Veiculo */
      $placa= preg_replace("/[^A-Z0-9]/", "", strtoupper($registro['placa'])); // $registro['placa'];
      $UF   = $registro['UF'];
      $RNTC = $registro['RNTC'];
      
    if($placa!=''){
      // dados dos veiculos de transporte
      $resp = $nfe->tagveicTransp($placa, $UF, $RNTC);
      }
    }
  }


  /*
  // Dados originais de transporte de mercadorias
      // transportadora
    $CNPJ = '';
    $CPF = '12345678901';
    $xNome = 'Ze da Carroca';
    $IE = '';
    $xEnder = 'Beco Escuro';
    $xMun = 'Campinas';
    $UF = 'SP'; // xUF nome do campo
    $resp = $nfe->tagtransporta($CNPJ, $CPF, $xNome, $IE, $xEnder, $xMun, $UF);

    // valores retidos para transporte
    $vServ = '258,69'; //Valor do Serviço
    $vBCRet = '258,69'; //BC da Retenção do ICMS
    $pICMSRet = '10,00'; //Alíquota da Retenção
    $vICMSRet = '25,87'; //Valor do ICMS Retido
    $CFOP = '5352';
    $cMunFG = '3509502'; //Código do município de ocorrência do fato gerador do ICMS do transporte
    $resp = $nfe->tagretTransp($vServ, $vBCRet, $pICMSRet, $vICMSRet, $CFOP, $cMunFG);

    // dados dos veiculos de transporte
    $placa = 'AAA1212';
    $UF = 'SP';
    $RNTC = '12345678';
    $resp = $nfe->tagveicTransp($placa, $UF, $RNTC);


  */

  
  //dados dos reboques
  //$aReboque = array(
  //    array('ZZQ9999', 'SP', '', '', ''),
  //    array('QZQ2323', 'SP', '', '', '')
  //);
  //foreach ($aReboque as $reb) {
  //    $placa = $reb[0];
  //    $UF = $reb[1];
  //    $RNTC = $reb[2];
  //    $vagao = $reb[3];
  //    $balsa = $reb[4];
  //    //$resp = $nfe->tagreboque($placa, $UF, $RNTC, $vagao, $balsa);
  //}

  /*
  Dados dos Volumes Transportados
  $aVol = array(
      array('4','Barris','','','120.000','120.000',''),
      array('2','Volume','','','10.000','10.000','')
  );
  foreach ($aVol as $vol) {
      $qVol = $vol[0]; //Quantidade de volumes transportados
      $esp = $vol[1]; //Espécie dos volumes transportados
      $marca = $vol[2]; //Marca dos volumes transportados
      $nVol = $vol[3]; //Numeração dos volume
      $pesoL = intval($vol[4]); //Kg do tipo Int, mesmo que no manual diz que pode ter 3 digitos verificador...
      $pesoB = intval($vol[5]); //...se colocar Float não vai passar na expressão regular do Schema. =\
      $aLacres = $vol[6];
      $resp = $nfe->tagvol($qVol, $esp, $marca, $nVol, $pesoL, $pesoB, $aLacres);
  }
  */
  
  /* Somente enviar a Tag de Volumes, se informou a transportadora ou veiculo */
  if(count($documentos_transporte)>0){
	 /* Edival 29/01/2018 10:56 Inclusão dos volumes Transportados */
	 foreach ($documentos_volumes as $key => $registro) {
	  $qVol = intval($registro['qVol']); //Quantidade de volumes transportados
	  if($qVol>=1){
		  $esp  = $registro['esp']; //Espécie dos volumes transportados
		  $marca = $registro['marca']; //Marca dos volumes transportados
		  $nVol = $registro['nVol']; //Numeração dos volume
		  $pesoL = number_format($registro['pesoL'], 3, '.', ''); //Kg do tipo Int, mesmo que no manual diz que pode ter 3 digitos verificador...
		  $pesoB = number_format($registro['pesoB'], 3, '.', ''); //...se colocar Float não vai passar na expressão regular do Schema. =\
		  $aLacres = $registro['aLacres'];
		  $resp = $nfe->tagvol($qVol, $esp, $marca, $nVol, $pesoL, $pesoB, $aLacres);
	  }
	}	  
  }

  /*
  //dados da fatura
  $nFat = '000035342';
  $vOrig = '1200.00';
  $vDesc = '';
  $vLiq = '1200.00';
  $resp = $nfe->tagfat($nFat, $vOrig, $vDesc, $vLiq);

  //dados das duplicatas (Pagamentos)
  $aDup = array(
      array('35342-1','2016-06-20','300.00'),
      array('35342-2','2016-07-20','300.00'),
      array('35342-3','2016-08-20','300.00'),
      array('35342-4','2016-09-20','300.00')
  );
  foreach ($aDup as $dup) {
      $nDup = $dup[0]; //Código da Duplicata
      $dVenc = $dup[1]; //Vencimento
      $vDup = $dup[2]; // Valor
      $resp = $nfe->tagdup($nDup, $dVenc, $vDup);
  }
  */

  //*************************************************************
  //Grupo obrigatório para a NFC-e. Não informar para a NF-e.
  //$tPag = '03'; //01=Dinheiro 02=Cheque 03=Cartão de Crédito 04=Cartão de Débito 05=Crédito Loja 10=Vale Alimentação 11=Vale Refeição 12=Vale Presente 13=Vale Combustível 99=Outros
  //$vPag = '1452,33';
  //$resp = $nfe->tagpag($tPag, $vPag);

  //se a operação for com cartão de crédito essa informação é obrigatória
  //$CNPJ = '31551765000143'; //CNPJ da operadora de cartão
  //$tBand = '01'; //01=Visa 02=Mastercard 03=American Express 04=Sorocred 99=Outros
  //$cAut = 'AB254FC79001'; //número da autorização da tranzação
  //$resp = $nfe->tagcard($CNPJ, $tBand, $cAut);
  //**************************************************************

  /* Edival - 05/06/2018 Adição da Tag Pagamentos e Cartões para Nfe4.00 
  YA01-30 : Se campo finNFe <> 3 ou 4 deve ser preenchido o Grupo Informações de Pagamento. Observação: 
  Implementação por padrão, opcional a critério da UF
  NF-e normal, 2 - NF-e complementar
  */
  if(count($documentos_pagamentos)>0){
    foreach ($documentos_pagamentos as $key => $registro) {
        $tPag   = $registro['tPag'];
        $vPag   = number_format($registro['vPag']  , 2, '.', '');
        $vTroco = number_format($registro['vTroco'], 2, '.', '');

        $cnpj     = $registro['CNPJ'];
        $tBand    = $registro['tBand'];
        $cAut     = $registro['cAut'];
        $tpIntegra= $registro['tpIntegra'];
        $tBand    = $registro['tBand'];

        $resp_pag = $nfe->tagpag($tPag, $vPag, $vTroco, $tpIntegra, $cnpj, $tBand, $cAut);
    }
  }else if($finNFe >=3 or count($documentos_pagamentos)==0){
        $tPag     = '90';
        $vPag     = '0.00'; // isset($vPag)   ? number_format($vPag, 2, '.', '') : '0.00';
        $tpIntegra= '2';
        $cnpj     = '';
        $tBand    = '99';
        $cAut     = '';

        $resp_pag = $nfe->tagpag($tPag, $vPag, $vTroco, $tpIntegra, $cnpj, $tBand, $cAut);
  }
 
    

  /*  Venda Normal && Natureza da Operação = 6 Venda
      Acrescenta o Texto IBPT */
  $textoIBPT = '';

  if($finNFe=="1" && $natOpID=="6"){
    $federal = 0;
    $estadual= 0;
    $municipal=0;

    /* Calculo de carga tributária similar ao IBPT - Regime Normal - Lei 12.741/12 */
    if($cRegTrib!="4"){    
      $federal = number_format($vItemFede, 2, '.', '');
      $estadual= number_format($vItemTrib, 2, '.', '');
      $municipal=number_format('0.00'    , 2, '.', '');

      /*
      $federal    = number_format($vII+$vIPI+$vIOF+$vPIS+$vCOFINS, 2, ',', '.');
      $estadual   =  number_format($vICMS+$vST, 2, ',', '.');
      $municipal  = number_format($vISS, 2, ',', '.');
      // $totalT     = number_format($federal+$estadual+$municipal, 2, ',', '.');
      // $totalT     = number_format($vII+$vIPI+$vIOF+$vPIS+$vCOFINS+$vICMS+$vST+$vISS, 2, ',', '.');
      */
    }else{
      $qr_tributos= $NfeCode->getTributos();
      
      if(count($qr_tributos)){
        $federal  = number_format($qr_tributos[0]['vl_nacional'] , 2, '.', ''); /* era '.', ',' */
        $estadual = number_format($qr_tributos[0]['vl_estadual'] , 2, '.', '');
        $municipal= number_format($qr_tributos[0]['vl_municipal'], 2, '.', '');
      }
    }

    $totalT = $federal + $estadual + $municipal;

    $vIBPT_f = number_format($federal  , 2, ',', '.');
    $vIBPT_e = number_format($estadual , 2, ',', '.');
    $vIBPT_m = number_format($municipal, 2, ',', '.');
    $vIBPT_t = number_format($totalT   , 2, ',', '.');

     $textoIBPT  = "Valor Aprox. Tributos R$ {$vIBPT_t} - R$ {$vIBPT_f} Federal, R$ {$vIBPT_e} Estadual e R$ {$vIBPT_m} Municipal. Lei 12.741/12";   

    /*
    $textoIBPT  = "Valor Aprox. Tributos R$ {$totalT} - R$ {$federal} Federal, R$ {$estadual} Estadual e R$ {$municipal} Municipal. Lei 12.741/12";
    */
  }

  //Informações Adicionais
  //$infAdFisco = "SAIDA COM SUSPENSAO DO IPI CONFORME ART 29 DA LEI 10.637";
  $infAdFisco = "";
  $infCpl .= " " . preg_replace( "/\r|\n/", "", $textoIBPT);
  $textoSemEnter = preg_replace( "/\r|\n/", "", $infCpl);

  $resp = $nfe->taginfAdic($infAdFisco, $textoSemEnter);
  $xmlString .= "<br>taginfAdic" . $resp->nodeValue;
  
  //observações emitente
  //$aObsC = array(
  //    array('email','roberto@x.com.br'),
  //    array('email','rodrigo@y.com.br'),
  //    array('email','rogerio@w.com.br'));
  //foreach ($aObsC as $obs) {
  //    $xCampo = $obs[0];
  //    $xTexto = $obs[1];
  //    $resp = $nfe->tagobsCont($xCampo, $xTexto);
  //}

  //observações fisco
  //$aObsF = array(
  //    array('email','roberto@x.com.br'),
  //    array('email','rodrigo@y.com.br'),
  //    array('email','rogerio@w.com.br'));
  //foreach ($aObsF as $obs) {
  //    $xCampo = $obs[0];
  //    $xTexto = $obs[1];
  //    //$resp = $nfe->tagobsFisco($xCampo, $xTexto);
  //}

  //Dados do processo
  //0=SEFAZ; 1=Justiça Federal; 2=Justiça Estadual; 3=Secex/RFB; 9=Outros
  //$aProcRef = array(
  //    array('nProc1','0'),
  //    array('nProc2','1'),
  //    array('nProc3','2'),
  //    array('nProc4','3'),
  //    array('nProc5','9')
  //);
  //foreach ($aProcRef as $proc) {
  //    $nProc = $proc[0];
  //    $indProc = $proc[1];
  //    //$resp = $nfe->tagprocRef($nProc, $indProc);
  //}

  //dados exportação
  //$UFSaidaPais = 'SP';
  //$xLocExporta = 'Maritimo';
  //$xLocDespacho = 'Porto Santos';
  //$resp = $nfe->tagexporta($UFSaidaPais, $xLocExporta, $xLocDespacho);

  //dados de compras
  //$xNEmp = '';
  //$xPed = '12345';
  //$xCont = 'A342212';
  //$resp = $nfe->tagcompra($xNEmp, $xPed, $xCont);

  //dados da colheita de cana
  //$safra = '2014';
  //$ref = '01/2014';
  //$resp = $nfe->tagcana($safra, $ref);
  //$aForDia = array(
  //    array('1', '100', '1400', '1000', '1400'),
  //    array('2', '100', '1400', '1000', '1400'),
  //    array('3', '100', '1400', '1000', '1400'),
  //    array('4', '100', '1400', '1000', '1400'),
  //    array('5', '100', '1400', '1000', '1400'),
  //    array('6', '100', '1400', '1000', '1400'),
  //    array('7', '100', '1400', '1000', '1400'),
  //    array('8', '100', '1400', '1000', '1400'),
  //    array('9', '100', '1400', '1000', '1400'),
  //    array('10', '100', '1400', '1000', '1400'),
  //    array('11', '100', '1400', '1000', '1400'),
  //    array('12', '100', '1400', '1000', '1400'),
  //    array('13', '100', '1400', '1000', '1400'),
  ///    array('14', '100', '1400', '1000', '1400')
  //);
  //foreach ($aForDia as $forDia) {
  //    $dia = $forDia[0];
  //    $qtde = $forDia[1];
  //    $qTotMes = $forDia[2];
  //    $qTotAnt = $forDia[3];
  //    $qTotGer = $forDia[4];
  //    //$resp = $nfe->tagforDia($dia, $qtde, $qTotMes, $qTotAnt, $qTotGer);
  //}

  $xmlString .= "<br>taginfAdic" . $resp->nodeValue;
  
  //monta a NFe e retorna na tela
  $resp = $nfe->montaNFe();
  if ($resp) {
      global $ok ;
      global $path_nfephp;

      $msg   = '';
      $status= 1;    // Status para o Processamento 1, GerarXML;

      try{
      // header('Content-type: text/xml; charset=UTF-8');
      $xml = $nfe->getXML();
	    $xml = preg_replace("/[\n\r\t]/","",$xml);
	  
      if($tipo_ambiente=='1'){
          $filename = "$path_nfephp/xmls/nfe/producao/entradas/{$chave}-nfe.xml";    // Ambiente Produção
      }else{
          $filename = "$path_nfephp/xmls/nfe/homologacao/entradas/{$chave}-nfe.xml"; // Ambiente Homologação
      }
      /* 28/09/2018 13:32 Forçar a remoção do xml caso exista */
      if(file_exists($filename)){
        unlink($filename);
      }
      file_put_contents($filename, $xml);
      chmod($filename, 0777);
      
    /*
    $msg = "Nota Fiscal " . substr('00000000' . $nNF, -8) . " XML criado" ;
	  echo "<br><a href='$filename'>CLIQUE AQUI PARA VISUALIZAR</a>";
	  exit;
    */
    
      }catch(Exception $e) {
        //header("Location:nfe_code_status.php");
        $ok = false;
        $msg   = $e->getMessage();
        $status= 0;
      }

      $NfeCode->bd_includeStatus(1, $chave, $filename, $msg, $status, $xml);

   }else {
      $ok = false;
      // header('Content-type: text/html; charset=UTF-8');
      foreach ($nfe->erros as $err) {
          $msg .= 'tag: &lt;'.$err['tag'].'&gt; ---- '.$err['desc'].'<br>';
      }
    }
    return $ok;
}

  function nfe_AssinaXml(){
    global $chave;
    global $NfeCode;
    global $path_nfephp;
    global $tipo_ambiente;

    // $chave = '52160500067985000172550010000000101000000100'; $chave_c = $GET['chave'];
    $sNFE    = substr($chave, 35, 8);
    $status = 1;
    $ok     = false;

    global $id_doc;

    try {
      // $filename = "c:/Apache24/htdocs/nfephp/xmls/nfe/homologacao/assinadas/{$chave}-nfe.xml"; // Ambiente Homologação Windows

      $p_folder = 'homologacao';
      if($tipo_ambiente=='1'){
        $p_folder = 'producao';
      }

      $filename = "$path_nfephp/xmls/nfe/{$p_folder}/entradas/{$chave}-nfe.xml"; // Ambiente Windows
      $xml = file_get_contents($filename);

      // $nfe = new ToolsNFe('../../config/config.json');
      $nfe = new ToolsNFe("$path_nfephp/config/config.json");
      $xml = $nfe->assina($xml);

      $filename = "$path_nfephp/xmls/nfe/{$p_folder}/assinadas/{$chave}-nfe.xml"; // Ambiente 

      /* 28/09/2018 13:32 Forçar a remoção do xml caso exista */
      if(file_exists($filename)){
        unlink($filename);
      }

      $xml = preg_replace("/[\n\r\t]/","", $xml);
      
      file_put_contents($filename, $xml);
      chmod($filename, 0777);
      $msg      = "";
      $status=1;

      /*
      echo "<br>BLOQUEIO ANTES DE ENVIAR A NFE";
      echo "<a href='$filename'>CLIQUE AQUI PARA VISUALIZAR O ARQUIVO ASSINADO!</a>";
      exit;
      */

    } catch(Exception $e) {
      // var_dump($e->getMessage());
      $msg = $e->getMessage();
      $ok = false;
      $status= 2;
    }

    $NfeCode->bd_includeStatus(2, $chave, $filename, $msg, $status);

  }

  function nfe_EnviaXml(){

    global $chave;
    global $NfeCode;
    global $tipo_ambiente;
    global $path_nfephp;

    $nfe = new ToolsNFe("$path_nfephp/config/config.json");
    $nfe->setModelo('55');

    $sNFE  = substr($chave, 35, 8);
    $status= 1;
    $ok = false;

    $aResposta = array();
    try{
      $p_folder = 'homologacao';
      if($tipo_ambiente=='1'){
        $p_folder = 'producao';
      }

      $filename = "$path_nfephp/xmls/nfe/$p_folder/assinadas/{$chave}-nfe.xml";

      if(!file_exists($filename)){
        $msg = "arquivo xml não existe";
        $st_status = 0;
      }else{
        $aXml = file_get_contents($filename); // Ambiente Windows

        $idLote = '';
        $indSinc = '1';
        $flagZip = false;

        $ok = $nfe->sefazEnviaLote($aXml, $tipo_ambiente, $idLote, $aResposta, $indSinc, $flagZip);

  	  // Atualiza o Número do Recibo e Final de Transmissão
  	  $NfeCode->bd_updateRecibo($aResposta);

  	  /* Atualiza o Status da Transmissão;
        $NfeCode->bd_includeStatus(3, $chave, $filename, $msg, $ok);

        */

        // $msg = "cStat=" . $aResposta['cStat'] .";xMotivo=" . $aResposta['xMotivo'] . ";nRec=" . $aResposta['nRec'];
        if($ok!=false){
          $msg = "xMotivo=" . $aResposta['xMotivo'];
        }
      }
    }catch(Exception $e) {
      // var_dump($e->getMessage());
      $msg = $e->getMessage();
      $ok  = false;
      $status = 0;
    }

    // retorna o array inteiro para check;
    return $aResposta;
  }

  // valida o arquivo xml gerado
  function nfe_ValidaXml(){
    global $chave;
    // global $nfeTools;
    global $tipo_ambiente;
    global $path_nfephp;

    $nfeTools = new ToolsNFe("$path_nfephp/config/config.json");
    $nfeTools->setModelo('55');

    $p_file_dir = 'homologacao';
    $p_erros_ret = array();
    
    if($tipo_ambiente=="1"){
      $p_file_dir = 'producao';
    }

    // $xml = "C:/Apache24/htdocs/nfephp/xmls/nfe/{$p_file_dir}/assinadas/{$chave}-nfe.xml"; // Ambiente Windows
    $xml = "$path_nfephp/xmls/nfe/{$p_file_dir}/assinadas/{$chave}-nfe.xml"; // Ambiente Windows

    $nfeTools->validarXml($xml);

    if(!file_exists($xml)){
      $msg      = "<br>arquivo não existe!";
      $st_ativo = 0;
    }else if (count($nfeTools->errors)>0) {
        // echo "<br><br>Erros :" . Count($nfe->errors);
        foreach ($nfeTools->errors[0] as $erro) {
          $ds_incluir = "nfe_ValidaXml:0:" . preg_replace("/[\n\r\t]/","",$erro);
          if($ds_incluir!=""){
            array_push($p_erros_ret, $ds_incluir);
          }
        }
    }

    array_push($p_erros_ret, "nfe_FileName:1:<a href='$xml'/>{$chave}</a>");

    return $p_erros_ret;
  }

  // Cálculo do IVA-ST ou MVA-ST
  function nfe_CalculaSt($p_mva_orig, $p_aliq_inter, $p_aliq_intra){
    // IVA-ST ajustado = [(1+IVA-ST original) x (1 - ALQ inter) / (1- ALQ intra)] -1, onde:
    
    $get_ret = 0;
    $get_ret = number_format((1 + ($p_mva_orig / 100)) * (1 - $p_aliq_inter / 100) / (1- $p_aliq_intra / 100) -1, 4, '.', '');
    return  $get_ret;
  }


  function sanitizeString($str)
  {
      return str_replace("?",'',
              strtr(
              utf8_decode(html_entity_decode($str)),
              utf8_decode('ÀÁÃÂÉÊÍÓÕÔÚÜÇÑàáãâéêíóõôúüçñ'),
              'AAAAEEIOOOUUCNaaaaeeiooouucn')
              );
  }

?>
