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

245 lines
9.2 KiB
PHP

<?php
namespace App\Http\Controllers\Ecommerce;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\EcommerceConfig;
use App\Models\Produto;
use App\Models\Carrinho;
use App\Models\Cliente;
use App\Models\ItemCarrinho;
use App\Models\ProdutoVariacao;
use App\Models\CategoriaProduto;
use App\Models\Estoque;
use Illuminate\Support\Str;
use App\Utils\CorreioUtil;
class CarrinhoController extends Controller
{
public function __construct(CorreioUtil $util){
// Session managed by Laravel
$this->util = $util;
}
public function index(Request $request){
$item = $this->_getCarrinho();
$config = EcommerceConfig::findOrfail($request->loja_id);
if(isset($_SESSION["session_cart"])){
$item = Carrinho::where('session_cart', $_SESSION["session_cart"])
->first();
}
$categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
$clienteLogado = $this->_getClienteLogado();
$cliente = null;
$enderecos = [];
$dataFrete = null;
if($item == null){
return redirect()->route('loja.index', 'link='.$config->loja_id);
}
if($clienteLogado){
$cliente = Cliente::findOrFail($clienteLogado);
$somaPeso = $item->somaPeso();
$dimensoes = $item->somaDimensoes();
$cepOrigem = str_replace("-", "", $config->cep);
$total = $item->valor_total;
foreach($cliente->enderecosEcommerce as $endereco){
$cepDestino = str_replace("-", "", $endereco->cep);
$data = $this->util->getValores($cepOrigem, $cepDestino, $dimensoes['altura'], $dimensoes['largura'], $dimensoes['comprimento'], $somaPeso);
$dataFrete .= view('loja.partials.calculo_frete_enderecos', compact('data', 'config', 'endereco', 'total'));
}
}
return view('loja.carrinho', compact('item', 'config', 'categorias', 'cliente', 'enderecos', 'dataFrete'));
}
private function _getCarrinho(){
$data = [];
if(isset($_SESSION["session_cart"])){
$data = Carrinho::where('session_cart', $_SESSION["session_cart"])
->first();
}
return $data;
}
public function adicionar(Request $request){
if(!isset($_SESSION["session_cart"])){
$session_cart = Str::random(30);
$_SESSION['session_cart'] = $session_cart;
}else{
$session_cart = $_SESSION['session_cart'];
}
$config = EcommerceConfig::findOrfail($request->loja_id);
$produto = Produto::findOrfail($request->produto_id);
$quantidade = __convert_value_bd($request->quantidade);
// dd($request->all());
if($produto->gerenciar_estoque){
if(!$produto->estoque){
session()->flash("flash_error", 'Produto sem estoque');
return redirect()->back();
}
if(sizeof($produto->variacoes) == 0){
if($quantidade > $produto->estoque->quantidade){
session()->flash("flash_error", 'Estoque insuficinete, quantidade máxima de ' . number_format($produto->estoque->quantidade, 0) . ' ' . $produto->unidade . ' para este item!');
return redirect()->back();
}
}else{
$estoque = Estoque::where('produto_id', $produto->id)->where('produto_variacao_id', $request->variacao_id)
->first();
if($quantidade > $estoque->quantidade){
session()->flash("flash_error", 'Estoque insuficinete, quantidade máxima de ' . number_format($estoque->quantidade, 0) . ' ' . $produto->unidade . ' para este item!');
return redirect()->back();
}
}
}
$carrinho = Carrinho::where('session_cart', $session_cart)
->first();
$produtoVariacao = null;
if(isset($request->variacao_id)){
$produtoVariacao = ProdutoVariacao::findOrfail($request->variacao_id);
$produto->valor_ecommerce = $produtoVariacao->valor;
}else{
if($produto->valor_ecommerce == null){
$produto->valor_ecommerce = $produto->valor_unitario;
}
}
if($carrinho == null){
//novo carrinho
$clienteLogado = $this->_getClienteLogado();
$carrinho = Carrinho::create([
'cliente_id' => $clienteLogado ? $clienteLogado : null,
'empresa_id' => $config->empresa_id,
'estado' => 'pendente',
'valor_total' => $produto->valor_ecommerce * $quantidade,
'endereco_id' => null,
'valor_frete' => 0,
'session_cart' => $session_cart
]);
ItemCarrinho::create([
'carrinho_id' => $carrinho->id,
'produto_id' => $request->produto_id,
'variacao_id' => isset($request->variacao_id) ? $request->variacao_id : null,
'quantidade' => $quantidade,
'valor_unitario' => $produto->valor_ecommerce,
'sub_total' => $produto->valor_ecommerce * $quantidade
]);
session()->flash("flash_success", "Produto adicionado ao carrinho!");
}else{
ItemCarrinho::create([
'carrinho_id' => $carrinho->id,
'produto_id' => $request->produto_id,
'variacao_id' => isset($request->variacao_id) ? $request->variacao_id : null,
'quantidade' => $quantidade,
'valor_unitario' => $produto->valor_ecommerce,
'sub_total' => $produto->valor_ecommerce * $quantidade
]);
session()->flash("flash_success", "Produto adicionado ao carrinho!");
}
$this->_atualizaValorCarrinho($carrinho->id);
return redirect()->route('loja.carrinho', 'link='.$config->loja_id);
}
private function _getClienteLogado(){
if(isset($_SESSION['cliente_ecommerce'])){
return $_SESSION['cliente_ecommerce'];
}
return null;
}
public function removeItem(Request $request, $id){
$item = ItemCarrinho::findOrfail($id);
try {
$item->delete();
$this->_atualizaValorCarrinho($item->carrinho_id);
session()->flash("flash_success", "Item removido com sucesso!");
} catch (\Exception $e) {
session()->flash("flash_error", 'Algo deu errado.', $e->getMessage());
}
return redirect()->back();
}
private function _atualizaValorCarrinho($carrinho_id){
$item = Carrinho::findOrfail($carrinho_id);
$item->valor_total = $item->itens->sum('sub_total') + $item->valor_frete;
$item->save();
}
public function atualizaQuantidade(Request $request, $id){
$item = ItemCarrinho::findOrfail($id);
try {
$item->quantidade = (float)$request->quantidade;
if($item->produto->gerenciar_estoque){
if(sizeof($item->produto->variacoes) == 0){
if($item->quantidade > $item->produto->estoque->quantidade){
session()->flash("flash_error", 'Estoque insuficinete, quantidade máxima de ' . number_format($item->produto->estoque->quantidade, 0) . ' ' . $item->produto->unidade . ' para este item!');
return redirect()->back();
}
}else{
$estoque = Estoque::where('produto_id', $item->produto->id)->where('produto_variacao_id', $request->produto_variacao_id)
->first();
// dd($estoque);
if($item->quantidade > $estoque->quantidade){
session()->flash("flash_error", 'Estoque insuficinete, quantidade máxima de ' . number_format($estoque->quantidade, 0) . ' ' . $item->produto->unidade . ' para este item!');
return redirect()->back();
}
}
}
$item->sub_total = $item->valor_unitario * (float)$request->quantidade;
$item->save();
$this->_atualizaValorCarrinho($item->carrinho_id);
session()->flash("flash_success", "Quantidade atualizada com sucesso!");
} catch (\Exception $e) {
session()->flash("flash_error", 'Algo deu errado.', $e->getMessage());
}
return redirect()->back();
}
public function setarFrete(Request $request){
// dd($request->all());
$item = $this->_getCarrinho();
$item->valor_frete = $request->valor_frete;
$item->endereco_id = $request->endereco_id;
$item->tipo_frete = $request->tipo_frete;
$item->cep = $request->cep;
$item->save();
$this->_atualizaValorCarrinho($item->id);
$config = EcommerceConfig::findOrfail($request->loja_id);
$clienteLogado = $this->_getClienteLogado();
if($clienteLogado == null){
return redirect()->route('loja.cadastro', 'link='.$config->loja_id);
}
return redirect()->route('loja.pagamento', 'link='.$config->loja_id);
}
}