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

require_once 'connect.php';
require_once 'messages.php';
require_once 'nfecode_class.php'; 
require_once 'inc/financeiro_lancamento_titulos.php';
require_once 'api/nfephp/bootstrap.php';
require_once 'inc/movimentacoes_class.php';

error_reporting(E_ALL ^ E_WARNING);

use NFePHP\NFe\ToolsNFe;

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

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

// retorna array com lista, ou false se deu erro
function emite_nfecode_getAll() {
  global $conexao;
    
  /*
  $sql = 'select	ds.id, vl.id_pedido_original,
		ds_numnf, dt_emissao, sum(vl_total_pedido) as vl_total_nota, id_status_transmissao,
        cd_status_nfe, ds_status_nfe, ds_recibo_sefaz, ds_chave, ds_xml
  from  erpc_documentos_saida              ds
  left join   erpc_pedidos_documentos_saida dp on ds.id = dp.id_documento_saida
  left join	 erpc_pedidos_venda_liberados   vl on dp.id_pedido_liberados = vl.id
  where  ds.st_ativo=? and ds.ds_modelo = 55
  group  by ds.id, vl.id_pedido_original,
		 ds_numnf, dt_emissao,
         id_status_transmissao, ds_chave,
         cd_status_nfe, ds_status_nfe, ds_recibo_sefaz order by 1 desc';
  */
  $sql = 'select	ds.id
                        ,vl.id_pedido_original
                        ,ds_numnf
                        ,dt_emissao
                        ,sum(vl_total_pedido) as vl_total_nota
                        ,id_status_transmissao
                        ,cd_status_nfe
                        ,ds_status_nfe
                        ,ds_recibo_sefaz
                        ,ds_chave
                        ,ds_xml
                  from  erpc_documentos_saida              ds
                  left join   erpc_pedidos_documentos_saida dp on ds.id = dp.id_documento_saida
                  left join	 erpc_pedidos_venda_liberados   vl on dp.id_pedido_liberados = vl.id
                  where  ds.st_ativo=? and ds.ds_modelo = 55
                  group  by ds.id, vl.id_pedido_original,
                		 ds_numnf, dt_emissao,
                         id_status_transmissao, ds_chave,
                         cd_status_nfe, ds_status_nfe, ds_recibo_sefaz order by 1 desc';


  $values[] = '1';
  $result = _prepareAndQuery($sql, $values);
  return $result;
}

// faz consulta novamente a Sefaz, verificando status
function emite_nfecode_setStatusAll(){
  global $tipo_ambiente;
  $consulta = emite_nfecode_getAll();

  foreach ($consulta as $key => $registro) {
    // Somente consultar Status de Notas Fiscais de até 7 dias
    $add_days= -7;
    $dt_emissao= $registro['dt_emissao'];
    $dt_limite = date("Y-m-d",strtotime("-7 day"));

    if(strtotime($dt_emissao)>=strtotime($dt_limite)){

      /* Status Atuais no Banco de Dados da Code */
      $id_nfe = $registro['id'];
      $cd_sta = $registro['cd_status_nfe'];
      $nr_rec = $registro['ds_recibo_sefaz'];
      $ds_chave= $registro['ds_chave'];
      $ds_xml  = $registro['ds_xml'];

      /* Somente consultar Status diferente 100 ou 101 */
      // if($cd_sta!="101" && $cd_sta!="100" && $ds_chave!=""){
      if(strpos("100,101", $cd_sta)===false && strlen($ds_chave)=="44"){

        /*
        // Verificar se as Flags para consultar Status na Sefaz novamente está funcionando
        echo "<br>Tamanho:" .strlen($ds_chave) . ":Consultar:" . strpos("100,101", $cd_sta) . " : $cd_sta Consultando Nfe: $id_nfe : $ds_chave";
        */

        $p_resp = emite_nfecode_getStatusChave($tipo_ambiente, $ds_chave);
        emite_nfecode_updateChave($id_nfe, $p_resp);

        /* Status Atual na Sefaz */
        $cd_sta = $p_resp['cStat'];

        /* Nfe Autorizada, acrescenta Protocolo Sefaz necessário API Danfe */
        if($cd_sta=="100"){
            
          //Henrique - Utiliza numero do documento de saída e daí vai faz o lançamento do título com o método abaixo.    
          geraLancFinanceiro($id_nfe);
          $movimenta = new Movimentacao;
          $movimenta->saidaEstoque($id_nfe, 1);
          
          emite_nfecode_ProtocoloToXml($id_nfe, $ds_chave, $p_resp);
        } else if(strpos("100,101", $cd_sta)===false && $nr_rec!=""){
          /* Nfe Diferente, consulta novamente pelo protocolo, discriminar erros */
          $p_resp = emite_nfecode_getStatusRecibo($tipo_ambiente, $nr_rec);
          emite_nfecode_updateRecibo($id_nfe, $p_resp);
        }
		if($cd_sta=="101"){
		    cancelaTitulo($id_nfe);
		}
      }
    }
  }
}

function emite_nfecode_getStatusChave($tipo_ambiente, $chave){
  global $nfe;
  global $tipo_ambiente;

  $aResposta= array();
  $retorno  = $nfe->sefazConsultaChave($chave, $tipo_ambiente, $aResposta);
  return $aResposta;

}

function emite_nfecode_getStatusRecibo($tipo_ambiente, $recibo){
  global $nfe;

  $aResposta = array();
  $retorno = $nfe->sefazConsultaRecibo($recibo, $tipo_ambiente, $aResposta);

  return $aResposta;
}

function emite_nfecode_updateChave($p_nfe, $p_resp){
  global $conexao;
  $ok = false;

  // Status da Nfe
  $cStat  = $p_resp['cStat'];
  $xMotivo= $p_resp['xMotivo'];
  $nRec   ='';

  // Recibo de Aprovação
  if(isset($p_resp['aProt']['nProt'])){
    $nRec = $p_resp['aProt']['nProt'];
  }

  // Recibo de Cancelamento
  if(isset($p_resp['aCanc']['nProt'])){
    $nRec = $p_resp['aCanc']['nProt'];
  }

  $sql = "update erpc_documentos_saida set id_status_transmissao=4";

  // se passou o recibo
  if(!$nRec==""){
    $sql .= ", ds_recibo_sefaz=$nRec";
  }

  //status = 3, xml transmitido com sucesso!;
  if($sql!=""){
    $sql .= ", cd_status_nfe='$cStat', ds_status_nfe='$xMotivo'";
    $sql .= " where id=$p_nfe";

    $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
    $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
  }

  // $ok = emite_nfecode_item_update($emite_nfecode);
  if ($ok != 1) {
    addError("Erro ao atulizar o recibo da Nota Fiscal: $p_nfe" );
  }
  return $ok;
}


function emite_nfecode_updateRecibo($p_nfe, $p_resp){
  global $conexao;
  $ok = false;

  // Status da Nfe
  $p_prot_cd_status = '';
  $p_prot_dt_retorno= '';
  $p_prot_ds_motivo = '';
  $p_prot_nr_recibo = '';

  // Detalhe do Processamento da Nfe por Protocolo, esse detalhe vai para o Log
  if(isset($p_resp['aProt'][0]['chNFe'])){
    $p_prot_cd_status = $p_resp['aProt'][0]['cStat'];
    $p_prot_dt_retorno= $p_resp['aProt'][0]['dhRecbto'];
    $p_prot_ds_motivo = $p_resp['aProt'][0]['xMotivo'];
    $p_prot_nr_recibo = $p_resp['nRec'];
  }


  if($p_prot_cd_status!="" && $p_prot_ds_motivo!=""){

    $data_atual = date('Y-m-d H:i:s:u');
    
    $descricao_detalhe = "DataConsulta:$data_atual|Protocolo:$p_prot_nr_recibo|DataProc:$p_prot_dt_retorno|Status:$p_prot_cd_status|Motivo:$p_prot_ds_motivo";

    $sql  = "update erpc_documentos_saida set id_status_transmissao=4,ds_status_proc=Concat(ds_status_proc,'<br />\r\n$descricao_detalhe')";
    $sql .= " where id=$p_nfe";

    //status = 3, xml transmitido com sucesso!;
    if($sql!=""){
      $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
      $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
    }

    // $ok = emite_nfecode_item_update($emite_nfecode);
    if ($ok != 1) {
      addError("Erro ao atulizar o recibo da Nota Fiscal: $p_nfe" );
    }

  }
  return $ok;
}



/* Varre os Elementos de um XML para acrescentar a um novo */
function xml_adopt($root, $new) {
    $node = $root->addChild($new->getName(), (string) $new);
    foreach($new->attributes() as $attr => $value) {
        $node->addAttribute($attr, $value);
    }
    foreach($new->children() as $ch) {
        xml_adopt($node, $ch);
    }
    return $node;
}

function emite_nfecode_ProtocoloToXml($id_nfe, $chave, $p_resp){
  global $conexao;
  global $tipo_ambiente;
  global $path_nfephp;

  $ok = false;

  /* Informações necessárias para a chave Protocolo */
  $tpAmbProt=$p_resp['tpAmb'];
  $verAplic= $p_resp['verAplic'];
  $dhRecbto= $p_resp['dhRecbto'];
  $nProt   = $p_resp['aProt']['nProt'];
  $digVal  = $p_resp['aProt']['digVal'];

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

  // Arquivo da Danfe original, alterado:
  $pathNFefile    = "$path_nfephp/xmls/nfe/$p_folder/assinadas/{$chave}-nfe.xml";
  $pathNFeAprovada= "$path_nfephp/xmls/nfe/$p_folder/enviadas/aprovadas/{$chave}-protNFe.xml";

  try{

    /* Cria um novo XML a partir da aprovação Status 100*/
    $file_original = file_get_contents($pathNFefile);

    $string_new  = "<?xml version=\"1.0\" encoding=\"utf-8\"?><nfeProc xmlns='http://www.portalfiscal.inf.br/nfe' versao='4.00'>";
    $string_new .= substr($file_original, strpos($file_original, "<NFe"));;
    $string_new .= "</nfeProc>";

    $xmlNew = simplexml_load_string($string_new);

    /* Somente incluir o protocolo se não existir no XML Original */
    if(isset($xmlNew->protNFe)==""){
      
      /* Inclui as informações necessárias do Protocolo para Impressão da Danfe */
      $protNfe = $xmlNew->addChild('protNFe');
      $protNfe->addAttribute('versao', '4.00');
      $infProt = $protNfe->addChild('infProt');
      $infProt->addAttribute('xmlns', 'http://www.portalfiscal.inf.br/nfe');

      /* Informações do Protocolo a adicionar : */
      $infProt->addChild('tpAmb'   , $tpAmbProt);
      $infProt->addChild('verAplic', $verAplic);
      $infProt->addChild('chNFe'   , $chave);
      $infProt->addChild('dhRecbto', $dhRecbto);
      $infProt->addChild('nProt'  ,  $nProt);
      $infProt->addChild('digVal' ,  $digVal);
      $infProt->addChild('cStat'  ,  '100');
      $infProt->addChild('xMotivo',  'Autorizado o uso da NF-e');

      if(file_exists($pathNFeAprovada)){
        unlink($pathNFeAprovada);
      } 

      /* Força a criação das pastas->aprovadas */
      @$pathURL = substr($pathNFeAprovada, 0, strripos($pathNFeAprovada, "/") + 1);
      if(!is_dir(@$pathURL)){
        mkdir(@$pathURL , 0777, true);
      }

      file_put_contents($pathNFeAprovada, $xmlNew->asXML());
      chmod($pathNFeAprovada, 0777);

      /* Atualizar o Path do XML no documento de Saída */
      $sql = "update erpc_documentos_saida set ds_xml='$pathNFeAprovada' where id=$id_nfe";
      if($sql!=""){
        $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
        $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
      }
    }
  }catch (Exception $e) {
    $p_error = 'Houve um erro ao verificar / adicionar o Protocolo : ' . $e->getMessage() ;
    addError($p_error);
    $redirect = "erpc_monitoramento_nfe_list.php";
  }
  /*
  echo "<br>$tipo_ambiente";
  echo "<br>$chave";
  echo "<pre>";
  print_r($p_resp);
  echo "</pre>";
  exit;

  $dhEmi = '2017-08-25T18:41:18-03:00';
  $ano = date('Y', strtotime($dhEmi));
  $mes = date('m', strtotime($dhEmi));

  echo "<br><a href='$pathNFeAprovada' target='_blank'/>Clique aqui para visualizar o XML novo</a>";
  echo "<br>$pathNFeAprovada";
  exit;
  */
  return $ok;
}
