403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Services/CartService.php
<?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;
        }

    }
    

}

Youez - 2016 - github.com/yon3zu
LinuXploit