arcadiasuite/plus/app/Http/Controllers/Cardapio/CarrinhoController.php

452 lines
16 KiB
PHP

<?php
namespace App\Http\Controllers\Cardapio;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\ConfiguracaoCardapio;
use App\Models\CarrinhoCardapio;
use App\Models\Mesa;
use App\Models\ItemCarrinhoCardapio;
use App\Models\NotificaoCardapio;
use App\Models\ItemPizzaCarrinhoCardapio;
use App\Models\ItemCarrinhoAdicionalCardapio;
use App\Models\Produto;
use App\Models\ItemAdicional;
use App\Models\ItemPizzaPedido;
use App\Models\ItemPedido;
use App\Models\CategoriaProduto;
use App\Models\ImpressoraPedidoProduto;
use App\Models\Pedido;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
class CarrinhoController extends Controller
{
public function __construct(){
// Session managed by Laravel
}
private function _getCarrinho(){
$data = [];
if(isset($_SESSION["session_cart_cardapio"])){
$data = CarrinhoCardapio::where('session_cart_cardapio', $_SESSION["session_cart_cardapio"])
->where('session_cart_user', $_SESSION["session_cart_user"])
->first();
}
return $data;
}
public function index(Request $request){
$carrinho = $this->_getCarrinho();
$config = ConfiguracaoCardapio::findOrfail($request->config_id);
$mesa = Mesa::where('empresa_id', $config->empresa_id)->where('hash', $request->link)
->first();
// if($mesa->ocupada == 1){
// $pedido = Pedido::where('empresa_id', $mesa->empresa_id)
// ->where('status', 1)->orderBy('id', 'desc')
// ->first();
// $_SESSION['session_cart_cardapio'] = $pedido->session_cart_cardapio;
// // dd($pedido);
// $carrinho->session_cart_cardapio = $pedido->session_cart_cardapio;
// $carrinho->save();
// // session()->flash("flash_error", "Esta mesa já esta ocupada!");
// // return -1;
// }
if($mesa == null){
session()->flash("flash_error", "Mesa não encontrada!");
return redirect()->back();
}
$session_cart_user = null;
if(isset($_SESSION["session_cart_user"])){
$session_cart_user = $_SESSION["session_cart_user"];
}
$session_nome_cardapio = null;
if(isset($_SESSION["session_nome_cardapio"])){
$session_nome_cardapio = $_SESSION["session_nome_cardapio"];
}
$item = null;
if(isset($_SESSION["session_cart_cardapio"])){
$item = CarrinhoCardapio::where('session_cart_cardapio', $_SESSION["session_cart_cardapio"])
->first();
}
$categorias = CategoriaProduto::where('cardapio', 1)
->orderBy('nome', 'asc')
->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
$notSearch = true;
$pedido = null;
if($carrinho){
$pedido = Pedido::where('empresa_id', $carrinho->empresa_id)
->where('status', 1)->where('session_cart_cardapio', $carrinho->session_cart_cardapio)
->join('item_pedidos', 'item_pedidos.pedido_id', '=', 'pedidos.id')
->where('item_pedidos.nome_cardapio', $session_nome_cardapio)
->first();
}
$travaLimite = 0;
if($config->limite_pessoas_qr_code && $carrinho){
$contPedidos = Pedido::where('empresa_id', $carrinho->empresa_id)
->where('status', 1)->where('session_cart_cardapio', $carrinho->session_cart_cardapio)
->count();
if($contPedidos >= $config->limite_pessoas_qr_code){
$travaLimite = 1;
}
}
// echo $pedido;
// die;
$notInfoHeader = 1;
$link = $request->link;
return view('qr_code_cardapio.carrinho', compact('config', 'categorias', 'carrinho', 'notSearch', 'notInfoHeader', 'link',
'pedido', 'travaLimite', 'mesa'));
}
public function adicionar(Request $request){
// dd($request->all());
$config = ConfiguracaoCardapio::findOrfail($request->config_id);
$quantidade = (float)__convert_value_bd($request->quantidade);
if($request->produto_id){
$produto_id = $request->produto_id;
}else{
$produto_id = $request->pizza_id[0];
}
$produto = Produto::findOrFail($produto_id);
if($produto->gerenciar_estoque){
if(!$produto->estoque || $produto->estoque->quantidade < $quantidade){
session()->flash("flash_error", "Estoque insuficiente!");
return redirect()->back();
}
}
try{
$carrinho = DB::transaction(function () use ($request, $config) {
if(!isset($_SESSION["session_cart_cardapio"])){
$session_cart_cardapio = Str::random(30);
$_SESSION['session_cart_cardapio'] = $session_cart_cardapio;
}else{
$session_cart_cardapio = $_SESSION['session_cart_cardapio'];
}
if(!isset($_SESSION["session_cart_user"])){
$session_cart_user = Str::random(30);
$_SESSION['session_cart_user'] = $session_cart_user;
}else{
$session_cart_user = $_SESSION['session_cart_user'];
}
if($request->produto_id){
$produto_id = $request->produto_id;
}else{
$produto_id = $request->pizza_id[0];
}
$adicionarSaborUnico = 0;
if(isset($request->tamanho_id)){
if(!isset($request->pizza_id)){
$adicionarSaborUnico = 1;
}
}
$carrinho = CarrinhoCardapio::where('session_cart_cardapio', $session_cart_cardapio)
->where('session_cart_user', $session_cart_user)
->first();
// dd($carrinho);
$quantidade = (float)__convert_value_bd($request->quantidade);
$itemCarrinho = null;
if(!isset($_SESSION["session_cart_user"])){
$session_cart_user = Str::random(30);
$_SESSION['session_cart_user'] = $session_cart_user;
}else{
$session_cart_user = $_SESSION['session_cart_user'];
}
if($carrinho == null){
//novo carrinho
$carrinho = CarrinhoCardapio::create([
'empresa_id' => $config->empresa_id,
'estado' => 'pendente',
'valor_total' => $request->sub_total,
'endereco_id' => null,
'valor_frete' => 0,
'session_cart_cardapio' => $session_cart_cardapio,
'session_cart_user' => $session_cart_user,
]);
$itemCarrinho = ItemCarrinhoCardapio::create([
'carrinho_id' => $carrinho->id,
'produto_id' => $produto_id,
'quantidade' => $quantidade,
'valor_unitario' => $request->sub_total/$quantidade,
'sub_total' => $request->sub_total,
'observacao' => $request->observacao ?? '',
'tamanho_id' => isset($request->tamanho_id) ? $request->tamanho_id : null
]);
session()->flash("flash_success", "Produto adicionado ao carrinho!");
}else{
$itemCarrinho = ItemCarrinhoCardapio::create([
'carrinho_id' => $carrinho->id,
'produto_id' => $produto_id,
'quantidade' => $quantidade,
'valor_unitario' => $request->sub_total/$quantidade,
'sub_total' => $request->sub_total,
'observacao' => $request->observacao ?? '',
'tamanho_id' => isset($request->tamanho_id) ? $request->tamanho_id : null
]);
session()->flash("flash_success", "Produto adicionado ao carrinho!");
}
if($request->adicional){
for($i=0; $i<sizeof($request->adicional); $i++){
ItemCarrinhoAdicionalCardapio::create([
'item_carrinho_id' => $itemCarrinho->id,
'adicional_id' => $request->adicional[$i]
]);
}
}
if(isset($request->pizza_id)){
for($i=0; $i<sizeof($request->pizza_id); $i++){
ItemPizzaCarrinhoCardapio::create([
'item_carrinho_id' => $itemCarrinho->id,
'produto_id' => $request->pizza_id[$i]
]);
}
}
if($adicionarSaborUnico){
ItemPizzaCarrinhoCardapio::create([
'item_carrinho_id' => $itemCarrinho->id,
'produto_id' => $produto_id
]);
}
return $carrinho;
});
}catch(\Exception $e){
// echo $e->getMessage();
// die;
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
return redirect()->back();
}
$this->_atualizaValorCarrinho($carrinho->id);
return redirect()->route('cardapio.carrinho', 'link='.$request->link);
}
private function _atualizaValorCarrinho($carrinho_id){
$item = CarrinhoCardapio::findOrfail($carrinho_id);
$item->valor_total = $item->itens->sum('sub_total') + $item->valor_frete;
$item->save();
}
public function enviarPedido(Request $request){
$config = ConfiguracaoCardapio::findOrfail($request->config_id);
$mesa = Mesa::where('empresa_id', $config->empresa_id)->where('hash', $request->link)
->first();
// dd($mesa);
if(isset($request->telefone)){
$verifica = Pedido::where('empresa_id', $mesa->empresa_id)
->where('cliente_fone', $request->telefone)
->where('status', 1)
->first();
if($verifica != null){
session()->flash("flash_error", "Você já fez pedido em outra mesa!");
return redirect()->back();
}
$_SESSION['session_telefone_cardapio'] = $request->telefone;
}
if(isset($request->nome)){
$_SESSION['session_nome_cardapio'] = $request->nome;
}
// verifica ja esta em outra mesa
if(!isset($_SESSION["session_cart_user"])){
$session_cart_user = Str::random(30);
$_SESSION['session_cart_user'] = $session_cart_user;
}else{
$session_cart_user = $_SESSION['session_cart_user'];
}
$carrinho = $this->_getCarrinho();
if($mesa->ocupada == 1){
$pedido = Pedido::where('empresa_id', $mesa->empresa_id)
->where('status', 1)->orderBy('id', 'desc')
->where('mesa_id', $mesa->id)
->first();
$_SESSION['session_cart_cardapio'] = $pedido->session_cart_cardapio;
// dd($carrinho);
if($carrinho){
$carrinho->session_cart_cardapio = $pedido->session_cart_cardapio;
$carrinho->save();
}
// session()->flash("flash_error", "Esta mesa já esta ocupada!");
// return -1;
}
$pedido = DB::transaction(function () use ($request, $config, $mesa, $session_cart_user, $carrinho) {
$pedido = Pedido::where('empresa_id', $carrinho->empresa_id)
->where('status', 1)->where('session_cart_cardapio', $carrinho->session_cart_cardapio)
->first();
if($pedido == null){
$_SESSION['session_nome_cardapio'] = $request->nome;
$_SESSION['session_telefone_cardapio'] = $request->telefone;
$pedido = Pedido::create([
'empresa_id' => $config->empresa_id,
'cliente_nome' => $request->nome,
'cliente_fone' => $request->telefone,
'mesa_id' => $mesa->id,
'confirma_mesa' => $config->confirma_mesa,
'total' => $carrinho->valor_total,
'session_cart_cardapio' => $carrinho->session_cart_cardapio,
'session_cart_user' => $session_cart_user,
]);
$carrinho->cliente_nome = $request->nome;
$carrinho->save();
NotificaoCardapio::create([
'empresa_id' => $config->empresa_id,
'mesa' => $pedido->_mesa->nome,
'pedido_id' => $pedido->id,
'tipo' => 'fechar_mesa',
'observacao' => 'Abrindo mesa',
'avaliacao' => '',
'tipo_pagamento' => '',
]);
$mesa->ocupada = 1;
$mesa->save();
}else{
$pedido->total += $carrinho->valor_total;
$pedido->save();
}
foreach($carrinho->itens as $i){
$impresso = $this->validaItemImpressao($i->produto_id);
$itemPedido = ItemPedido::create([
'pedido_id' => $pedido->id,
'produto_id' => $i->produto_id,
'observacao' => $i->observacao,
'estado' => 'novo',
'quantidade' => $i->quantidade,
'valor_unitario' => $i->valor_unitario,
'sub_total' => $i->sub_total,
'tamanho_id' => $i->tamanho_id,
'impresso' => $impresso,
'nome_cardapio' => $_SESSION['session_nome_cardapio'],
'telefone_cardapio' => $_SESSION['session_telefone_cardapio'],
]);
foreach($i->adicionais as $a){
$itemAdicional = ItemAdicional::create([
'item_pedido_id' => $itemPedido->id,
'adicional_id' => $a->adicional_id
]);
}
foreach($i->pizzas as $pizza){
ItemPizzaPedido::create([
'item_pedido_id' => $itemPedido->id,
'produto_id' => $pizza->produto_id
]);
}
}
foreach($carrinho->itens as $it){
$it->adicionais()->delete();
$it->sabores()->delete();
$it->delete();
}
$carrinho->valor_total = 0;
$carrinho->save();
return $pedido;
});
if(isset($pedido->id)){
session()->flash("flash_success", "Pedido realizado!");
}
return redirect()->route('cardapio.index', ['link='.$request->link]);
}
private function validaItemImpressao($produto_id){
$imprime = ImpressoraPedidoProduto::where('produto_id', $produto_id)->first();
return $imprime != null ? 0 : 1;
}
public function pedirFechar(Request $request){
$config = ConfiguracaoCardapio::findOrfail($request->config_id);
$carrinho = $this->_getCarrinho();
$pedido = Pedido::where('empresa_id', $carrinho->empresa_id)
->where('status', 1)->where('session_cart_cardapio', $carrinho->session_cart_cardapio)
->first();
$pedido->em_atendimento = 0;
$pedido->save();
NotificaoCardapio::create([
'empresa_id' => $config->empresa_id,
'mesa' => $pedido->_mesa->nome,
'pedido_id' => $pedido->id,
'tipo' => 'fechar_mesa',
'observacao' => $request->observacao,
'avaliacao' => $request->avaliacao,
'tipo_pagamento' => $request->tipo_pagamento,
]);
$_SESSION["session_cart_cardapio"] = null;
$_SESSION["session_nome_cardapio"] = null;
$_SESSION["session_telefone_cardapio"] = null;
session()->flash("flash_success", "Mesa finalizada!");
return redirect()->route('cardapio.index', ['link='.$request->link]);
}
}