<?php include(__DIR__.'/../fncr-geral/coneccao-bd.php');
include(__DIR__.'/../fncr-geral/formatacao_valores.php');

// REGISTRAR RETORNO DO WEBHOOK
$headers = json_encode(getallheaders());
$body = file_get_contents("php://input");

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

$sql = $bd->getConexao()->prepare('INSERT INTO webhooks
  (header, body, origem, data_hora) VALUES
  (:headers, :body, "stripe", NOW())');
$sql->bindValue(':headers', $headers, PDO::PARAM_STR);
$sql->bindValue(':body', $body, PDO::PARAM_STR);
if($sql->execute());

$action = isset($_GET['ac']) ? $_GET['ac'] : null;

// POKERWEB CLUBES - PAGAMENTOS
if($action=="payment"){
  try{
    $data = json_decode($body, true);

    // FINANCEIRO GERAL
    $id_conta = 4;
    $id_categoria_mensalidade = 63; // Categoria "PokerWeb - Mensalidades"
    $id_categoria_taxas = 127; // Categoria "Stripe - Taxas"

    // Validação da estrutura do json
    if(isset($data['type']) && $data['type']=="payment_intent.succeeded" && isset($data['data']['object']['id'])){
      $pay = $data['data']['object'];

      $id_transacao = $pay['id'];
      $id_fatura = $pay['metadata']['id_fatura'];
      $id_doc = $pay['metadata']['doc'];

      // Dados do registro
      $sql = $bd->getConexao()->prepare('
      SELECT f.*, r.id as stripe_id, r.stripe_id_transacao, cf.cobranca_stripe_nf_direto
      FROM clubes_financeiro f
        LEFT JOIN clubes_configuracao cf ON cf.id_clube = f.id_clube
        LEFT JOIN stripe_registros r ON r.id_financeiro = f.id AND r.id_clube = f.id_clube AND r.cancelado = 0 AND r.pago = 0
      WHERE f.id = :id AND f.documento = :documento');
      $sql->bindValue(':id', $id_fatura, PDO::PARAM_STR);
      $sql->bindValue(':documento', $id_doc, PDO::PARAM_STR);
      if($sql->execute()){$fatura_registro = $sql->fetch(PDO::FETCH_ASSOC);}

      if($fatura_registro
        && (in_array($fatura_registro['status'],[1,2,3,7])) // Se fatura continua aberta
        && $id_transacao == $fatura_registro['stripe_id_transacao'] // Se fatura possui o mesmo id de transação do hook
      ){

        require_once(__DIR__.'../../../_vendors/stripe-php/init.php');
        $stripe = new \Stripe\StripeClient(GLOBAL_STRIPE_CLIENT_SECRET);

        $pay = $stripe->paymentIntents->retrieve($id_transacao);
        $cobranca = $stripe->charges->retrieve($pay->latest_charge);
        $transacao = $stripe->balanceTransactions->retrieve($cobranca->balance_transaction);

        $valor_brl = $transacao->amount / 100;
        $valor_cambio = $transacao->exchange_rate;
        $valor_taxa = $transacao->fee / 100;
        $valor_liquido = $transacao->net / 100;

        $perc_taxa = 100-($valor_liquido/$valor_brl*100);

        // REGISTRO STRIPE
        $sql = $bd->getConexao()->prepare('UPDATE stripe_registros SET
          pago = 1,
          stripe_id_charge = :stripe_id_charge,
          data_hora_pagamento = NOW()
        WHERE id = :id');
        $sql->bindValue(':id', $fatura_registro['stripe_id'], PDO::PARAM_STR);
        $sql->bindValue(':stripe_id_charge', $pay->latest_charge, PDO::PARAM_STR);
        if($sql->execute());

        // Pagamento de multiplas faturas
        if($fatura_registro['plano_sistema']==0){
          $fat_multipla = true;

          $sql = $bd->getConexao()->prepare('
          SELECT f.*, cf.cobranca_stripe_nf_direto
          FROM clubes_financeiro f
            LEFT JOIN clubes_configuracao cf ON cf.id_clube = f.id_clube
          WHERE f.id_ref = :id_ref');
          $sql->bindValue(':id_ref', $fatura_registro['id'], PDO::PARAM_STR);
          if($sql->execute()){$faturas_pagas = $sql->fetchall(PDO::FETCH_ASSOC);}

          // MARCA A FATURA COMO PAGO
          $sql = $bd->getConexao()->prepare('UPDATE clubes_financeiro SET
            data_pgto = NOW(),
            data_notificacao = NOW(),
            data_liberacao = NOW(),
            valor_pago = :valor_pago,
            valor_liberado = :valor_liberado,
            conversao_cotacao = :conversao_cotacao,
            valor_desc_pag = :valor_desc_pag,
            status = 4
          WHERE id = :id AND status > 0');
          $sql->bindValue(':valor_pago', $valor_brl, PDO::PARAM_STR);
          $sql->bindValue(':valor_liberado', $valor_liquido, PDO::PARAM_STR);
          $sql->bindValue(':conversao_cotacao', $valor_cambio, PDO::PARAM_STR);
          $sql->bindValue(':valor_desc_pag', $valor_taxa, PDO::PARAM_STR);
          $sql->bindValue(':id', $fatura_registro['id'], PDO::PARAM_STR);
          if($sql->execute());

        }
        // Fatura Única
        else{
          $fat_multipla = false;
          $faturas_pagas[0]=$fatura_registro;
        }
      }

      // RODAR AS FATURAS
      if(isset($faturas_pagas) && count($faturas_pagas)>0){

        foreach($faturas_pagas as $fatura){
          if($fatura && (in_array($fatura['status'],[1,2,3,7]))){

            $fat_valor_brl = $fat_multipla ? ($fatura['valor']*$valor_cambio)/100 : $valor_brl;
            $fat_valor_taxa = $fat_multipla ? $fat_valor_brl * $perc_taxa /100 : $valor_taxa;
            $fat_valor_liquido = $fat_multipla ? $fat_valor_brl - $fat_valor_taxa : $valor_liquido;

            // MARCA A FATURA COMO PAGO
            $sql = $bd->getConexao()->prepare('UPDATE clubes_financeiro SET
              data_pgto = NOW(),
              data_notificacao = NOW(),
              data_liberacao = NOW(),
              valor_pago = :valor_pago,
              valor_liberado = :valor_liberado,
              conversao_cotacao = :conversao_cotacao,
              valor_desc_pag = :valor_desc_pag,
              status = 4
            WHERE id = :id AND status > 0');
            $sql->bindValue(':valor_pago', $fat_valor_brl, PDO::PARAM_STR);
            $sql->bindValue(':valor_liberado', $fat_valor_liquido, PDO::PARAM_STR);
            $sql->bindValue(':conversao_cotacao', $valor_cambio, PDO::PARAM_STR);
            $sql->bindValue(':valor_desc_pag', $fat_valor_taxa, PDO::PARAM_STR);
            $sql->bindValue(':id', $fatura['id'], PDO::PARAM_STR);
            if($sql->execute());

            if($fatura['periodo_mes']!=date("m")){
              $data_vencimento = "20".$fatura['periodo_ano'].'-'.$fatura['periodo_mes'].'-'.'01';
            }else{
              $data_vencimento = date("Y-m-d");
            }

            $obs  = 'Valor Pago: '.echomoeda($fatura['valor']).' ('.$fatura['moeda_iso'].')<br>';
            $obs .= 'Cambio: '.echomoeda($valor_cambio,6).'<br>';
            $obs .= 'Convertido: '.echomoeda($fat_valor_brl).'<br>';
            $obs .= 'Taxa: '.echomoeda($fat_valor_taxa).'<br>';
            $obs .= 'Liquido: '.echomoeda($fat_valor_liquido).'<br>';

            $nf_ato_pgto = $fatura['cobranca_stripe_nf_direto']==1;

            // Registro do valor pago
            $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
            (id_categoria, id_conta, id_clube, id_clube_financeiro, valor, nfs_deduzir_valor, observacao, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
            (:id_categoria, :id_conta, :id_clube, :id_clube_financeiro, :valor, :nfs_deduzir_valor, :observacao, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, NOW(), 1, 1, 0)');
            $sql->bindValue(':id_categoria', $id_categoria_mensalidade, PDO::PARAM_STR);
            $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
            $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
            $sql->bindValue(':id_clube_financeiro', $fatura['id'], PDO::PARAM_STR);
            $sql->bindValue(':valor', $fat_valor_brl, PDO::PARAM_STR);
            $sql->bindValue(':nfs_deduzir_valor', $nf_ato_pgto, PDO::PARAM_STR);
            $sql->bindValue(':observacao', $obs, PDO::PARAM_STR);
            $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
            $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
            $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
            if($sql->execute());

            $id_fingeral_registro = $bd->lastId();

            // Registro das taxas com Stripe
            $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
            (id_categoria, id_conta, id_clube, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
            (:id_categoria, :id_conta, :id_clube, :valor, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, NOW(), 1, 1, 0)');
            $sql->bindValue(':id_categoria', $id_categoria_taxas, PDO::PARAM_STR);
            $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
            $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
            $sql->bindValue(':valor', $fat_valor_taxa*-1, PDO::PARAM_STR);
            $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
            $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
            $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
            if($sql->execute());

            // Emissão da NF (se for o caso de ser emissão no ato do pagamento)
            if($nf_ato_pgto){
              include_once('../libraries/outros/NFs/NFs.php');
              $nf = new NFs();
              $nf->fingeralRegistro($id_fingeral_registro);
              $nf->cadastrar();

              // Marca o registro para ter o valor descontado, na emissão da NF de repasse
              $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET nfs_deduzir_valor = 1 WHERE id = :id');
              $sql->bindValue(':id', $id_fingeral_registro, PDO::PARAM_STR);
              if($sql->execute());
            }

            // Registro de comissões em caso de Representantes
            $reg_extrato = false;
            if(in_array($fatura['plano_nivel'],[11,12,13,14,15])){ // Japão
              $reg_extrato = true;
              $extrato_id_painel = 3;
              $extrato_comissao = (($fatura['valor']*10)/100)*-1;
            }

            if($reg_extrato){
              $sql = $bd->getConexao()->prepare('INSERT INTO representantes_extrato
              (id_clube_painel, id_clube, tipo, plano_nivel, id_mensalidade, periodo_mes, periodo_ano, valor_setup, valor_mensalidade, valor, data_hora) VALUES
              (:id_clube_painel, :id_clube, 2, :plano_nivel, :id_mensalidade, :periodo_mes, :periodo_ano, :valor_setup, :valor_mensalidade, :valor, NOW())');
              $sql->bindValue(':id_clube_painel', $extrato_id_painel, PDO::PARAM_STR);
              $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
              $sql->bindValue(':plano_nivel', $fatura['plano_nivel'], PDO::PARAM_STR);
              $sql->bindValue(':id_mensalidade', $fatura['id'], PDO::PARAM_STR);
              $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
              $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
              $sql->bindValue(':valor_setup', 0, PDO::PARAM_STR);
              $sql->bindValue(':valor_mensalidade', $fatura['valor'], PDO::PARAM_STR);
              $sql->bindValue(':valor', $extrato_comissao, PDO::PARAM_STR);
              if($sql->execute());
            }

            // Liberar Clube se bloqueado
            if($fatura['bloq_status_clube']==0){
              // Liberar Clube se bloqueado
              $sql = $bd->getConexao()->prepare('UPDATE clubes SET bloqueio = 0, visualizacao = 0 WHERE id = :id_clube');
              $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
              if($sql->execute());
            }
          }


        }
      }








      //echoPre($id_fatura);
      //echoPre($id_doc);
      //echoPre($fatura);

      /*
      if($fatura
        && ($fatura['status']=="2" or $fatura['status']=="3" or $fatura['status']=="7") // Se fatura continua aberta
        && $id_transacao == $fatura['stripe_id_transacao'] // Se fatura possui o mesmo id de transação do hook
      ){
        require_once(__DIR__.'../../../_vendors/stripe-php/init.php');

        $stripe = new \Stripe\StripeClient(GLOBAL_STRIPE_CLIENT_SECRET);

        $pay = $stripe->paymentIntents->retrieve($id_transacao);
        $cobranca = $stripe->charges->retrieve($pay->latest_charge);
        $transacao = $stripe->balanceTransactions->retrieve($cobranca->balance_transaction);

        $valor_brl = $transacao->amount / 100;
        $valor_cambio = $transacao->exchange_rate;
        $valor_taxa = $transacao->fee / 100;
        $valor_liquido = $transacao->net / 100;

        // MARCA A FATURA COMO PAGO
        $sql = $bd->getConexao()->prepare('UPDATE clubes_financeiro SET
          data_pgto = NOW(),
          data_notificacao = NOW(),
          data_liberacao = NOW(),
          valor_pago = :valor_pago,
          valor_liberado = :valor_liberado,
          conversao_cotacao = :conversao_cotacao,
          valor_desc_pag = :valor_desc_pag,
          status = 4
        WHERE id = :id AND status > 0');
        $sql->bindValue(':valor_pago', $valor_brl, PDO::PARAM_STR);
        $sql->bindValue(':valor_liberado', $valor_liquido, PDO::PARAM_STR);
        $sql->bindValue(':conversao_cotacao', $valor_cambio, PDO::PARAM_STR);
        $sql->bindValue(':valor_desc_pag', $valor_taxa, PDO::PARAM_STR);
        $sql->bindValue(':id', $fatura['id'], PDO::PARAM_STR);
        if($sql->execute());

        // REGISTRO STRIPE
        $sql = $bd->getConexao()->prepare('UPDATE stripe_registros SET pago = 1, data_hora_pagamento = NOW() WHERE id = :id');
        $sql->bindValue(':id', $fatura['stripe_id'], PDO::PARAM_STR);
        if($sql->execute());

        // FINANCEIRO GERAL
        $id_conta = 4;
        $id_categoria_mensalidade = 63; // Categoria "PokerWeb - Mensalidades"
        $id_categoria_taxas = 127; // Categoria "Stripe - Taxas"

        if($fatura['periodo_mes']!=date("m")){
          $data_vencimento = "20".$fatura['periodo_ano'].'-'.$fatura['periodo_mes'].'-'.'01';
        }else{
          $data_vencimento = date("Y-m-d");
        }

        $obs  = 'Valor Pago: '.echomoeda($fatura['valor']).' ('.$fatura['moeda_iso'].')<br>';
        $obs .= 'Cambio: '.echomoeda($valor_cambio,6).'<br>';
        $obs .= 'Convertido: '.echomoeda($valor_brl).'<br>';
        $obs .= 'Taxa: '.echomoeda($valor_taxa).'<br>';
        $obs .= 'Liquido: '.echomoeda($valor_liquido).'<br>';

        $nf_ato_pgto = $fatura['cobranca_stripe_nf_direto']==1;

        // Registro do valor pago
        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, id_clube_financeiro, valor, nfs_deduzir_valor, observacao, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
        (:id_categoria, :id_conta, :id_clube, :id_clube_financeiro, :valor, :nfs_deduzir_valor, :observacao, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, NOW(), 1, 1, 0)');
        $sql->bindValue(':id_categoria', $id_categoria_mensalidade, PDO::PARAM_STR);
        $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
        $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':id_clube_financeiro', $fatura['id'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_brl, PDO::PARAM_STR);
        $sql->bindValue(':nfs_deduzir_valor', $nf_ato_pgto, PDO::PARAM_STR);
        $sql->bindValue(':observacao', $obs, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
        $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
        if($sql->execute());

        $id_fingeral_registro = $bd->lastId();

        // Registro das taxas com Stripe
        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
        (:id_categoria, :id_conta, :id_clube, :valor, :periodo_mes, :periodo_ano, NOW(), :data_vencimento, NOW(), 1, 1, 0)');
        $sql->bindValue(':id_categoria', $id_categoria_taxas, PDO::PARAM_STR);
        $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
        $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_taxa*-1, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
        $sql->bindValue(':data_vencimento', $data_vencimento, PDO::PARAM_STR);
        if($sql->execute());

        // Emissão da NF (se for o caso de ser emissão no ato do pagamento)
        if($nf_ato_pgto){
          include_once('../libraries/outros/NFs/NFs.php');
          $nf = new NFs();
          $nf->fingeralRegistro($id_fingeral_registro);
          $nf->cadastrar();

          // Marca o registro para ter o valor descontado, na emissão da NF de repasse
          $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET nfs_deduzir_valor = 1 WHERE id = :id');
          $sql->bindValue(':id', $id_fingeral_registro, PDO::PARAM_STR);
          if($sql->execute());
        }

        // Registro de comissões em caso de Representantes
        $reg_extrato = false;
        if(in_array($fatura['plano_nivel'],[11,12,13,14,15])){ // Japão
          $reg_extrato = true;
          $extrato_id_painel = 3;
          $extrato_comissao = (($fatura['valor']*10)/100)*-1;
        }

        if($reg_extrato){
          $sql = $bd->getConexao()->prepare('INSERT INTO representantes_extrato
            (id_clube_painel, id_clube, tipo, plano_nivel, id_mensalidade, periodo_mes, periodo_ano, valor_setup, valor_mensalidade, valor, data_hora) VALUES
            (:id_clube_painel, :id_clube, 2, :plano_nivel, :id_mensalidade, :periodo_mes, :periodo_ano, :valor_setup, :valor_mensalidade, :valor, NOW())');
          $sql->bindValue(':id_clube_painel', $extrato_id_painel, PDO::PARAM_STR);
          $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
          $sql->bindValue(':plano_nivel', $fatura['plano_nivel'], PDO::PARAM_STR);
          $sql->bindValue(':id_mensalidade', $fatura['id'], PDO::PARAM_STR);
          $sql->bindValue(':periodo_mes', $fatura['periodo_mes'], PDO::PARAM_STR);
          $sql->bindValue(':periodo_ano', $fatura['periodo_ano'], PDO::PARAM_STR);
          $sql->bindValue(':valor_setup', 0, PDO::PARAM_STR);
          $sql->bindValue(':valor_mensalidade', $fatura['valor'], PDO::PARAM_STR);
          $sql->bindValue(':valor', $extrato_comissao, PDO::PARAM_STR);
          if($sql->execute());
        }

        // Liberar Clube se bloqueado
        if($fatura['bloq_status_clube']==0){
          // Liberar Clube se bloqueado
          $sql = $bd->getConexao()->prepare('UPDATE clubes SET bloqueio = 0, visualizacao = 0 WHERE id = :id_clube');
          $sql->bindValue(':id_clube', $fatura['id_clube'], PDO::PARAM_STR);
          if($sql->execute());

          // Inserir Registro de Status
          $sql = $bd->getConexao()->prepare('INSERT INTO clubes_financeiro_datas
          (id_financeiro, data, hora, status, origem) VALUES
          ("'.$fatura['id'].'", NOW(), NOW(), "4", "1")');
          if( $sql->execute() );
        }
      }


      */



    }
  }catch(Exception $e){}
}

// POKERWEB CLUBES - REPASSE
if($action=="repasse"){
  try{
    $data = json_decode($body, true);
    if(isset($data['type']) && $data['type']=="payout.paid" && isset($data['data']['object']['id'])){
      $repasse = $data['data']['object'];
      $id_transacao = $repasse['id'];

      require_once(__DIR__.'../../../_vendors/stripe-php/init.php');
      $stripe = new \Stripe\StripeClient(GLOBAL_STRIPE_CLIENT_SECRET);

      $transacao = $stripe->payouts->retrieve($id_transacao);

      $valor = $transacao->amount / 100;

      $periodo_mes = date('m');
      $periodo_ano = date('y');

      // TRANSFERENCIA ENTRE CONTAS

      // Pokerweb - Internacional
      $descricao = 'PokerWeb Internacional >> PokerWeb';
      $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, valor, descricao, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (125, 4, :valor, :descricao, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 0)');
      $sql->bindValue(':valor', ($valor*-1), PDO::PARAM_STR);
      $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
      $sql->bindValue(':periodo_mes', $periodo_mes, PDO::PARAM_STR);
      $sql->bindValue(':periodo_ano', $periodo_ano, PDO::PARAM_STR);
      if($sql->execute());

      $id_origem = $bd->lastId();

      // Pokerweb
      $descricao = 'PokerWeb << PokerWeb Internacional';
      $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, valor, descricao, id_ref, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (125, 1, :valor, :descricao, :id_ref, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 0)');
      $sql->bindValue(':valor', $valor, PDO::PARAM_STR);
      $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
      $sql->bindValue(':id_ref', $id_origem, PDO::PARAM_STR);
      $sql->bindValue(':periodo_mes', $periodo_mes, PDO::PARAM_STR);
      $sql->bindValue(':periodo_ano', $periodo_ano, PDO::PARAM_STR);
      if($sql->execute());

      $id_destino = $bd->lastId();

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

      // EMISSÃO DA NF
      $nf_valor_deduzir = 0;

      // Verificando se existe valor à desconsiderar
      $charges = [];
      $balanceTx = $stripe->balanceTransactions->all(['payout' => $id_transacao, 'limit' => 100]);
      foreach($balanceTx->data as $t){
        if(isset($t->source) && strpos($t->source, 'ch_')===0){
          $charges[] = $t->source;
        }
      }
      if(count($charges)>0){
        $sql = $bd->getConexao()->prepare('
        SELECT sum(ifnull(fr.valor,0)) as total
        FROM fingeral_registros fr
        WHERE
          fr.id_clube_financeiro IN(
            SELECT id_financeiro FROM stripe_registros sr WHERE sr.stripe_id_charge IN('.listarIDs($charges, null, 1).')
          ) AND id_nfs>0');
        if($sql->execute()){$nf_deduzir = $sql->fetch(PDO::FETCH_ASSOC);}

        if($nf_deduzir['total']>0) $nf_valor_deduzir = $nf_deduzir['total'];
      }

      include_once('../libraries/outros/NFs/NFs.php');
      $nf = new NFs();
      $nf->fingeralRegistro($id_destino, array("stripe"=>true,"valor_force"=>($valor - $nf_deduzir['total'])));
      $nf->cadastrar();

      /*
      // Obs de status: 1 deduzir / 2 em andamento / 3 concluído
      // Registros para deduzir do valor de emissão da NF (marca para não haver novos durante o processo)
      $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET nfs_deduzir_valor = 2 WHERE nfs_deduzir_valor = 1');
      if($sql->execute());
      // Valor total para deduzir
      $sql = $bd->getConexao()->prepare('SELECT ifnull(sum(r.valor),0) as total FROM fingeral_registros r WHERE r.nfs_deduzir_valor = 2');
      if($sql->execute()){$nf_deduzir = $sql->fetch(PDO::FETCH_ASSOC);}

      $valor_nf = $valor - $nf_deduzir['total'];

      include_once('../libraries/outros/NFs/NFs.php');
      $nf = new NFs();
      $nf->fingeralRegistro($id_destino, array("stripe"=>true,"valor_force"=>$valor_nf));
      $nf->cadastrar();

      // marca os registros como completados
      $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET nfs_deduzir_valor = 3 WHERE nfs_deduzir_valor = 2');
      if($sql->execute());
      */
    }
  }catch(Exception $e){}
}

// GAMEID - CARTÃO CAPTURADO
if($action=="payment_gameid"){
  try{
    $data = json_decode($body, true);
    // Validação da estrutura do json
    if(isset($data['type']) && $data['type']=="payment_intent.succeeded" && isset($data['data']['object']['id'])){
      $pay = $data['data']['object'];

      $id_transacao = $pay['id'];

      // Dados do registro
      $sql = $bd->getConexao()->prepare('
      SELECT
        j.id,
        j.gameid,
        j.nome_completo,
        pg.FNCR_id_clube as id_clube,
        pgto1.valor,
        pgto1.valor_taxa_gid,
        ifnull(pgto2.valor,0) as valor_taxa_conv,
        pgto1.reservado,
        pgto1.finalizado
      FROM api_gameid.pgtos_ext_pagamentos pg
        LEFT JOIN api_gameid.jogadores j ON j.id = pg.gameid_id_jogador
        LEFT JOIN api_gameid.jogadores_vendas_pgtos pgto1 ON pgto1.id = pg.gameid_id_venda_pgto AND pgto1.id_venda = pg.gameid_id_venda
        LEFT JOIN api_gameid.jogadores_vendas_pgtos pgto2 ON pgto2.id_venda = pg.gameid_id_venda AND pgto2.id_forma_pgto = 0 AND pgto2.id_ref = pgto1.id_forma_pgto
      WHERE pg.compra_id = :id_transacao');
      $sql->bindValue(':id_transacao', $id_transacao, PDO::PARAM_STR);
      if($sql->execute()){$infs = $sql->fetch(PDO::FETCH_ASSOC);}

      // Validação do pagamento
      if($infs['reservado']==1 || $infs['finalizado']==1){
        include_once('../../../_defines/api_gameid.php');
        require_once(__DIR__.'../../../_vendors/stripe-php/init.php');

        $stripe = new \Stripe\StripeClient(GLOBAL_GID_STRIPE_CLIENT_SECRET);

        $pay = $stripe->paymentIntents->retrieve($id_transacao);
        $cobranca = $stripe->charges->retrieve($pay->latest_charge);
        $transacao = $stripe->balanceTransactions->retrieve($cobranca->balance_transaction);

        $valor_brl = $transacao->amount / 100;
        $valor_cambio = $transacao->exchange_rate ?? 1;
        $valor_taxa = $transacao->fee / 100;
        $valor_liquido = $transacao->net / 100;

        // FINANCEIRO GERAL
        $id_conta = 5;
        $id_categoria_recebimento = 132; // Categoria "Recebimento - Cartão"
        $id_categoria_taxas = 127; // Categoria "Stripe - Taxas"

        $descricao = $infs['gameid'].' - '.$infs['nome_completo'];

        $obs  = 'Ext: Valor Total: '.echomoeda($valor_brl).' (brl)<br>';
        $obs .= 'Ext: Cambio: '.echomoeda($valor_cambio,6).'<br>';
        $obs .= 'Ext: Convertido: '.echomoeda($valor_brl).'<br>';
        $obs .= 'Ext: Taxa: '.echomoeda($valor_taxa).'<br>';
        $obs .= 'Ext: Liquido: '.echomoeda($valor_liquido).'<br><br>';
        $obs .= 'GameID: '.$infs['gameid'].'<br>';
        $obs .= 'GameID Id Jogador: '.$infs['id'].'<br>';
        $obs .= 'GameID Nome: '.$infs['nome_completo'].'<br>';

        $valor_fingeral = $valor_brl;

        // Registro do valor pago
        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, valor, gid_taxa_conv, gid_taxa_op, descricao, documento, observacao, periodo_mes, periodo_ano, data_lancamento, data_vencimento, pagar_automatico, status_pago, status) VALUES
        (:id_categoria, :id_conta, :id_clube, :valor, :gid_taxa_conv, :gid_taxa_op, :descricao, :documento, :observacao, :periodo_mes, :periodo_ano, NOW(), NOW(), 1, 0, 0)');
        $sql->bindValue(':id_categoria', $id_categoria_recebimento, PDO::PARAM_STR);
        $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
        $sql->bindValue(':id_clube', $infs['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_fingeral, PDO::PARAM_STR);
        $sql->bindValue(':gid_taxa_conv', $infs['valor_taxa_conv'], PDO::PARAM_STR);
        $sql->bindValue(':gid_taxa_op', $infs['valor_taxa_gid'], PDO::PARAM_STR);
        $sql->bindValue(':observacao', $obs, PDO::PARAM_STR);
        $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
        $sql->bindValue(':documento', $id_transacao, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', date('m'), PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', date('y'), PDO::PARAM_STR);
        if($sql->execute());

        // Registro das taxas com Stripe
        $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
        (:id_categoria, :id_conta, :id_clube, :valor, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 1, 0)');
        $sql->bindValue(':id_categoria', $id_categoria_taxas, PDO::PARAM_STR);
        $sql->bindValue(':id_conta', $id_conta, PDO::PARAM_STR);
        $sql->bindValue(':id_clube', $infs['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_taxa*-1, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', date('m'), PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', date('y'), PDO::PARAM_STR);
        if($sql->execute());
      }
    }
  }catch(Exception $e){
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    echoPre($e);
  }
}

// GAMEID - REPASSE
if($action=="repasse_gameid"){
  try{
    $data = json_decode($body, true);
    if(isset($data['type']) && $data['type']=="payout.paid" && isset($data['data']['object']['id'])){
      $repasse = $data['data']['object'];
      $id_repasse = $repasse['id'];

      include_once('../../../_defines/api_gameid.php');
      require_once(__DIR__.'../../../_vendors/stripe-php/init.php');
      $stripe = new \Stripe\StripeClient(GLOBAL_GID_STRIPE_CLIENT_SECRET);

      $transacao = $stripe->payouts->retrieve($id_repasse);

      $valor = $transacao->amount / 100;

      $periodo_mes = date('m');
      $periodo_ano = date('y');

      // TRANSFERENCIA ENTRE CONTAS

      // GameID Stripe
      $descricao = 'GameID Stripe >> GameID';
      $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, valor, descricao, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (125, 5, :valor, :descricao, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 0)');
      $sql->bindValue(':valor', ($valor*-1), PDO::PARAM_STR);
      $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
      $sql->bindValue(':periodo_mes', $periodo_mes, PDO::PARAM_STR);
      $sql->bindValue(':periodo_ano', $periodo_ano, PDO::PARAM_STR);
      if($sql->execute());

      $id_origem = $bd->lastId();

      // Pokerweb
      $descricao = 'GameID << GameID Stripe';
      $sql = $bd->getConexao()->prepare('INSERT INTO fingeral_registros
      (id_categoria, id_conta, valor, descricao, id_ref, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, status_pago, status) VALUES
      (125, 3, :valor, :descricao, :id_ref, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 0)');
      $sql->bindValue(':valor', $valor, PDO::PARAM_STR);
      $sql->bindValue(':descricao', $descricao, PDO::PARAM_STR);
      $sql->bindValue(':id_ref', $id_origem, PDO::PARAM_STR);
      $sql->bindValue(':periodo_mes', $periodo_mes, PDO::PARAM_STR);
      $sql->bindValue(':periodo_ano', $periodo_ano, PDO::PARAM_STR);
      if($sql->execute());

      $id_destino = $bd->lastId();

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

      // MARCAR REGISTROS COMO "PAGOS"

      // Lista de ids de payments intent
      $ids_paymentintent = [];

      // Pesquisar registros de charges (ch_) por páginas, dentro do registro principal do repasse (po_)
      $params = ["payout"=>$id_repasse,"limit" => 50];
      do{
        $transacoes = $stripe->balanceTransactions->all($params);
        // Roda os registros de charges para pegar o id do paymentintent (pi_), usado pelo fncr
        if(isset($transacoes['data']) && count($transacoes['data'])>0){
          foreach($transacoes['data'] as $reg){
            if($reg['type'] == "charge"){
              $charge = $stripe->charges->retrieve($reg['source']);
              $ids_paymentintent[] = $charge['payment_intent'];
            }
          }
        }
        // Se houver mais registros (próximos)
        if($transacoes->has_more){
          $params['starting_after'] = end($transacoes->data)->id;
        }
      }while($transacoes->has_more);

      // Atualiza como pago, os registros ids_paymentintent no fingeral_registros
      $placeholders = implode(', ', array_map(function($valor){ return ':'.$valor; }, $ids_paymentintent));
      $sql = $bd->getConexao()->prepare('UPDATE fingeral_registros SET data_pagamento = NOW(), status_pago = 1 WHERE status_pago = 0 AND documento in('.$placeholders.')');
      foreach($ids_paymentintent as $valor){ $sql->bindValue(':'.$valor, $valor, PDO::PARAM_STR); }
      $sql->execute();
    }
  }catch(Exception $e){}

}




/*
 EXEMPLO DOCUMENTAÇÃO (IMPLANTAR)

// webhook.php
//
// Use this sample code to handle webhook events in your integration.
//
// 1) Paste this code into a new file (webhook.php)
//
// 2) Install dependencies
//   composer require stripe/stripe-php
//
// 3) Run the server on http://localhost:4242
//   php -S localhost:4242

require 'vendor/autoload.php';

// The library needs to be configured with your account's secret key.
// Ensure the key is kept out of any version control system you might be using.
$stripe = new \Stripe\StripeClient('sk_test_...');

// This is your Stripe CLI webhook secret for testing your endpoint locally.
$endpoint_secret = 'whsec_f200e7b9f16db10ed7f7a80b9f81df5a054f4592e4d02d6928ef825e8e312dde';

$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;

try {
  $event = \Stripe\Webhook::constructEvent(
    $payload, $sig_header, $endpoint_secret
  );
} catch(\UnexpectedValueException $e) {
  // Invalid payload
  http_response_code(400);
  exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
  // Invalid signature
  http_response_code(400);
  exit();
}

// Handle the event
switch ($event->type) {
  case 'payout.paid':
    $payout = $event->data->object;
  // ... handle other event types
  default:
    echo 'Received unknown event type ' . $event->type;
}

http_response_code(200);

 * */


?>