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

// Banco de Dados
require_once 'connect.php';
require_once 'messages.php';
require_once "nfc_class.php";
require_once "Xml.Class.php";

$NfcCode = new NfcCode();
$xml     = new Xml();
$id_unidade = 2;

class NfcXmlVenda{

  private $set_msg = array();
  private $id_documento=0;
  private $s_trib_federal = 0;
  private $s_trib_estadual= 0;
  private $s_trib_municipal=0;
  private $p_ds_chave_ibpt = '';

  private $documentos_emitente = array();
  private $documentos_saida   = array();
  private $documentos_cliente = array();
  private $documentos_produto = array();


  public function __construct(){
    global $xml;
    $xml->openTag("CFe");
    $xml->openTag("infCFe versaoDadosEnt='0.07'");
  }

  // retorna as informações do emitente
  function getSQLtoTag($p_tag_sql, $p_tag_name) {
    global $conexao;
    global $xml;

    // cria uma tag e transforma o resultado do array para um XML
    //Abrindo a Tag de Resposta
    $xml->openTag($p_tag_name);
    foreach ($p_tag_sql as $key => $value) {
      if($key!='nr_documento' and $value!=""){
        $xml->addTag($key, $value);
      }
    }

    // fecha a tag e retorna o resultado
    $xml->closeTag($p_tag_name);
    return $xml;
  }

  // inclui o produto no Xml
  function getProdutoToTag($p_produtos){
    global $conexao;
    global $xml;

    for ($i=0; $i < count($p_produtos) ; $i++) {
      $p_nr_item  = $i +1;
      $p_id_item  = $p_produtos[$i]['nItem']; // ID do Item Liberado, só usado para join do imposto.

      $p_tag_name = 'det nItem="' . $p_nr_item . '"';
      $xml->openTag($p_tag_name);

      // dados do produto
      $xml->openTag('prod');
      $xml->addTag('cProd', $p_produtos[$i]['cProd']);
      $xml->addTag('xProd', $p_produtos[$i]['xProd']);
      $xml->addTag('NCM'  , $p_produtos[$i]['NCM']);
      $xml->addTag('CFOP' , $p_produtos[$i]['CFOP']);
      $xml->addTag('uCom' , $p_produtos[$i]['uCom']);
      $xml->addTag('qCom'  , number_format($p_produtos[$i]['qCom'], 4, '.', '')); 
      $xml->addTag('vUnCom', $p_produtos[$i]['vUnCom']);
      $xml->addTag('indRegra', $p_produtos[$i]['indRegra']);
      $xml->addTag('vDesc', $p_produtos[$i]['vDesc']);
      $xml->closeTag("prod");

      // dados dos impostos do produtos ICMS, PIS e Cofins
      $p_impostos = $p_produtos[$i]['imposto'];
      $xml->openTag('imposto');
      for($x=0; $x< count($p_impostos); $x++){
        $p_tipo = $p_impostos[$x]['tipo'];
        $p_valor= $p_impostos[$x]['valor'];
        $xml->addTag($p_tipo, $p_valor);
      }
      $xml->closeTag('imposto');
      $xml->closeTag("det");

      // acumulador de valores para lei 12741/2012
      $vl_produto = $p_produtos[$i]['vProd'];
      $vl_federal = $p_produtos[$i]['vTribFed'];
      $vl_estadual= $p_produtos[$i]['vTribEst'];
      $vl_municipal=$p_produtos[$i]['vTribMun'];

      $this->s_trib_federal   += ($vl_federal  * $vl_produto);
      $this->s_trib_estadual  += ($vl_estadual * $vl_produto);
      $this->s_trib_municipal += ($vl_municipal* $vl_produto);

      $this->p_ds_chave_ibpt = $p_produtos[$i]['ds_chave_ibpt'];
    }
  }

  function getTotaisTotTag($p_totais){
    global $xml;

    /* Edival 02/03/2017 Antigo, captura dos tributos através do produto/ncm/tributos
    global $conexao;

    $p_total_icms = round($p_totais[0]['vl_total_icms'], 4);
    $p_total_fede = round($p_totais[0]['vl_total_fede'], 4);
    $p_total_pedido= round($p_totais[0]['vl_total_pedido'], 4);

    $p_perc_aliq_icms = ($p_total_icms / $p_total_pedido)*100;
    $p_perc_aliq_fede = ($p_total_fede / $p_total_pedido)*100;

    $p_total_impostos = $p_total_icms + $p_total_fede;

    $p_mensagem = "Val. Aprox. Tributos: Federais R$ $p_total_fede ($p_perc_aliq_fede%) Estaduais R$ $p_total_icms ($p_perc_aliq_icms%) Municipais R$0,00 (0,00%) Fonte: IBPT Chave: 5oi7eW Versao: 15.2.A";
    */

    $this->s_trib_federal  = round($this->s_trib_federal  , 2);
    $this->s_trib_estadual = round($this->s_trib_estadual , 2);
    $this->s_trib_municipal= round($this->s_trib_municipal, 2);

    $p_total_impostos = round($this->s_trib_federal + $this->s_trib_estadual + $this->s_trib_municipal, 2);
    $p_mensagem = "Val. Aprox. Tributos: Federais R$ {$this->s_trib_federal} Estaduais R$ {$this->s_trib_estadual} Municipais R$ {$this->s_trib_municipal} Fonte: IBPT {$this->p_ds_chave_ibpt} (Conforme Lei Fed.12.741/2012)";

    $xml->openTag("total");
    $xml->addTag("vCFeLei12741", number_format($p_total_impostos, 2, '.', ''));
    $xml->closeTag("total");

    $xml->openTag("pgto");
    foreach ($p_totais as $key => $item) {
      $p_cd_mp = $item['cMP']; // $p_totais[0]['cMP']; 
      $p_vl_mp = $item['vMP']; // $p_totais[0]['vMP'];

      $xml->openTag("MP");
      $xml->addTag("cMP", $p_cd_mp);
      $xml->addTag("vMP", $p_vl_mp);
      $xml->closeTag("MP");
    }
    $xml->closeTag("pgto");

    $xml->openTag("infAdic");
    $xml->addTag("infCpl", $p_mensagem);
    $xml->closeTag("infAdic");
}



  /* função que verifica se todos os dados do cupom estão OK ! */
    function getDados($id_documento){
      global $NfcCode;
      global $xml;
      global $id_unidade;

      $r_getDados = true;
      $NfcCode->setNrNota($id_documento);

      $sql_ide     = $NfcCode->getIdeSat();
      $sql_emitente= $NfcCode->getEmitente();
      $sql_cliente = $NfcCode->getCliente();
      $sql_entrega = $NfcCode->getEntrega();
      $sql_produto = $NfcCode->getProdutos();
      $sql_totais  = $NfcCode->getTotalCupom();

      /*
      echo "<pre>";
      print_r($sql_cliente);
      echo "</pre>";
      exit;
      */

      $xml_ide      = $this->getSQLtoTag($sql_ide[0],"ide");
      $xml_emitente = $this->getSQLtoTag($sql_emitente[0], "emit");
      $xml_cliente  = $this->getSQLtoTag($sql_cliente[0] , "dest");
      // $xml_entrega  = $this->getSQLtoTag($sql_entrega[0] , "entrega");

      $this->getProdutoToTag($sql_produto);
      $this->getTotaisTotTag($sql_totais);

      $xml->closeTag("infCFe");
      $xml->closeTag("CFe");

      /*
      $xml2 = new SimpleXMLElement('<xml/>');
      $xml2 = new SimpleXMLElement($xml);
      Header('Content-type: text/xml');
      print($xml2->asXML());


      $sql_emitente = $NfcCode->getEmitente();
      $xml_emitente = $this->getSQLtoTag($sql_emitente[0], 'emit');

      $sql_
      echo '<pre>', htmlentities($xml), '</pre>';

      echo '<pre>', htmlentities($xml), '</pre>';
      exit;*/

      return $xml;
    }




    // valida o arquivo xml gerado
    function nfc_ValidaXml(){
      global $chave;
      global $nfcTools;

      $nfc = new Toolsnfc('../nfcphp/config/config.json');
      $nfc->setModelo('55');

      $p_file_dir = 'homologacao';
      $p_mesg_ret = array();

      if($this->tipo_ambiente=="1"){
        $p_file_dir = 'producao';
      }

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

      if(!file_exists($xml)){
        $msg      = "<br>arquivo não existe!";
        $st_ativo = 0;
      }else if (! $nfc->validarXml($xml) || sizeof($nfcTools->errors)) {
          global $p_mesg_ret;
           // echo "<br><br>Erros :" . Count($nfc->errors);
          foreach ($nfc->errors as $erro) {
              $p_mesg_ret = $erro;
          }
      }
      array_push($p_mesg_ret, "nfc_FileName:<a href='$xml'/>$xml</a>");
      return $p_mesg_ret;
    }

    // Cálculo do IVA-ST ou MVA-ST
    function nfc_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;
    }

}

?>
