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

354 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers\Delivery;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\CarrinhoDelivery;
use App\Models\ItemCarrinhoDelivery;
use App\Models\MarketPlaceConfig;
use App\Models\Produto;
use App\Models\ItemPizzaCarrinho;
use App\Models\Cliente;
use App\Models\ProdutoVariacao;
use App\Models\CategoriaProduto;
use App\Models\FuncionamentoDelivery;
use App\Models\ItemCarrinhoAdicionalDelivery;
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_delivery"])){
$data = CarrinhoDelivery::where('session_cart_delivery', $_SESSION["session_cart_delivery"])
->first();
}
return $data;
}
public function index(Request $request){
$carrinho = $this->_getCarrinho();
$config = MarketPlaceConfig::findOrfail($request->loja_id);
$item = null;
if(isset($_SESSION["session_cart_delivery"])){
$item = CarrinhoDelivery::where('session_cart_delivery', $_SESSION["session_cart_delivery"])
->first();
}
$temServico = 0;
$temProduto = 0;
$tempoServico = 0;
if($item){
foreach($item->itens as $i){
if($i->servico){
$temServico = 1;
$tempoServico += $i->servico->tempo_servico + $i->servico->tempo_adicional;
}
if($i->produto) $temProduto = 1;
}
}
$clienteLogado = $this->_getClienteLogado();
$categorias = CategoriaProduto::where('delivery', 1)
->orderBy('nome', 'asc')
->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
$notSearch = true;
$funcionamento = $this->getFuncionamento($config);
$notInfoHeader = 1;
$config->tipo_entrega = json_decode($config->tipo_entrega);
return view('food.carrinho', compact('config', 'categorias', 'carrinho', 'notSearch', 'clienteLogado',
'funcionamento', 'notInfoHeader', 'temServico', 'temProduto', 'tempoServico'));
}
private function getFuncionamento($config){
$dia = date('w');
$hora = date('H:i');
$dia = FuncionamentoDelivery::getDia($dia);
$funcionamento = FuncionamentoDelivery::where('dia', $dia)
->where('empresa_id', $config->empresa_id)->first();
if($funcionamento != null){
$atual = strtotime(date('Y-m-d H:i'));
$dataHoje = date('Y-m-d');
$inicio = strtotime($dataHoje . " " . $funcionamento->inicio);
$fim = strtotime($dataHoje . " " . $funcionamento->fim);
if($atual > $inicio && $atual < $fim){
$funcionamento->aberto = true;
}else{
$funcionamento->aberto = false;
}
return $funcionamento;
}
return null;
}
public function adicionar(Request $request){
// dd($request->all());
$config = MarketPlaceConfig::findOrfail($request->loja_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->combo){
foreach($produto->itensDoCombo as $c){
if(!$c->produtoDoCombo->estoque || $c->produtoDoCombo->estoque->quantidade <= 0){
session()->flash("flash_error", "Estoque insuficiente!");
return redirect()->back();
}
}
}else{
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_delivery"])){
$session_cart_delivery = Str::random(30);
$_SESSION['session_cart_delivery'] = $session_cart_delivery;
}else{
$session_cart_delivery = $_SESSION['session_cart_delivery'];
}
if($request->produto_id){
$produto_id = $request->produto_id;
}else{
$produto_id = $request->pizza_id[0];
}
// dd($request->all());
$carrinho = CarrinhoDelivery::where('session_cart_delivery', $session_cart_delivery)
->first();
$quantidade = (float)__convert_value_bd($request->quantidade);
$itemCarrinho = null;
if($carrinho == null){
//novo carrinho
$clienteLogado = $this->_getClienteLogado();
$cli = Cliente::where('uid', $clienteLogado)->first();
$carrinho = CarrinhoDelivery::create([
'cliente_id' => $cli ? $cli->id : null,
'empresa_id' => $config->empresa_id,
'estado' => 'pendente',
'valor_total' => $request->sub_total,
'endereco_id' => null,
'valor_frete' => 0,
'session_cart_delivery' => $session_cart_delivery
]);
$itemCarrinho = ItemCarrinhoDelivery::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 = ItemCarrinhoDelivery::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++){
ItemCarrinhoAdicionalDelivery::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++){
ItemPizzaCarrinho::create([
'item_carrinho_id' => $itemCarrinho->id,
'produto_id' => $request->pizza_id[$i]
]);
}
}
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('food.carrinho', 'link='.$config->loja_id);
}
private function _atualizaValorCarrinho($carrinho_id){
$item = CarrinhoDelivery::findOrfail($carrinho_id);
$item->valor_total = $item->itens->sum('sub_total') + $item->valor_frete;
$item->save();
}
private function _getClienteLogado(){
if(isset($_SESSION['cliente_delivery'])){
return $_SESSION['cliente_delivery'];
}
return null;
}
public function updateQuantidades(Request $request){
$session_cart_delivery = $_SESSION['session_cart_delivery'];
$itemCarrinho = ItemCarrinhoDelivery::findOrFail($request->item_id);
if($request->quantidade == 0){
$itemCarrinho->adicionais()->delete();
$itemCarrinho->delete();
}else{
$itemCarrinho->quantidade = $request->quantidade;
$itemCarrinho->sub_total = $itemCarrinho->valor_unitario * $request->quantidade;
$itemCarrinho->save();
}
$carrinho = CarrinhoDelivery::where('session_cart_delivery', $session_cart_delivery)
->first();
$this->_atualizaValorCarrinho($carrinho->id);
session()->flash("flash_success", "Carrinho atualizado!");
return redirect()->back();
}
public function removeItem($id){
$session_cart_delivery = $_SESSION['session_cart_delivery'];
$itemCarrinho = ItemCarrinhoDelivery::findOrFail($id);
$itemCarrinho->adicionais()->delete();
$itemCarrinho->delete();
$carrinho = CarrinhoDelivery::where('session_cart_delivery', $session_cart_delivery)
->first();
$this->_atualizaValorCarrinho($carrinho->id);
session()->flash("flash_success", "Carrinho atualizado!");
return redirect()->back();
}
public function adicionarServico(Request $request){
// dd($request->all());
$config = MarketPlaceConfig::findOrfail($request->loja_id);
try{
$carrinho = DB::transaction(function () use ($request, $config) {
if(!isset($_SESSION["session_cart_delivery"])){
$session_cart_delivery = Str::random(30);
$_SESSION['session_cart_delivery'] = $session_cart_delivery;
}else{
$session_cart_delivery = $_SESSION['session_cart_delivery'];
}
$servico_id = $request->servico_id;
$carrinho = CarrinhoDelivery::where('session_cart_delivery', $session_cart_delivery)
->first();
$quantidade = __convert_value_bd($request->quantidade);
$itemCarrinho = null;
// dd($request->all());
if($carrinho == null){
//novo carrinho
$clienteLogado = $this->_getClienteLogado();
$cli = Cliente::where('uid', $clienteLogado)->first();
$carrinho = CarrinhoDelivery::create([
'cliente_id' => $cli ? $cli->id : null,
'empresa_id' => $config->empresa_id,
'estado' => 'pendente',
'valor_total' => $request->sub_total,
'endereco_id' => null,
'valor_frete' => 0,
'session_cart_delivery' => $session_cart_delivery
]);
$itemCarrinho = ItemCarrinhoDelivery::create([
'carrinho_id' => $carrinho->id,
'servico_id' => $servico_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", "Serviço adicionado ao carrinho!");
}else{
$itemCarrinho = ItemCarrinhoDelivery::create([
'carrinho_id' => $carrinho->id,
'servico_id' => $servico_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!");
}
return $carrinho;
});
}catch(\Exception $e){
echo $e->getMessage();
die;
}
$this->_atualizaValorCarrinho($carrinho->id);
return redirect()->route('food.carrinho', 'link='.$config->loja_id);
}
}