| 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/Http/Controllers/Website/ |
Upload File : |
<?php
namespace App\Http\Controllers\Website;
use App\Modules\AdegaVirada\Services\AdegaViradaService;
use App\Services\CheckoutService;
use DB;
use Cart;
use Sentinel;
use App\BasicInfo;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\Services\CartService;
use App\Services\GeralService;
use App\Modules\Pais\Models\Pais;
use App\Modules\Cupom\Models\Cupom;
use App\Modules\Frete\Models\Frete;
use Illuminate\Support\Facades\Log;
use App\Modules\Cidade\Models\Cidade;
use App\Modules\Estado\Models\Estado;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\Produto\Models\Produto;
use App\Http\Controllers\BaseController;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\Whatsapp\Models\Whatsapp;
use App\Modules\Confraria\Models\Confraria;
use App\Modules\PedidoVenda\Models\PedidoVenda;
use App\Modules\CupomCadastro\Models\CupomCadastro;
use App\Modules\OfertaReserva\Models\OfertaReserva;
use App\Modules\Confraria\Services\ConfrariaService;
use App\Modules\CadastroCartao\Models\CadastroCartao;
use App\Modules\CupomIndicacao\Models\CupomIndicacao;
use App\Modules\CadastroEndereco\Models\CadastroEndereco;
use App\Modules\CupomPedidoVenda\Models\CupomPedidoVenda;
use App\Modules\CondicaoComercial\Models\CondicaoComercial;
use App\Modules\CupomPedidoIndicacao\Models\CupomPedidoIndicacao;
use App\Modules\PedidoVendaHistorico\Models\PedidoVendaHistorico;
use App\Modules\PedidoVendaHasProduto\Models\PedidoVendaHasProduto;
use App\Modules\PedidoVendaIntegracao\Models\PedidoVendaIntegracao;
class CheckoutController extends BaseController
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese');
date_default_timezone_set('America/Sao_Paulo');
}
public function checkoutReserva(){
$reservas = OfertaReserva::where('hash', session('hash_oferta'))
->where('data_controle', session('data_controle'))
->where('data_expiracao', session('data_expiracao'))->get();
foreach ($reservas as $reserva){
$oferta = $reserva->oferta;
$oferta->estoque = $oferta->estoque + $reserva->quantidade;
$oferta->save();
$reserva->delete();
}
session()->forget('data_controle');
session()->forget('data_expiracao');
$canalBlackFriday = GeralService::checkCanalBlackFriday();
$keyReserva = str_replace("=", "", base64_encode('reservaTimeout'));
setcookie($keyReserva, TRUE, time() + 60 * 60 * 24 * 1); //24 HS KeyReserva == 'cmVzZXJ2YVRpbWVvdXQ'
return response()->json(array(
'status' => true,
'message' => 'Reservas Atualizadas',
'url' => ($canalBlackFriday ? url(tipo_canal($canalBlackFriday->tipo)."/{$canalBlackFriday->slug}") : '')
));
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function checkout()
{
OfertaReserva::dataAtual();
$data = array();
$data['cartItems'] = Cart::content();
$data['mostrarBoxCashback'] = CartService::mostrarBoxCashback();
$data['htmlListagemCart'] = CartService::buscarHtmlListagemCart();
$data['htmlCupomDesconto'] = CartService::buscarHtmlCupomDesconto();
$data['htmlCupomAdegaVirada'] = CartService::buscarHtmlCupomAdegaVirada();
$data['htmlRegulamentoAdegaVirada'] = CartService::buscarHtmlRegulamentoAdegaVirada();
$data['ofertasRelacionadas'] = GeralService::buscarOfertasRelacionadas([
'limit' => 3,
'oferta_semana' => true,
'oferta_dia' => true,
'oferta_individual' => true,
'oferta_solidaria' => false,
'oferta_equipe' => true,
'random' => true
]);
$data['oferta_solidaria'] = GeralService::buscarOfertaSolidaria();
$data['oferta_casada'] = GeralService::buscarOfertaCasada();
$data['ofertas_casadas'] = GeralService::buscarOfertasCasadas();
$data['htmlIdentificacao'] = CartService::buscarHtmlIdentificacao();
$data['regioes'] = GeralService::buscarFretesPorRegiao();
$fretes = Frete::select('frete.*', DB::raw('(SELECT count(f.id) FROM frete as f WHERE f.regiao_id = frete.regiao_id) as quantidade_fretes '))->orderBy('valor_inicial', 'ASC')->groupBy('frete.regiao_id', 'custo')->get();
$data['max_fretes'] = $fretes->max('quantidade_fretes');
foreach ($fretes as $frete) {
$data['fretes'][$frete->regiao_id][] = $frete;
}
$data['titulo_pagina'] = 'Finalizar';
$data['subtitulo_pagina'] = 'Compra';
$data['primeira_compra'] = GeralService::buscarPrimeiraCompra();
$data['canaisLiberados'] = BasicInfo::first()->value('liberar_canais');
$data['oferta_relampago'] = GeralService::buscarOfertaCanalRelampago();
// $data['sugestoesProdutos'] = GeralService::buscarSugestoesProduto();
//print_r($data['sugestoesProdutos']);
//die()
$clienteLogado = GeralService::buscarClienteLogado();
$data['clienteLogado'] = $clienteLogado;
$data['dadosAdega'] = GeralService::buscarFreteAdegaAberta();
return view('checkout.checkout', $data);
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function checkoutConfraria()
{
OfertaReserva::dataAtual();
$data = array();
$data['cartItems'] = Cart::content();
$data['mostrarBoxCashback'] = CartService::mostrarBoxCashback();
$data['htmlListagemCart'] = CartService::buscarHtmlListagemCart();
$data['htmlCupomDesconto'] = CartService::buscarHtmlCupomDesconto();
$data['ofertasRelacionadas'] = GeralService::buscarOfertasRelacionadas([
'limit' => 3,
'oferta_semana' => true,
'oferta_dia' => true,
'oferta_individual' => true,
'oferta_solidaria' => false,
'random' => true
]);
$data['oferta_solidaria'] = GeralService::buscarOfertaSolidaria();
$data['oferta_casada'] = GeralService::buscarOfertaCasada();
$data['ofertas_casadas'] = GeralService::buscarOfertasCasadas();
$data['htmlIdentificacao'] = CartService::buscarHtmlIdentificacao(true);
$data['regioes'] = GeralService::buscarFretesPorRegiao();
$fretes = Frete::select('frete.*', DB::raw('(SELECT count(f.id) FROM frete as f WHERE f.regiao_id = frete.regiao_id) as quantidade_fretes '))->orderBy('valor_inicial', 'ASC')->groupBy('frete.regiao_id', 'custo')->get();
$data['max_fretes'] = $fretes->max('quantidade_fretes');
foreach ($fretes as $frete) {
$data['fretes'][$frete->regiao_id][] = $frete;
}
$data['titulo_pagina'] = 'Finalizar';
$data['subtitulo_pagina'] = 'Compra';
$data['primeira_compra'] = GeralService::buscarPrimeiraCompra();
$data['canaisLiberados'] = BasicInfo::first()->value('liberar_canais');
$data['oferta_relampago'] = GeralService::buscarOfertaCanalRelampago();
// $data['sugestoesProdutos'] = GeralService::buscarSugestoesProduto();
//print_r($data['sugestoesProdutos']);
//die();
$clienteLogado = GeralService::buscarClienteLogado();
$data['clienteLogado'] = $clienteLogado;
$data['dadosAdega'] = GeralService::buscarFreteAdegaAberta();
return view('checkout/checkout', $data);
}
public function checkDisponibilidadeOferta(Request $request){
try {
$input = $request->input();
$Oferta = Oferta::where('id', $input['oferta_id'])->first();
$message = "Não há disponibilidade em estoque para este produto!";
if(!$Oferta->produtos){
$status = false;
}else{
$status = false;
$Produto = $Oferta->produtos[0];
$SaldoProduto = GeralService::atualizarSaldoProduto($Produto->produto);
if($SaldoProduto->produto->disponibilidade > 0 && $Produto->produto->preco_mercado > $Produto->produto->preco_custo){
$status = true;
$ofertaClone = $Oferta->replicate();
$ofertaClone->short_link = NULL;
$ofertaClone->slug = NULL;
$ofertaClone->data = date('Y-m-d');
$ofertaClone->tipo = 'M';
$ofertaClone->estoque = 1;
$ofertaClone->qtde_vendida = 0;
$ofertaClone->poucas_unidades = 1;
$ofertaClone->quantidade_maxima_por_cliente = 1;
$ofertaClone->percentual_desconto = 0;
$ofertaClone->preco_oferta = $Produto->produto->preco_mercado;
$ofertaClone->save();
if(isset($Oferta->produtos)){
$preco_oferta = 0;
foreach ($Oferta->produtos as $produtoOferta) {
$produtosOfertaClone = $produtoOferta->replicate();
$produtosOfertaClone->id_oferta = $ofertaClone->id;
$produtosOfertaClone->valor_unitario = $produtoOferta->produto->preco_mercado;
$produtosOfertaClone->preco_mercado = $produtoOferta->produto->preco_mercado;
$produtosOfertaClone->preco_custo = $produtoOferta->produto->preco_custo;
$produtosOfertaClone->valor_total = $produtoOferta->produto->preco_mercado;
$produtosOfertaClone->quantidade = 1;
$produtosOfertaClone->save();
$preco_oferta += $produtoOferta->produto->preco_mercado;
}
}
$Oferta = $ofertaClone;
if($preco_oferta > 0){
$Oferta->preco_oferta = $preco_oferta;
$Oferta->preco_mercado = $preco_oferta;
$Oferta->save();
}
}
}
} catch (Exception $e) {
$status = false;
}
$result = [
'status' => $status,
'message' => $message,
'slug' => $Oferta->slug,
'id' => $Oferta->id,
];
return response()->json($result);
}
public function addOfertaDia(Request $request){
$input = $request->input();
if (!$input['quantidade']) {
return response()->json(array(
'status' => false,
'message' => 'Você deve fornecer uma quantidade válida.',
));
}
$result = CartService::addOfertaDia($input);
return response()->json($result);
}
public function addOfertaSemana(Request $request){
$input = $request->input();
if (!$input['quantidade']) {
return response()->json(array(
'status' => false,
'message' => 'Você deve fornecer uma quantidade válida.',
));
}
$result = CartService::addOfertaSemana($input);
return response()->json($result);
}
public function addOfertaRelampago(Request $request){
$input = $request->input();
if (!$input['quantidade']) {
return response()->json(array(
'status' => false,
'message' => 'Você deve fornecer uma quantidade válida.',
));
}
$result = CartService::addOfertaRelampago($input);
return response()->json($result);
}
public function addItem(Request $request){
$input = $request->input();
$result = CartService::addItem($input);
$result['parcelas'] = CartService::buscarParcelas();
$result['html'] = CartService::buscarHtmlListagemCart();
$result['html_cupom'] = CartService::buscarHtmlCupomDesconto();
return response()->json($result);
}
public function addOferta(Request $request){
$input = $request->input();
if(!isset($input['oferta_id'])){
Log::info('CheckoutController::addOferta => !isset(oferta_id) ' . json_encode($input));
}
$result = CartService::addOferta($input);
$result['parcelas'] = CartService::buscarParcelas();
$result['html'] = CartService::buscarHtmlListagemCart();
$result['html_cupom'] = CartService::buscarHtmlCupomDesconto();
return response()->json($result);
}
public function updateItem(Request $request){
$input = $request->input();
$result = CartService::updateItem($input);
$html = CartService::buscarHtmlListagemCart();
$htmlCupom = CartService::buscarHtmlCupomDesconto();
$parcelas = CartService::buscarParcelas();
return response()->json(array(
'status' => $result['status'],
'message' => $result['message'],
'quantidade' => $result['quantidade'],
'parcelas' => $parcelas,
'html' => $html,
'html_cupom' => $htmlCupom,
));
}
public function updateOfertaCart(Request $request){
$input = $request->input();
$resultDelete = CartService::deleteItem($input);
$resultAddOferta = CartService::addOferta($input);
$result = [];
$result['parcelas'] = CartService::buscarParcelas();
$result['html'] = CartService::buscarHtmlListagemCart();
$result['html_cupom'] = CartService::buscarHtmlCupomDesconto();
$result['message'] = $resultAddOferta['message'];
$result['status'] = $resultAddOferta['status'];
return response()->json($result);
}
public function deleteItem(Request $request){
$input = $request->input();
$result = CartService::deleteItem($input);
$html = CartService::buscarHtmlListagemCart();
$parcelas = CartService::buscarParcelas();
$htmlCupom = CartService::buscarHtmlCupomDesconto();
return response()->json(array(
'status' => true,
'message' => 'Item removido com sucesso!',
'parcelas' => $parcelas,
'html' => $html,
'html_cupom' => $htmlCupom
));
}
public function reloadCart(Request $request){
$html = CartService::buscarHtmlCart();
$data_atual = OfertaReserva::dataAtual();
$reserva = [
'data_expiracao' => (session('data_expiracao') ? date('Y/m/d H:i:s', strtotime(session('data_expiracao'))) : ''),
'data_expire' => (session('data_expiracao') ? date('d/m/Y H:i:s', strtotime(session('data_expiracao'))) : ''),
'data_atual' => date('d/m/Y H:i:s', strtotime($data_atual))
];
//CartCount
$qtdeItens = CartService::buscarQtdeItensCart();
$valorTotal = CartService::calcularValorTotal();
if($valorTotal->totalOriginal == 0){
session(['cupom' => null]);
session(['cupom_adega_virada' => null]);
session(['usar_saldo' => null]);
}
// $html = CartService::buscarHtmlListagemCart();
// $html_cupom = CartService::buscarHtmlCupomDesconto();
$parcelas = CartService::buscarParcelas();
$html_cashback = CartService::buscarHtmlCashback();
$html_cashback_checkout = CartService::buscarHtmlCashbackCheckout();
$html_adega_virada = CartService::buscarHtmlCupomAdegaVirada();
$html_adega_regulamento = CartService::buscarHtmlRegulamentoAdegaVirada();
return response()->json(array(
'status' => true,
'message' => 'Carrinho atualizado com sucesso!',
'usar_saldo' => session('usar_saldo'),
'html' => $html,
'html_adega_virada' => $html_adega_virada,
'html_adega_regulamento' => $html_adega_regulamento,
'html_cashback' => $html_cashback,
'html_cashback_checkout' => $html_cashback_checkout,
'reserva' => $reserva,
'parcelas' => $parcelas,
'text_finalizar_compra' => 'Finalizar compra ('.$qtdeItens. ' '.($qtdeItens <= 1 ? 'item' : 'itens') . ')',
'valor_total' => [
'total' => number_format($valorTotal->total, 2, ',', '.'),
'total_original' => number_format($valorTotal->totalOriginal, 2, ',', '.'),
'desconto' => $valorTotal->desconto,
'cupom' => $valorTotal->cupom,
'total_cupom' => number_format($valorTotal->totalCupom, 2, ',', '.'),
'total_cashback' => number_format($valorTotal->totalCashback, 2, ',', '.'),
'valor_restante' => $valorTotal->totalCashback
]
));
}
public function reloadListagem(Request $request){
$html = CartService::buscarHtmlListagemCart();
return response()->json(array(
'status' => true,
'message' => 'Listagem carregada com sucesso!',
'html' => $html
));
}
public function confirmarAlerta(Request $request){
$post = $request->input();
$alerta = ($post['alerta'] ? $post['alerta'] : 0);
$clienteLogado = GeralService::buscarClienteLogado();
$clienteLogado->exibe_alerta = $alerta;
$clienteLogado->save();
return response()->json(array(
'status' => true,
'message' => 'Exibição alerta salva com sucesso!'
));
}
public function confirmarCompra(Request $request){
$idempotencyToken = $request->input('idempotency_token');
$user = Sentinel::getUser();
if($idempotencyToken && $user){
$pedidoExistente = PedidoVenda::where('idempotency_token', $idempotencyToken)->first();
if($pedidoExistente){
Log::info("DUPLICATE CHECKOUT DETECTED (IDEMPOTENCY TOKEN): Pedido {$pedidoExistente->id} já existe com token {$idempotencyToken}");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoExistente->id
));
}
}
if(!session('hash_tracking')){
$hash_tracking = md5(date('Y-m-d H:i:s').microtime(true));
session(['hash_tracking' => $hash_tracking]);
}
$hash = session('hash_tracking');
Log::info("START CHECKOUT ({$hash})" . ($idempotencyToken ? " [IDEMPOTENCY: {$idempotencyToken}]" : ""));
$file = $request->file();
$post = $request->input();
$cartItems = Cart::content();
if(Cart::count() <= 0 && Cart::subtotal(2,'.','') <= 0){
return response()->json(array(
'status' => false,
'message' => 'Seu carrinho está vazio.'
));
}
Log::info("STEP 01 BEGIN : VALIDAR COMPRA OFERTA ({$hash})");
$custo_efetivo = 0;
$desconto_ocultado = 0;
foreach ($cartItems as $item) {
if($item->options->desconto_ocultado)
$desconto_ocultado = 1;
$custo_efetivo += $item->options->custo_efetivo * $item->qty;
if($item->options->tipo == 'oferta'){
$result = CartService::validarCompraOferta(['id_oferta' => $item->options->id, 'quantidade' => $item->qty, 'tamanho' => $item->options->tamanho, 'modelo' => $item->options->modelo]);
}else{
$result = CartService::validarCompraProduto(['id_produto' => $item->options->id, 'quantidade' => $item->qty]);
}
if($result['valid'] == false){
return response()->json(array(
'status' => false,
'message' => $result['message']
));
}
}
Log::info("STEP 01 END : VALIDAR COMPRA OFERTA ({$hash})");
if(!$user){
$user = Sentinel::getUser();
}
$cadastro = Cadastro::where('user_id', $user->id)->first();
if(!$user || !$cadastro){
return response()->json(array(
'status' => false,
'message' => 'Verifique se você está logado para finalizar a compra'
));
}
if($cadastro->bloqueio_cliente == 1){
return response()->json(array(
'status' => false,
'message' => 'Infelizmente não foi possível concluir a sua compra. Em caso de dúvidas favor entrar em contato <a href="'.url('/contato').'" style="color: blue">clicando aqui</a>.'
));
}
if(count($cadastro->enderecos) == 0){
if(!isset($post['cep']) || !$post['cep']){
return response()->json(array(
'status' => false,
'message' => 'O campo CEP é obrigatório.'
));
}
if(!isset($post['logradouro']) || !$post['logradouro']){
return response()->json(array(
'status' => false,
'message' => 'O campo Rua é obrigatório.'
));
}
if(!isset($post['numero']) || !$post['numero']){
return response()->json(array(
'status' => false,
'message' => 'O campo Número é obrigatório.'
));
}
if(!isset($post['bairro']) || !$post['bairro']){
return response()->json(array(
'status' => false,
'message' => 'O campo Bairro é obrigatório.'
));
}
if(!isset($post['estado_id']) || !$post['estado_id']){
return response()->json(array(
'status' => false,
'message' => 'O campo Estado é obrigatório.'
));
}
if(!isset($post['cidade_id']) || !$post['cidade_id']){
return response()->json(array(
'status' => false,
'message' => 'O campo Cidade é obrigatório.'
));
}
if(!isset($post['pais_id']) || !$post['pais_id']){
return response()->json(array(
'status' => false,
'message' => 'O campo País é obrigatório.'
));
}
}
if (!$cadastro->telefone) {
if(!isset($post['telefone']) || !$post['telefone']){
return response()->json(array(
'status' => false,
'message' => 'O campo Telefone é obrigatório.'
));
}
if(strlen($post['telefone']) < 14){
return response()->json(array(
'status' => false,
'message' => 'O campo Telefone é inválido. Por favor verificar se foi preenchido corretamente.'
));
}
$telefone = (int) $res = preg_replace("/[^0-9]/", "", $post['telefone']);
$cadastro->telefone = $post['telefone'];
}
$pedidoVenda = new PedidoVenda();
$pedidoVenda->desconto_ocultado = $desconto_ocultado;
$pedidoVenda->saldo_usado = (isset($post['cashback']) ? 1 : 0);
$pedidoVendaHistorico = new PedidoVendaHistorico();
//Pedido Venda Confraria
$confraria = ConfrariaService::buscarConfrariaUsuarioLogado();
if($confraria && isset($post['tipo_adega']) && $post['tipo_adega'] == 'confraria'){
$confraria = Confraria::where('id', $confraria->id)->first(); // devido uso contaCorrente
$pedidoVenda->confraria_id = $confraria->id;
}
$cupom = session('cupom');
$adega_virada_indicacao = session('cupom_adega_virada');
$cupomIndicacaoAtivo = GeralService::buscarCupomIndicacaoAtivo();
if($adega_virada_indicacao){
$checkParticipacao = AdegaViradaService::regulamentoStatus();
if(!$checkParticipacao){
return response()->json(array(
'status' => false,
'message' => 'Você <strong>ainda não está participando</strong> da Adega da Virada 2023. Aceite o <strong><a href="' . url('/adega-da-virada/regulamento') . '">regulamento</a></strong> para efetivar sua participação.'
));
}
if(empty($cadastro->adegaViradaParticipanteIndicacao->adega_virada_cupom_id)){
$pedidoVenda->id_adega_virada_indicacao = $adega_virada_indicacao['indicacao_id'];
}
}
if(isset($post['tipo_deposito']) && $post['tipo_deposito']){
Log::info("STEP 02 BEGIN : PAGAMENTO DEPÓSITO ({$hash})");
if($post['tipo_deposito'] != 'PIX' && $post['tipo_deposito'] != 'CASH' && (!isset($post['nome_depositante']) || !$post['nome_depositante'])){
return response()->json(array(
'status' => false,
'message' => 'Você deve preencher o nome do depositante.'
));
}
Log::info("STEP 02.01 BEGIN : UPLOAD COMPROVANTE ({$hash})");
if($request->hasFile('fileUpload')) {
$file = $request->file('fileUpload');
$comprovante = GeralService::uploadFile($file, 'pedido-venda/comprovante');
$pedidoVenda->comprovante = $comprovante->filename;
}
Log::info("STEP 02.01 END : UPLOAD COMPROVANTE ({$hash})");
$subtotal = Cart::subtotal(2,'.','');
$total = $subtotal;
Log::info("STEP 02.02 BEGIN : VALIDAÇÃO CUPOM ({$hash})");
if($cupom && $cupom['codigo'] == env('CUPOM_SOCIOS', 'VINUMOFF')){
$total = $custo_efetivo;
$pedidoVenda->id_cupom = $cupom['id'];
}elseif($cupom && $cupomIndicacaoAtivo && $cupom['codigo'] == $cupomIndicacaoAtivo->codigo){
$Indicacoes = GeralService::buscarCuponsIndicacoes($cupom['id']);
$indicacao = (count($Indicacoes) > 0) ? 'id_indicador' : 'id_indicado';
$Indicacoes = GeralService::buscarQtdeIndicacoes($cupom['id'], $indicacao);
$qtde_cupons = 1;
if($Indicacoes && $Indicacoes->qtde_cupons > 0){
$qtde_cupons = $Indicacoes->qtde_cupons;
}
$total = $total - ($cupom['valor_desconto'] * $qtde_cupons);
$total = $total > 0 ? $total : 0;
$pedidoVenda->id_cupom = $cupom['id'];
}elseif($cupom){
$total = $subtotal * (1 - (($cupom['percentual_desconto'] ? $cupom['percentual_desconto'] : 100) / 100)) - $cupom['valor_desconto'];
$total = $total > 0 ? $total : 0;
$pedidoVenda->id_cupom = $cupom['id'];
}
$basicInfo = DB::table('sis_basic_info')
->where('id', 1)
->first();
if($basicInfo->ativar_desconto_deposito){
$descontoPixDep = ($total * $basicInfo->percentual_desconto_pix) / 100;
$valorComDesconto = $total - $descontoPixDep;
$total = number_format($valorComDesconto, 2, '.', '.');
}
if(isset($post['cashback'])){
$contaCorrente = (!empty($pedidoVenda->confraria_id) ? $confraria->contaCorrente : $cadastro->contaCorrente);
if($contaCorrente && $contaCorrente->saldo > $total){
$total = 0;
}else{
$total = $total - ($contaCorrente ? $contaCorrente->saldo : 0);
}
}
$ajuste = $total - $subtotal;
Log::info("STEP 02.02 END : VALIDAÇÃO CUPOM ({$hash})");
Log::info("STEP 02.03 BEGIN : CRIAÇÃO PEDIDO ({$hash})");
if($idempotencyToken){
$pedidoDuplicadoFinal = PedidoVenda::where('idempotency_token', $idempotencyToken)->first();
if($pedidoDuplicadoFinal){
Log::info("DUPLICATE CHECKOUT DETECTED (FINAL CHECK DEPÓSITO): Pedido {$pedidoDuplicadoFinal->id} já existe com token {$idempotencyToken}");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoDuplicadoFinal->id
));
}
$pedidoVenda->idempotency_token = $idempotencyToken;
}
$pedidoVenda->subtotal = $subtotal;
$pedidoVenda->total = $total;
$pedidoVenda->ajuste = $ajuste;
$pedidoVenda->data_fechamento = date('Y-m-d H:i:s');
if($total == 0 && $post['tipo_deposito'] == 'CASH'){
$pedidoVenda->nm_referencia = 'Compra com saldo Cashback realizada por '.$cadastro->nome.' '.$cadastro->sobrenome;
}else{
$pedidoVenda->nm_referencia = 'Intenção de depósito realizada por '.$cadastro->nome.' '.$cadastro->sobrenome;
}
$pedidoVenda->assunto = 'Pedido realizado através da plataforma.';
$pedidoVenda->id_condicao_comercial = 1; // 1x
$pedidoVenda->id_cliente = $cadastro->id;
$pedidoVenda->tipo_deposito = $post['tipo_deposito'];
$pedidoVenda->nome_depositante = (isset($post['nome_depositante']) ? $post['nome_depositante'] : '');
if($total == 0 && $post['tipo_deposito'] == 'CASH'){
$pedidoVenda->id_status_pedido_venda = 2; // Aprovado
}else{
$pedidoVenda->id_status_pedido_venda = 1; // Pendente
}
try {
$pedidoVenda->save();
} catch (\Illuminate\Database\QueryException $e) {
if($e->getCode() == 23000 && strpos($e->getMessage(), 'idempotency_token') !== false && $idempotencyToken){
$pedidoExistente = PedidoVenda::where('idempotency_token', $idempotencyToken)->first();
if($pedidoExistente){
Log::info("DUPLICATE CHECKOUT DETECTED (UNIQUE CONSTRAINT): Pedido {$pedidoExistente->id} já existe com token {$idempotencyToken}");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoExistente->id
));
}
}
throw $e;
}
Log::info("STEP 02.03 END : CRIAÇÃO PEDIDO ({$hash})");
$pedidoVendaHistorico->id_pedido_venda_status = $pedidoVenda->id_status_pedido_venda;
Log::info("STEP 02.04 BEGIN : VALIDAÇÃO CADASTRO ({$hash})");
if(count($cadastro->enderecos) == 0){
$cadastroEndereco = new CadastroEndereco();
$cadastroEndereco->fill($post);
$cadastroEndereco->cadastro_id = $cadastro->id;
$cadastroEndereco->principal = 1;
//$cadastroEndereco->nome = 'Endereço de cadastro';
$cadastroEndereco->save();
}
$cadastro->save();
Log::info("STEP 02.04 END : VALIDAÇÃO CADASTRO ({$hash})");
Log::info("STEP 02 END : PAGAMENTO DEPÓSITO ({$hash})");
}else{
$info = \App\BasicInfo::find(1);
if($cupom && $info->cupomDesconto && $cupom['codigo'] == $info->cupomDesconto->codigo){
return array(
'status' => false,
'message' => 'Cupom Inválido para pagamentos com Cartão de Crédito!',
'html' => ''
);
}
if(env('APP_ENV') != 'production'){
return response()->json(array(
'status' => false,
'message' => 'Pagamento Cartão desabilitado para este ambiente! (Homologação)'
));
}
Log::info("STEP 02 BEGIN : PAGAMENTO CARTÃO ({$hash})");
$subtotal = Cart::subtotal(2,'.','');
$total = $subtotal;
if($cupom && $cupom['codigo'] == env('CUPOM_SOCIOS', 'VINUMOFF')){
$total = $custo_efetivo;
$pedidoVenda->id_cupom = $cupom['id'];
}elseif($cupom){
$total = $subtotal * (1 - (($cupom['percentual_desconto'] ? $cupom['percentual_desconto'] : 100) / 100)) - $cupom['valor_desconto'];
$total = $total > 0 ? $total : 0;
$pedidoVenda->id_cupom = $cupom['id'];
}
if(isset($post['cashback'])){
$contaCorrente = (!empty($pedidoVenda->confraria_id) ? $confraria->contaCorrente : $cadastro->contaCorrente);
$total = $total - ($contaCorrente ? $contaCorrente->saldo : 0);
}
$ajuste = $total - $subtotal;
if($total > 0){
$resultadoPagamento = CheckoutService::pagamento($cadastro, $user, $total, $post, $hash);
$resultado = (object)$resultadoPagamento;
if($resultado->status){
$id_pedido_venda_transacao = $resultado->id_pedido_venda_transacao;
$transaction_id = $resultado->transaction_id;
}else{
return response()->json($resultadoPagamento);
}
}
$condicaoComercial = CondicaoComercial::where('frequencia', 30)->where('numero_dias', $post['parcelas'] * 30)->first();
$pre_venda = FALSE;
foreach (Cart::content() as $item) {
if($item->options->tipo == 'oferta'){
$oferta = Oferta::find($item->options->id);
if($oferta->pre_venda){
$pre_venda = TRUE;
break;
}
}else{
break;
}
}
$id_pedido_venda_status = $pre_venda ? 9 : 2;
if($idempotencyToken){
$pedidoDuplicadoFinal = PedidoVenda::where('idempotency_token', $idempotencyToken)->first();
if($pedidoDuplicadoFinal){
Log::info("DUPLICATE CHECKOUT DETECTED (FINAL CHECK CARTÃO): Pedido {$pedidoDuplicadoFinal->id} já existe com token {$idempotencyToken}");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoDuplicadoFinal->id
));
}
$pedidoVenda->idempotency_token = $idempotencyToken;
}
$pedidoVenda->subtotal = $subtotal;
$pedidoVenda->total = $total;
$pedidoVenda->ajuste = $ajuste;
$pedidoVenda->data_fechamento = date('Y-m-d H:i:s');
$pedidoVenda->nm_referencia = 'Compra realizada por '.$cadastro->nome.' '.$cadastro->sobrenome;
$pedidoVenda->assunto = 'Pedido realizado através da plataforma.';
$pedidoVenda->transacao_id = null;
if(isset($transaction_id) && $transaction_id){
$pedidoVenda->transacao_id = $total > 0 ? $transaction_id : null;
}
$pedidoVenda->id_condicao_comercial = $condicaoComercial->id;
$pedidoVenda->id_cliente = $cadastro->id;
$pedidoVenda->id_status_pedido_venda = $id_pedido_venda_status;
try {
$pedidoVenda->save();
} catch (\Illuminate\Database\QueryException $e) {
if($e->getCode() == 23000 && strpos($e->getMessage(), 'idempotency_token') !== false && $idempotencyToken){
$pedidoExistente = PedidoVenda::where('idempotency_token', $idempotencyToken)->first();
if($pedidoExistente){
Log::info("DUPLICATE CHECKOUT DETECTED (UNIQUE CONSTRAINT CARTÃO): Pedido {$pedidoExistente->id} já existe com token {$idempotencyToken}");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoExistente->id
));
}
}
throw $e;
}
GeralService::recalcularAdega($pedidoVenda->id_cliente, $pedidoVenda->id, FALSE, $pedidoVenda->confraria_id);
if(isset($id_pedido_venda_transacao) && is_numeric($id_pedido_venda_transacao)){
DB::table('pedido_venda_transacao')->where('id', $id_pedido_venda_transacao)->update(['pedido_venda_id' => $pedidoVenda->id]);
}
$pedidoVendaHistorico->id_pedido_venda_status = $id_pedido_venda_status;
Log::info("STEP 02 END : PAGAMENTO CARTÃO ({$hash})");
}
Log::info("STEP 03 BEGIN : VALIDAÇÃO CUPOM ({$hash})");
if($cupom){
$cupomPedidoVenda = new CupomPedidoVenda();
$cupomPedidoVenda->id_cupom = $cupom['id'];
$cupomPedidoVenda->id_pedido_venda = $pedidoVenda->id;
$cupomPedidoVenda->data = date('Y-m-d H:i:s');
$cupomPedidoVenda->save();
if($cupomIndicacaoAtivo && ($cupom['codigo'] == $cupomIndicacaoAtivo->codigo)){
$Indicacoes = GeralService::buscarCuponsIndicacoes($cupom['id']);
if(count($Indicacoes) > 0){
foreach ($Indicacoes as $Indicacao) {
$CupomPedidoIndicacao = new CupomPedidoIndicacao;
$CupomPedidoIndicacao->data_cadastro = date('Y-m-d H:i');
$CupomPedidoIndicacao->cupom_indicacao_id = $Indicacao->id;
$CupomPedidoIndicacao->pedido_venda_id = $pedidoVenda->id;
if(isset($cupomPedidoVenda)){
$CupomPedidoIndicacao->cupom_pedido_venda_id = $cupomPedidoVenda->id;
}
$CupomPedidoIndicacao->save();
}
}
}
}
//VERIFICA SE HOUVE INDICAÇÃO
if($cupomIndicacaoAtivo){
$Indicacao = CupomIndicacao::select('cupom_indicacao.*')->join('cupom', 'cupom_indicacao.id_cupom', '=', 'cupom.id')->where('id_indicado', $cadastro->id)->where('cupom.codigo', $cupomIndicacaoAtivo->codigo)->first();
if($Indicacao && count($cadastro->compras) == 1){
$CupomPedidoIndicacao = new CupomPedidoIndicacao;
$CupomPedidoIndicacao->data_cadastro = date('Y-m-d H:i');
$CupomPedidoIndicacao->cupom_indicacao_id = $Indicacao->id;
$CupomPedidoIndicacao->pedido_venda_id = $pedidoVenda->id;
if(isset($cupomPedidoVenda)){
$CupomPedidoIndicacao->cupom_pedido_venda_id = $cupomPedidoVenda->id;
}
$CupomPedidoIndicacao->save();
if($pedidoVenda->id_status_pedido_venda == 2){
$CupomCadastro = new CupomCadastro;
$CupomCadastro->id_cupom = $Indicacao->id_cupom;
$CupomCadastro->id_cadastro = $Indicacao->id_indicador;
$CupomCadastro->id_cupom_indicacao = $Indicacao->id;
$CupomCadastro->save();
}
}
}
Log::info("STEP 03 END : VALIDAÇÃO CUPOM ({$hash})");
$pedidoVendaHistorico->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaHistorico->data = date('Y-m-d H:i');
$pedidoVendaHistorico->notificar_cliente = 0;
$pedidoVendaHistorico->id_colaborador = 1;
Log::info("STEP 04 BEGIN : PRODUTO CARRINHO ({$hash})");
$nr_ofertas = 0;
$valor_economizado = 0;
$qtd_garrafas = 0;
foreach (Cart::content() as $item) {
if($item->options->tipo == 'produto'){
$pedidoVendaProduto = new PedidoVendaHasProduto();
$pedidoVendaProduto->id_produto = $item->options->id;
$pedidoVendaProduto->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaProduto->quantidade = $item->qty;
$pedidoVendaProduto->valor_total = $item->qty * $item->price;
$pedidoVendaProduto->save();
}elseif($item->options->tipo == 'oferta'){
Log::info("STEP 04.01 BEGIN : PEDIDO X PRODUTO ({$hash})");
$nr_ofertas += $item->qty;
$oferta = Oferta::with('produtos.produto')->find($item->options->id);
$valor_economizado += $oferta->preco_mercado - $oferta->preco_oferta;
if($item->options->id_produto){
$pedidoVendaProduto = new PedidoVendaHasProduto();
$pedidoVendaProduto->id_oferta = $oferta->id;
$pedidoVendaProduto->id_produto = $item->options->id_produto;
$pedidoVendaProduto->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaProduto->quantidade = $item->qty;
$pedidoVendaProduto->valor_total = $item->qty * $item->price;
$pedidoVendaProduto->save();
$qtd_garrafas += $item->qty;
}else{
foreach ($oferta->produtos as $ofertaHasProduto) {
$pedidoVendaProduto = new PedidoVendaHasProduto();
$pedidoVendaProduto->id_oferta = $oferta->id;
$pedidoVendaProduto->id_produto = $ofertaHasProduto->id_produto;
$pedidoVendaProduto->id_pedido_venda = $pedidoVenda->id;
$pedidoVendaProduto->quantidade = $ofertaHasProduto->quantidade * $item->qty;
$pedidoVendaProduto->valor_total = $ofertaHasProduto->valor_total * $item->qty;
$pedidoVendaProduto->save();
$qtd_garrafas += $item->qty;
}
}
Log::info(json_encode($item->options));
DB::table('pedido_venda_has_oferta')->insert([
[
'pedido_venda_id' => $pedidoVenda->id,
'oferta_id' => $oferta->id,
'quantidade' => $item->qty,
'valor_unitario' => $oferta->preco_oferta,
'valor_total' => $oferta->preco_oferta * $item->qty,
'desconto_ocultado' => ($item->options->desconto_ocultado ? 1 : 0),
'created_at' => date('Y-m-d H:i:s')
]
]);
Log::info("STEP 04.01 END : PEDIDO X PRODUTO ({$hash})");
Log::info("STEP 04.02 BEGIN : ATUALIZA ESTOQUE ({$hash})");
OfertaReserva::atualizaEstoque($oferta, $pedidoVenda, $item->qty, $item->options->id_produto);
Log::info("STEP 04.02 EBD : ATUALIZA ESTOQUE ({$hash})");
Log::info("STEP 04.03 BEGIN : alteraOrdenacaoOferta ({$hash})");
GeralService::alteraOrdenacaoOferta($oferta);
Log::info("STEP 04.03 END : alteraOrdenacaoOferta ({$hash})");
}
}
Log::info("STEP 04 END : PRODUTO CARRINHO ({$hash})");
Log::info("STEP 05 BEGIN : FIM PROCESSO ({$hash})");
$pedidoVenda->qtd_garrafas = $qtd_garrafas;
$pedidoVenda->valor_economizado = $valor_economizado;
$pedidoVenda->nr_ofertas = $nr_ofertas;
if(env('APP_ENV') == 'local'){
$endereco_ip = '186.216.248.40';
}else{
$endereco_ip = GeralService::getClientIp();
}
$pedidoVenda->endereco_ip = $endereco_ip;
$cadastro = Cadastro::where('user_id', $user->id)->first();
if($cadastro->enderecoPrincipal && $cadastro->enderecoPrincipal->estado){
$pedidoVenda->uf_cliente = $cadastro->enderecoPrincipal->estado->sigla;
}
if(!empty($pedidoVenda->endereco_ip)){
$retorno_ip = GeralService::callIpAPI($pedidoVenda->endereco_ip);
if($retorno_ip){
$retorno_ip = json_decode($retorno_ip);
if(isset($retorno_ip->region_code)){
$pedidoVenda->uf_ip = $retorno_ip->region_code;
}
}
}
$pedidoVenda->unidade_negocio_id = GeralService::checkUnidadeNegocio($pedidoVenda, 'pedido-venda');
$sql = "UPDATE conta_receber SET unidade_negocio_id = {$pedidoVenda->unidade_negocio_id} WHERE id_pedido_venda = {$pedidoVenda->id}";
DB::update($sql);
Log::info("confirmarCompra:unidade_negocio_id => {$pedidoVenda->unidade_negocio_id}");
$pedidoVenda->save();
$cadastro->save();
$pedidoVendaHistorico->save();
GeralService::recalcularAdega($pedidoVenda->id_cliente, $pedidoVenda->id, FALSE, $pedidoVenda->confraria_id);
GeralService::checkoutTracking('pedido-venda', ['id_tipo' => $pedidoVenda->id, 'acao' => 'checkout']);
session(['cupom' => null]);
session(['cupom_adega_virada' => null]);
session(['usar_saldo' => null]);
Cart::destroy();
OfertaReserva::limpaSession();
$keyReserva = str_replace("=", "", base64_encode('reservaTimeout'));
setcookie($keyReserva, FALSE); // Remove KeyReserva == 'cmVzZXJ2YVRpbWVvdXQ'
Log::info("STEP 05 END : FIM PROCESSO ({$hash})");
Log::info("FINISH CHECKOUT ({$hash})");
return response()->json(array(
'status' => true,
'message' => 'Compra <strong>efetuada</strong> com sucesso!',
'id' => $pedidoVenda->id
));
}
public function cadastroWhatsapp(Request $request){
try {
$post = $request->input();
$numero = str_replace(["(", ")", " ", "+55", "-"], '', $post['numero']);
if((Whatsapp::where('numero', $numero)->count()) > 0) {
return response()->json(array(
'status' => false,
'message' => 'Este número de celular já está cadastrado.',
));
}elseif(!is_numeric($numero)){
return response()->json(array(
'status' => false,
'message' => 'O número de celular deve conter somente números',
));
}else{
$whatsapp = new Whatsapp();
$whatsapp->numero = $numero;
$whatsapp->data_registro = date('Y-m-d H:i:s');
$user = Sentinel::getUser();
if ($user) {
$cadastro = Cadastro::where('user_id', $user->id)->first();
$whatsapp->cadastro_id = $cadastro->id;
}
if($whatsapp->save()){
$text1 = "Olá, bem-vindo(a) ao nosso canal de ofertas via Whatsapp. A partir de agora você poderá conferir o vinho do dia de forma ágil e rápida, possibilitando a compra imediata do produto. Para completar o cadastro, basta adicionar o número da VinumDay em seus contatos conforme indicado abaixo.";
$text2 = "VinumDay: +555434190984";
$text3 = 'Caso não queira mais receber nossas ofertas basta responder com a palavra "cancelar".';
$send1 = GeralService::callWhatsappAPI('chat', $numero, "text={$text1}");
$send2 = GeralService::callWhatsappAPI('chat', $numero, "text={$text2}");
$send3 = GeralService::callWhatsappAPI('chat', $numero, "text={$text3}");
return response()->json(array(
'status' => true,
'message' => 'Celular cadastrado com sucesso, em breve você reberá nossas ofertas diárias via Whatsapp.',
));
}else{
return response()->json(array(
'status' => false,
'message' => 'Falha ao cadastrar celular!',
));
}
}
} catch (Exception $e) {
return response()->json(array(
'status' => false,
'message' => 'Falha ao cadastrar celular!',
));
}
}
public function utilizarSaldo(Request $request){
$post = $request->input();
$response = CartService::utilizarSaldo($post);
return response()->json($response);
}
public function getTipoAdega(Request $request){
$post = $request->input();
$tipo_adega = CartService::getTipoAdega($request->input('tipo_adega'));
return response()->json(['status' => true, 'message' => 'Tipo Adega atualizada!', 'tipo_adega' => $tipo_adega]);
}
public function adicionarCupom(Request $request){
$post = $request->input();
session(['cupom_removido' => null]);
$response = CartService::adicionarCupom($post['codigo'], $post['meio_pagamento'], TRUE);
return response()->json($response);
}
public function removerCupom(Request $request){
session(['cupom' => null]);
session(['cupom_removido' => TRUE]);
$html = CartService::buscarHtmlListagemCart();
$html_cupom = CartService::buscarHtmlCupomDesconto();
$parcelas = CartService::buscarParcelas();
$valorTotal = CartService::calcularValorTotal();
return response()->json(array(
'status' => true,
'message' => 'Cupom removido com sucesso!',
'html' => $html,
'html_cupom' => $html_cupom,
'parcelas' => $parcelas,
'valor_total' => ['total' => number_format($valorTotal->total, 2, ',', '.'), 'desconto' => $valorTotal->desconto]
));
}
public function adicionarCupomAdegaVirada(Request $request){
$post = $request->input();
session(['cupom_removido_adega_virada' => null]);
$response = CartService::adicionarCupomAdegaVirada($post['codigo'], TRUE);
return response()->json($response);
}
public function removerCupomAdegaVirada(Request $request){
session(['cupom_adega_virada' => null]);
session(['cupom_removido_adega_virada' => TRUE]);
$html = CartService::buscarHtmlListagemCart();
$html_cupom = CartService::buscarHtmlCupomDesconto();
$html_adega_virada = CartService::buscarHtmlCupomAdegaVirada();
$parcelas = CartService::buscarParcelas();
$valorTotal = CartService::calcularValorTotal();
return response()->json(array(
'status' => true,
'message' => 'Código removido com sucesso!',
'html' => $html,
'html_cupom' => $html_cupom,
'html_adega_virada' => $html_adega_virada,
'parcelas' => $parcelas,
'valor_total' => ['total' => number_format($valorTotal->total, 2, ',', '.'), 'desconto' => $valorTotal->desconto]
));
}
public function addOfertaEquipe(Request $request){
$input = $request->input();
if (!$input['quantidade']) {
return response()->json(array(
'status' => false,
'message' => 'Você deve fornecer uma quantidade válida.',
));
}
$result = CartService::addOfertaEquipe($input);
return response()->json($result);
}
}