public function enviarSms($celular, $mensagem)
 {
     $from = "#gdgjf";
     require_once PLUGINPATH . '/vendor/human_gateway_client_api/HumanClientMain.php';
     $humanSimpleSend = new HumanSimpleSend(TGO_EVENTO_HUMAN_ACCOUNT, TGO_EVENTO_HUMAN_TOKEN);
     // Certificar que pessoa e celular estejam ok
     $celular = PLib::only_numbers($celular);
     if ($celular == null || $celular == '' || strlen($celular) < 8) {
         return false;
     }
     $celular = substr($celular, -10);
     if (strlen($celular) == 8) {
         $celular = '32' . $celular;
     }
     $celular = '55' . $celular;
     //        $celular="553288735683";
     // Criar objeto e enviar
     $message = new HumanSimpleMessage($mensagem, $celular, $from);
     try {
         $status = $humanSimpleSend->sendMessage($message);
     } catch (Exception $e) {
         echo "<br>Erro no envio - Exception<br>";
     }
     if ($status->getCode() == "000") {
         return true;
     } else {
         echo "<br>Erro: {$pessoa->nome} - {$celular} - code:" . $status->getCode() . " - message:" . $status->getMessage() . "<br>";
         return false;
     }
 }
 public static function getUrlCielo(Evento $evento, Pessoa $pessoa, Inscricao $inscricao, $urlRetorno = null)
 {
     $integracao = $evento->getIntegracaoCielo();
     $valor = number_format($inscricao->valor_inscricao, 2, '', '');
     $order = new stdClass();
     $order->OrderNumber = $inscricao->id;
     $order->SoftDescriptor = $evento->organizador()->titulo;
     $order->Cart = new stdClass();
     $order->Cart->Items = array();
     $order->Cart->Items[0] = new stdClass();
     $order->Cart->Items[0]->Name = $evento->titulo;
     $order->Cart->Items[0]->Description = 'Inscrição em ' . $evento->titulo;
     $order->Cart->Items[0]->UnitPrice = $valor;
     $order->Cart->Items[0]->Quantity = 1;
     $order->Cart->Items[0]->Type = 'Service';
     $order->Shipping = new stdClass();
     $order->Shipping->Type = 'WithoutShipping';
     $order->Payment = new stdClass();
     $order->Payment->BoletoDiscount = 5;
     $order->Payment->DebitDiscount = 5;
     $order->Customer = new stdClass();
     $order->Customer->Identity = $pessoa->cpf;
     $order->Customer->FullName = $pessoa->nome;
     $order->Customer->Email = $pessoa->email;
     $order->Customer->Phone = PLib::only_numbers($pessoa->celular);
     //$order->Options = new stdClass();
     //$order->Options->AntifraudEnabled = false;
     //        var_dump($order);
     //
     $curl = curl_init();
     curl_setopt($curl, CURLOPT_URL, 'https://cieloecommerce.cielo.com.br/api/public/v1/orders');
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curl, CURLOPT_POST, true);
     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($order));
     curl_setopt($curl, CURLOPT_HTTPHEADER, array('MerchantId: ' . $integracao->token, 'Content-Type: application/json'));
     $response = curl_exec($curl);
     curl_close($curl);
     //        var_dump($response);die("a");
     //        PLib::var_dump($response,'response');
     if ($response != null && strlen($response) > 1) {
         $json = json_decode($response);
         if ($json != false) {
             //                PLib::var_dump($json,'json');
             //                die();
             // Url de checkout
             if ($json->settings != null && $json->settings->checkoutUrl) {
                 return $json->settings->checkoutUrl;
             }
         } else {
             die('erro no json decode cielo?');
         }
     } else {
     }
     return false;
 }
 public static function dispatcher()
 {
     header('Access-Control-Allow-Origin: *');
     header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
     header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
     error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ^ E_STRICT);
     $app = new \Slim\Slim();
     \Slim\Slim::registerAutoloader();
     $app->contentType('application/json; charset=utf-8');
     $app->config('debug', true);
     //        echo "<pre>";
     if (WP_DEBUG) {
         $root = strtolower($app->request()->getRootUri()) . '/api';
     } else {
         $root = "/api";
     }
     //        var_dump($root);
     //            $root = "/api";
     //            $root = strtolower($app->request()->getRootUri()) . '/api';
     //        else
     //        $root = "/api";
     //        var_dump($root);
     //        $root = null;
     //        $root = var_dump($app->request()->getRootUri());
     //        die();
     //        });
     //        var_dump($app->request->headers);
     $app->hook('slim.before.dispatch', function () use($app) {
         // Conferir se é url que exige autenticação
         $req = $_SERVER['REQUEST_URI'];
         if (strpos($req, '/autenticar/') !== false) {
             return;
         }
         $headers = self::request_headers();
         //            var_dump($headers);die();
         $app = \Slim\Slim::getInstance();
         $erro = null;
         $api_user_id = $headers['X-API-USER-ID'];
         $api_token = $headers['X-API-TOKEN'];
         if ($api_user_id == null || $api_token == null) {
             $erro = "É preciso informar X-API-USER-ID e X-API-TOKEN no header.";
         } else {
             // Sanitizar user_id
             /* @var $pessoa Pessoa */
             $pessoa = Pessoas::getInstance()->getById($api_user_id);
             // Sanitizar token
             if ($pessoa == null) {
                 $erro = 'Não te encontramos em nossa base de dados...';
             } else {
                 if (md5($pessoa->id . '_' . $pessoa->password) != $api_token) {
                     $erro = 'Password inválido';
                 }
             }
         }
         if ($erro) {
             $app->response->headers['X-Authenticated'] = 'False';
             $app->halt('401', '{"error":{"text": "' . $erro . '" }}');
         }
     });
     $app->group($root, function () use($app) {
         // '/'
         $app->get('/', function () use($app) {
             echo json_encode(array("bem vindo", "a API"));
         });
         // Autenticate
         $app->post('/autenticar/', function () use($app) {
             // Obter pessoa, e usuário
             $email = $_POST['email'];
             $password = $_POST['password'];
             if ($email == '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
                 echo json_encode(array('Erro' => 'Informe um endereço de email válido.'));
                 return;
             }
             /* @var $pessoa Pessoa */
             $pessoa = Pessoas::getInstance()->getByEmail($email);
             if ($pessoa == null) {
                 echo json_encode(array('Erro' => 'Não te encontramos em nossa base de dados...'));
                 return;
             }
             // Validar senha, antes de mais nada
             // @TODO Buscar user do wordpress que seja esta pessoa e verificar se está ativo, senão, é pessoa normal
             // Aqui, só pode ser um participante do grupo ou inscrito em algum evento
             $nPessoa = ControllerApi::decoratePessoa($pessoa);
             $return = array('pessoa' => $nPessoa);
             $return = PLib::object_to_array($return);
             //                    $return = PLib::array_utf8_encode($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
             return;
         });
         $app->group('/gamification', function () use($app) {
             $app->get('/ranking', function () use($app) {
                 $ranking = Gamification::getInstance()->getUsersPointsRanking(300);
                 //                    var_dump($ranking);
                 $nRanking = ControllerApi::decorateRanking($ranking);
                 echo json_encode($nRanking);
             });
             $app->get('/user/:id', function ($id) use($app) {
                 $pessoa = ControllerApi::getPessoa($id, true);
                 if ($pessoa) {
                     /* @var $gamification Gamification */
                     $gamification = Gamification::getInstance();
                     $gamification->setUserId($id);
                     $nPessoa = ControllerApi::decorateUserGamification($pessoa);
                     $badges = $gamification->getBadges();
                     $nBadges = ControllerApi::decorateBadges($badges);
                     $return = array('user' => $nPessoa, 'badge' => $nBadges);
                     $return = PLib::object_to_array($return);
                     echo json_encode($return, JSON_NUMERIC_CHECK);
                 }
             });
         });
         // '/'
         $app->get('/notificacao/', function () use($app) {
             die("notificação");
         });
         // Retorna uma inscrição
         $app->get('/inscricao/:idInscricao/simples/', function ($idInscricao) use($app) {
             if (strlen($idInscricao) > 10) {
                 $transactionId = $idInscricao;
                 $inscricao = Inscricoes::getInstance()->callbackPagamento(1, $transactionId);
                 if (get_class($inscricao) != 'Inscricao') {
                     $erro = 'Transação não identificada..';
                 }
             } else {
                 /* @var $inscricao Inscricao */
                 $inscricao = Inscricoes::getInstance()->getById($idInscricao);
                 if ($inscricao == null) {
                     $erro = 'Inscrição não localizada (' . $idInscricao . ')';
                 }
             }
             if ($erro) {
                 echo json_encode(array('erro' => $erro));
             } else {
                 if ($erro == null) {
                     if ($inscricao->confirmado == true) {
                         $mensagem = "wizard_fim_pagamento_confirmado";
                     } else {
                         $mensagem = "wizard_fim_pagamento_aguardando_confirmacao";
                     }
                     $mensagem = Mensagens::getInstance()->get($mensagem, $inscricao->evento(), $inscricao->pessoa(), $inscricao, true);
                     $nInscricao = array('confirmado' => $inscricao->confirmado, 'mensagem' => $mensagem);
                     $return = array('inscricao' => $nInscricao);
                     $nInscrito = PLib::object_to_array($return);
                     echo json_encode($nInscrito, JSON_NUMERIC_CHECK);
                 }
             }
         });
         // Redireciona para URL de pagamento no gateway - Por enquanto só funciona pro devfest
         $app->get('/inscricao/:idInscricao/pagar/', function ($idInscricao) use($app) {
             /* @var $inscricao Inscricao */
             $inscricao = Inscricoes::getInstance()->getById($idInscricao);
             if ($inscricao == null) {
                 echo json_encode(array('erro' => 'Inscrição não localizada (' . $idInscricao . ')'));
                 return;
             }
             $urlRetorno = BASE_URL . '/confirmacao?ticket=' . $inscricao->id * 333;
             $url = \lib\PagSeguroUtil::getUrlPagamento($inscricao, $urlRetorno);
             $return = array('url' => $url);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Retorna dados de uma pessoa
         $app->get('/pessoa/:idPessoa/', function ($idPessoa) use($app) {
             $pessoa = ControllerApi::getPessoa($idPessoa, true);
             if ($pessoa) {
                 $nPessoa = ControllerApi::decoratePessoa($pessoa);
                 $return = array('pessoa' => $nPessoa);
                 //                $return = PLib::array_utf8_encode($return);
                 $return = PLib::object_to_array($return);
                 echo json_encode($return, JSON_NUMERIC_CHECK);
             }
         });
         // Retorna as inscrições de uma pessoa
         $app->get('/pessoa/:idPessoa/inscricoes/', function ($idPessoa) use($app) {
             $pessoa = ControllerApi::getPessoa($idPessoa, true);
             if ($pessoa) {
                 // Obter inscrições da pessoa
                 $inscricoes = Inscricoes::getInstance()->getByPessoa($pessoa->id);
                 $nInscricoes = array();
                 if ($inscricoes == null) {
                     echo json_encode(array('mensagem' => 'Sem inscrições desta pessoa'));
                     return;
                 }
                 foreach ($inscricoes as $inscricao) {
                     $nInscricoes[] = ControllerApi::decorateInscricaoTeceiros($inscricao);
                 }
                 $return = array('inscricoes' => $nInscricoes);
                 $return = PLib::object_to_array($return);
                 echo json_encode($return, JSON_NUMERIC_CHECK);
             }
         });
         // Realiza uma inscrição
         $app->post('/inscrever/:idEvento/', function ($idEvento) use($app) {
             $idPessoa = $_POST['id_pessoa'];
             $nome = trim(ucfirst($_POST['nome']));
             $email = trim(strtolower($_POST['email']));
             $cpf = trim($_POST['cpf']);
             $celular = PLib::only_numbers($_POST['celular']);
             if (strpos($celular, '55') === 0) {
                 $celular = substr($celular, 2);
             }
             /* @var $evento Evento */
             $evento = Eventos::getInstance()->getById($idEvento);
             if ($evento == null) {
                 echo json_encode(array('erro' => 'Evento não localizado na base de dados (' . $idEvento . ')'));
                 return;
             }
             $validacao = PLib::coalesce($evento->validacao_pessoa, 'email');
             if ($idPessoa == null && ($nome == null || $celular == null || $email == null || ${$validacao} == null)) {
                 echo json_encode(array('erro' => 'Envie todos os dados (' . $nome . $email . $celular . ').' . print_r($_POST, true)));
                 return;
             }
             if ($idPessoa == null && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
                 echo json_encode(array('erro' => 'Email inválido'));
                 return;
             }
             if ($idPessoa == null && strlen($celular) < 8) {
                 echo json_encode(array('erro' => 'Celular inválido'));
                 return;
             }
             // Mesmo sem id de pessoa, tentar encontrar pessoa por email
             if ($idPessoa == null) {
                 $pessoa = Pessoas::getInstance()->getByMd5($email);
                 if ($pessoa != null) {
                     $idPessoa = $pessoa->id;
                 }
             }
             //                $validacao='cpf';
             //                if ($validacao=='cpf' && $cpf!=null && !PLib::validade_cpf($cpf)){
             //                    echo json_encode(array('erro' => 'CPF inválido ('.$cpf.')'));
             //                    return;
             //                }
             // Incluir pessoa
             /* @var $pessoa Pessoa */
             if ($idPessoa == null) {
                 /* @var $pessoa Pessoa */
                 $pessoa = new Pessoa();
                 $pessoa->nome = $nome;
                 $pessoa->email = $email;
                 $pessoa->celular = $celular;
                 if ($validacao == 'cpf') {
                     $pessoa->cpf = PLib::str_mask(PLib::only_numbers($cpf), '###.###.###-##');
                 }
                 //                    PLib::var_dump($pessoa);
                 $pessoa = Pessoas::getInstance()->insert($pessoa);
             } else {
                 $pessoa = Pessoas::getInstance()->getById($idPessoa);
                 if ($nome != null && strlen($nome) > 2) {
                     $pessoa->nome = $nome;
                 }
                 if ($celular != null && strlen($celular) > 2) {
                     $pessoa->celular = $celular;
                 }
                 $pessoa->save();
             }
             // Extras? Pegar do post.... xeu pensar - ter como limitar e tal.. como tornar mais seguro?
             $extras = array();
             foreach ($_POST as $key => $value) {
                 if ($key == 'id_pessoa' || $key == 'nome' || $key == 'cpf' || $key == 'celular' || $key == 'email') {
                     continue;
                 }
                 $extra = array('titulo' => $key, 'valor' => $value);
                 $extras[$key] = $extra;
             }
             if (count($extras) > 0) {
                 $pessoa->setExtras($extras);
                 $pessoa->save();
             }
             //PLib::var_dump($pessoa->getExtrasArray());
             //PLib::var_dump($pessoa);die();
             $idPessoa = $pessoa->id;
             // Verificar se já está inscrita.... hum, tem algumas situações aqui
             $inscricao = Inscricoes::getInstance()->getByEventoPessoaConfirmado($idEvento, $idPessoa);
             if ($inscricao != null) {
                 echo json_encode(array('erro' => "Você já está inscrito e confirmado para este evento!"));
                 return;
             }
             // Já salvar registro de inscrição
             $inscricao = Inscricoes::getInstance()->certificarInscricao($evento, $pessoa, $evento->confirmacao == "preinscricao");
             $nInscrito = ControllerApi::decorateInscricao($inscricao);
             $return = array('inscricao' => $nInscrito);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Return "current" events
         $app->get('/eventos/', function () use($app) {
             $eventos = Eventos::getInstance()->getAll();
             if ($eventos == null) {
                 echo json_encode(array('erro' => 'Nenhum evento registrado....'));
                 return;
             }
             $events = array();
             /* @var $evento Evento */
             foreach ($eventos as $evento) {
                 if ($evento->preInscricao()) {
                     continue;
                 }
                 $nEvento = ControllerApi::decorateEvento($evento, false);
                 $events[] = $nEvento;
             }
             $events = PLib::object_to_array($events);
             echo json_encode($events, JSON_NUMERIC_CHECK);
         });
         // Return "current" events
         $app->get('/eventos/futuros/', function () use($app) {
             $eventos = Eventos::getInstance()->getAcontecendoFuturos();
             if ($eventos) {
                 $events = array();
                 /* @var $evento Evento */
                 foreach ($eventos as $evento) {
                     $nEvento = ControllerApi::decorateEvento($evento, false);
                     $events[] = $nEvento;
                 }
                 $events = PLib::object_to_array($events);
                 echo json_encode($events, JSON_NUMERIC_CHECK);
             }
         });
         // Return "current" events
         $app->get('/eventos/atual/', function () use($app) {
             $evento = ControllerApi::getEventoAtual();
             if ($evento == null) {
                 echo json_encode(array('erro' => 'Não existe um evento atual'));
                 return;
             }
             $evento = ControllerApi::decorateEvento($evento, false);
             $events = PLib::object_to_array($evento);
             echo json_encode($events, JSON_NUMERIC_CHECK);
         });
         // Return "current" events
         $app->get('/eventos/terceiros/', function () use($app) {
             // Obter eventos de outros sites de eventos
             //                $sites = array(
             //                );
             //                $eventosArray = array();
             //                foreach ($sites as $site) {
             //                    //  Initiate curl
             //                    $ch = curl_init();
             //                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
             //                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
             //                    curl_setopt($ch, CURLOPT_URL, $site . '/api/eventos/futuros/');
             //                    $result = curl_exec($ch);
             //                    curl_close($ch);
             ////                    var_dump($result);
             //                    if ($result) {
             //                        $eventosJson = json_decode($result, true);
             ////                        var_dump($eventosJson);
             //                        if ($eventosJson) {
             //                            foreach ($eventosJson as $evento) {
             ////                                $evento = Eventos::getInstance()->populate($evento);
             //                                $eventosArray[] = $evento;
             //                            }
             //                        } else {
             //                            echo "nune " . $site;
             //                        }
             //                    } else {
             ////                        echo "none ".$site;
             //                    }
             //                }
             //                // Ordernar
             ////                var_dump($eventosArray);
             //                usort($eventosArray, 'ControllerApi::ordem');
             ////                Eventos::getInstance()->ordenar($eventosArray,true);
             ////                $eventosReturn=array();
             ////                foreach($eventosArray as $evento) {
             ////                    $eventosReturn[]= ControllerApi::decorateEvento($evento, false);
             ////                }
             //
             //                $eventosReturn = PLib::object_to_array($eventosArray);
             //                echo json_encode($eventosReturn, JSON_NUMERIC_CHECK);
         });
         // Retorna um evento e seus dados
         $app->get('/evento/:idEvento/', function ($idEvento) use($app) {
             $evento = Eventos::getInstance()->getById($idEvento);
             if ($evento == null) {
                 echo json_encode(array('erro' => 'Evento não localizado na base de dados (' . $idEvento . ')'));
                 return;
             }
             $nEvento = ControllerApi::decorateEvento($evento, true);
             $events = PLib::object_to_array($nEvento);
             echo json_encode($events, JSON_NUMERIC_CHECK);
         });
         // Retorna os inscritos no evento
         $app->get('/inscritos/:idEvento/', function ($idEvento) use($app) {
             $inscritos = Inscricoes::getInstance()->getByEvento($idEvento, null, "ev_pessoas.nome");
             //                var_dump($inscritos);
             $registrations = array();
             /* @var $inscrito Inscricao */
             foreach ($inscritos as $inscrito) {
                 $nInscrito = ControllerApi::decorateInscricao($inscrito);
                 $registrations[] = $nInscrito;
             }
             $registrations = PLib::object_to_array($registrations);
             echo json_encode($registrations, JSON_NUMERIC_CHECK);
         });
         // Dá presença a um inscrito
         $app->post('/inscricao/self_chekin/', function () use($app) {
             /* @var $inscricao Inscricao */
             $inscricao = null;
             $identificacao = $_POST['identificacao'];
             // email - ou id_evento-id_inscricao-id_pessoa
             if (substr_count($identificacao, '-') === 2) {
                 $id_evento = substr($identificacao, 0, strpos($identificacao, '-'));
                 $id_inscricao = substr($identificacao, strpos($identificacao, '-') + 1);
                 $id_pessoa = substr($id_inscricao, strpos($identificacao, '-') + 1);
                 $id_inscricao = substr($id_inscricao, 0, strpos($identificacao, '-'));
                 //                    var_dump($id_evento);
                 //                    var_dump($id_inscricao);
                 //                    var_dump($id_pessoa);
                 $inscricao = Inscricoes::getInstance()->getById($id_inscricao);
                 if ($inscricao == null) {
                     echo json_encode(array('erro' => 'Inscrição não localizada...'));
                     return;
                 } else {
                     if ($inscricao->id_pessoa != $id_pessoa) {
                         echo json_encode(array('erro' => 'As informações não batem! Inscrição X Pessoa'));
                         return;
                     } else {
                         if ($inscricao->id_evento != $id_evento) {
                             echo json_encode(array('erro' => 'As informações não batem! Inscrição X Evento'));
                             return;
                         }
                     }
                 }
             } else {
                 if (filter_var($identificacao, FILTER_VALIDATE_EMAIL) !== false) {
                     //                    $evento =
                     $evento = ControllerApi::getEventoAtual();
                     if ($evento == null) {
                         echo json_encode(array('erro' => 'Não existe um evento atual'));
                         return;
                     }
                     $pessoa = Pessoas::getInstance()->getByEmail(strtolower(trim($identificacao)));
                     if ($pessoa == null) {
                         echo json_encode(array('erro' => 'Não te encontramos em nossa base de dados (' . $identificacao . ')'));
                         return;
                     }
                     $inscricao = Inscricoes::getInstance()->getByEventoPessoa($evento->id, $pessoa->id);
                     if ($inscricao == null) {
                         echo json_encode(array('erro' => 'Você não se inscreveu pra este evento!'));
                         return;
                     }
                 } else {
                     echo json_encode(array('erro' => 'Do que você está falando afinal?'));
                     return;
                 }
             }
             // Fazer - retornar
             $inscricao->presenca();
             $nInscrito = ControllerApi::decorateInscricao($inscricao, true);
             $return = PLib::object_to_array($nInscrito);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Setar dados da inscrição - por enquanto apenas categoria
         $app->post('/inscricao/:idInscricao/', function ($idInscricao) use($app) {
             /* @var $inscricao Inscricao */
             $inscricao = Inscricoes::getInstance()->getById($idInscricao);
             if ($inscricao == null) {
                 echo json_encode(array('erro' => 'Inscrição não localizada na base de dados (' . $idInscricao . ')'));
                 return;
             }
             // Categoria - Como bloquear mudar a categoria? Depois de que momento não pode mudar mais?
             $id_categoria = $_POST['id_categoria'];
             $inscricao->setCategoria($id_categoria);
             $inscricao->save();
             $return = array('inscricao' => $inscricao);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Retorna uma inscrição
         $app->get('/inscricao/:idInscricao/', function ($idInscricao) use($app) {
             /* @var $inscricao Inscricao, e o evento referente */
             $inscricao = Inscricoes::getInstance()->getById($idInscricao);
             if ($inscricao == null) {
                 echo json_encode(array('erro' => 'Inscrição não localizada na base de dados (' . $idInscricao . ')'));
                 return;
             }
             $nInscrito = ControllerApi::decorateInscricao($inscricao, true);
             $nInscrito = PLib::object_to_array($nInscrito);
             echo json_encode($nInscrito, JSON_NUMERIC_CHECK);
         });
         // Confirma um inscrito
         $app->post('/inscricao/:idInscricao/confirmar/', function ($idInscricao) use($app) {
             /* @var $inscricao Inscricao */
             $inscricao = Inscricoes::getInstance()->getById($idInscricao);
             if ($inscricao == null) {
                 echo json_encode(array('erro' => 'Inscrição não localizada na base de dados (' . $idInscricao . ')'));
                 return;
             }
             // Se evento pago, verificar se informações vieram no post
             if ($inscricao->valor_inscricao > 0 && $_POST['forma_pagamento'] == null) {
                 $return = array('erro' => 'É preciso informar a forma de pagamento da insrição.');
             } else {
                 if ($inscricao->valor_inscricao > 0 && $_POST['id_pessoa_confirmacao'] == null) {
                     $return = array('erro' => 'É preciso informar a pessoa que está confirmando o pagamento.');
                 } else {
                     if ($_POST['id_pessoa_confirmacao'] == null) {
                         $return = array('erro' => 'É preciso informar a pessoa que está confirmando a inscrição.');
                     } else {
                         if (Pessoas::getInstance()->getById($_POST['id_pessoa_confirmacao'])->id_user == null) {
                             $return = array('erro' => 'O usuário confirmando precisa ser um admin.');
                         } else {
                             $inscricao->id_pessoa_confirmacao = $_POST['id_pessoa_confirmacao'];
                             if ($inscricao->confirmado != 1) {
                                 $inscricao = $inscricao->confirmar($_POST['forma_pagamento'], $inscricao->valor_inscricao);
                             }
                             $nInscrito = ControllerApi::decorateInscricao($inscricao, true);
                             $nEvento = ControllerApi::decorateEvento($inscricao->evento(), true);
                             $return = array('evento' => $nEvento, 'inscricao' => $nInscrito);
                         }
                     }
                 }
             }
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Dá presença a um inscrito
         $app->get('/inscricao/:idInscricao/presente/', function ($idInscricao) use($app) {
             /* @var $inscricao Inscricao */
             $inscricao = Inscricoes::getInstance()->getById($idInscricao);
             if ($inscricao == null) {
                 echo json_encode(array('erro' => 'Inscrição não localizada na base de dados (' . $idInscricao . ')'));
                 return;
             }
             $inscricao = $inscricao->presenca();
             $nInscrito = ControllerApi::decorateInscricao($inscricao, true);
             $nEvento = ControllerApi::decorateEvento($inscricao->evento(), true);
             $return = array('evento' => $nEvento, 'inscricao' => $nInscrito);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Atualiza dados de uma pessoa
         $app->post('/pessoa/:identificacao/', function ($identificacao) use($app) {
             /* @var $pessoa Pessoa */
             $identificacao = urldecode($identificacao);
             $pessoa = Pessoas::getInstance()->getByMd5($identificacao);
             if ($pessoa == null) {
                 echo json_encode(array('erro' => 'Pessoa nao localizada na base de dados (' . $identificacao . ')'));
                 return;
             }
             // Extras?
             $extras = $_POST['extras'];
             if ($extras) {
                 foreach ($extras as $chave => $valor) {
                     $pessoa->setExtra($chave, ucfirst($chave), $valor);
                 }
                 $pessoa->save();
             }
             $pessoa = Pessoas::getInstance()->getByMd5($identificacao);
             $nPessoa = ControllerApi::decoratePessoa($pessoa);
             $return = array('pessoa' => $nPessoa);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         // Obter todas pessoas
         $app->get('/pessoas/todas/', function () use($app) {
             /* @var $pessoas Pessoa[] */
             $pessoas = Pessoas::getInstance()->getAll();
             $return = array();
             foreach ($pessoas as $pessoa) {
                 if ($pessoa->getCountConfirmados()) {
                     $return[] = ControllerApi::decoratePessoa($pessoa);
                 }
             }
             $return = array('pessoas' => $return);
             $return = PLib::object_to_array($return);
             echo json_encode($return, JSON_NUMERIC_CHECK);
         });
         //            $app->get('/reset/', function () use ($app) {
         //                // Zera todos os dados do site...
         //                if (DB_NAME == 'emjf_wpjf' || DB_NAME == 'emjf') {
         //                    /* @var $wpdb wpdb */
         //                    $sql = "UPDATE ev_inscricoes SET confirmado=NULL, data_pagamento=NULL, data_confirmacao=NULL, valor_pago=NULL, taxa_cobranca=NULL, valor_liquido=NULL,codigo_pagamento=NULL, formapagamento_pagseguro=NULL,presente=NULL,status_gateway=NULL,forma_pagamento_gateway=NULL,codigo_gateway=NULL,data_atualizacao_gateway=NULL,vencido=NULL,data_vencido=NULL,data_cancelamento=NULL,forma_pagamento=NULL,id_situacao=NULL";
         //                    $return = array('sucesso' => 'Dados resetados');
         //                    echo json_encode($return, JSON_NUMERIC_CHECK);
         //                } else {
         //                    $return = array('erro' => 'Ops.. aqui não pode!');
         //                    echo json_encode($return, JSON_NUMERIC_CHECK);
         //                }
         //            });
     });
     $app->run();
 }
 public function validarEtapaDadosPessoais()
 {
     // Validar dados
     $nome = sanitize_text_field(trim($_POST['nome']));
     $celular = ltrim(PLib::only_numbers(sanitize_text_field(trim($_POST['celular'])), '0'));
     $email = sanitize_text_field(trim($_POST['email']));
     //        PLib::var_dump($_POST);
     // Quais outros dados são obrigatórios??
     if (!$nome) {
         $this->erro = "Informe seu nome.";
     }
     if (strpos($nome, " ") === false) {
         $this->erro = "Informe ao menos nome e sobrenome.";
     }
     if (!$celular) {
         $this->erro = "Informe seu telefone celular.";
     }
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
         $this->erro = "Informe um endereço de email válido.";
     }
     // Validar telefone celular e formatar
     if ($this->erro == null) {
         $len = strlen($celular);
         if ($len < 10 || $len > 12) {
             $this->erro = "Informe o celular com o prefixo.";
         } else {
             if ($len == 10) {
                 $_POST['celular'] = PLib::str_mask($celular, "(##)####-####");
             } else {
                 $_POST['celular'] = PLib::str_mask($celular, "(##)#####-####");
             }
         }
     }
     if ($this->erro == null) {
         // Temos todos os dados da pessoa
         $this->valorChave = $_SESSION['inscricao_chave'];
         $extras = array();
         $this->pessoa = new Pessoa();
         // Já tinhamos a pessoa? Obter os extras para merge com extras novos
         if ($_SESSION['id_pessoa'] != null) {
             $this->pessoa = Pessoas::getInstance()->getById($_SESSION['id_pessoa']);
             $pessoaExtras = $this->pessoa->getExtras();
         }
         $this->pessoa = Pessoas::getInstance()->populate($_POST, $this->pessoa);
         //            if ($debug)
         //                PLib::var_dump($this->pessoa,"Pessoa 1");
         // Existem campos extras?
         if ($this->evento->campos_extras != null) {
             foreach ($this->evento->getCamposExtras() as $extraIndice => $extraTitulo) {
                 if (isset($_POST[$extraIndice]) || isset($_FILES[$extraIndice])) {
                     // Zerar valor
                     $extraValor = null;
                     $extraTituloClean = $extraTitulo;
                     // Clean no titulo
                     if (strpos($extraTitulo, '[') !== false && strpos($extraTitulo, ']') !== false) {
                         $opcoes = substr($extraTitulo, strpos($extraTitulo, '['));
                         $extraTituloClean = str_replace($opcoes, "", $extraTitulo);
                     }
                     if (strpos($extraTitulo, '( )') !== false) {
                         $opcoes = substr($extraTitulo, strpos($extraTitulo, '('));
                         $extraTituloClean = trim(str_replace($opcoes, "", $extraTitulo));
                     }
                     if (isset($_POST[$extraIndice])) {
                         $extraValor = sanitize_text_field($_POST[$extraIndice]);
                     }
                     $extras[$extraIndice] = array();
                     $extras[$extraIndice]['titulo'] = $extraTituloClean;
                     $extras[$extraIndice]['valor'] = $extraValor;
                     //var_dump($extras[$extraIndice]);
                     // File upload
                     if (strpos($extraTitulo, '[file]') !== false && isset($_FILES[$extraIndice])) {
                         $tmpFile = $_FILES[$extraIndice]["tmp_name"];
                         $tmpName = $_FILES[$extraIndice]["name"];
                         //                            var_dump($tmpFile);
                         //                            var_dump($_FILES[$extraIndice]['error']);
                         $target_dir = WP_CONTENT_DIR . "/uploads/eventos/";
                         $target_file = $target_dir . basename($tmpName);
                         //                            var_dump($target_file);
                         $uploadOk = 1;
                         $imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
                         if (file_exists($target_file)) {
                             unlink($target_file);
                         }
                         // Allow certain file formats
                         if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" && $imageFileType != "pdf" && $imageFileType != "doc" && $imageFileType != "bmp") {
                             $erro = "Apenas arquivos JPG, JPEG, PNG, GIF, BMP, PDF e DOC são aceitos no campo \"{$extraTituloClean}\".";
                             $uploadOk = 0;
                         }
                         if ($uploadOk == 1) {
                             //                                error_reporting(E_ALL);
                             //                                echo "<br><br>mover $tmpFile para $target_file<br>";
                             if (!move_uploaded_file($tmpFile, $target_file)) {
                                 $erro = "Não foi possível fazer upload dos arquivos.";
                                 //                                    print_r(error_get_last());
                                 //                                    die("Sorry, there was an error uploading your file.");
                             }
                             $extras[$extraIndice]['arquivo'] = basename($tmpName);
                         }
                     }
                 }
             }
             if (count($extras) > 0) {
                 $this->pessoa->setExtras($extras);
             }
         }
         //            if ($debug)
         //                PLib::var_dump($this->pessoa,"Pessoa 2");
         if ($this->erro == null) {
             // Salvar pessoa, certificar que esteja registrada
             $this->certificarPessoa();
             //                die("aaa");
             // Verificar se pessoa já está inscrita e confirmada
             $inscricao = Inscricoes::getInstance()->getByEventoPessoaConfirmado($this->evento->id, $this->pessoa->id);
             //                var_dump($inscricao);die();
             if ($inscricao != null) {
                 $this->erro = "Você já está inscrito e confirmado para este evento!";
             }
         }
         //            var_dump($this->erro);
         //            die("aass");
         if ($this->erro == null) {
             $this->avancar = true;
             if ($this->evento->pago == "pago") {
                 // Obter Preço atual
                 $preco = Precos::getInstance()->getByEventoAtual($this->evento->id);
                 if ($preco != null) {
                     $id_preco = $preco->id;
                 }
             }
             // Já salvar registro de inscrição
             $this->inscricao = Inscricoes::getInstance()->certificarInscricao($this->evento, $this->pessoa, $this->evento->confirmacao == "preinscricao", $id_preco, null, $_POST['c_utmz']);
             $_SESSION['id_inscricao'] = $this->inscricao->id;
             // Existe arquivos?
             if (count($extras) > 0) {
                 $extrasModificados = false;
                 foreach ($extras as $extraIndice => $extra) {
                     if ($extra['arquivo']) {
                         //                            var_dump($extra['arquivo']);
                         $target_dir = WP_CONTENT_DIR . "/uploads/eventos/";
                         $target_file = $target_dir . $extra['arquivo'];
                         //                            var_dump($target_file);
                         $imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
                         // Rename file
                         $target_file_new = $target_dir . 'inscricao_' . $this->inscricao->id . '_' . $extraIndice . '.' . $imageFileType;
                         rename($target_file, $target_file_new);
                         //                            var_dump($target_file_new);
                         $extras[$extraIndice]['arquivo'] = basename($target_file_new);
                         $extrasModificados = true;
                     }
                 }
                 if ($extrasModificados) {
                     $this->pessoa->extras = json_encode($extras);
                     $this->pessoa = Pessoas::getInstance()->save($this->pessoa->id, $this->pessoa);
                 }
             }
             //
         }
     }
     //            PLib::var_dump($this->pessoa,"Pessoa final");
     //        PLib::var_dump($this->erro,"Erro");
 }
 public static function getUrlPagSeguro(Evento $evento, Pessoa $pessoa, Inscricao $inscricao, $urlRetorno = null)
 {
     // Preparar pagamento PagSeguro
     $valor = number_format($inscricao->valor_inscricao, 2, '.', '');
     $reference = $inscricao->id;
     if ($reference == null || $reference == 0) {
         throw new Exception("Referencia null");
     }
     $nome = utf8_decode(trim($pessoa->nome));
     $email = trim($pessoa->email);
     $celular = ltrim(PLib::only_numbers($pessoa->celular), '0');
     if (strlen($celular) == 8) {
         $ddd = 32;
     } else {
         $ddd = substr($celular, 0, 2);
         $celular = substr($celular, 2);
     }
     if ($urlRetorno == null) {
         $urlRetorno = get_permalink() . "?inscricao=1&id_integracao=" . $evento->id_integracao_pagseguro;
     }
     //        var_dump($ddd);
     //        var_dump($celular);
     //        die();
     // Incluir PagSeguro
     include_once PLUGINPATH . '/vendor/PagSeguro/PagSeguroLibrary.php';
     // Criar requisição PagSeguro
     $paymentRequest = new PagSeguroPaymentRequest();
     $paymentRequest->setCurrency("BRL");
     $paymentRequest->setRedirectURL($urlRetorno);
     $paymentRequest->addItem('0001', 'Inscrição para ' . $evento->titulo, 1, $valor);
     $paymentRequest->setReference($reference);
     $paymentRequest->setSender($nome, $email, $ddd, $celular);
     $paymentRequest->setRedirectUrl($urlRetorno);
     if ($reference == null || $reference < 1) {
         throw new Exception("Erro na inscrição. Falta de referencia para pagamento. Inscricao: " . $inscricao->id);
     }
     try {
         // Obter integração
         $integracao = $evento->getIntegracaoPagSeguro();
         if ($integracao == null) {
             enviarEmail(TGO_EVENTO_ADMIN, 'Evento sem gateway informado', 'O evento ' . $evento->titulo . ' está recebendo dados de pagseguro, porém, se integração definida.');
         }
         // Criar credenticias
         $credentials = new PagSeguroAccountCredentials($integracao->client, $integracao->token);
         $urlPagSeguro = $paymentRequest->register($credentials);
         return $urlPagSeguro;
     } catch (PagSeguroServiceException $e) {
         // "Desvendar" erros do pagseguro..
         if (strpos($e->getMessage(), 'senderPhone') != false) {
             self::$erro = "O telefone informado ({$ddd}){$celular} não foi aceito pelo PagSeguro. Clique em voltar e informe um novo número.";
         } else {
             if (strpos($e->getMessage(), 'senderName') != false) {
                 self::$erro = "O nome informado ({$nome}) não foi aceito pelo PagSeguro. Clique em voltar e informe corretamente.";
             } else {
                 if (strpos($e->getMessage(), 'senderEmail') != false) {
                     self::$erro = "O email informado ({$email}) não foi aceito pelo PagSeguro. Clique em voltar e informe corretamente.";
                 } else {
                     if (strpos($e->getMessage(), 'shipping') != false) {
                         self::$erro = "O endereço informado não foi aceito pelo PagSeguro. Clique em voltar e informe corretamente.";
                     } else {
                         if (strpos($e->getMessage(), 'senderAreaCode') != false) {
                             self::$erro = "O DDD do telefone deve ter apenas dois dígitos. Clique em voltar e informe corretamente.";
                         } else {
                             self::$erro = "Ocorreu um erro desconhecido no PagSeguro, o desenvolvedor foi avisado por email para rápida correção. Tente novamente em algumas horas.";
                             $evento->organizador()->enviarEmail(TGO_EVENTO_ADMIN, 'Erro com PagSeguro 1', $e->getMessage() . '<br><br><br>post:<br>' . print_r($_POST, true) . '<br><br><br>pessoa:' . print_r($pessoa, true) . '<br><br><br>inscrição:' . print_r($inscricao, true) . '<br><br><br>exception:' . print_r($e, true) . '<br><br><br>paymentRequest:' . print_r($paymentRequest, true));
                         }
                     }
                 }
             }
         }
         if (self::$erro != null) {
             echo self::$erro;
         }
         throw new Exception($e);
         return false;
     }
 }