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

// Banco de Dados
require_once 'connect.php';
require_once 'messages.php';
require_once "nfecode_class.php";

require_once 'api/nfephp/bootstrap.php';

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

class NfeCodeXml{
    
    /* Variáveis de retorno do BD */
    private $documentos_emitente  = array();
    private $documentos_saida     = array();
    private $documentos_cliente   = array();
    private $documentos_produto   = array();
    private $documentos_transporte= array();
    private $documentos_volumes   = array();
    private $documentos_tributos  = array();
    private $documentos_pagamentos= array();
    
    private $id_doc_sai = 0;
    
    private $set_msg = array();
    
    /* Regime Tributário da Empresa
     1	Lucro Arbitrado
     2	Lucro Real
     3	Lucro Presumido
     4	Simples Nacional
     */
    private $cRegTrib = 2;
    private $tpNF     = '';
    private $tipo_ambiente = '2'; // Ambiente 1 Produção, 2 Homologação - Windows
    private $p_folder = 'homologacao';
    private $chave    = '';
    private $path_nfephp='api/nfephp';
    private $vTotTrib = 0.00;
    
    // métodos mágicos get e set
    public function __set($atrib, $value){
        $this->$atrib = $value;
    }
    
    public function __get($atrib){
        return $this->$atrib;
    }
    
    function __construct() {
        $usuario = getLoggedUser();
        $this->id_usuario = $usuario['id'];
        
        $this->NfeCode = new NfeCode();
        $this->tipo_ambiente = $this->NfeCode->getAmbiente();
        
        if($this->tipo_ambiente=="1"){
            $this->p_folder = "producao";
        }
        
        $this->path_nfephp = $this->NfeCode->getPathNFEPHP();
        
        /*
         $nfe = new MakeNFe();
         $nfeTools = new ToolsNFe('api/nfephp/config/config.json');*/
        
    }
    
    function getSQL($consulta){
        global $conexao;
        
        $ar_retorno = array();
        $resultado = mysqli_query($conexao, $consulta) or die ($erro = mysqli_error($conexao));
        if (mysqli_num_rows($resultado)>0) {
            while ($registro = mysqli_fetch_assoc($resultado)){
                array_push($ar_retorno, $registro);
            }
        }
        return $ar_retorno;
    }
    
    function getDados($id_documento){
        $r_getDados = true;
        
        $this->id_doc_sai = $id_documento;
        
        // Obtendo as informações do BD para
        $NfeCode = new NfeCode();
        $NfeCode->setNrNota($this->id_doc_sai);
        
        $this->documentos_emitente = $NfeCode->getEmitente();
        $this->documentos_saida    = $NfeCode->getDocumento();
        $this->documentos_cliente  = $NfeCode->getCliente();
        $this->documentos_produto  = $NfeCode->getProdutos();
        $this->documentos_transporte=$NfeCode->getTransporte(); // Edival Inclusão em: 23/01/2018 23:32
        $this->documentos_volumes   =$NfeCode->getVolumes();
        $this->documentos_pagamentos=$NfeCode->getPagamentos(); // Nfe4.00 { Não Obrigatória ! };
        $this->documentos_tributos  =$NfeCode->getTributos();
        
        $this->tipo_ambiente       = $NfeCode->getAmbiente();
        
        if(count($this->documentos_emitente)==0){
            array_push($this->set_msg, "Não foi possível encontrar o emitente da NFE: $this->id_doc_sai");
            $r_getDados = false;
        }
        
        if(count($this->documentos_saida)==0){
            array_push($this->set_msg, "Não foi possível encontrar o Dados da NFE: $this->id_doc_sai");
            $r_getDados = false;
        }
        
        if(count($this->documentos_cliente)==0){
            array_push($this->set_msg, "Não foi possível encontrar o Cliente da NFE: $this->id_doc_sai");
            $r_getDados = false;
        }
        
        if(count($this->documentos_produto)==0){
            array_push($this->set_msg, "Não foi possível encontrar os Produtos da NFE: $this->id_documento");
            $r_getDados = false;
        }
        
        if(count($this->documentos_tributos)==0){
            array_push($this->set_msg, "Não foi possível encontrar os Tributos da NFE: $this->id_documento");
            $r_getDados = false;
        }
        
        $this->NfeCode = $NfeCode;
        
        return $r_getDados;
    }
    
    function nfe_GeraXml(){
        $nfe = new MakeNFe();
        $nfeTools = new ToolsNFe("$this->path_nfephp/config/config.json");
        
        /* faz a numeração do item do produto, para nao ocasionar erros */
        $p_num_item = 1;
        foreach ($this->documentos_produto as $key => $value) {
            # code...
            $this->documentos_produto[$key]['nItem']=$p_num_item;
            $p_num_item ++;
        }
        
        // Informações do Emitente da Nota Fiscal
        foreach ($this->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'];
            $this->cRegTrib= $registro['cRegTrib'];
        }
        
        
        //Dados da NFe - infNFe
        foreach ($this->documentos_saida as $key => $registro) {
            
            $mod    = $registro['mod'];
            $serie  = $registro['serie'] ;
            $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.
            $this->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($this->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 = $nfeTools->aConfig['cnpj']  ;
            
            
            $this->chave = $nfe->montaChave($cUF, $ano, $mes, $cnpj, $mod, $serie, $nNF, $tpEmis, $cNF);
            
            $versao= '4.00';
            $resp  = $nfe->taginfNFe($this->chave, $versao);
            
            $this->xmlString = "";
            $this->xmlString .= "<br>taginfNFe" . $resp->nodeValue;
            
            $cDV = substr($this->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
        // echo "<br>" . $this->xmlString;
        
        $resp = $nfe->tagide($cUF, $cNF, $natOp, $indPag, $mod, $serie, $nNF, $dhEmi, $dhSaiEnt, $tpNF, $idDest, $cMunFG, $tpImp, $tpEmis, $cDV, $this->tipo_ambiente, $this->finNFe, $indFinal, $indPres, $procEmi, $verProc, $dhCont, $xJust);
        $this->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($this->finNFe=="4"){
            if($p_refNfe==""){
                echo "É obrigatório informar a chave de referencia da NFE";
                exit;
            }else{
                $resp = $nfe->tagrefNFe($p_refNfe);
                $this->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 = $nfeTools->aConfig['cnpj'];
        $CPF = ''; // Utilizado para CPF na nota
        $xNome= $nfeTools->aConfig['razaosocial'];
        $xFant= $nfeTools->aConfig['nomefantasia'];
        $IE   = substr("000000000000" . $nfeTools->aConfig['ie'], -12);
        $IEST = $nfeTools->aConfig['iest'];
        $IM   = $nfeTools->aConfig['im'];
        $CNAE = $nfeTools->aConfig['cnae'];
        $CRT  = $nfeTools->aConfig['regime'];
        $resp = $nfe->tagemit($CNPJ, $CPF, $xNome, $xFant, $IE, $IEST, $IM, $CNAE, $CRT);
        
        $this->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);
        $this->xmlString .= "<br>tagenderEmit" . $resp->nodeValue;
        
        // if(isset($_POST['incluir'])){
        // Obtendo as informações do Cliente ou Tomador na Nomenclatura da Nota Fiscal
        foreach ($this->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'];
            
            // 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'];
            $IE       = $registro['IE'];
            $ISUF         = '' . $registro['ISUF'];
            $idEstrangeiro= $registro['idEstrangeiro'];
            $IM           = $registro['IM'];// '4128095';
            $email        = '' . $registro['email'];
            
            // echo "<br><br>Tamanho do Campo número é:" . strlen($registro['nro']);
            
            //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);
        $this->xmlString .= "<br>tagdest" . $resp->nodeValue;
        
        $resp = $nfe->tagenderDest($xLgr, $nro, $xCpl, $xBairro, $cMun, $xMun, $UF, $CEP, $cPais, $xPais, $fone);
        $this->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);
         }
         }*/
        
        /*echo "passei por aqui";
         echo $this->xmlString;
         exit;*/
        
        // $i_itens = Count($_POST['p_id_ite']);
        
        /* echo "<br>" . $_POST['fl_indtotal'][0] . "***"; exit;*/
        
        $id_cfop = '';
        
        if($this->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'    => '');
         }*/
        
        $this->vTotProd = 0;
        $this->vTotFrete   = 0;    // Soma geral de todos os fretes de produtos
        $this->vTotPedFrete= 0; // Utilizado para comparar diferenças do total do frete x produtos
        foreach ($this->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'];
            $vFrete  = ''; // $prod['vFrete'];
            $vSeg    = ''; // $prod['vSeg'];
            $vDesc   = ''; // $prod['vDesc'];
            $vOutro  = ''; // $prod['vOutro'];
            $indTot  = $prod['indTot'];
            $xPed = $prod['xPed'];
            $nItemPed = $prod['nItem'];
            $nFCI = $prod['nFCI'];
            
            if($cEAN==''){
                $cEAN = 'SEM GTIN';
            }
            
            if($cEANTrib==''){
                $cEANTrib = 'SEM GTIN';
            }
            
            
            /* Somente enviar a Tag de Frete do Produto caso maior que Zero */
            if($prod['vFrete']>0){
                $vFrete = number_format($prod['vFrete'], 2, '.', '');
                $this->vTotFrete += $vFrete;
                
                /* Total do Frete no Pedido */
                $this->vTotPedFrete = number_format($prod['vl_frete'], 2, '.', '');
                
                /* Ajustar diferença de 0.01 centavo do Frete para último Item */
                if($nItem == count($this->documentos_produto) && $this->vTotPedFrete > $this->vTotFrete ){
                    $vFrete         += $this->vTotPedFrete - $this->vTotFrete;
                    $this->vTotFrete+= $this->vTotPedFrete - $this->vTotFrete;
                }
                
                $vFrete    = number_format($vFrete   , 2, '.', '');
                $this->vTotFrete = number_format($this->vTotFrete, 2, '.', '');
                
                /*
                 echo "<br>Item          $nItem de produtos: " . count($documentos_produto);
                 echo "<br>vFrete        $vFrete";
                 echo "<br>vTotFrete     $vTotFrete";
                 echo "<br>vTotPedFrete  $vTotPedFrete";
                 */
            }
            
            $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);
            
            $this->vTotProd += $vProd;
            
            $this->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 ($this->documentos_produto as $key => $prod) {
            $nItem = $prod['nItem'];
            $vItemTrib = 0;
            $vItemFede = 0;
            $vItemIPI  = 0;
            $vBC = 0;
            $this->vBCDevol = 0;
            
            $iItem = $prod['nItem'];
            $tipo  = '' . $prod['trib'];
            
            // Faz o acerto da formula iva em caso de icms 10, substituição tributária
            if(strpos("10,30,60,70", $tipo)>=0){
                
                // Somente calcular para estados diferentes
                // Base fixa de 0.21951 que corresponde a 18% para o estado de SP
                if($UFEmit!=$UFDest){
                    /*
                     $pIVA = 0.21951;
                     $vIC  = round($vBC  * $pIVA, 2);
                     $vIVA = round($vBC  + $vIC , 2);
                     $vBCST= round($vIVA + ($vIVA * 0.11), 2);    // 11% IVA Original do Produto Cafe
                     $vICMSST = round(($vBCST * 0.18) - $vIC, 2); // Valor do ICMSST será a diferença do IVA - ICMS
                     */
                    
                    $pIVA  = $prod['pIVA'];
                    $pInter= $prod['pInter'];
                    $pIntra= $prod['pIntra'];
                    
                    $pCalcSt = nfe_CalculaSt($pIVA, $pInter, $pIntra);
                    $vBCST   = round($vBC + ( $vBC * $pCalcSt), 2);
                    $vICMSST = round($vBCST * $pCalcSt, 2);
                    
                    // chave corrente do array para alteração
                    $index = key($prod);
                    $prod['vBCST']  = $vBCST;
                    $prod['pICMSST']= round($pCalcSt, 2);  // round($pIVA, 2);
                    $prod['vICMSST']= round($vICMSST, 2);
                    
                    $this->documentos_produto[$key]['vBCST']  = $vBCST;
                    $this->documentos_produto[$key]['pICMSST']= round($pIVA, 2);
                    $this->documentos_produto[$key]['vICMSST']= round($vICMSST, 2);
                }
                
                // echo "<br>vBCST = " . $prod['vBCST'];
                
                // troca o cst em caso de devolução
                
                /*
                 if($this->finNFe=="4"){
                 $prod['trib']  = "00";
                 $this->documentos_produto[$key]['trib'] = "00";
                 }
                 */
                
                // Acumula o valor do ICMS para a Nota
            }
            
            /* FCP enviar a tag somente para estes tributos*/
            if(strpos("00,10,20,51,70,90", $tipo)>=0){
                $vItemTrib += $prod['vFCP'];
            }
            
            /* PIS, Cofins e ICMS somente para empresas regime normal */
            if($this->cRegTrib!="4"){
                $vItemTrib += $prod['vICMS'];
                $vItemTrib += $prod['vICMSST'];
                
                $vItemFede += $prod['vPIS'];
                $vItemFede += $prod['vCof'];
                $vItemIPI  += $prod['vIPI'];
                
                $vTotTrib = $vItemTrib + $vItemFede + $vItemIPI;
                
            }else{ // Simples Nacional não pasar Tributos
                $vTotTrib = 0.00;
            }
            
            $vTribImposto = number_format($vTotTrib, 2, '.', '');
            
            $resp = $nfe->tagimposto($nItem, $vTribImposto);
        }
        
        
        //$this->xmlString .= "<br>tagimposto" . $resp->nodeValue;
        /*
         //Impostos
         $nItem = 1; //produtos 1
         $vTotTrib = '449.90'; // 226.80 ICMS + 51.50 ICMSST + 50.40 IPI + 39.36 PIS + 81.84 CONFIS
         $resp = $nfe->tagimposto($nItem, $vTotTrib);
         $nItem = 2; //produtos 2
         $vTotTrib = '74.34'; // 61.20 ICMS + 2.34 PIS + 10.80 CONFIS
         $resp = $nfe->tagimposto($nItem, $vTotTrib);
         */
        
        $this->vTotBCICMS= 0;
        $this->vTotICMS  = 0;
        $this->vTotBCST  = 0;
        $this->vTotST    = 0;
        $this->vTotFCP   = 0;
        
        // Tributos de ICMS e ICMS 10
        foreach ($this->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 = '';
            $vBCFCP= ''; /* Zerar Base de Cálculo*/
            $pFCP  = '';
            $vFCP  = '';
            
            /* Nfe4.00, Fundo de Combate a Pobreza*/
            if(strpos("00,10,20,51,70,90", $tipo)>=0 and $this->cRegTrib){
                $vBCFCP= number_format($trib['vBCFCP'], 2, '.', '');
                $pFCP  = number_format($trib['pFCP']  , 2, '.', '');
                $vFCP  = number_format($trib['vFCP']  , 2, '.', '');
                
                $this->vTotFCP += $vFCP; // Totalizador na Nfe
            }
            
            $nItem = $trib['nItem']; //produtos 1
            $orig  = $trib['orig'];
            $cst   = $trib['trib']; // '00'; // Tributado Integralmente
            
            if($this->cRegTrib!="4"){
                $vBC =floatval($trib['vBC']   ) +
                floatval($trib['vFrete']);
                
                /* BASE DE CALCULO : mercadoria + frete + (IPI sendo consumidor final )*/
                if($indFinal=="1"){
                    $vBC += floatval($trib['vIPI']);
                }
                $this->vTotBCICMS += $vBC;
            }
            
            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 )
            }else if($cst=='10'){
                //ICMS 10
                $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   = $trib['vBCST']; // 1030.00 Pauta do Chope Claro 1000ml em GO R$ 8,59 x 60 Litros
                $pICMSST = $trib['pICMSST']; // GO para GO
                $vICMSST = $trib['vICMSST'];// '51.50'; // = (Valor da Pauta * Alíquota ICMS ST) - Valor ICMS Próprio
            }
            
            if(!$this->finNFe=="1"){
                $this->vTotBCST += $vBCST;
                $this->vTotST   += $vICMSST;
            }else{
                $this->vTotBCST += $trib['vBCST'];
                $this->vTotST   += $trib['vICMSST'];
            }
            
            /* 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($this->cRegTrib=="4"){
                /*Zerar Substituição tributária e ICMS para o Simples Nacional */
                $modBCST='';
                $vBCST  ='';
                $pICMSST='';
                $vICMSST='';
                $modBC= '';
                $vBC  = '';
                $pICMS= '';
                $vICMS= '';
                $pCredSN     = '';
                $vCredICMSSN = '';
                
                if($cst=="40"){
                    $csosn = "102";
                }else if($cst=="90"){
                    $csosn = "400";
                }else{
                    $csosn  = "400";
                }
                $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);
            }
            $this->vTotICMS += number_format($vICMS, 2, '.', '');
        }
        
        //$this->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);
        
        $this->vTotIPI = 0;
        
        // Tributos Federais - IPI
        // foreach($aF as $fitem){
        foreach ($this->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'];
            $pIPI = $fitem['pIPI']; //Calculo por alíquota - 6% Alíquota GO.
            
            /* 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($this->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);
            // $this->xmlString .= "<br>tagIPI" . $resp->nodeValue;
            
            $this->vTotIPI += number_format($vIPI , 2, '.', '');
            
        }
        
        $vTotPIS   = 0;
        $vTotCofins= 0;
        
        // Informações de PIS
        // foreach($aF as $fede){
        foreach ($this->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 COFINS */
            $qBCProd  = number_format('0.00', 4, '.', '');
            $vAliqProd= number_format('0.00', 4, '.', '');
            $vPIS     = number_format('0.00', 2, '.', '');
            
            if($this->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);
            
            if(!isset($this->vTotPIS)){
                $this->vTotPIS = 0;
            }
            
            $this->vTotPIS += number_format($vPIS , 2, '.', '');
        }
        
        // Informações de COFINS
        // foreach ($aF as $fede) {
        foreach ($this->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($this->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);
            $this->xmlString .= "<br>tagCOFINS" . $resp->nodeValue;
            
            if(!isset($this->vTotCofins)){
                $this->vTotCofins = 0;
            }
            $this->vTotCofins += number_format($vCOFINS, 2, '.', '');
        }
        
        
        //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, $this->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;
         $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;
         
         */
        $vBCICMS  = isset($this->vTotBCICMS	) ? number_format($this->vTotBCICMS   , 2, '.', ''): '0.00';
        $vICMS    = isset($this->vTotICMS  	) ? number_format($this->vTotICMS 	  , 2, '.', ''): '0.00';
        $vICMSDeson = '0.00';
        
        $vFCP     = isset($this->vTotFCP	) ? number_format($this->vTotFCP      , 2, '.', ''): '0.00';
        $vBCST    = isset($this->vTotBCST  	) ? number_format($this->vTotBCST     , 2, '.', ''): '0.00';
        $vST      = isset($this->vTotST    	) ? number_format($this->vTotST    	  , 2, '.', ''): '0.00';
        $vFCPST   = isset($this->vTotFCPST	) ? number_format($this->vTotFCPST    , 2, '.', ''): '0.00';
        $vFCPSTRet= isset($this->vFCPSTRet	) ? number_format($this->vTotFCPSTRet , 2, '.', ''): '0.00';
        
        $vProd  = number_format($this->vTotProd, 2, '.', '');  // '1200.00';
        $vFrete   = isset($this->vTotFrete ) ? number_format($this->vTotFrete , 2, '.', ''): '0.00';
        $vSeg   = '0.00';
        $vDesc  = '0.00';
        $vII    = '0.00';
        $vIOF   = isset($vIOF) ? $vIOF : 0;
        $vISS   = isset($vISS) ? $vISS : 0;
        
        $vIPI     = isset($this->vTotIPI   ) ? number_format($this->vTotIPI   , 2, '.', ''): '0.00';
        $vIPIDevol= isset($this->vIPIDevol ) ? number_format($this->vIPIDevol    , 2, '.', ''): '0.00';
        
        $vPIS    = isset($this->vTotPIS   ) ? number_format($this->vTotPIS   , 2, '.', ''): '0.00';
        $vCOFINS = isset($this->vTotCofins) ? number_format($this->vTotCofins, 2, '.', ''): '0.00';
        $vOutro  = '0.00'; // Verificar se somase dos tributos em caso de devolução
        
        // Nota Fiscal diferente de Nota de Devolução, para ST e IPI
        
        $vNF     = number_format($vProd-$vDesc-$vICMSDeson+$vST+$vFrete+$vSeg+$vOutro+$vII+$vIPI, 2, '.', '');
        
        if($this->cRegTrib=="4"){
            $vFCP = "0.00";
            $vTotTrib= "0.00";
        }else{
            $vTotTrib= number_format($vICMS+$vST+$vII+$vIPI+$vPIS+$vCOFINS+$vIOF+$vISS+$vFCP, 2, '.', '');
            $this->vTotTrib= number_format(
                floatval($this->vTotICMS) +
                floatval($this->vTotFCP ) +
                floatval($this->vTotIPI ) +
                floatval($this->vTotPIS ) +
                floatval($this->vTotCofins), 2, '.', '');
        }
        echo "<br>TOTAL DOS TRIBUTOS CALCULADOS : "  . $vTotTrib;
        echo "<br>vBCICMS"  . $vBCICMS;
        echo "<br>vICMS"    . $vICMS;
        echo "<br>vFCP "    . $vFCP;
        echo "<br>vPIS"     . $vPIS;
        echo "<br>vCOFINS"  . $vCOFINS;
        echo "<br>vIPI"     . $vIPI;
        
        echo "<br>";
        echo "<br>";
        echo "<br>";
        
        echo "<br>TOTAL DOS TRIBUTOS : "  . $this->vTotTrib;
        echo "<br>cRegTrib"  . $this->cRegTrib;
        echo "<br>vTotBCICMS". $this->vTotBCICMS;
        echo "<br>vTotICMS"  . $this->vTotICMS;
        echo "<br>vTotFCP "  . $this->vTotFCP;
        echo "<br>vTotPIS "  . $this->vTotPIS;
        echo "<br>vTotCofins "  . $this->vTotCofins;
        echo "<br>vTotIPI"  . $this->vTotIPI;
        
        echo "<br>TOTAL DOS NF : "  . $vNF;
        
        echo "<br>";
        echo "<br>";
        echo "<br>";
        
        $resp = $nfe->tagICMSTot(
            $vBCICMS , $vICMS, $vICMSDeson, $vFCP, $vBCST    , $vST , $vFCPST , $vFCPSTRet, $vProd, $vFrete  ,
            $vSeg, $vDesc, $vII       , $vIPI, $vIPIDevol, $vPIS, $vCOFINS, $vOutro   , $vNF  , $vTotTrib
            );
        
        // $this->xmlString .= "<br>tagICMSTot" . $resp->nodeValue;
        
        
        /* Dados para Conhecimento de Transporte na Danfe */
        if(count($this->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 ($this->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($this->documentos_transporte)>0 && count($this->documentos_volumes)>0){
            /* Edival 29/01/2018 10:56 Inclusão dos volumes Transportados */
            foreach ($this->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($this->documentos_pagamentos)>0){
            foreach ($this->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'];
            }
        }
        
        if($this->finNFe >=3 or count($this->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);
        
        $textoIBPT = '';
        
        if($this->finNFe=="1"  && $natOpID=="6"){
            /*
             // Calculo de carga tributária similar ao IBPT - Lei 12.741/12
             $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, ',', '.');
             
             echo "<pre>";
             print_r($qr_tributos);
             echo "</pre>";
             
             */
            
            $qr_tributos= $this->documentos_tributos; // $NfeCode->getTributos();
            $federal = 0;
            $estadual= 0;
            $municipal=0;
            
            if(count($qr_tributos)){
                $federal  = number_format($qr_tributos[0]['vl_nacional'] , 2, '.', '');
                $estadual = number_format($qr_tributos[0]['vl_estadual'] , 2, '.', '');
                $municipal= number_format($qr_tributos[0]['vl_municipal'], 2, '.', '');
            }
            
            $totalT = $federal + $estadual + $municipal;
            
            $textoIBPT  = "Valor Aprox. Tributos R$ {$totalT} - R$ {$federal} Federal, R$ {$estadual} Estadual e R$ {$municipal} Municipal. Lei 12.741/12";
        }
        
        /*echo "<br>federal : $federal";
         echo "<br>estadual: $estadual";
         echo "<br>municipal:$municipal";
         echo "<br>totalT   :$totalT";
         echo "<br>$textoIBPT";
         exit;*/
        
        //Informações Adicionais
        //$infAdFisco = "SAIDA COM SUSPENSAO DO IPI CONFORME ART 29 DA LEI 10.637";
        $infAdFisco = "";
        $infCpl .= " " . preg_replace( "/\r|\n/", "", $textoIBPT);
        
        /* Texto em Caso de Devolução */
        if($this->vBCDevol>0){
            $vBCDevol = number_format($this->vBCDevol, 2, '.', '');
            $vItemIPI = number_format($this->vItemIPI, 2, '.', '');
            
            $textoDevol = "Informação Complementar : Valor Base Cálc. IPI R$ {$vBCDevol}, Valor IPI R$ {$vItemIPI}";
            $infCpl .= $textoDevol;
        }
        
        $textoSemEnter = preg_replace( "/\r|\n/", "", $infCpl);
        $resp = $nfe->taginfAdic($infAdFisco, $textoSemEnter);
        // $xmlString .= "<br>taginfAdic" . $resp->nodeValue;
        
        /*echo "<br>$this->xmlString<br>";
         exit;
         */
        
        //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);
        //}
        
        $this->xmlString .= "<br>taginfAdic" . $resp->nodeValue;
        /*echo "<br>$this->xmlString<br>";
         exit;
         */
        
        //monta a NFe e retorna na tela
        $resp = $nfe->montaNFe();
        if ($resp) {
            $ok = true ;
            $msg   = '';
            $status= 1;    // Status para o Processamento 1, GerarXML;
            
            try{
                // header('Content-type: text/xml; charset=UTF-8');
                $xml = $nfe->getXML();
                if($this->tipo_ambiente=='1'){
                    $filename = "$this->path_nfephp/xmls/nfe/producao/entradas/{$this->chave}-nfe.xml";    // Ambiente Produção
                }else{
                    $filename = "$this->path_nfephp/xmls/nfe/homologacao/entradas/{$this->chave}-nfe.xml"; // Ambiente Homologação
                }
                
                if(file_exists($filename)){
                    unlink($filename);
                }
                
                file_put_contents($filename, $xml);
                chmod($filename, 0777);
                // echo $xml;
                
                echo "<a target='_blank' href='$filename'>Clique aqui para visualizar o arquivo </a>";
                
                
                
                // $msg = "Nota Fiscal " . substr('00000000' . $nNF, -8) . " XML criado" ;
                
            }catch(Exception $e) {
                //header("Location:nfe_code_status.php");
                $ok = false;
                $msg   = $e->getMessage();
                $status= 0;
            }
            
            $this->NfeCode->bd_includeStatus(1, $this->chave, $filename, $msg, $status, $xml);
            
        }else {
            $ok = false;
            // header('Content-type: text/html; charset=UTF-8');
            foreach ($this->nfe->erros as $err) {
                // echo 'tag: &lt;'.$err['tag'].'&gt; ---- '.$err['desc'].'<br>';
                $msg .= 'tag: &lt;'.$err['tag'].'&gt; ---- '.$err['desc'].'<br>';
            }
        }
        return $ok;
    }
    
    
    
    function nfe_AssinaXml(){
        
        // $this->chave = '52160500067985000172550010000000101000000100'; $this->chave_c = $GET['chave'];
        $sNFE    = substr($this->chave, 35, 8);
        // $nfe = new ToolsNFe('../../config/config.json');
        $nfe = new ToolsNFe("$this->path_nfephp/config/config.json");
        $status = 1;
        $ok     = false;
        
        try {
            // $filename = "/var/www/nfe/homologacao/entradas/{$this->chave}-nfe.xml"; // Ambiente Linux
            // $filename = "c:/Apache24/htdocs/nfephp/xmls/nfe/homologacao/entradas/{$this->chave}-nfe.xml"; // Ambiente Produção Windows
            // $filename = "c:/Apache24/htdocs/nfephp/xmls/nfe/homologacao/assinadas/{$this->chave}-nfe.xml"; // Ambiente Homologação Windows
            
            $filename = "$this->path_nfephp/xmls/nfe/{$this->p_folder}/entradas/{$this->chave}-nfe.xml"; // Ambiente Windows
            $xml = file_get_contents($filename);
            $xml = $nfe->assina($xml);
            
            $filename = "$this->path_nfephp/xmls/nfe/{$this->p_folder}/assinadas/{$this->chave}-nfe.xml"; // Ambiente Windows
            file_put_contents($filename, $xml);
            chmod($filename, 0777);
            $msg      = "";
            $status=1;
            // $msg = "Nota Fiscal $sNFE XML assinado";
            // $msg = "Nota Fiscal " . substr('00000000' . $nNF, -8) . "XML criado" ;
            
        } catch(Exception $e) {
            // var_dump($e->getMessage());
            $msg = $e->getMessage();
            $ok = false;
            $status= 0;
        }
        
        $this->NfeCode->bd_includeStatus(2, $this->chave, $filename, $msg, $status);
        
        /* echo "arquivo gerado com sucesso!<br><a href='$filename'>clique aqui para visualizar</a>";
         if ($ok !== false) {
         addError($msg);
         }*/
    }
    
    function nfe_EnviaXml(){
        $nfe = new ToolsNFe("$this->path_nfephp/config/config.json");
        $nfe->setModelo('55');
        
        $sNFE  = substr($this->chave, 35, 8);
        $status= 1;
        $ok = false;
        
        $aResposta = array();
        
        $filename = "$this->path_nfephp/xmls/nfe/$this->p_folder/assinadas/{$this->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;
            
            try{
                
                $ok = $nfe->sefazEnviaLote($aXml, $this->tipo_ambiente, $idLote, $aResposta, $indSinc, $flagZip);
                
                /*
                 echo "<pre>";
                 print_r($aResposta);
                 echo '</pre>';*/
                
                // Atualiza o Número do Recibo e Final de Transmissão
                // $this->NfeCode->bd_includeStatus(1, $this->chave, $filename, $msg, $status, $xml);
                $this->NfeCode->bd_updateRecibo($aResposta);
                
                // $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(){
        $nfe = new ToolsNFe("$this->path_nfephp/config/config.json");
        $nfe->setModelo('55');
        
        $p_file_dir = 'homologacao';
        $p_mesg_ret = array();
        
        if($this->tipo_ambiente=="1"){
            $p_file_dir = 'producao';
        }
        
        // $xml = "C:/Apache24/htdocs/nfephp/xmls/nfe/{$p_file_dir}/assinadas/{$this->chave}-nfe.xml"; // Ambiente Windows
        $xml = "$this->path_nfephp/xmls/nfe/{$p_file_dir}/assinadas/{$this->chave}-nfe.xml"; // Ambiente Windows
        
        if(!file_exists($xml)){
            $msg      = "<br>arquivo não existe!";
            $st_ativo = 0;
            // }else if (! $nfe->validarXml($xml) || sizeof($nfeTools->errors)) {
        }else if (! $nfe->validarXml($xml) || sizeof($nfe->errors)) {
            global $p_mesg_ret;
            // echo "<br><br>Erros :" . Count($nfe->errors);
            foreach ($nfe->errors as $erro) {
                $p_mesg_ret = $erro;
            }
        }
        array_push($p_mesg_ret, "nfe_FileName:<a href='$xml'/>$xml</a>");
        return $p_mesg_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:
        echo "<br>p_mva_orig => $p_mva_orig";
        echo "<br>p_aliq_inter => $p_aliq_inter";
        echo "<br>p_aliq_intra => $p_aliq_intra";
        echo "<br>";
        
        $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;
    }
    
}
?>
