<?php

// CRIAR BLOQUEIO PARA ACESSO EXTERNO (APENAS SERVIDOR DO SISTEMA)
// RESTRIÇÃO DE PAGINAS NÃO FUNCIONA


// ********** VALORES PADRÃO ************
$fingeral_modulo_caixa = isset($config_fingeral['modulo_caixa'])?1:0;
$fingeral_data_venc =    isset($config_fingeral['data_venc'])?$config_fingeral['data_venc']:date("Y-m-d");
$fingeral_id_modulo =    isset($config_fingeral['id_modulo'])?$config_fingeral['id_modulo']:0;

// ********** SELECTS PADRÕES ************
$resul_fingeral_categorias = criarArvoreCat(sel_fingeral("categorias"));
$resul_fingeral_contas = sel_fingeral("contas");
$resul_fingeral_fornecedores = sel_fingeral("fornecedores");

// ********** SELECTS ************
function sel_fingeral($tipo, $options=null){
  global $bd,
         $fingeral_modulo_caixa,
         $rconf_gastos;

  if(in_array($tipo, ['saldos','registros','registros_gid_group','dados_registro'])){
    $sql_registros = '
    FROM fingeral_registros
      LEFT JOIN fingeral_nfs nf ON nf.id = fingeral_registros.id_nfs
      LEFT JOIN fingeral_categorias ON fingeral_categorias.id = fingeral_registros.id_categoria
      LEFT JOIN fingeral_contas ON fingeral_contas.id = fingeral_registros.id_conta
      LEFT JOIN fingeral_fornecedores ON fingeral_fornecedores.id = fingeral_registros.id_fornecedor
      LEFT JOIN clubes ON clubes.id = fingeral_registros.id_clube
      LEFT JOIN (
        SELECT count(DISTINCT a.id) as qtd, a.id_fingeral_registro
        FROM fingeral_registros_anexos a
        GROUP BY a.id_fingeral_registro
      ) anexos ON anexos.id_fingeral_registro = fingeral_registros.id
    WHERE fingeral_registros.excluido = 0 AND fingeral_registros.id_conta = '.$options['id_conta'];
  }

  // ********* SALDOS GERAIS *********
  if($tipo=="saldos"){

    // SALDO GERAL (SEM FILTROS)
    $sql_rs = $bd->getConexao()->prepare('SELECT sum(valor) as saldo_real '.$sql_registros);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetch(PDO::FETCH_ASSOC);}

    $saldo_real = $rs['saldo_real']==""?0:$rs['saldo_real'];

    $where_filtros = whereFiltro($options, "saldo_anterior");
    $where = $where_filtros['where'];
    $periodo = $where_filtros['periodo'];

    // SALDO ANTERIOR (COM FILTROS)
    $sql_rs = $bd->getConexao()->prepare('SELECT
      sum(valor) as anterior
      '.$sql_registros.$periodo.$where);
    if( $sql_rs->execute() ) { $rs1 = $sql_rs->fetch(PDO::FETCH_ASSOC);}

    $where_filtros = whereFiltro($options, "registros");
    $where = $where_filtros['where'];
    $periodo = $where_filtros['periodo'];

    $sql_rs = $bd->getConexao()->prepare('SELECT
      sum(CASE WHEN valor > 0 THEN valor ELSE 0 END) as entrada,
      sum(CASE WHEN valor < 0 THEN valor ELSE 0 END) as saida
      '.$sql_registros.$periodo.$where);
    if( $sql_rs->execute() ) { $rs2 = $sql_rs->fetch(PDO::FETCH_ASSOC);}

    $anterior = $rs1['anterior']==""?0:$rs1['anterior'];
    $entrada = $rs2['entrada']==""?0:$rs2['entrada'];
    $saida = $rs2['saida']==""?0:$rs2['saida'];

    $periodo = $entrada + $saida;

    $rs = array(
      "saldo_real"=>$saldo_real,
      "anterior"=>$anterior,
      "entrada"=>$entrada,
      "saida"=>$saida,
      "periodo"=>$periodo,
      "outros"=>array(      )
    );
  }

  // ********* REGISTROS DE LANÇAMENTOS *********
  if($tipo=="registros"){

    if($options!=null){
      $where_filtros = whereFiltro($options, "registros");
      $where = $where_filtros['where'];
      $periodo = $where_filtros['periodo'];

      $group_gid_int = isset($options['group_gid_int']) ? '
        group by cast(fingeral_registros.data_lancamento as date), fingeral_registros.tipo_lancamento, fingeral_registros.id_categoria, fingeral_registros.id_clube' : '';
    }

    $sql_rs = $bd->getConexao()->prepare('SELECT
      fingeral_registros.*,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d") AS dia,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d/%m/%Y - %H:%i") AS data,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%Y-%m-%d") AS databd,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d") AS dia_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d/%m/%Y - %H:%i") AS data_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%Y-%m-%d") AS databd_para,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d") AS dia_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d/%m/%Y") AS data_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%Y-%m-%d") AS databd_pago,
      fingeral_categorias.nome as categoria,
      fingeral_contas.nome as conta,
      fingeral_fornecedores.nome as fornecedor,
      clubes.nome as clube,
      fingeral_registros.descricao,
      IFNULL(fingeral_registros.gid_taxa_conv,0) as gid_taxa_conv,
      IF(anexos.qtd>0, 1, 0) as anexos,
      nf.status as nf_status,
      nf.erro as nf_erro,
      nf.erro_json as nf_erro_json
      '.$sql_registros.$periodo.$where.$group_gid_int.'
      ORDER BY fingeral_registros.data_pagamento ASC, id ASC');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* REGISTROS DE LANÇAMENTOS - GID INTERMEDIAÇÃO *********
  if($tipo=="registros_gid_group"){

    if($options!=null){
      $where_filtros = whereFiltro($options, "registros");
      $where = $where_filtros['where'];
      $periodo = $where_filtros['periodo'];
    }

    $sql_rs = $bd->getConexao()->prepare('SELECT
      fingeral_registros.*,
      sum(IFNULL(fingeral_registros.valor,0)) as valor,
      sum(IFNULL(fingeral_registros.gid_taxa_conv,0)) as gid_taxa_conv,
      sum(IFNULL(fingeral_registros.gid_taxa_op,0)) as gid_taxa_op,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d") AS dia,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d/%m/%Y") AS data,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%Y-%m-%d") AS databd,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d") AS dia_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d/%m/%Y") AS data_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%Y-%m-%d") AS databd_para,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d") AS dia_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d/%m/%Y") AS data_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%Y-%m-%d") AS databd_pago,
      fingeral_categorias.nome as categoria,
      fingeral_contas.nome as conta,
      fingeral_fornecedores.nome as fornecedor,
      clubes.nome as clube,
      fingeral_registros.descricao,
      IF(anexos.qtd>0, 1, 0) as anexos
      '.$sql_registros.$periodo.$where.'
      GROUP BY cast(fingeral_registros.data_lancamento as date), fingeral_registros.periodo_mes, fingeral_registros.periodo_ano, fingeral_registros.tipo_lancamento, fingeral_registros.id_categoria, fingeral_registros.id_clube
      ORDER BY fingeral_registros.data_vencimento ASC, id ASC');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* INFORMAÇÕES DO LANÇAMENTO *********
  if($tipo=="dados_registro"){
    $id_lancamento = $options['id_lancamento'];
    $sql_rs = $bd->getConexao()->prepare('
    SELECT
      fingeral_registros.*,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d") AS dia,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%d/%m/%Y - %H:%i") AS data,
      DATE_FORMAT(fingeral_registros.data_lancamento,"%Y-%m-%d") AS databd,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d") AS dia_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%d/%m/%Y") AS data_para,
      DATE_FORMAT(fingeral_registros.data_vencimento,"%Y-%m-%d") AS databd_para,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d") AS dia_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%d/%m/%Y") AS data_pago,
      DATE_FORMAT(fingeral_registros.data_pagamento,"%Y-%m-%d") AS databd_pago,
      fingeral_categorias.nome as categoria,
      fingeral_contas.nome as conta,
      fingeral_fornecedores.nome as fornecedor,
      IFNULL(fingeral_registros.gid_taxa_conv,0) as gid_taxa_conv
      '.$sql_registros.'
      AND fingeral_registros.id = :id_lancamento');
    $sql_rs->bindValue(':id_lancamento', $id_lancamento, PDO::PARAM_STR);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetch(PDO::FETCH_ASSOC);}
  }

  // ********* INFORMAÇÕES DO LANÇAMENTO *********
  if($tipo=="anexos_registro"){
    $id_lancamento = $options['id_lancamento'];
    $sql_rs = $bd->getConexao()->prepare('
    SELECT *
    FROM fingeral_registros_anexos
    WHERE id_fingeral_registro = :id_fingeral_registro');
    $sql_rs->bindValue(':id_fingeral_registro', $id_lancamento, PDO::PARAM_STR);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* CATEGORIAS *********
  if($tipo=="categorias"){
    $excluido = isset($options['excluido']) ? $options['excluido'] : 'c.excluido = 0';

    $sql_rs = $bd->getConexao()->prepare('
    SELECT c.*, p.nome as pai_nome
    FROM fingeral_categorias c
      LEFT JOIN fingeral_categorias p ON p.id = c.id_pai
    WHERE '.$excluido.'
    ORDER BY c.id_pai, c.ordem, c.nome');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* CONTAS *********
  if($tipo=="contas"){
    $sql_rs = $bd->getConexao()->prepare('
    SELECT *
    FROM fingeral_contas
    WHERE excluido = 0 ORDER BY ordem');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  if($tipo=="conta_dados"){
    $sql_rs = $bd->getConexao()->prepare('
    SELECT *
    FROM fingeral_contas
    WHERE id = :id');
    $sql_rs->bindValue(':id', $options['id_conta'], PDO::PARAM_STR);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetch(PDO::FETCH_ASSOC);}
  }

  // ********* FORNECEDORES *********
  if($tipo=="fornecedores"){
    $sql_rs = $bd->getConexao()->prepare('
    SELECT f.*, folha_cat.nome as folha_categoria_nome
    FROM fingeral_fornecedores f
      LEFT JOIN fingeral_categorias folha_cat ON folha_cat.id = f.folha_categoria
    WHERE f.excluido = 0 ORDER BY f.status DESC, f.nome ASC');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* FORNECEDORES *********
  if($tipo=="fornecedores_liberados"){
    $sql_rs = $bd->getConexao()->prepare('
    SELECT f.*, folha_cat.nome as folha_categoria_nome
    FROM fingeral_fornecedores f
      LEFT JOIN fingeral_categorias folha_cat ON folha_cat.id = f.folha_categoria
    WHERE f.excluido = 0 AND f.status = 1 ORDER BY f.folha_categoria, f.nome ASC');
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* REGISTROS PARA DRE *********
  if($tipo=="registros_dre_saldo_anterior"){
    $where_id_conta = $options['id_conta']>0 ? '='.$options['id_conta'] : '<>3';
    $sql_rs = $bd->getConexao()->prepare('
    SELECT
      sum(valor) as caixa,
      sum(CASE WHEN id_categoria in(113,114) THEN valor ELSE 0 END) as aplicacao
    FROM fingeral_registros
    WHERE periodo_ano < :periodo_ano AND excluido = 0 AND id_conta'.$where_id_conta);
    $sql_rs->bindValue(':periodo_ano', $options['ano'], PDO::PARAM_STR);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetch(PDO::FETCH_ASSOC);}
  }

  // ********* REGISTROS PARA DRE *********
  if($tipo=="registros_dre"){
    $where_id_conta = $options['id_conta']>0 ? '='.$options['id_conta'] : ' not in("3","5")';
    $sql_rs = $bd->getConexao()->prepare('
    SELECT
      cat.id as id_cat,
      cat.nome as categoria,
      sum(CASE WHEN reg.periodo_mes=1 THEN reg.valor ELSE 0 END) as m1,
      sum(CASE WHEN reg.periodo_mes=2 THEN reg.valor ELSE 0 END) as m2,
      sum(CASE WHEN reg.periodo_mes=3 THEN reg.valor ELSE 0 END) as m3,
      sum(CASE WHEN reg.periodo_mes=4 THEN reg.valor ELSE 0 END) as m4,
      sum(CASE WHEN reg.periodo_mes=5 THEN reg.valor ELSE 0 END) as m5,
      sum(CASE WHEN reg.periodo_mes=6 THEN reg.valor ELSE 0 END) as m6,
      sum(CASE WHEN reg.periodo_mes=7 THEN reg.valor ELSE 0 END) as m7,
      sum(CASE WHEN reg.periodo_mes=8 THEN reg.valor ELSE 0 END) as m8,
      sum(CASE WHEN reg.periodo_mes=9 THEN reg.valor ELSE 0 END) as m9,
      sum(CASE WHEN reg.periodo_mes=10 THEN reg.valor ELSE 0 END) as m10,
      sum(CASE WHEN reg.periodo_mes=11 THEN reg.valor ELSE 0 END) as m11,
      sum(CASE WHEN reg.periodo_mes=12 THEN reg.valor ELSE 0 END) as m12,
      IFNULL(sum(reg.valor),0) as total
    FROM fingeral_categorias cat
      LEFT JOIN fingeral_registros reg ON reg.id_categoria = cat.id AND reg.periodo_ano = :periodo_ano AND reg.excluido = 0 AND id_conta'.$where_id_conta.'
    GROUP BY cat.id');
    $sql_rs->bindValue(':periodo_ano', $options['ano'], PDO::PARAM_STR);
    if( $sql_rs->execute() ) { $rs = $sql_rs->fetchall(PDO::FETCH_ASSOC);}
  }

  // ********* NF *********
  if($tipo=="nfs_dds"){
    $sql = $bd->getConexao()->prepare('
    SELECT nf.*,
      DATE_FORMAT(nf.data_hora, "%d/%m/%Y - %H:%i:%s") as data_registro,
      DATE_FORMAT(nf.data_hora_envio, "%d/%m/%Y - %H:%i:%s") as data_envio,
      DATE_FORMAT(nf.data_hora_emissao, "%d/%m/%Y - %H:%i:%s") as data_emissao,
      reg.id as fingeral_registro_id
    FROM fingeral_nfs nf
      LEFT JOIN fingeral_registros reg ON reg.id_nfs = nf.id
    WHERE nf.id = :id');
    $sql->bindValue(':id', $options['id'], PDO::PARAM_STR);
    if($sql->execute()){$rs = $sql->fetch(PDO::FETCH_ASSOC);}
  }

  if($tipo=="nfs_aliquota"){
    $sql = $bd->getConexao()->prepare('
    SELECT al.*,
      DATE_FORMAT(al.data_hora_expire, "%d/%m/%Y - %H:%i:%s") as expire
    FROM fingeral_nfs_aliquotas al
    WHERE al.expirado = 0 AND al.excluido = 0 AND al.data_hora_expire > NOW()
    ORDER BY al.id DESC LIMIT 1');
    if($sql->execute()){$rs = $sql->fetch(PDO::FETCH_ASSOC);}
  }

  return $rs;
}





// ********** AÇÕES DE FORMS ************

// Cadastrando Lançamento
if(isset($_POST['fingeral']) && $_POST['fingeral'] == 'cadastrar_lanc') {
  $tipo_lancamento = $_POST['tipo_lancamento'];

  if(($tipo_lancamento==0 && $_POST['valor']<0) or ($tipo_lancamento==1 && $_POST['valor']>0) ){
    $valor = moeda($_POST['valor'])*-1;
  }else{
    $valor = moeda($_POST['valor']);
  }

  if($valor!=0 && $valor!=""){

    $id_categoria = $_POST['id_categoria'];
    $id_conta = $_POST['id_conta'];
    $id_clube = $_POST['id_clube'];
    $id_fornecedor = $_POST['id_fornecedor'];
    $observacao = $_POST['observacao'];
    $descricao = isset($_POST['descricao']) ? $_POST['descricao'] : "";

    $data_vencimento = isset($_POST['data_vencimento'])?$_POST['data_vencimento']:$fingeral_data_venc;
    //$data_vencimento = $data_vencimento==date("Y-m-d") ? date("Y-m-d H:i:s") : $data_vencimento.' 23:59:59';

    $data_competencia = explode('-',$_POST['competencia']);
    $data_competencia[0] = substr($data_competencia[0], -2);

    $conta_transf = $_POST['conta_transf']>0 ? $_POST['conta_transf'] : false;
    if($conta_transf){
      $conta_origem = sel_fingeral('conta_dados', array('id_conta'=>$id_conta));
      $conta_destino = sel_fingeral('conta_dados', array('id_conta'=>$conta_transf));

      $descricao = $conta_origem['nome'].($tipo_lancamento==0 ? ' << ' : ' >> ').$conta_destino['nome'];
      $descricao_destino = $conta_destino['nome'].($tipo_lancamento==0 ? ' >> ' : ' << ').$conta_origem['nome'];
    }

    $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, id_fornecedor, id_clube, descricao, observacao, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (:id_categoria, :id_conta, :id_fornecedor, :id_clube, :descricao, :observacao, :valor, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, :data_vencimento, 1, 0)');
    $sql->bindValue(':id_categoria', $id_categoria, PDO::PARAM_STR);
    $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
    $sql->bindValue(':id_fornecedor', $id_fornecedor, PDO::PARAM_STR);
    $sql->bindValue(':id_clube', $id_clube, PDO::PARAM_STR);
    $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
    $sql->bindValue(':observacao', $observacao, PDO::PARAM_STR);
    $sql->bindValue(':valor', $valor, PDO::PARAM_STR);
    $sql->bindValue(':periodo_mes', $data_competencia[1], PDO::PARAM_STR);
    $sql->bindValue(':periodo_ano', $data_competencia[0], PDO::PARAM_STR);
    $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
    $sql->bindValue(':data_pagamento', $data_vencimento, PDO::PARAM_STR);
    if($sql->execute());

    $id_ref_origem = $bd->lastId();

    // Realiza o lançamento espelho no destino (valor invertido)
    if($conta_transf){

      $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, id_fornecedor, id_ref, descricao, observacao, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (:id_categoria, :id_conta, :id_fornecedor, :id_ref, :descricao, :observacao, :valor, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, :data_vencimento, 1, 0)');
      $sql->bindValue(':id_categoria', $id_categoria, PDO::PARAM_STR);
      $sql->bindValue(':id_conta', $conta_transf, PDO::PARAM_STR);
      $sql->bindValue(':id_fornecedor', $id_fornecedor, PDO::PARAM_STR);
      $sql->bindValue(':id_ref', $id_ref_origem, PDO::PARAM_STR);
      $sql->bindValue(':descricao', $descricao_destino, PDO::PARAM_STR);
      $sql->bindValue(':observacao', $observacao, PDO::PARAM_STR);
      $sql->bindValue(':valor', $valor*-1, PDO::PARAM_STR);
      $sql->bindValue(':periodo_mes', $data_competencia[1], PDO::PARAM_STR);
      $sql->bindValue(':periodo_ano', $data_competencia[0], PDO::PARAM_STR);
      $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
      $sql->bindValue(':data_pagamento', $data_vencimento, PDO::PARAM_STR);
      if($sql->execute());

      $id_ref_destino = $bd->lastId();

      $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET id_ref = :id_ref WHERE id = :id');
      $sql->bindValue(':id', $id_ref_origem, PDO::PARAM_STR);
      $sql->bindValue(':id_ref', $id_ref_destino, PDO::PARAM_STR);
      if( $sql->execute() );
    }

    // Cadastra os anexos (se houver)
    if((isset($_FILES["anexos"]) && count($_FILES['anexos']['name'])>0 && $_FILES['anexos']['name'][0]!="")){
      $anexos = array();
      foreach($_FILES["anexos"] as $tipo=>$l){
        foreach($l as $i=>$v){
          $anexos[$i][$tipo]=$v;
        }
      }
      foreach($anexos as $l){
        $name = explode('.', $l['name']);
        $ext = end($name);

        $nome_file = date("YmdHis")."_".md5(date("YmdHis").gerarSenha(10, false, true)).".".$ext;
        move_uploaded_file($l["tmp_name"], "files/fingeral_anexos/".$nome_file);

        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros_anexos
        (id_fingeral_registro, titulo, arquivo_nome, data_hora) VALUES
        (:id_fingeral_registro, :titulo, :arquivo_nome, NOW())');
        $sql->bindValue(':id_fingeral_registro', $id_ref_origem, PDO::PARAM_STR);
        $sql->bindValue(':titulo', $l['name'], PDO::PARAM_STR);
        $sql->bindValue(':arquivo_nome', $nome_file, PDO::PARAM_STR);
        if($sql->execute());
      }
    }


    // Nota Fiscal
    if($_POST['nota_fiscal']==1 && $tipo_lancamento == 0){
      include_once('libraries/outros/NFs/NFs.php');
      $nf = new NFs();
      $nf->fingeralRegistro($id_ref_origem);
      $nf->cadastrar();
    }

    $mensagem = "ok";
  }else{
    $mensagem = "erro";
    $mensagem_frase = "O valor do lan&ccedil;amento n&atilde;o pode ser zero.";
  }

}


// Editando Lançamento
if(isset($_POST['fingeral']) && $_POST['fingeral'] == 'editar_lanc') {

  $id_registro = $_POST['id_lanc'];

  $tipo_lancamento = $_POST['tipo_lancamento'];

  $valor = moeda($_POST['valor']);
  $valor = $tipo_lancamento==0 ?
    ($valor<0 ? $valor*-1 : $valor):
    ($valor>0 ? $valor*-1 : $valor);

  if($valor!=0 && $valor!=""){

    $id_categoria = $_POST['id_categoria'];
    $id_fornecedor = $_POST['id_fornecedor'];
    $id_clube = $_POST['id_clube'];
    $descricao = $_POST['descricao'];
    $observacao = $_POST['observacao'];

    $data_vencimento = isset($_POST['data_vencimento'])?$_POST['data_vencimento']:$fingeral_data_venc;
    //$data_vencimento = $data_vencimento==date("Y-m-d") ? date("Y-m-d H:i:s") : $data_vencimento.' 23:59:59';

    $data_competencia = explode('-',$_POST['competencia']);
    $data_competencia[0] = substr($data_competencia[0], -2);

    $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET
    id_categoria = :id_categoria,
    id_clube = :id_clube,
    id_fornecedor = :id_fornecedor,
    descricao = :descricao,
    observacao = :observacao,
    valor = :valor,
    data_vencimento = :data_vencimento,
    periodo_mes = :periodo_mes,
    periodo_ano = :periodo_ano
    WHERE id = :id');
    $sql->bindValue(':id', $id_registro, PDO::PARAM_STR);
    $sql->bindValue(':id_categoria', $id_categoria, PDO::PARAM_STR);
    $sql->bindValue(':id_clube', $id_clube, PDO::PARAM_STR);
    $sql->bindValue(':id_fornecedor', $id_fornecedor, PDO::PARAM_STR);
    $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
    $sql->bindValue(':observacao', $observacao, PDO::PARAM_STR);
    $sql->bindValue(':valor', $valor, PDO::PARAM_STR);
    $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
    $sql->bindValue(':periodo_mes', $data_competencia[1], PDO::PARAM_STR);
    $sql->bindValue(':periodo_ano', $data_competencia[0], PDO::PARAM_STR);
    if($sql->execute());

    $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET
    id_categoria = :id_categoria,
    id_clube = :id_clube,
    id_fornecedor = :id_fornecedor,
    descricao = :descricao,
    observacao = :observacao,
    valor = :valor,
    data_vencimento = :data_vencimento,
    periodo_mes = :periodo_mes,
    periodo_ano = :periodo_ano
    WHERE id_ref = :id');
    $sql->bindValue(':id', $id_registro, PDO::PARAM_STR);
    $sql->bindValue(':id_categoria', $id_categoria, PDO::PARAM_STR);
    $sql->bindValue(':id_clube', $id_clube, PDO::PARAM_STR);
    $sql->bindValue(':id_fornecedor', $id_fornecedor, PDO::PARAM_STR);
    $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
    $sql->bindValue(':observacao', $observacao, PDO::PARAM_STR);
    $sql->bindValue(':valor', $valor*-1, PDO::PARAM_STR);
    $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
    $sql->bindValue(':periodo_mes', $data_competencia[1], PDO::PARAM_STR);
    $sql->bindValue(':periodo_ano', $data_competencia[0], PDO::PARAM_STR);
    if($sql->execute());

    $mensagem = "ok";
  }else{
    $mensagem = "erro";
    $mensagem_frase = "O valor do lan&ccedil;amento n&atilde;o pode ser zero.";
  }

}

// Excluir Lançamento
if(isset($_POST['fingeral']) && $_POST['fingeral'] == 'excluir_lanc') {

  $id = $_POST['id_lanc'];

  $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET excluido = 1 WHERE id = :id OR id_ref = :id');
  $sql->bindValue(':id', $id, PDO::PARAM_STR);
  if($sql->execute());

  $mensagem = "ok";
}


// Cadastrando Lançamento
if(isset($_POST['fingeral']) && $_POST['fingeral'] == 'cadastrar_folha'){

  $id_conta = $_POST['id_conta'];
  $data_vencimento = isset($_POST['data_vencimento'])?$_POST['data_vencimento']:$fingeral_data_venc;

  $data_competencia = explode('-',$_POST['competencia']);
  $data_competencia[0] = substr($data_competencia[0], -2);

  // Campos com ID do centro de custo (0 para enviado via post)
  $campos_valores = [
    'valor'=>0,
    'bonus'=>111,
    'comissao'=>140
  ];

  $categorias = $_POST['categoria'];

  // Roda cada campo de valor
  foreach($campos_valores as $c=>$id_cat){
    $inserts = array();
    $valores = $_POST[$c];
    foreach($valores as $k=>$l){
      $valor = moeda($l);
      if($valor>0){$valor=$valor*-1;}
      if($valor<0){
        $inserts[] = array(
          "id_fornecedor"=> $k,
          "id_categoria"=> $id_cat > 0 ? $id_cat : $categorias[$k],
          "valor"=> $valor
        );
      }
    }
    if(count($inserts)>0){
      foreach($inserts as $l){
        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, id_fornecedor, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (:id_categoria, :id_conta, :id_fornecedor, :valor, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, :data_vencimento, 1, 0)');
        $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
        $sql->bindValue(':id_categoria', $l['id_categoria'], PDO::PARAM_STR);
        $sql->bindValue(':id_fornecedor', $l['id_fornecedor'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $l['valor'], PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', $data_competencia[1], PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', $data_competencia[0], PDO::PARAM_STR);
        $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
        $sql->bindValue(':data_pagamento', $data_vencimento, PDO::PARAM_STR);
        if($sql->execute());
      }
    }
  }
  $mensagem = "ok";
}




// ********** FUNÇÕES - PRINCIPAIS (TODOS OS MÓDULOS) ************



// ********** FUNÇÕES - PADRÃO FINANCEIRO ************

// Criando Árvore de Categorias
function criarArvoreCat($resul_func_cats, $id_pai=0, $campo=null){
  $refs = array(); $list = array();
  foreach ($resul_func_cats as $row){
    $ref = & $refs[$row['id']];

    $ref['id'] = $row['id'];
    $ref['id_pai'] = $row['id_pai'];
    $ref['nome'] = $row['nome'];
    $ref['pai_nome'] = $row['pai_nome'];
    $ref['status'] = $row['status'];
    $ref['ordem'] = $row['ordem'];

    if($row['id_pai'] == $id_pai){ $list[$row['id']] = & $ref; }else{
      $refs[$row['id_pai']]['filhos'][$row['id']] = & $ref;
    }
  }

  global $arr_fim; $arr_fim=array();
  global $nivel; $nivel=0;

  if($campo==null){ return criarArrayCat($list); }else{
    $arr_campos = array();
    foreach(criarArrayCat($list) as $l){
      if($campo=='id'){array_push($arr_campos, $l['id']);}
      if($campo=='id_pai'){array_push($arr_campos, $l['id_pai']);}
      if($campo=='nome'){array_push($arr_campos, $l['nome']);}
      if($campo=='pai_nome'){array_push($arr_campos, $l['pai_nome']);}
      if($campo=='status'){array_push($arr_campos, $l['status']);}
      if($campo=='ordem'){array_push($arr_campos, $l['ordem']);}
      if($campo=='fluxo'){array_push($arr_campos, $l['fluxo']);}
      if($campo=='indice'){array_push($arr_campos, $l['indice']);}
    }
    return $arr_campos;
  }
}


// Criando Array na Ordem da Árvore
function criarArrayCat($array){
  global $nivel;
  global $arr_fim;
  if(!isset($nivel)){$nivel=0;}
  if(!isset($arr_fim)){$arr_fim=array();}
  $nivel++;
  $infcat=array();
  if($array){
    foreach ($array as $l) {
      $infcat = array(
        "id"=>$l['id'],
        "nome"=>$l['nome'],
        "id_pai"=>$l['id_pai'],
        "pai_nome"=>$l['pai_nome'],
        "status"=>$l['status'],
        "ordem"=>$l['ordem'],
        "nivel"=>$nivel
      ); array_push($arr_fim, $infcat);
      if(isset($l['filhos'])){ criarArrayCat($l['filhos']); $nivel--; }
    }
  }
  return criarIndiceNumCat($arr_fim);
}


// Criando Índice numérico para as categorias
function criarIndiceNumCat($array){
  $i=0; $ind=array(); $ult_nivel=0;
  foreach ($array as $l) {
    $num='';

    if(!isset($ind[$l['nivel']])){ $ind[$l['nivel']]=1; }else{ $ind[$l['nivel']]++; }
    for($n=1;$n<=$l['nivel'];$n++){ $num.=$ind[$n].'.'; }

    $num = substr($num, 0, -1);
    $array[$i]['indice'] = $num;

    if($l['nivel']<$ult_nivel){
      for($u=$ult_nivel;$u>$l['nivel'];$u--){ $ind[$u]=0; }
    }else{ $ult_nivel = $l['nivel']; }

    $i++;
  }
  return $array;
}


// Where para periodos
function whereFiltro($options, $tipo){

  $where = '';

  if(isset($options['filtro_categorias'])){ $where .= ' AND fingeral_registros.id_categoria in('.listarIDs($options['filtro_categorias']).')'; }
  if(isset($options['filtro_contas'])){ $where .= ' AND fingeral_registros.id_conta in('.listarIDs($options['filtro_contas']).')'; }
  if(isset($options['filtro_fornecedores'])){ $where .= ' AND fingeral_registros.id_fornecedor in('.listarIDs($options['filtro_fornecedores']).')'; }
  if(isset($options['filtro_tipo'])){ $where .= ' AND fingeral_registros.tipo_lancamento in('.listarIDs($options['filtro_tipo']).')'; }

  if(isset($options['filtro_valor_de'])){
    $where .= ' AND fingeral_registros.valor >='.$options['filtro_valor_de'];
  }
  if(isset($options['filtro_valor_ate'])){
    $where .= ' AND fingeral_registros.valor <='.$options['filtro_valor_ate'];
  }

  // Se há período de Pagamento
  if($options['pgto_inicio']>0 && $options['pgto_fim']>0){
    $periodo_pgto = ' AND fingeral_registros.data_pagamento BETWEEN ("'.$options['pgto_inicio'].' 00:00:00") AND ("'.$options['pgto_fim'].' 23:59:59")';
  }else{ $periodo_pgto = ''; }

  // Se há período de Competência
  if($options['competencia']>0){
    $comp_valor = explode('-',$options['competencia']);
    $competencia = ' AND fingeral_registros.periodo_ano = '.$comp_valor[0].' AND fingeral_registros.periodo_mes = '.$comp_valor[1];
  }else{ $competencia = ''; }

  // Se há período de Vencimento
  if($options['data_inicio']>0 && $options['data_fim']>0){
    $periodo_inicio = $options['data_inicio']." 00:00:00";
    $periodo_fim = $options['data_fim']." 23:59:59";
    $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'")';

    $coluna_data = 'data_vencimento';
  }else{
    $periodo_inicio = date("Y-m-01")." 00:00:00";
    $periodo_fim = date("Y-m-t")." 23:59:59";

    if($periodo_pgto=='' && $competencia==''){
      $periodo = ' AND fingeral_registros.data_lancamento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'")';
    }else{$periodo = '';}
  }

  if($tipo=="saldo_anterior"){
    $coluna_data = isset($coluna_data) ? $coluna_data : 'data_lancamento';
    $periodo = ' AND fingeral_registros.'.$coluna_data.' < "'.$periodo_inicio.'"';
  }

  if(isset($options['filtro_status'])) {
    $status_array = $options['filtro_status'];
    $status_pago = in_array("0", $status_array)?1:0;
    $status_vencido = in_array("1", $status_array)?1:0;
    $status_aberto = in_array("2", $status_array)?1:0;

    if($status_vencido==0 && $status_aberto==1){
      $inicio_aberto = strtotime(date("Y-m-d"))<strtotime($periodo_inicio)?$periodo_inicio:date("Y-m-d"); // Para Saldo Anterior
      // Se Pago
      if($status_pago==1){
        $periodo = ' AND (
            (fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 1) or
            (fingeral_registros.data_vencimento BETWEEN ("'.$inicio_aberto.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 0)
            )';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND (
            (fingeral_registros.data_vencimento < "'.$periodo_inicio.'" AND fingeral_registros.status_pago = 1) or
            (fingeral_registros.data_vencimento BETWEEN ("'.date("Y-m-d").'") AND ("'.date("Y-m-d", strtotime("-1 days", strtotime($inicio_aberto))).'") AND fingeral_registros.status_pago = 0)
            )';
        }
      }else{
        $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$inicio_aberto.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 0';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.date("Y-m-d").'") AND ("'.date("Y-m-d", strtotime("-1 days", strtotime($inicio_aberto))).'") AND fingeral_registros.status_pago = 0';
        }
      }
    }

    if($status_vencido==1 && $status_aberto==0){
      $fim_vencido = strtotime(date("Y-m-d"))>strtotime($periodo_fim)?$periodo_fim:date("Y-m-d"); // Para Registros
      $fim_vencido_saldo = strtotime(date("Y-m-d"))>strtotime($periodo_inicio)?$periodo_inicio:date("Y-m-d"); // Para Saldo Anterior
      // Se Pago
      if($status_pago==1){
        $periodo = ' AND (
            (fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 1) or
            (fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$fim_vencido.'") AND fingeral_registros.data_vencimento<>"'.date("Y-m-d").'" AND fingeral_registros.status_pago = 0)
            )';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND (
            (fingeral_registros.data_vencimento < "'.$periodo_inicio.'" AND fingeral_registros.status_pago = 1) or
            (fingeral_registros.data_vencimento < "'.$fim_vencido_saldo.'" AND fingeral_registros.status_pago = 0)
            )';
        }
      }else{
        $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$fim_vencido.'") AND fingeral_registros.data_vencimento<>"'.date("Y-m-d").'" AND fingeral_registros.status_pago = 0';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND fingeral_registros.data_vencimento < "'.$fim_vencido_saldo.'" AND fingeral_registros.status_pago = 0';
        }
      }
    }

    if($status_vencido==1 && $status_aberto==1){
      // Se Pago
      if($status_pago==1){
        $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'")';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND fingeral_registros.data_vencimento < "'.$periodo_inicio.'"';
        }
      }else{
        $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 0';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND fingeral_registros.data_vencimento < "'.$periodo_inicio.'" AND fingeral_registros.status_pago = 0';
        }
      }
    }

    if($status_vencido==0 && $status_aberto==0){
      // Se Pago
      if($status_pago==1){
        $periodo = ' AND fingeral_registros.data_vencimento BETWEEN ("'.$periodo_inicio.'") AND ("'.$periodo_fim.'") AND fingeral_registros.status_pago = 1';
        if($tipo=="saldo_anterior"){
          $periodo = ' AND fingeral_registros.data_vencimento < "'.$periodo_inicio.'" AND fingeral_registros.status_pago = 1';
        }
      }
      // Se não pago -> Perído sem filtro
    }

  }

  $filtro_preparado = array(
    "where"=>$where,
    "periodo"=>$periodo.$periodo_pgto.$competencia,
  );

  return $filtro_preparado;
}



