<?php

require_once 'connect.php';
// require_once 'inc/documento_saida_class.php';
require_once 'inc/LiberacaoPedidos.php';
require_once 'inc/nfecode_class.php';
require_once 'inc/usuario.php';


/*
$id_usuario  = 1;
// captura do usuário logado no sistema
if(isset($_SESSION[SESSION_USER_NAME])){
  $id_usuario = $_SESSION[SESSION_USER_NAME]['id'];
  /*
  echo "<pre>";
  print_r($_SESSION[SESSION_USER_NAME]);
  echo "</pre>";
}*/

class LiberarEcommerce {
  private $ds_modelo = 55;

  /* Padrões para Consumidor Final */
  private $id_natureza=1;
  private $id_processamento_emissao=0;
  private $id_status_xml_interno=1;
  private $id_status_transmissao=1;
  private $ds_serie=1;
  private $id_tipo_ambiente=2;
  private $id_tipo_operacao=1;
  private $id_destino_operacao=1;
  private $id_operacao_presencial=9;
  private $st_ativo=1;
  private $dt_emissao='';

  public  $id_tipo_emissao=1;
  public  $fl_consumidor_final=1;
  public  $ds_numnf_referencia='';

  public  $id_tipo_nfe=1;  // 0 Entrada - Saída

  // método inicial de construção da classe
  public function __construct(){
    // capturando o usuário e unidade logado
    $this->usuario_liberacao = getLoggedUser();
    $this->id_usuario=$this->usuario_liberacao['id'];
    $this->id_unidade=$this->usuario_liberacao['unidade'];

    $this->dt_emissao = date("Y-m-d H:i:s"); // date("Y-m-d\TH:i:sP");

    $NfeCode = new NfeCode();
    $this->id_tipo_ambiente = $NfeCode->getAmbiente();

   }

  /* retorna o status da liberação do pedido de venda */
  function getLiberarPedido($p_num_ped){
    try {
      $lp = new LiberacaoPedidos();
      $resultado = $lp->liberarPedido($p_num_ped);
      echo 'Liberação: ' . $resultado;
    } catch(Exception $e) {
      echo 'Exceção capturada: ' . $e->getMessage();
    }
    return true;
  }

  /* retorna o array com os pedidos Liberados */
  function getPedidos(){
    return $this->ar_liberados;
  }

  /* captura o array dos pedidos a liberar*/
  function setPedidos($p_array){

    // Modelo Padrão de Status
    $fl_status = array(
                 'PedOrig' => 0, // Numero do Pedido Original
                 'Status'  => 2, // Status para o Novo Pedido
                 'PedLibe' => 0);// Numero do Pedido Liberado

    // Inclui o Status do Pedido e Pedido Original $DocumentoSaida->pedidos
    foreach ($p_array as $key => $value) {
      # code...
      $fl_status['PedOrig'] = $value;
      array_push($p_array, $fl_status);
      array_shift($p_array);
    }

    $this->ar_liberados = $p_array;
  }

  /* função para processo completo de liberação */
  function setAllPedidos(){
    $this->setClonePedidosLiberados();// Clona para pedidos Liberados
    $this->setCloneItensLiberados();  // Itens liberados
    $this->setStatusPedidoOriginal(); // Atualiza o Status dos Pedidos Liberados na Original

    /* 03/01/2017 1704 Edival, Incluir a Nota Fiscal, somente após o faturamento
    setIncludeNotaFiscal();    // Inclui a Nota Fiscal
    setAssociaNotaFiscal();    // Associa e fecha processo da NFE
    */
  }

  /* retorna o numero da proxima nfe */
  function getNumeroDocumentoSaida(){
    return $this->id_doc_sai;
  }

  /* retorna o numero do documento de saida para associação */
  function getNumeroProxNfe(){
    global $conexao;

	$this->usuario_logado = getLoggedUser();
    $this->id_unidade=$this->usuario_logado['unidade'];
	
    $p_ds_numnf = 1;

      // $consulta = "select concat('00000', max(ds_numnf*1) + 1) as p_ds_numnf from erpc_documentos_saida";
      $consulta = "select max(ds_numnf*1) + 1 as p_ds_numnf from erpc_documentos_saida where ds_modelo=$this->ds_modelo";
	  $consulta   = "SELECT cast(ds_numnf as decimal) + 1 as proxnfe FROM erpc_documentos_saida WHERE ds_modelo = $this->ds_modelo and (cd_status_nfe in (100, 101)) and id_unidade=$this->id_unidade ORDER BY ID DESC LIMIT 1;";
    
      /*
      $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
      $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
      */
      $resultado = mysqli_query($conexao, $consulta) or die ($erro = mysqli_error($conexao));
      if (mysqli_num_rows($resultado)>0) {
            while ($registro = mysqli_fetch_assoc($resultado)){
              $p_ds_numnf = $registro['p_ds_numnf'];
            }
        }
      return $p_ds_numnf;
  }

  /* Verificar se é 1 para consumidor final para emissão da NFe */
  function getConsumidorFinal(){
    global $conexao;

    /*
    echo "<pre>";
    print_r($this->ar_liberados);
    echo "</pre>";
    exit;*/

    if(count($this->ar_liberados)>0){
      $p_ped_orig = $this->ar_liberados[0]['PedOrig']; // Número do Pedido Original;

      $consulta = "select id_tipo_cliente from erpc_clientes cl join erpc_pedidos_venda pv on cl.id = pv.id_cliente
      where  pv.id = $p_ped_orig and id_tipo_cliente = 1 limit 1";

      $resultado = mysqli_query($conexao, $consulta) or die ($erro = mysqli_error($conexao));
      if (mysqli_num_rows($resultado)==0) {
        $this->fl_consumidor_final = 0;
        }
    }
  }

  /* inicia o processo de faturamento*/
  function setAllFaturar(){
    $this->setIncludeNotaFiscal();
    $this->setAssociaNotaFiscal();
    $this->setStatusPedidoOriginal();
  }

  /* inclui a nota fiscal conforme informações passadas */
  function setIncludeNotaFiscal(){
    global $conexao;

    if($this->ds_modelo!='59'){
      $this->ds_numnf = $this->getNumeroProxNfe();
      $this->getConsumidorFinal();
    }

    $ok = false;
    $sql = 'insert into erpc_documentos_saida ';
    $campos = array('id_tipo_nfe', 'ds_numnf', 'dt_emissao', 'ds_serie', 'ds_modelo', 'id_status_xml_interno', 'id_status_transmissao', 'ds_numnf_referencia', 'id_tipo_ambiente', 'id_tipo_operacao', 'id_destino_operacao', 'id_tipo_emissao', 'fl_consumidor_final', 'id_operacao_presencial', 'id_natureza', 'id_processamento_emissao', 'st_ativo', 'id_usuario', 'id_unidade');
    $values = array();

    foreach($campos as $campo) {
        $values[] = $this->$campo;
    }

    $sql .= '(' . implode(',', $campos) . ') values (' . trim(str_repeat('?,', count($values)), ',') . ')';

    $ok = _prepareAndExecute($sql, $values, $error);
    $this->id_doc_sai = mysqli_insert_id($conexao);

  return $ok;
  }


  /* Atualiza o Status de Cada Pedido Original em erpc_pedidos_venda */
  function setStatusPedidoOriginal(){
    global $conexao;

    foreach ($this->ar_liberados as $key => $p_array_status) {
      $p_num_ped = $p_array_status['PedLibe'];
      $p_sta_ped = 4; // FATURADO $p_array_status['Status'];

      $sql = "update erpc_pedidos_venda_liberados set id_status_pedido = $p_sta_ped where id = $p_num_ped";

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


  /* associação do pedido ao documento de saida */
  function setAssociaNotaFiscal(){
    global $conexao;

    foreach ($this->ar_liberados as $key => $p_array_status) {
      $p_num_ped = $p_array_status['PedLibe'];
      $p_num_doc = $this->id_doc_sai;

      $sql = "insert into erpc_pedidos_documentos_saida values($p_num_ped, $p_num_doc)";

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

  function setClonePedidosLiberados(){
    global $conexao;
    $p_array_new = array(); // Novo Array com Status e Id de Insert;

    foreach ($this->ar_liberados as $key => $p_array_status) {
      $p_num_ped = $p_array_status['PedOrig'];
      $p_sta_ped = $p_array_status['Status'];

      $sql = "insert into erpc_pedidos_venda_liberados(
      id_pedido_original,
      id_cliente,
      id_tipo_pedido_nf,
      id_transportadora,
      fl_recalcula_vencto,
      id_tabela_precos,
      id_unidade,
      id_status_pedido,
      id_vendedor1,
      nr_perc_comissao1,
      nr_perc_emissao1,
      nr_perc_baixa1,
      id_vendedor2,
      nr_perc_comissao2,
      nr_perc_emissao2,
      nr_perc_baixa2,
      id_vendedor3,
      nr_perc_comissao3,
      nr_perc_emissao3,
      nr_perc_baixa3,
      ds_mensagem_nf,
      id_mensagem_padrao1,
      id_mensagem_padrao2,
      id_mensagem_padrao3,
      id_mensagem_padrao4,
      id_mensagem_padrao5,
      ds_codigo_antt,
      ds_placa_veiculo,
      ds_uf_placa_veiculo,
      qt_volumes,
      ds_especie,
      ds_marca,
      nr_volumes,
      nr_peso_liquido,
      nr_peso_bruto,
      nr_lacres,
      ds_modelo_frete,
      vl_servico,
      id_condicao_pagamento,
      id_plano_contas,
      vl_total_produtos,
      vl_frete,
      vl_desconto,
      vl_despesas,
      vl_impostos,
      vl_total_pedido,
      vl_total_frete_despesas,
      id_forma_pagamento,
      vl_pagamento,
      dh_liberacao,
      st_ativo, id_usuario)
      select $p_num_ped,
      id_cliente,
      id_tipo_pedido_nf,
      id_transportadora,
      fl_recalcula_vencto,
      id_tabela_precos,
      id_unidade,
      $p_sta_ped,
      id_vendedor1,
      nr_perc_comissao1,
      nr_perc_emissao1,
      nr_perc_baixa1,
      id_vendedor2,
      nr_perc_comissao2,
      nr_perc_emissao2,
      nr_perc_baixa2,
      id_vendedor3,
      nr_perc_comissao3,
      nr_perc_emissao3,
      nr_perc_baixa3,
      ds_mensagem_nf,
      id_mensagem_padrao1,
      id_mensagem_padrao2,
      id_mensagem_padrao3,
      id_mensagem_padrao4,
      id_mensagem_padrao5,
      ds_codigo_antt,
      ds_placa_veiculo,
      ds_uf_placa_veiculo,
      qt_volumes,
      ds_especie,
      ds_marca,
      nr_volumes,
      nr_peso_liquido,
      nr_peso_bruto,
      nr_lacres,
      ds_modelo_frete,
      vl_servico,
      id_condicao_pagamento,
      id_plano_contas,
      vl_total_produtos,
      vl_frete,
      vl_desconto,
      vl_despesas,
      vl_impostos,
      vl_total_pedido,
      vl_total_frete_despesas,
      id_forma_pagamento,
      vl_pagamento,
      now(),
      st_ativo, $this->id_usuario
      from erpc_pedidos_venda  where id=$p_num_ped";

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

        $p_num_ped_lib = mysqli_insert_id($conexao);

        $p_array_status['PedLibe'] = $p_num_ped_lib;
        array_push($p_array_new, $p_array_status);
    }

    $this->ar_liberados=$p_array_new;
  }

  function setCloneItensLiberados(){
    global $conexao;

    foreach ($this->ar_liberados as $key => $p_array_item) {
      $p_num_ped = $p_array_item['PedLibe'];
      $p_num_org = $p_array_item['PedOrig'];

      $sql = "insert into erpc_pedidos_itens_liberados(
          id_pedido_venda_liberado
        , id_produto
        , nr_quantidade
        , id_unidade_medida
        , vl_unitario
        , nr_perc_ipi
        , nr_perc_icms
        , vl_ipi
        , vl_icms
        , id_tipo_movimentacao
        , vl_desconto_produto
        )
        select
        $p_num_ped
      , id_produto
      , nr_quantidade
      , id_unidade_medida
      , vl_unitario
      , nr_perc_ipi
      , nr_perc_icms
      , vl_ipi
      , vl_icms
      , id_tipo_movimentacao
      , vl_desconto_produto
    from   erpc_pedidos_itens i
    where  id_pedido = $p_num_org";

    /*
       and not exists
      (select 1 from erpc_pedidos_itens_liberados p
       where  i.id = p.id)";*/

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


}
?>
