<?php

require_once 'connect.php';
require_once 'inc/messages.php';
require_once 'inc/funcionalidade.php';
require_once 'inc/usuario.php';

/**
 * Description of LiberacaoPedido
 *
 * @author Code
 */
class LiberacaoPedidos {

  // pedido em espera/processando
  const EmEspera = 0;
  // liberado
  const Liberado = 1;
  // não liberado
  const NaoLiberado = 2;
  // liberado parcialmente
  const LiberadoParcial = 3;

  private $pedido = array();

  /**
   *
   * @param type $pedidoId id do pedido
   */
  function liberarPedido($pedidoId = 0) {
    $u = getLoggedUser();
    // verifica se usuário está logado e com permissões
    /*
    if (!funcionalidade_possuiAcesso('erpc_liberar_pedido')) {
      throw new Exception('Permissão negada para liberação do pedido ' . $pedidoId);
    }
    */
    $pedido    = $this->carregarPedido($pedidoId);
    $statusNovo= $this->validarPedido($pedido);
    // alterar o pedido?
    $pedido['id_status_pedido'] = $statusNovo; // Liberado? NaoLiberado? LiberadoParcial?

    $pedido['id_usuario'] = $u['id'];
    $pedido['dh_alteracao'] = date('Y-m-d H:i:s');
    foreach ($pedido['itens'] as &$item) {
      $item['dh_alteracao'] = date('Y-m-d H:i:s');
      $item['id_usuario'] = $u['id'];
      $item['dt_liberacao'] = date('Y-m-d H:i:s');
    }

    // faz o clone do pedido em liberados
    if($statusNovo==LiberacaoPedidos::Liberado or $statusNovo==LiberacaoPedidos::LiberadoParcial){
      clonarPedido($pedido);
    }

    return $this->alterarStatusLiberacao($pedido);
  }

  private function carregarPedido($pedidoId) {
    $sql = 'SELECT * FROM erpc_orcamento WHERE id=? AND st_ativo=1';
    $values = array($pedidoId);
    $pedido = _prepareAndQuery($sql, $values, $erro);
    if ($pedido === false) {
      throw new Exception($erro);
    } else if (count($pedido) !== 1) {
      throw new Exception('Pedido não localizado para liberação');
    } else {
      $pedido = $pedido[0];
    }
    $sql = 'SELECT * FROM erpc_pedidos_produto WHERE id_pedido_venda=? AND st_ativo=1';
    $values = array($pedidoId);
    $itens = _prepareAndQuery($sql, $values, $erro);
    if ($itens === false) {
      throw new Exception($erro);
    }
    $pedido['itens'] = $itens;
    return $pedido;
  }

  private function origemDestinoVenda($pedido){
    $sql = 'select o.ds_uf as ds_estado_origem,
                   d.ds_uf as ds_estado_destino
            from   erpc_pedidos_venda  p
            join   erpc_unidades   u on p.id_unidade = u.id
            join   erpc_municipios o on u.id_municipio=o.id
            left join erpc_clientes   c on p.id_cliente  = c.id
            left join erpc_municipios d on c.id_municipio= d.id
            where p.id = ?';
    $values = array();
    $values[]= $pedido['id'];
    $ok = _prepareAndQuery($sql, $values, $erro);
  }

  // Cálculo do IVA-ST ou MVA-ST
  function calculaIndiceST($p_mva_orig, $p_aliq_inter, $p_aliq_intra){
    // IVA-ST ajustado = [(1+IVA-ST original) x (1 - ALQ inter) / (1- ALQ intra)] -1, onde:

    $get_ret = 0;
    $get_ret = number_format((1 + ($p_mva_orig / 100)) * (1 - $p_aliq_inter / 100) / (1- $p_aliq_intra / 100) -1, 4, '.', ',');
    return  $get_ret;
  }

  /* verifica se cliente possui o bloqueio de crédito */
  private function consultarCredito($p_id_cliente, $p_vl_pedido){

      return true;
  }

  /* verifica se o produto possui o bloqueio de estoque*/
  private function consultarEstoque($p_id_produto){

    return true;
  }

  private function validarPedido($pedido) {
    // 0 para bloqueio de crédito, 1 para bloqueio de estoque, 2 outros bloqueios
    $cd_bloqueio_pedido = '';

    $id_cliente     = $pedido['id_cliente'];
    $vl_total_pedido= $pedido['vl_total_pedido'];

    if(consultarCredito($id_cliente, $vl_total_pedido)!=true){
      $cd_bloqueio_pedido = 0;
    }

    // origem e destino de venda em caso de ST
    $tipo_venda = origemDestinoVenda($pedido);

    // varredura dos itens do pedido para consulta de estoque e ST
    foreach ($pedido['itens'] as $key => $value) {
      $id_produto  = $value['id_produto'];
      $vl_unitario = $value['vl_unitario'];
      $nr_quantidade=$value['nr_quantidade'];

      // consulta o estoque do produto
      if(consultarEstoque($id_produto)!=true){
        $cd_bloqueio_pedido = 1;
      }

      // calcula a situação tributária do item em estados diferentes
      $ds_estado_origem = $tipo_venda['ds_estado_origem'];
      $ds_estado_destino= $tipo_venda['ds_estado_destino'];
      if($ds_estado_destino==''){
        $ds_estado_destino = $ds_estado_origem;
      }

      if($ds_estado_origem!=$ds_estado_destino){
        $indice = calculaIndiceST($nr_perc_mva, $nr_perc_inter, $nr_perc_intra);
        $this->pedido['itens'][$key]['nr_perc_mva'] = $indice;
        $this->pedido['itens'][$key]['vl_icms_st']  = ($vl_unitario * $nr_quantidade) * ($indice /100);
      }
    }

    if($cd_bloqueio_pedido!=''){
      return LiberacaoPedidos::NaoLiberado;
    }else{
      return LiberacaoPedidos::Liberado;
    }
  }

  private function alterarStatusLiberacao($pedido) {
    global $conexao;
    $ok = false;
    $conexao->query("START TRANSACTION");

    $sql = 'UPDATE erpc_orcamento SET id_status_pedido=? WHERE id=?';
    $values = array($pedido['id_status_pedido'], $pedido['id']);
    $ok = _prepareAndExecute($sql, $values, $erro);
    if ($ok === false) {
      $conexao->query("ROLLBACK");
      throw new Exception($erro);
    }

    $itens = $pedido['itens'];
    foreach($itens as $item) {
      $sql = 'UPDATE erpc_pedidos_produto SET dh_alteracao=?, id_usuario=?, dt_liberacao=? WHERE id=?';
      $values = array(
        $item['dh_alteracao'],
        $item['id_usuario'],
        $item['dt_liberacao'],
        $item['id']
      );
      $erro = '';
      $ok = _prepareAndExecute($sql, $values, $erro);

      if ($ok === false) {
        $conexao->query("ROLLBACK");
        throw new Exception($erro);
      }
    }

    if ($ok) {
      $conexao->query("COMMIT");
    }
    return $pedido['id_status_pedido'];
  }
}
