| Server IP : 54.94.228.101 / 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/Services/ |
Upload File : |
<?php
namespace App\Services;
use DB;
use Sentinel;
use Illuminate\Support\Facades\Log;
use App\Modules\Cupom\Models\Cupom;
use App\Modules\CupomIndicacao\Models\CupomIndicacao;
use App\Modules\AdegaViradaParticipante\Models\AdegaViradaParticipante;
use App\Modules\AdegaViradaParticipanteIndicacao\Models\AdegaViradaParticipanteIndicacao;
use App\Modules\Produto\Models\Produto;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\OfertaReserva\Models\OfertaReserva;
use App\Modules\CadastroCartao\Models\CadastroCartao;
use App\Modules\Cadastro\Models\Cadastro;
use App\Modules\Pais\Models\Pais;
use App\BasicInfo;
use App\Services\GeralService;
use App\Services\OfertaService;
use App\Services\ContaCorrenteService;
use App\Modules\Confraria\Services\ConfrariaService;
use App\Modules\AdegaVirada\Services\AdegaViradaService;
use Session;
use Cart;
use Facebook;
use App\Modules\OfertaHasProduto\Models\OfertaHasProduto;
class CartService {
public static function addOfertaDia($input){
$oferta = GeralService::buscarOfertaDia();
$descontoOcultado = false;
if(isset($input['ocultar_desconto']) && $input['ocultar_desconto'] != '' && $oferta->ocultar_desconto)
$descontoOcultado = true;
$countItems = 0;
$countPreVenda = 0;
foreach (Cart::content() as $item) {
if($item->options->pre_venda){
$countPreVenda += 1;
}
$countItems += 1;
}
if(($oferta->pre_venda && $countItems > 0) || ($countPreVenda > 0)){
return array(
'status' => false,
'message' => "Vinhos em caráter de pré-venda só podem ser adquiridos individualmente. Caso deseje comprar outros produtos do site, por favor realize um novo pedido após a conclusão do atual.",
'html' => ''
);
}
$result = Cart::search(function ($cartItem, $rowId) use($oferta){
return $cartItem->id == 'oferta-'.$oferta->id;
});
$item = $result->first();
$cupom = session('cupom');
if($cupom && isset($cupom['id_canal']) && !empty($cupom['id_canal'])){
$cupom = Cupom::find($cupom['id']);
//Verifica Cupom Ativo x Canal x Oferta Adicionada
if(!isset($oferta->canalHasOferta) || (isset($oferta->canalHasOferta) && $oferta->canalHasOferta->id_canal != $cupom->id_canal)){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
}
}
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'add']);
if($input['quantidade'] > $oferta->quantidade_maxima_por_cliente){
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $oferta->quantidade_maxima_por_cliente . ' gr. por cliente.'
];
}elseif(!$item || (($item->qty + $input['quantidade']) <= $item->options->maximo_por_cliente)){
if($oferta && $oferta->estoque >= $input['quantidade']){
$quantidade_vinhos = OfertaHasProduto::select(DB::raw('SUM(quantidade) as quantidade_total'))->where('id_oferta', $oferta->id)->value('quantidade_total');
$custo_efetivo = OfertaService::getCustoEfetivo($oferta->id);
$teor_alcoolico = OfertaService::getTeorAlcoolico($oferta->id);
$data = array(
'id' => 'oferta-'.$oferta->id,
'name' => $oferta->titulo.' '.$oferta->sub_titulo,
'price' => $oferta->preco_oferta,
'qty' => $input['quantidade'],
'options' => [
'tipo' => 'oferta',
'id' => $oferta->id,
'pre_venda' => $oferta->pre_venda ? TRUE : FALSE,
'id_canal' => 0,
'id_produto' => FALSE,
'tipo_oferta' => isset($oferta->tipo) ? $oferta->tipo : false,
'foto' => $oferta->thumbnail_principal,
'preco_mercado' => $oferta->preco_mercado,
'preco_custo' => $oferta->preco_custo,
'custo_efetivo' => $custo_efetivo,
'teor_alcoolico' => $teor_alcoolico,
'valor_parcela_minima' => $oferta->valor_parcela_minima,
'numero_maximo_parcelas' => $oferta->numero_maximo_parcelas,
'unidade_medida' => ($quantidade_vinhos > 1) ? 'Un.' : 'Gr.',
'slug' => $oferta->slug,
'quantidade_vinhos' => $quantidade_vinhos,
'maximo_por_cliente' => $oferta->quantidade_maxima_por_cliente,
'tamanho' => FALSE,
'modelo' => FALSE,
'desconto_ocultado' => $descontoOcultado,
]
);
$item = Cart::add($data);
OfertaReserva::reserva($oferta, $input['quantidade']);
Session::save();
return [
'status' => true,
'message' => 'Oferta adicionada ao seu carrinho!',
'item' => $item
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível'
];
}
}else{
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de '.$item->options->maximo_por_cliente.' unidades por cliente.'
];
}
}
public static function addOfertaSemana($input){
$oferta = GeralService::buscarOfertaDaSemana();
$countItems = 0;
$countPreVenda = 0;
foreach (Cart::content() as $item) {
if($item->options->pre_venda){
$countPreVenda += 1;
}
$countItems += 1;
}
if(($oferta->pre_venda && $countItems > 0) || ($countPreVenda > 0)){
return array(
'status' => false,
'message' => "Vinhos em caráter de pré-venda só podem ser adquiridos individualmente. Caso deseje comprar outros produtos do site, por favor realize um novo pedido após a conclusão do atual.",
'html' => ''
);
}
$result = Cart::search(function ($cartItem, $rowId) use($oferta){
return $cartItem->id == 'oferta-'.$oferta->id;
});
$item = $result->first();
$cupom = session('cupom');
if($cupom && isset($cupom['id_canal']) && !empty($cupom['id_canal'])){
$cupom = Cupom::find($cupom['id']);
//Verifica Cupom Ativo x Canal x Oferta Adicionada
if(!isset($oferta->canalHasOferta) || (isset($oferta->canalHasOferta) && $oferta->canalHasOferta->id_canal != $cupom->id_canal)){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
}
}
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'add']);
if($input['quantidade'] > $oferta->quantidade_maxima_por_cliente){
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $oferta->quantidade_maxima_por_cliente . ' gr. por cliente.'
];
}elseif(!$item || (($item->qty + $input['quantidade']) <= $item->options->maximo_por_cliente)){
if($oferta && $oferta->estoque >= $input['quantidade']){
$quantidade_vinhos = OfertaHasProduto::select(DB::raw('SUM(quantidade) as quantidade_total'))->where('id_oferta', $oferta->id)->value('quantidade_total');
$custo_efetivo = OfertaService::getCustoEfetivo($oferta->id);
$teor_alcoolico = OfertaService::getTeorAlcoolico($oferta->id);
$data = array(
'id' => 'oferta-'.$oferta->id,
'name' => $oferta->titulo.' '.$oferta->sub_titulo,
'price' => $oferta->preco_oferta,
'qty' => $input['quantidade'],
'options' => [
'tipo' => 'oferta',
'id' => $oferta->id,
'id_canal' => 0,
'id_produto' => FALSE,
'tipo_oferta' => isset($oferta->tipo) ? $oferta->tipo : false,
'foto' => $oferta->thumbnail_principal,
'preco_mercado' => $oferta->preco_mercado,
'preco_custo' => $oferta->preco_custo,
'custo_efetivo' => $custo_efetivo,
'teor_alcoolico' => $teor_alcoolico,
'valor_parcela_minima' => $oferta->valor_parcela_minima,
'numero_maximo_parcelas' => $oferta->numero_maximo_parcelas,
'unidade_medida' => ($quantidade_vinhos > 1) ? 'Un.' : 'Gr.',
'slug' => $oferta->slug,
'quantidade_vinhos' => $quantidade_vinhos,
'maximo_por_cliente' => $oferta->quantidade_maxima_por_cliente,
'tamanho' => FALSE,
'modelo' => FALSE,
'desconto_ocultado' => FALSE
]
);
$item = Cart::add($data);
OfertaReserva::reserva($oferta, $input['quantidade']);
Session::save();
return [
'status' => true,
'message' => 'Oferta adicionada ao seu carrinho!',
'item' => $item
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível'
];
}
}else{
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de '.$item->options->maximo_por_cliente.' unidades por cliente.'
];
}
}
public static function addItem($input){
$produto = Produto::find($input['produto_id']);
GeralService::checkoutTracking('produto', ['id_tipo' => $produto->id, 'quantidade' => $input['quantidade'], 'acao' => 'add']);
if($produto && $produto->estoque >= $input['quantidade']){
$data = array(
'id' => 'produto-'.$produto->id,
'name' => $produto->nome,
'price' => $produto->preco_de_venda,
'qty' => $input['quantidade'],
'options' => [
'tipo' => 'produto',
'id' => $produto->id,
'tipo_oferta' => FALSE,
'foto' => $produto->thumbnail_principal,
'preco_mercado' => $produto->preco_mercado,
'preco_custo' => $produto->preco_custo,
'custo_efetivo' => $produto->custo_efetivo
]
);
$item = Cart::add($data);
Session::save();
return [
'status' => true,
'message' => 'Produto adicionado ao seu carrinho!',
'item' => $item
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível'
];
}
}
public static function addOferta($input){
$oferta = Oferta::find($input['oferta_id']);
$descontoOcultado = false;
if(isset($input['ocultar_desconto']) && $input['ocultar_desconto'] != '' && $oferta->ocultar_desconto)
$descontoOcultado = true;
$countItems = 0;
$countPreVenda = 0;
$itemDiariaSemana = [];
$tipos = GeralService::tiposOfertasProdutos($oferta);
foreach (Cart::content() as $item) {
if($item->options->pre_venda){
$countPreVenda += 1;
}
$countItems += 1;
if($oferta->tipo == 'CS' && in_array($item->options->tipo_oferta, $tipos)){
$itemDiariaSemana[] = $item;
}
}
if(($oferta->pre_venda && $countItems > 0) || ($countPreVenda > 0)){
return array(
'status' => false,
'message' => "Vinhos em caráter de pré-venda só podem ser adquiridos individualmente. Caso deseje comprar outros produtos do site, por favor realize um novo pedido após a conclusão do atual.",
'html' => ''
);
}
$result = Cart::search(function ($cartItem, $rowId) use($oferta){
return $cartItem->id == 'oferta-'.$oferta->id;
});
$item = $result->first();
$cupom = session('cupom');
if($cupom && isset($cupom['id_canal']) && !empty($cupom['id_canal'])){
$cupom = Cupom::find($cupom['id']);
//Verifica Cupom Ativo x Canal x Oferta Adicionada
if(!isset($oferta->canalHasOferta) || (isset($oferta->canalHasOferta) && $oferta->canalHasOferta->id_canal != $cupom->id_canal)){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
}
}
$urlOferta = url('/oferta/'.$oferta->slug) . (isset($input['tag_video']) && $input['tag_video'] == 'true' ? '?video='.$input['video'] : '');
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'add', 'observacao' => $urlOferta]);
$unidade_medida = isset($input['tamanho']) ? 'Un.' : 'Gr.';
$quantidade_compra = ($item ? ($item->qty + $input['quantidade']) : $input['quantidade']);
if(isset($input['origem']) && $input['origem'] == 'listagem-cart'){
$quantidade_compra = $input['quantidade'];
}
if($quantidade_compra > $oferta->quantidade_maxima_por_cliente){
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $oferta->quantidade_maxima_por_cliente . ' ' . $unidade_medida . ' por cliente.'
];
}elseif(!$item || ($quantidade_compra <= $item->options->maximo_por_cliente)){
if(isset($input['tamanho'])){
$Produto = Produto::select('produto.id', 'ohp.estoque AS estoque_oferta_has_produto')
->join('oferta_has_produto as ohp', 'ohp.id_produto', '=', 'produto.id')
->join('produto_has_variacao_atributo as a', 'a.produto_id', '=', 'produto.id')
->join('produto_variacao as v', 'v.id', '=', 'a.produto_variacao_id')
->where('ohp.id_oferta', $oferta->id)
->where('v.slug', 'modelo')
->where('a.produto_variacao_atributo_id', $input['modelo'])
->whereRaw("EXISTS (SELECT 1 FROM produto_has_variacao_atributo phva, produto_variacao pv WHERE phva.produto_id = produto.id AND phva.produto_variacao_id = pv.id AND pv.slug = 'tamanho' AND phva.produto_variacao_atributo_id = " . $input['tamanho'] . ")")
->first();
$estoque = $Produto ? $Produto->estoque_oferta_has_produto : 0;
$quantidade_vinhos = 1;
}else{
$Produto = FALSE;
$estoque = $oferta->estoque;
$quantidade_vinhos = OfertaHasProduto::select(DB::raw('SUM(quantidade) as quantidade_total'))->where('id_oferta', $oferta->id)->value('quantidade_total');
$unidade_medida = ($quantidade_vinhos > 1) ? 'Un.' : 'Gr.';
}
if($oferta && $estoque >= $quantidade_compra){
if($item && isset($input['origem']) && $input['origem'] == 'listagem-cart' && isset($input['row_id'])){
CartService::deleteItem($input);
}
//Se Tiver Venda Casada com Oferta da Semana ou Diária remove se já tiver no carrinho algo relacionado!
if($oferta->tipo == 'CS' && count($itemDiariaSemana) > 0){
foreach ($itemDiariaSemana as $itemOferta) {
CartService::deleteItem(['row_id' => $itemOferta->rowId]);
}
}
$custo_efetivo = OfertaService::getCustoEfetivo($oferta->id);
$teor_alcoolico = OfertaService::getTeorAlcoolico($oferta->id);
$data = array(
'id' => 'oferta-'.$oferta->id,
'name' => $oferta->titulo.' '.$oferta->sub_titulo,
'price' => $oferta->preco_oferta,
'qty' => $input['quantidade'],
'options' => [
'id' => $oferta->id,
'pre_venda' => $oferta->pre_venda ? TRUE : FALSE,
'tipo' => 'oferta',
'tipo_oferta' => $oferta->tipo,
'tipos' => GeralService::tiposOfertasProdutos($oferta),
'id_canal' => isset($oferta->canalHasOferta) ? $oferta->canalHasOferta->id_canal : 0,
'id_produto' => $Produto ? $Produto->id : FALSE,
'foto' => $oferta->thumbnail_principal,
'preco_mercado' => $oferta->preco_mercado,
'preco_custo' => $oferta->preco_custo,
'custo_efetivo' => $custo_efetivo,
'teor_alcoolico' => $teor_alcoolico,
'valor_parcela_minima' => $oferta->valor_parcela_minima,
'numero_maximo_parcelas' => $oferta->numero_maximo_parcelas,
'unidade_medida' => $unidade_medida,
'slug' => $oferta->slug,
'quantidade_vinhos' => $quantidade_vinhos,
'maximo_por_cliente' => $oferta->quantidade_maxima_por_cliente,
'tamanho' => isset($input['tamanho']) ? GeralService::variacaoAtributo($input['tamanho']) : FALSE,
'modelo' => isset($input['modelo']) ? GeralService::variacaoAtributo($input['modelo']) : FALSE,
'desconto_ocultado' => $descontoOcultado,
]
);
$item = Cart::add($data);
$reserva = OfertaReserva::reserva($oferta, $input['quantidade']);
Log::info("Reserva: " . json_encode($reserva));
Session::save();
return [
'status' => true,
'message' => 'Oferta adicionada ao seu carrinho!',
'item' => $item
];
}else{
if(isset($input['tamanho'])){
$url = $Produto ? url("/contato?oferta={$oferta->id}&produto=".$Produto->id."&quantidade=".$input['quantidade']) : url("/contato?oferta={$oferta->id}&tamanho=".$input['tamanho']."&modelo=".$input['modelo']."&quantidade=".$input['quantidade']);
return [
'status' => false,
'message' => 'Estoque indisponível. Para ser avisado quando tiver disponível, <a href="' . $url . '">clique aqui</a>'
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível.'
];
}
}
}else{
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $item->options->maximo_por_cliente . ' unidades por cliente.'
];
}
}
public static function updateItem($input){
if($input['quantidade'] > 0){
$item = Cart::get($input['row_id']);
$maxPorCliente = $item->options->maximo_por_cliente;
$unidade_medida = $item->options->tamanho ? 'unidades' : 'garrafas';
if($maxPorCliente >= $input['quantidade']){
if($item->options->tipo == 'oferta'){
$oferta = Oferta::find($item->options->id);
if($item->options->tamanho){
$Produto = Produto::select('produto.id', 'ohp.estoque AS estoque_oferta_has_produto')
->join('oferta_has_produto as ohp', 'ohp.id_produto', '=', 'produto.id')
->join('produto_has_variacao_atributo as a', 'a.produto_id', '=', 'produto.id')
->join('produto_variacao as v', 'v.id', '=', 'a.produto_variacao_id')
->where('ohp.id_oferta', $oferta->id)
->where('v.slug', 'modelo')
->where('a.produto_variacao_atributo_id', $item->options->modelo->id)
->whereRaw("EXISTS (SELECT 1 FROM produto_has_variacao_atributo phva, produto_variacao pv WHERE phva.produto_id = produto.id AND phva.produto_variacao_id = pv.id AND pv.slug = 'tamanho' AND phva.produto_variacao_atributo_id = {$item->options->tamanho->id})")
->first();
$estoque = $Produto ? $Produto->estoque_oferta_has_produto : 0;
$descAux = ($item->options->tamanho ? "<br>Tam. {$item->options->tamanho->nome}" : '');
$descAux .= ($item->options->modelo ? " - Mod. {$item->options->modelo->nome}" : '');
}else{
$estoque = $oferta->estoque;
$descAux = '';
}
//Valida Tanto Oferta com/sem reserva
$checkOferta = OfertaReserva::check($oferta, $input['quantidade'], $estoque);
$BasicInfo = BasicInfo::first();
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'update']);
if(!$checkOferta){
$message = 'Quantidade inválida. Restam apenas ' . $estoque . ' ' . $unidade_medida . ' da oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . ' ' . $descAux . '.';
if($estoque == 0){
$message = 'Não há disponibilidade para a oferta '.$oferta->titulo.' '.$oferta->sub_titulo.'.';
if($BasicInfo->reserva_estoque == 1){
$message = 'Não há disponibilidade para ' . $input['quantidade'] . ' ' . $unidade_medida . ' na oferta '.$oferta->titulo.' '.$oferta->sub_titulo . ' ' . $descAux . '.';
}
}
return [
'status' => false,
'message' => $message,
'quantidade' => $item->qty
];
}
OfertaReserva::reserva($oferta, $input['quantidade'], 'update');
}
$item = Cart::update($input['row_id'], $input['quantidade']); // Will update the quantity
}else{
return [
'status' => false,
'message' => 'Quantidade inválida. A oferta "' . $item->name . '" tem o limite de ' . $item->options->maximo_por_cliente . ' ' . $unidade_medida . ' por cliente.',
'quantidade' => $item->qty
];
}
$quantidade = $item->qty;
}else{
$quantidade = 0;
}
return [
'status' => true,
'message' => 'Item atualizado com sucesso!',
'quantidade' => $quantidade
];
}
public static function deleteItem($input){
$item = Cart::get($input['row_id']);
if($item->options->tipo == 'oferta'){
$oferta = Oferta::find($item->options->id);
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $item->qty, 'acao' => 'remove']);
OfertaReserva::reserva($oferta, $item->qty, 'remove');
}
Cart::remove($input['row_id']); // Will remove
return true;
}
public static function buscarOfertasCart(){
$ofertas = [];
foreach (Cart::content() as $item) {
$ofertas[$item->options->id] = $item->qty;
}
return $ofertas;
}
public static function buscarQtdeItensCart(){
//CartCount
$cartCount = 0;
foreach (Cart::content() as $item) {
$cartCount += $item->qty * $item->options->quantidade_vinhos;
}
return $cartCount;
}
public static function buscarHtmlCart(){
$data['cartCount'] = 0;
foreach (Cart::content() as $item) {
$data['cartCount'] += $item->qty * $item->options->quantidade_vinhos;
}
$data['cartTotal'] = Cart::subtotal();
$view = view('checkout/cart', $data);
return $view->render();
}
public static function buscarProdutosValidosCashback($local = 'cart'){
$data['info'] = \App\BasicInfo::find(1);
$data['cartItems'] = Cart::content();
$produtosValidosParaCashback = [];
$confraria = ConfrariaService::buscarConfrariaUsuarioLogado();
// OFERTAS VÁLIDAS PARA CASHBACK:
// 1º - OFERTAS CANAL LIBERADO VIA ADMIN NO CASHBACK E EM PERÍODO ATIVO
// 2º - OFERTAS CONFRARIA (COLEÇÕES DO MÊS)
// 3º - SE O USUÁRIO LOGADO FIZER PARTE DE UMA CONFRARIA SEMPRE VAI PERMITIR GERAR CASHBACK PARA QUALQUER OFERTA OU SOMENTE NAS SITUAÇÕES ACIMA?
if($confraria){
foreach($data['cartItems'] as $cartItem){
$produtosValidosParaCashback[] = $cartItem;
}
}elseif(isset($data['info']->canal_id_cashback) && !empty($data['info']->canal_id_cashback)){
foreach($data['cartItems'] as $cartItem){
if($cartItem->options->id_canal == $data['info']->canal_id_cashback){
$produtosValidosParaCashback[] = $cartItem;
}
}
}else{
foreach($data['cartItems'] as $cartItem){
$produtosValidosParaCashback[] = $cartItem;
}
}
return $produtosValidosParaCashback;
}
public static function buscarHtmlListagemCart()
{
$data['cartItems'] = Cart::content();
$data['ocultarDesconto'] = true;
$ofertasCarrinho = [];
if (count($data['cartItems']) == 1){
foreach ($data['cartItems'] as $cartItem) {
$ofertasCarrinho[] = $cartItem->options->id;
}
}
$ofertasCheck = Oferta::whereIn('id', $ofertasCarrinho)
->where('ocultar_desconto', 0)
->get();
if($ofertasCheck->isNotEmpty()){
$data['ocultarDesconto'] = false;
}
$data['cupom'] = session('cupom');
$data['info'] = \App\BasicInfo::find(1);
$data['clienteLogado'] = GeralService::buscarClienteLogado();
$produtosValidosParaCashback = CartService::buscarProdutosValidosCashback();
$totalValorCashback = 0;
if(count($produtosValidosParaCashback) >= 1){
foreach ($produtosValidosParaCashback as $item) {
$totalValorCashback += $item->price * $item->qty;
}
}
$total = 0;
foreach ($data['cartItems'] as $item) {
$total += $item->price * $item->qty;
}
$data['valorCashback'] = ContaCorrenteService::calcularValor($totalValorCashback, $data['info']);
$data['mostrarBoxCashback'] = CartService::mostrarBoxCashback();
$data['totalValorItensCashback'] = $totalValorCashback;
$data['tipo_adega'] = CartService::getTipoAdega();
$data['confraria'] = ConfrariaService::buscarConfrariaUsuarioLogado();
$view = view('checkout.listagem-cart', $data);
return $view->render();
}
public static function getTipoAdega($tipo_adega = FALSE){
if(!$tipo_adega){
$currentPath = \Request::path();
$pieces = explode('/', $currentPath);
$tipo_adega = 'pessoal';
if(!empty($pieces) && isset($pieces[0]) && $pieces[0] == 'confraria' && isset($pieces[1]) && $pieces[1] == 'checkout'){
$tipo_adega = 'confraria';
}
if(session('tipo_adega')){
$tipo_adega = session('tipo_adega');
}
}
session(['tipo_adega' => $tipo_adega]);
return $tipo_adega;
}
public static function buscarHtmlCashback(){
$data['usar_saldo'] = session('usar_saldo');
$data['tipo_adega'] = session('tipo_adega');
$data['cadastro'] = GeralService::buscarClienteLogado();
$data['confraria'] = ConfrariaService::buscarConfrariaUsuarioLogado();
$data['valorTotal'] = CartService::calcularValorTotal();
$data['info'] = \App\BasicInfo::find(1);
$view = view('checkout._box-cashback', $data);
return $view->render();
}
public static function buscarHtmlCashbackCheckout(){
$total = CartService::calcularValorTotal();
$data['soma'] = $total->totalOriginal;
$data['info'] = \App\BasicInfo::find(1);
$cartItems = Cart::content();
$produtosValidosParaCashback = CartService::buscarProdutosValidosCashback();
$totalValorCashback = 0;
if(count($produtosValidosParaCashback) >= 1){
foreach ($produtosValidosParaCashback as $item) {
$totalValorCashback += $item->price * $item->qty;
}
}
$data['totalValorItensCashback'] = $totalValorCashback;
$data['confraria'] = ConfrariaService::buscarConfrariaUsuarioLogado();
$data['valorCashback'] = ContaCorrenteService::calcularValor($totalValorCashback, $data['info']);
$view = view('checkout._box-cashback-checkout', $data);
$produtos = self::buscarOfertasCart();
return $view->render();
}
public static function buscarHtmlCupomAdegaVirada(){
$cartItems = Cart::content();
$cupomAtivo = CartService::buscarCupomAtivoAdegaVirada();
$cupom = session('cupom_adega_virada');
$teor_alcoolico = FALSE;
foreach ($cartItems as $item) {
if($item->options->teor_alcoolico <= 13){
$teor_alcoolico = TRUE;
}
}
if($cupomAtivo && !session('cupom_removido_adega_virada') && $teor_alcoolico){
$response = CartService::adicionarCupomAdegaVirada($cupomAtivo->codigo);
$cupom = session('cupom_adega_virada');
}
$qtde_cupons = 1;
/*if($cupom){
$Indicacoes = GeralService::buscarQtdeIndicacoesAdegaVirada();
if($Indicacoes && $Indicacoes->qtde_cupons > 0){
$qtde_cupons = $Indicacoes->qtde_cupons;
}
$Indicacoes = GeralService::buscarCuponsIndicacoesAdegaVirada();
$data['indicacoes'] = $Indicacoes;
}*/
$data['cupom'] = $cupom;
$data['cupomAtivo'] = $cupomAtivo;
$data['qtde_cupons'] = $qtde_cupons;
$data['itens'] = $cartItems;
$data['adegaVirada'] = AdegaViradaService::buscarAdegaVirada();
$data['clienteLogado'] = GeralService::buscarClienteLogado();
$view = view('checkout/cupom-adega-virada', $data);
return $view->render();
}
public static function buscarHtmlRegulamentoAdegaVirada(){
$adegaVirada = AdegaViradaService::buscarAdegaVirada();
$exibeAdegaVirada = ($adegaVirada && $adegaVirada->ativo && date('Y-m-d H:i:s') >= $adegaVirada->data_ativacao);
if(!$exibeAdegaVirada)
return false;
$checkParticipacao = AdegaViradaService::regulamentoStatus();
if($checkParticipacao)
return false;
$data['clienteLogado'] = GeralService::buscarClienteLogado();
$view = view('checkout/regulamento-adega-virada', $data);
return $view->render();
}
public static function buscarHtmlCupomDesconto(){
$cartItems = Cart::content();
$cupomAtivo = CartService::buscarCupomAtivo();
$cupom = session('cupom');
$cupomIndicacaoAtivo = GeralService::buscarCupomIndicacaoAtivo();
if($cupomAtivo && ($cupomIndicacaoAtivo && $cupomAtivo->codigo == $cupomIndicacaoAtivo->codigo || $cupomAtivo->codigo == 'PRIMEIRA20') && !session('cupom_removido') && !$cupom){
$response = CartService::adicionarCupom($cupomAtivo->codigo);
}
$cupom = session('cupom');
$soma = 0;
$custo_efetivo = 0;
$qtde_cupons = 1;
foreach ($cartItems as $item) {
$soma += $item->price * $item->qty;
$custo_efetivo += $item->options->custo_efetivo * $item->qty;
}
if(isset($cupom['codigo']) && $cupom['codigo'] == env('CUPOM_SOCIOS', 'VINUMOFF')){
$novo_total = $custo_efetivo;
$desconto = $soma - $custo_efetivo;
$desconto = "R$ " . number_format($desconto, 2, ',', '.');
}elseif($cupom && $cupomIndicacaoAtivo && $cupom['codigo'] == $cupomIndicacaoAtivo->codigo){
$Indicacoes = GeralService::buscarQtdeIndicacoes($cupom['id']);
if($Indicacoes && $Indicacoes->qtde_cupons > 0){
$qtde_cupons = $Indicacoes->qtde_cupons;
}
$novo_total = $soma - ($cupom['valor_desconto'] * $qtde_cupons);
$novo_total = $novo_total > 0 ? $novo_total : 0;
$valor_desconto = $cupom['valor_desconto'] * $qtde_cupons;
$desconto = "R$ " . number_format($valor_desconto, 2, ',', '.');
$Indicacoes = GeralService::buscarCuponsIndicacoes($cupom['id'], true);
$data['indicacoes'] = $Indicacoes;
}elseif($cupom){
$novo_total = $soma * (1 - (($cupom['percentual_desconto'] ? $cupom['percentual_desconto'] : 100) / 100)) - $cupom['valor_desconto'];
$novo_total = $novo_total > 0 ? $novo_total : 0;
$desconto = ($cupom['percentual_desconto'] > 0 ? "{$cupom['percentual_desconto']}%" : "R$ " . number_format($cupom['valor_desconto'], 2, ',', '.'));
}else{
$novo_total = $soma;
$desconto = '-';
}
$data['soma'] = $soma;
$data['novo_total'] = $novo_total;
$data['desconto'] = $desconto;
$data['cupom'] = $cupom;
$data['cupomAtivo'] = $cupomAtivo;
$data['qtde_cupons'] = $qtde_cupons;
$data['clienteLogado'] = GeralService::buscarClienteLogado();
$view = view('checkout/cupom-desconto', $data);
return $view->render();
}
public static function buscarCartoesCliente(){
$user = Sentinel::getUser();
$cadastro = Cadastro::where('user_id', $user->id)->first();
$apiKey = GeralService::getApiKeyPagarMe($cadastro);
$pagarMe = new \PagarMe\Sdk\PagarMe($apiKey);
foreach ($cadastro->cartoes as $key => $cartao) {
try {
$cartao->info = $pagarMe->card()->get($cartao->cartao_id);
} catch (\Exception $e) {
unset($cadastro->cartoes[$key]);
}
}
return $cadastro->cartoes;
}
public static function buscarHtmlIdentificacao($confrariaCheck = false){
$user = Sentinel::getUser();
$data = [];
if ($user) {
$data['user'] = $user;
$data['cadastro'] = Cadastro::where('user_id', $user->id)->first();
$apiKey = GeralService::getApiKeyPagarMe($data['cadastro']);
$pagarMe = new \PagarMe\Sdk\PagarMe($apiKey);
if(!$data['cadastro']){
return null;
}
foreach ($data['cadastro']->cartoes as $cartao) {
$cartao->info = $pagarMe->card()->get($cartao->cartao_id);
}
$data['parcelasOptions'] = self::buscarParcelas();
$data['cartItems'] = Cart::content();
$data['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();
$data['valorTotal'] = self::calcularValorTotal();
$basicInfo = BasicInfo::first();
$data['info'] = $basicInfo;
$data['tentativasCartao'] = CadastroCartao::where('cadastro_id', $data['cadastro']->id)->where('empresa_id', $data['cadastro']->empresa_id)->whereDate('data_cadastro', date('Y-m-d'))->where('ativo', 0)->count();
$data['htmlBoxCashback'] = CartService::buscarHtmlCashback();
$data['valorRestante'] = $data['valorTotal']->totalOriginal - ($data['cadastro']->contaCorrente ? $data['cadastro']->contaCorrente->saldo : 0);
$data['tipo_adega'] = CartService::getTipoAdega();
$data['confrariaCheck'] = $confrariaCheck;
$view = view('checkout/meios-pagamento', $data);
}else{
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['listaPaises'] = Pais::orderBy('nome', 'ASC')->get();
$view = view('checkout/guest', $data);
}
return $view->render();
}
public static function buscarCupomPedidoVenda($id_pedido_venda){
$query = Cupom::select('cupom.*');
$query->join('cupom_pedido_venda', 'cupom.id', '=', 'cupom_pedido_venda.id_cupom');
$query->where('cupom_pedido_venda.id_pedido_venda', '=', $id_pedido_venda);
$cupom = $query->first();
return $cupom;
}
public static function buscarCupomCliente($codigo, $cliente, $primeiro_pedido = 0){
$query = Cupom::select('cupom.*');
$query->leftJoin('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query->leftJoin('cupom_pedido_venda', 'cupom.id', '=', 'cupom_pedido_venda.id_cupom');
if(!empty($codigo)){
$query->where('cupom.codigo', $codigo);
}
$query->where('cupom.tipo', 'C');
$query->where('cupom.status', 'A');
$query->where('cupom.primeiro_pedido', $primeiro_pedido);
$query->where('cupom.data_de_expiracao', '>=', date('Y-m-d'));
$query->where(function($q) use ($cliente){
$q->where('cupom.todos_clientes', 1);
if ($cliente) {
$q->orWhere('cupom_cadastro.id_cadastro', $cliente->id);
}
});
if($cliente){
/*
$query->whereNotExists(function($q) use ($cliente){
$q->select(DB::raw(1))->from('pedido_venda')
->whereRaw('pedido_venda.id = cupom_pedido_venda.id_pedido_venda')
->where('id_cliente', '=', $cliente->id);
});
if($primeiro_pedido > 0){
$query->whereNotExists(function($q) use ($cliente){
$q->select(DB::raw(1))->from('pedido_venda')->where('id_cliente', '=', $cliente->id);
});
}
*/
}
$cupom = $query->orderBy('tipo', 'DESC')->first();
return $cupom;
}
public static function utilizarSaldo($post){
try {
if($post['usar_saldo'] == 0){
session(['usar_saldo' => null]);
}else{
session(['usar_saldo' => $post['usar_saldo']]);
}
$parcelas = CartService::buscarParcelas();
$valorTotal = CartService::calcularValorTotal();
return array(
'status' => true,
'message' => 'Saldo atualizado com sucesso!',
'html' => CartService::buscarHtmlListagemCart(),
'html_cupom' => CartService::buscarHtmlCupomDesconto(),
'parcelas' => $parcelas,
'valor_total' => ['total' => number_format($valorTotal->total, 2, ',', '.'), 'total_original' => number_format($valorTotal->totalOriginal, 2, ',', '.'), 'desconto' => $valorTotal->desconto]
);
} catch (Exception $e) {
return array(
'status' => false,
'message' => 'Falha ao atualizar Saldo',
'html' => ''
);
}
}
public static function adicionarCupomAdegaVirada($codigo, $ajax = FALSE){
try {
$info = \App\BasicInfo::find(1);
if(empty($codigo)){
return array(
'status' => false,
'message' => 'Código Inválido',
'html' => ''
);
}
$clienteLogado = GeralService::buscarClienteLogado();
$cupom = CartService::buscarCupomAtivoAdegaVirada($codigo);
if ($cupom) {
if($clienteLogado){ // Se existe o cupom e o cliente está logado
$cartItems = Cart::content();
$teor_alcoolico = FALSE;
foreach ($cartItems as $item) {
if($item->options->teor_alcoolico <= 13){
$teor_alcoolico = TRUE;
}
}
if(!$teor_alcoolico){
return array(
'status' => false,
'message' => 'Pelo menos um produto precisa de teor_alcoolico <= 13%.',
'html' => ''
);
}
$countCupomCliente = AdegaViradaParticipanteIndicacao::select('cadastro_id')
->where('cadastro_id', $clienteLogado->id)
->whereRaw('adega_virada_cupom_id IS NOT NULL')->count(); // Confere se o cliente já utilizou o cupom
if($countCupomCliente > 0){
return array(
'status' => false,
'message' => 'Esse código já foi utilizado.',
'html' => ''
);
}
}
session(['cupom_adega_virada' => [
'id' => $cupom->id,
'indicacao_id' => $cupom->adega_virada_participante_indicacao_id,
'codigo' => $cupom->codigo,
'nome_completo' => $cupom->cadastro->nome_completo()
]
]);
if($ajax){
return array(
'status' => true,
'message' => 'Código adicionado com sucesso!',
'html_adega_virada' => CartService::buscarHtmlCupomAdegaVirada()
);
}
return array(
'status' => true,
'message' => 'Código adicionado com sucesso!'
);
}else{
if(!$clienteLogado){
$message = 'Código exclusivo. Entre na sua conta para verificar se esse cupom está disponível.';
}else{
$message = 'Código inválido.';
}
return array(
'status' => false,
'message' => $message,
'html' => ''
);
}
} catch (Exception $e) {
return array(
'status' => false,
'message' => 'Falha ao adicionar Código',
'html' => ''
);
}
}
public static function adicionarCupom($codigo, $meio_pagamento = '', $ajax = FALSE){
try {
$info = \App\BasicInfo::find(1);
if(empty($codigo)){
return array(
'status' => false,
'message' => 'Cupom Inválido',
'html' => ''
);
}
$clienteLogado = GeralService::buscarClienteLogado();
$cupom = CartService::buscarCupomAtivo($codigo);
$cupomIndicacaoAtivo = GeralService::buscarCupomIndicacaoAtivo();
$descontoDeposito = FALSE;
/*
if($info->ativar_desconto_deposito && !empty($info->cupom_desconto_id) && $info->cupomDesconto->codigo == $codigo){
$cupom = $info->cupomDesconto;
$descontoDeposito = TRUE;
}
*/
if($cupom->id == $info->cupom_desconto_id){
return array(
'status' => false,
'message' => 'Cupom inválido!',
'html' => ''
);
}
if ($cupom) {
if(!empty($meio_pagamento) && $meio_pagamento == 'C' && $cupom->id == $info->cupom_desconto_id){
return array(
'status' => false,
'message' => 'Cupom Inválido para pagamentos com Cartão de Crédito!',
'html' => ''
);
}
if($clienteLogado){ // Se existe o cupom e o cliente está logado
if($cupomIndicacaoAtivo && $cupom->codigo == $cupomIndicacaoAtivo->codigo){
$IndicacoesIndicador = GeralService::buscarQtdeIndicacoes($cupom->id);
$IndicacoesIndicado = GeralService::buscarQtdeIndicacoes($cupom->id, 'id_indicado');
if($IndicacoesIndicador->qtde_cupons == 0 && $IndicacoesIndicado->qtde_cupons == 0){
return array(
'status' => false,
'message' => 'Esse cupom já foi utilizado.',
'html' => ''
);
}
}else{
$countCupomCliente = Cadastro::select('cadastro.id')
->join('pedido_venda', 'cadastro.id', '=', 'pedido_venda.id_cliente')
->join('cupom_pedido_venda', 'pedido_venda.id', 'cupom_pedido_venda.id_pedido_venda')
->where('cadastro.id', $clienteLogado->id)
->where('cupom_pedido_venda.id_cupom', $cupom->id)->count(); // Confere se o cliente já utilizou o cupom
if($countCupomCliente > 0 && $cupom->codigo != env('CUPOM_SOCIOS', 'VINUMOFF') && !$descontoDeposito){ // Cliente já usou o cupom se não for cupom especial
return array(
'status' => false,
'message' => 'Esse cupom já foi utilizado.',
'html' => ''
);
}elseif($countCupomCliente > 0 && $descontoDeposito && $cupom->codigo != $info->cupomDesconto->codigo && $cupom->codigo != env('CUPOM_SOCIOS', 'VINUMOFF')){
return array(
'status' => false,
'message' => 'Esse cupom já foi utilizado.',
'html' => ''
);
}
//Verifica Cupom Ativo x Canal x Ofertas Carrinho
if(!empty($cupom->id_canal)){
$items = Cart::content();
foreach ($items as $item) {
if($item->options->id_canal != $cupom->id_canal){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
break;
}
}
}
}
}
session(['cupom' => [
'id' => $cupom->id,
'id_canal' => $cupom->id_canal,
'codigo' => $cupom->codigo,
'percentual_desconto' => $cupom->percentual_desconto,
'valor_desconto' => $cupom->valor_desconto,
'tipo' => $cupom->tipo
]
]);
$parcelas = CartService::buscarParcelas();
$valorTotal = CartService::calcularValorTotal();
if($ajax){
return array(
'status' => true,
'message' => 'Cupom adicionado com sucesso!',
'html' => CartService::buscarHtmlListagemCart(),
'html_cupom' => CartService::buscarHtmlCupomDesconto(),
'parcelas' => $parcelas,
'valor_total' => ['total' => number_format($valorTotal->total, 2, ',', '.'), 'total_original' => number_format($valorTotal->totalOriginal, 2, ',', '.'), 'desconto' => $valorTotal->desconto]
);
}
return array(
'status' => true,
'message' => 'Cupom adicionado com sucesso!'
);
}else{
$cupomExclusivoClientes = Cupom::where('codigo', $codigo)->where('status', 'A')->first();
if(!$clienteLogado && $cupomExclusivoClientes){
$message = 'Cupom exclusivo. Entre na sua conta para verificar se esse cupom está disponível.';
}else{
$message = 'Cupom inválido.';
}
return array(
'status' => false,
'message' => $message,
'html' => ''
);
}
} catch (Exception $e) {
return array(
'status' => false,
'message' => 'Falha ao adicionar Cupom',
'html' => ''
);
}
}
public static function buscarCupomIndicacao(){
$query_indicacao = Cupom::select('cupom.*');
$query_indicacao->where('cupom.status', 'A');
$query_indicacao->where('cupom.tipo', 'I');
$cupom = $query_indicacao->first();
return $cupom;
}
public static function buscarCupomPrimeiraCompra(){
$codigo = 'PRIMEIRA20';
$query = Cupom::select('cupom.*');
$query->leftJoin('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query->leftJoin('cupom_pedido_venda', 'cupom.id', '=', 'cupom_pedido_venda.id_cupom');
if(!empty($codigo)){
$query->where('cupom.codigo', $codigo);
}
$query->where('cupom.tipo', 'C');
$query->where('cupom.status', 'A');
$query->where('cupom.primeiro_pedido', 1);
$query->where('cupom.data_de_expiracao', '>=', date('Y-m-d'));
$query->where('cupom.todos_clientes', 1);
$cupom = $query->first();
if(!$cupom){
return false;
}
return $cupom;
}
public static function buscarCupomIndicado(){
$cliente = GeralService::buscarClienteLogado();
if(!$cliente){
return false;
}
$query_indicacao = Cupom::select(DB::raw('cupom.*, cadastro.nome indicador_nome, cadastro.sobrenome indicador_sobrenome'));
$query_indicacao->join('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query_indicacao->join('cupom_indicacao', 'cupom_indicacao.id_indicado', '=', 'cupom_cadastro.id_cadastro');
$query_indicacao->join('cadastro', 'cupom_indicacao.id_indicador', '=', 'cadastro.id');
$query_indicacao->where('cupom.status', 'A');
$query_indicacao->where('cupom.tipo', 'I');
$query_indicacao->where('cupom.todos_clientes', 0);
$query_indicacao->where('cupom_cadastro.id_cadastro', $cliente->id);
$query_indicacao->whereRaw("NOT EXISTS (
SELECT 1 FROM
cupom_pedido_indicacao cpi INNER JOIN pedido_venda pv ON pv.id = cpi.pedido_venda_id
WHERE cpi.cupom_indicacao_id = cupom_indicacao.id AND pv.id_cliente = {$cliente->id}
)");
$cupom = $query_indicacao->first();
return $cupom;
}
public static function buscarCupomIndicacaoCliente(){
$cliente = GeralService::buscarClienteLogado();
if(!$cliente){
return false;
}
$query_indicacao = Cupom::select('cupom.*');
$query_indicacao->join('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query_indicacao->where('cupom.status', 'A');
$query_indicacao->where('cupom.tipo', 'I');
$query_indicacao->where('cupom.todos_clientes', 0);
$query_indicacao->where('cupom_cadastro.id_cadastro', $cliente->id);
$cupom = $query_indicacao->first();
if($cupom){
$IndicacoesIndicador = GeralService::buscarQtdeIndicacoes($cupom->id);
$IndicacoesIndicado = GeralService::buscarQtdeIndicacoes($cupom->id, 'id_indicado');
if($IndicacoesIndicador->qtde_cupons == 0 && $IndicacoesIndicado->qtde_cupons == 0){
$cupom = false;
}
}
return $cupom;
}
public static function buscarCupomAtivoAdegaVirada($codigo = '', $cliente = FALSE, $checkpoint = TRUE){
if(!$cliente){
$cliente = GeralService::buscarClienteLogado();
}
$cupom = false;
// $cupom = CartService::buscarCupomCliente($codigo, $cliente);
//Verificar Cupom Indicação
if($cliente && !$cupom){
$query_indicacao = AdegaViradaParticipante::selectRaw('adega_virada_participante.*, cadastro.nome AS cadastro_nome, cadastro.sobrenome AS cadastro_sobrenome, adega_virada_participante_indicacao.id AS adega_virada_participante_indicacao_id');
$query_indicacao->join('cadastro', 'cadastro.id', '=', 'adega_virada_participante.cadastro_id');
$query_indicacao->join('adega_virada_participante_indicacao', 'adega_virada_participante.id', '=', 'adega_virada_participante_indicacao.adega_virada_participante_id');
$query_indicacao->where('adega_virada_participante_indicacao.situacao', '<>', 'R'); //Resgatado
if(!empty($codigo)){
$query_indicacao->where('adega_virada_participante.codigo', $codigo);
}
$query_indicacao->where('adega_virada_participante_indicacao.cadastro_id', $cliente->id);
$query_indicacao->where('adega_virada_participante.participando', 1);
$cupom = $query_indicacao->first();
if(!$cupom && !empty($codigo) && $checkpoint){
$AdegaViradaParticipanteIndicacao = GeralService::associarConviteAdegaVirada($codigo, $cliente);
if($AdegaViradaParticipanteIndicacao){
$cupom = CartService::buscarCupomAtivoAdegaVirada($codigo, $cliente, FALSE);
}
}
}
return $cupom;
}
public static function buscarCupomAtivo($codigo = '', $cliente = FALSE){
if(!$cliente){
$cliente = GeralService::buscarClienteLogado();
}
$cupom = CartService::buscarCupomCliente($codigo, $cliente);
//Verificar Cupom Indicação
if($cliente && !$cupom){
$query_indicacao = Cupom::select('cupom.*');
$query_indicacao->join('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query_indicacao->where('cupom.status', 'A');
$query_indicacao->where('cupom.tipo', 'I');
if(!empty($codigo)){
$query_indicacao->where('cupom.codigo', $codigo);
}
$query_indicacao->where('cupom.todos_clientes', 0);
$query_indicacao->where('cupom_cadastro.id_cadastro', $cliente->id);
$cupom = $query_indicacao->first();
if($cupom){
$IndicacoesIndicador = GeralService::buscarQtdeIndicacoes($cupom->id);
$IndicacoesIndicado = GeralService::buscarQtdeIndicacoes($cupom->id, 'id_indicado');
if($IndicacoesIndicador->qtde_cupons == 0 && $IndicacoesIndicado->qtde_cupons == 0){
$cupom = false;
}
}
}
//Verificar Cupom x Primeiro Pedido
if($cliente && !$cupom){
$cupomIndicacaoCliente = CartService::buscarCupomIndicacaoCliente();
if(!$cupomIndicacaoCliente){
$cupom = CartService::buscarCupomCliente($codigo, $cliente, 1);
}
}
if($cliente && !$cupom){
$query_socio = Cupom::select('cupom.*');
$query_socio->join('cupom_cadastro', 'cupom.id', '=', 'cupom_cadastro.id_cupom');
$query_socio->where('cupom.status', 'A');
$query_socio->where('cupom.codigo', env('CUPOM_SOCIOS', 'VINUMOFF'));
if(!empty($codigo)){
$query_socio->where('cupom.codigo', $codigo);
}
$query_socio->where('cupom.todos_clientes', 0);
$query_socio->where('cupom_cadastro.id_cadastro', $cliente->id);
$cupom = $query_socio->first();
}
return $cupom;
}
public static function calcularValorTotal(){
$total = Cart::subtotal(2,'.','');
$cupomIndicacaoAtivo = GeralService::buscarCupomIndicacaoAtivo();
$cupom = session('cupom');
$usar_saldo = session('usar_saldo');
$tipo_adega = session('tipo_adega');
$total = 0;
$totalOriginal = 0;
$totalCupom = 0;
$custo_efetivo = 0;
$cashback = 0;
$cartItems = Cart::content();
foreach ($cartItems as $item) {
$total += $item->price * $item->qty;
$custo_efetivo += $item->options->custo_efetivo * $item->qty;
}
$totalOriginal = $total;
$clienteLogado = GeralService::buscarClienteLogado();
if($tipo_adega == 'confraria'){
if($clienteLogado){
$confraria = ConfrariaService::buscarConfrariaUsuarioLogado($clienteLogado->id);
if($confraria && ($confraria->config && $confraria->config->permitir_cashback_membros || $confraria->cadastro_id == $clienteLogado->id)){
$cashback = ($confraria && $confraria->contaCorrente ? $confraria->contaCorrente->saldo : 0);
}else{
$cashback = ($clienteLogado && $clienteLogado->contaCorrente ? $clienteLogado->contaCorrente->saldo : 0);
}
}
}else{
$cashback = ($clienteLogado && $clienteLogado->contaCorrente ? $clienteLogado->contaCorrente->saldo : 0);
}
if($cupom && $cupom['codigo'] == env('CUPOM_SOCIOS', 'VINUMOFF')){
$desconto = $total - $custo_efetivo;
$desconto = "R$ " . number_format($desconto, 2, ',', '.');
$total = $custo_efetivo;
$totalCupom = $total;
}elseif($cupom && $cupomIndicacaoAtivo && $cupom['codigo'] == $cupomIndicacaoAtivo->codigo){
$Indicacoes = GeralService::buscarQtdeIndicacoes($cupom['id']);
$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;
$valor_desconto = $cupom['valor_desconto'] * $qtde_cupons;
$desconto = "R$ " . number_format($valor_desconto, 2, ',', '.');
$totalCupom = $total;
}elseif($cupom){
$total = $total * (1 - (($cupom['percentual_desconto'] ? $cupom['percentual_desconto'] : 100) / 100)) - $cupom['valor_desconto'];
$total = $total > 0 ? $total : 0;
$desconto = ($cupom['percentual_desconto'] > 0 ? number_format($cupom['percentual_desconto'], 0, ',', '.')."%" : "R$ " . number_format($cupom['valor_desconto'], 2, ',', '.'));
$totalCupom = $total;
}else{
$desconto = '';
}
if($usar_saldo && $usar_saldo == 1){
$total = $total - $cashback;
$desconto = $cashback;
$desconto = "R$ " . number_format($desconto, 2, ',', '.');
}
return (object)['total' => $total, 'totalOriginal' => $totalOriginal, 'desconto' => $desconto, 'totalCashback' => (session('cupom') ? $totalCupom : $totalOriginal) - $cashback, 'cupom' => $cupom, 'totalCupom' => $totalCupom];
}
public static function calcularValorTotalPedidoVenda($pedidoVenda){
$cupom = ($pedidoVenda->cupom ? $pedidoVenda->cupom->cupom : false);
$usar_saldo = $pedidoVenda->saldo_usado;
$total = 0;
$totalOriginal = 0;
$custo_efetivo = 0;
$cashback = 0;
$cupomIndicacaoAtivo = GeralService::buscarCupomIndicacaoAtivo();
foreach ($pedidoVenda->produtos as $item) {
$produto = $item->produto;
$custo_efetivo += $produto->custo_efetivo * $item->quantidade;
}
$totalOriginal = $pedidoVenda->subtotal;
$total = $totalOriginal;
$clienteLogado = GeralService::buscarClienteLogado();
$cashback = ($clienteLogado && $clienteLogado->contaCorrente ? $clienteLogado->contaCorrente->saldo : 0);
if($usar_saldo && $usar_saldo == 1){
$total = $total - $cashback;
$desconto = $cashback;
$desconto = "R$ " . number_format($desconto, 2, ',', '.');
}elseif($cupom && $cupom->codigo == env('CUPOM_SOCIOS', 'VINUMOFF')){
$desconto = $total - $custo_efetivo;
$desconto = "R$ " . number_format($desconto, 2, ',', '.');
$total = $custo_efetivo;
}elseif($cupom && $cupomIndicacaoAtivo && $cupom->codigo == $cupomIndicacaoAtivo->codigo){
$Indicacoes = GeralService::buscarQtdeIndicacoes($cupom->id);
$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;
$valor_desconto = $cupom->valor_desconto * $qtde_cupons;
$desconto = "R$ " . number_format($valor_desconto, 2, ',', '.');
}elseif($cupom){
$total = $total * (1 - (($cupom->percentual_desconto ? $cupom->percentual_desconto : 100) / 100)) - $cupom->valor_desconto;
$total = $total > 0 ? $total : 0;
$desconto = ($cupom->percentual_desconto > 0 ? number_format($cupom->percentual_desconto, 0, ',', '.')."%" : "R$ " . number_format($cupom->valor_desconto, 2, ',', '.'));
}else{
$desconto = '';
}
return (object)['total' => $total, 'totalOriginal' => $totalOriginal, 'desconto' => $desconto, 'totalCashback' => $totalOriginal - $cashback];
}
public static function buscarParcelas(){
$parcelas = '';
$basicInfo = BasicInfo::first();
$valorTotal = CartService::calcularValorTotal();
$total = $valorTotal->total;
if($total){
$valorParcelaMinima = $basicInfo->parcela_minima;
$numeroMaximoParcelas = $basicInfo->quantidade_maxima_parcelas;
for ($i = 1; $i <= $numeroMaximoParcelas; $i = $i + 1) {
$valor = $total / $i;
if($valor >= $valorParcelaMinima || $total < $valorParcelaMinima && $i == 1){
$parcelas .= '<option value="'.$i.'">'.$i.'x de R$ '.number_format($valor,2,',','.').'</option>';
}
}
}else{
$parcelas .= '<option value="1">1x de R$ 00,00</option>';
}
return $parcelas;
}
public static function validarCompraOferta($params){
$basicInfo = BasicInfo::first();
$oferta = Oferta::find($params['id_oferta']);
$quantidadeSendoComprada = $params['quantidade'];
$tempo_reserva = OfertaReserva::dataAtual();
//$cliente = (isset($params['id_cliente'])) ? Cliente::find($params['id_cliente']) : GeralService::buscarClienteLogado();
$valid = true;
$message = 'Compra válida.';
if(isset($params['tamanho']) && $params['tamanho']){
$Produto = Produto::select('produto.id', 'ohp.estoque AS estoque_oferta_has_produto')
->join('oferta_has_produto as ohp', 'ohp.id_produto', '=', 'produto.id')
->join('produto_has_variacao_atributo as a', 'a.produto_id', '=', 'produto.id')
->join('produto_variacao as v', 'v.id', '=', 'a.produto_variacao_id')
->where('ohp.id_oferta', $oferta->id)
->where('v.slug', 'modelo')
->where('a.produto_variacao_atributo_id', $params['modelo']->id)
->whereRaw("EXISTS (SELECT 1 FROM produto_has_variacao_atributo phva, produto_variacao pv WHERE phva.produto_id = produto.id AND phva.produto_variacao_id = pv.id AND pv.slug = 'tamanho' AND phva.produto_variacao_atributo_id = " . $params['tamanho']->id . ")")
->first();
$estoque = $Produto ? $Produto->estoque_oferta_has_produto : 0;
$descAux = ($params['tamanho'] ? "<br>Tam. {$params['tamanho']->nome}" : '');
$descAux .= ($params['modelo'] ? " - Mod. {$params['modelo']->nome}" : '');
}else{
$Produto = FALSE;
$estoque = $oferta->estoque;
$descAux = '';
}
if($oferta->quantidade_maxima_por_cliente && $quantidadeSendoComprada > $oferta->quantidade_maxima_por_cliente){
$valid = false;
$message = 'Quantidade inválida. A oferta "'.$oferta->titulo.' '.$oferta->sub_titulo.'" tem o limite de '.$oferta->quantidade_maxima_por_cliente.' unidades por cliente.';
}
$validaCanal = true;
$reserva = false;
if($quantidadeSendoComprada > $estoque){
$valid = false;
if($estoque && $estoque > 0){
$message = 'Quantidade inválida. Restam apenas '.$estoque.' unidades da oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . $descAux . '.';
}else{
$reserva = false;
if(session('hash_oferta')){
$reserva = OfertaReserva::select('quantidade')->where('oferta_id', $oferta->id)->where('hash', session('hash_oferta'))->where('data_expiracao', '>=', $tempo_reserva)->first();
if($reserva){
$valid = true;
$validaCanal = false;
}
}
if(!$reserva){
$message = 'A oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . $descAux . ' já foi esgotada.';
}
}
}
if($basicInfo->liberar_canais == 1){
$dataAtual = date('Y-m-d H:i');
$OfertaCanal = Oferta::select(DB::raw("cho.disponibilidade_canal"))
->join('canal_has_oferta as cho', 'cho.id_oferta', '=', 'oferta.id')
->join('canal as c', 'c.id', '=', 'cho.id_canal')
->whereRaw('cho.deleted_at IS NULL')
->where('c.data_inicio', '<=', $dataAtual)
->where('c.data_fim', '>=', $dataAtual)
->where('oferta.id', $oferta->id)
->first();
if($OfertaCanal && $OfertaCanal->disponibilidade_canal <= 0 && $validaCanal){
$valid = false;
$message = 'A oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . $descAux . ' está indisponível no canal.';
}elseif($OfertaCanal && $validaCanal && $OfertaCanal->disponibilidade_canal < $quantidadeSendoComprada){
$valid = false;
$message = 'A oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . $descAux . ' tem apenas ' . $OfertaCanal->disponibilidade_canal . ' unidade(s) disponíveis no canal.';
}elseif($OfertaCanal && $reserva && $reserva->quantidade < $quantidadeSendoComprada){
$valid = false;
$message = 'A oferta ' . $oferta->titulo . ' ' . $oferta->sub_titulo . $descAux . ' tem apenas ' . $reserva->quantidade . ' unidade(s) disponíveis no canal.';
}
}
Log::info("validarCompraOferta: {$oferta->id} | valid: ".($valid ? 'true' : 'false')." | validaCanal: ".($validaCanal ? 'true' : 'false')." | reserva: ".($reserva ? $reserva : 'false')." | message: {$message}");
return [
'valid' => $valid,
'message' => $message
];
}
public static function validarCompraProduto($params){
$produto = Produto::find($params['id_produto']);
$quantidadeSendoComprada = $params['quantidade'];
//$cliente = (isset($params['id_cliente'])) ? Cliente::find($params['id_cliente']) : GeralService::buscarClienteLogado();
$valid = true;
$message = 'Compra válida.';
if($quantidadeSendoComprada > $produto->disponibilidade){
$valid = false;
if($produto->disponibilidade){
$message = 'Quantidade inválida. Restam apenas '.intval($produto->disponibilidade).' unidades do produto <i><b>'.$produto->nome.'</b></i>.';
}else{
$message = 'Não restam unidades de <i><b>'.$produto->nome.'</b></i> disponíveis.';
}
}
return [
'valid' => $valid,
'message' => $message
];
}
public static function addOfertaRelampago($input){
$oferta = GeralService::buscarOfertaRelampago($input['id_oferta_relampago']);
$countItems = 0;
$countPreVenda = 0;
foreach (Cart::content() as $item) {
if($item->options->pre_venda){
$countPreVenda += 1;
}
$countItems += 1;
}
if(($oferta->pre_venda && $countItems > 0) || ($countPreVenda > 0)){
return array(
'status' => false,
'message' => "Vinhos em caráter de pré-venda só podem ser adquiridos individualmente. Caso deseje comprar outros produtos do site, por favor realize um novo pedido após a conclusão do atual.",
'html' => ''
);
}
$result = Cart::search(function ($cartItem, $rowId) use($oferta){
return $cartItem->id == 'oferta-'.$oferta->id;
});
$item = $result->first();
$cupom = session('cupom');
if($cupom && isset($cupom['id_canal']) && !empty($cupom['id_canal'])){
$cupom = Cupom::find($cupom['id']);
//Verifica Cupom Ativo x Canal x Oferta Adicionada
if(!isset($oferta->canalHasOferta) || (isset($oferta->canalHasOferta) && $oferta->canalHasOferta->id_canal != $cupom->id_canal)){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
}
}
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'add']);
if($input['quantidade'] > $oferta->quantidade_maxima_por_cliente){
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $oferta->quantidade_maxima_por_cliente . ' gr. por cliente.'
];
}elseif(!$item || (($item->qty + $input['quantidade']) <= $item->options->maximo_por_cliente)){
if($oferta && $oferta->estoque >= $input['quantidade']){
$quantidade_vinhos = OfertaHasProduto::select(DB::raw('SUM(quantidade) as quantidade_total'))->where('id_oferta', $oferta->id)->value('quantidade_total');
$custo_efetivo = OfertaService::getCustoEfetivo($oferta->id);
$teor_alcoolico = OfertaService::getTeorAlcoolico($oferta->id);
$data = array(
'id' => 'oferta-'.$oferta->id,
'name' => $oferta->titulo.' '.$oferta->sub_titulo,
'price' => $oferta->preco_oferta,
'qty' => $input['quantidade'],
'options' => [
'tipo' => 'oferta',
'id' => $oferta->id,
'id_canal' => 0,
'id_produto' => FALSE,
'tipo_oferta' => isset($oferta->tipo) ? $oferta->tipo : false,
'foto' => $oferta->thumbnail_principal,
'preco_mercado' => $oferta->preco_mercado,
'preco_custo' => $oferta->preco_custo,
'custo_efetivo' => $custo_efetivo,
'teor_alcoolico' => $teor_alcoolico,
'valor_parcela_minima' => $oferta->valor_parcela_minima,
'numero_maximo_parcelas' => $oferta->numero_maximo_parcelas,
'unidade_medida' => ($quantidade_vinhos > 1) ? 'Un.' : 'Gr.',
'slug' => $oferta->slug,
'quantidade_vinhos' => $quantidade_vinhos,
'maximo_por_cliente' => $oferta->quantidade_maxima_por_cliente,
'tamanho' => FALSE,
'modelo' => FALSE,
'desconto_ocultado' => FALSE
]
);
$item = Cart::add($data);
OfertaReserva::reserva($oferta, $input['quantidade']);
Session::save();
return [
'status' => true,
'message' => 'Oferta adicionada ao seu carrinho!',
'item' => $item
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível'
];
}
}else{
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de '.$item->options->maximo_por_cliente.' unidades por cliente.'
];
}
}
public static function addOfertaEquipe($input){
$oferta = GeralService::buscarOfertaEquipe($input['id_oferta_equipe']);
$countItems = 0;
$countPreVenda = 0;
foreach (Cart::content() as $item) {
if($item->options->pre_venda){
$countPreVenda += 1;
}
$countItems += 1;
}
if(($oferta->pre_venda && $countItems > 0) || ($countPreVenda > 0)){
return array(
'status' => false,
'message' => "Vinhos em caráter de pré-venda só podem ser adquiridos individualmente. Caso deseje comprar outros produtos do site, por favor realize um novo pedido após a conclusão do atual.",
'html' => ''
);
}
$result = Cart::search(function ($cartItem, $rowId) use($oferta){
return $cartItem->id == 'oferta-'.$oferta->id;
});
$item = $result->first();
$cupom = session('cupom');
if($cupom && isset($cupom['id_canal']) && !empty($cupom['id_canal'])){
$cupom = Cupom::find($cupom['id']);
//Verifica Cupom Ativo x Canal x Oferta Adicionada
if(!isset($oferta->canalHasOferta) || (isset($oferta->canalHasOferta) && $oferta->canalHasOferta->id_canal != $cupom->id_canal)){
return array(
'status' => false,
'message' => "Cupom exclusivo para ofertas do canal {$cupom->canal->nome} {$cupom->canal->subtitulo}",
'html' => ''
);
}
}
GeralService::checkoutTracking('oferta', ['id_tipo' => $oferta->id, 'quantidade' => $input['quantidade'], 'acao' => 'add']);
if($input['quantidade'] > $oferta->quantidade_maxima_por_cliente){
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de ' . $oferta->quantidade_maxima_por_cliente . ' gr. por cliente.'
];
}elseif(!$item || (($item->qty + $input['quantidade']) <= $item->options->maximo_por_cliente)){
if($oferta && $oferta->estoque >= $input['quantidade']){
$quantidade_vinhos = OfertaHasProduto::select(DB::raw('SUM(quantidade) as quantidade_total'))->where('id_oferta', $oferta->id)->value('quantidade_total');
$custo_efetivo = OfertaService::getCustoEfetivo($oferta->id);
$teor_alcoolico = OfertaService::getTeorAlcoolico($oferta->id);
$data = array(
'id' => 'oferta-'.$oferta->id,
'name' => $oferta->titulo.' '.$oferta->sub_titulo,
'price' => $oferta->preco_oferta,
'qty' => $input['quantidade'],
'options' => [
'tipo' => 'oferta',
'id' => $oferta->id,
'id_canal' => 0,
'id_produto' => FALSE,
'tipo_oferta' => isset($oferta->tipo) ? $oferta->tipo : false,
'foto' => $oferta->thumbnail_principal,
'preco_mercado' => $oferta->preco_mercado,
'preco_custo' => $oferta->preco_custo,
'custo_efetivo' => $custo_efetivo,
'teor_alcoolico' => $teor_alcoolico,
'valor_parcela_minima' => $oferta->valor_parcela_minima,
'numero_maximo_parcelas' => $oferta->numero_maximo_parcelas,
'unidade_medida' => ($quantidade_vinhos > 1) ? 'Un.' : 'Gr.',
'slug' => $oferta->slug,
'quantidade_vinhos' => $quantidade_vinhos,
'maximo_por_cliente' => $oferta->quantidade_maxima_por_cliente,
'tamanho' => FALSE,
'modelo' => FALSE,
'desconto_ocultado' => FALSE
]
);
$item = Cart::add($data);
OfertaReserva::reserva($oferta, $input['quantidade']);
Session::save();
return [
'status' => true,
'message' => 'Oferta adicionada ao seu carrinho!',
'item' => $item
];
}else{
return [
'status' => false,
'message' => 'Estoque indisponível'
];
}
}else{
return [
'status' => false,
'message' => 'Essa oferta possui um limite máximo de '.$item->options->maximo_por_cliente.' unidades por cliente.'
];
}
}
public static function mostrarBoxCashback(){
$basicInfo = BasicInfo::first();
$confraria = ConfrariaService::buscarConfrariaUsuarioLogado();
if($confraria){
return true;
}elseif(isset($basicInfo->canal_id_cashback) && !empty($basicInfo->canal_id_cashback)){
$produtosCarrinho = CartService::buscarOfertasCart();
$canalProdutos = DB::table('canal_has_oferta')
->whereIn('id_oferta', array_keys($produtosCarrinho))
->where('id_canal', $basicInfo->canal_id_cashback)
->get();
if(count($canalProdutos) >= 1){
return true;
} else{
return false;
}
}else{
return true;
}
}
}