820 lines
30 KiB
PHP
820 lines
30 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Delivery;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\MarketPlaceConfig;
|
|
use App\Models\CarrinhoDelivery;
|
|
use App\Models\ItemCarrinhoDelivery;
|
|
use App\Models\CategoriaProduto;
|
|
use App\Models\ItemAgendamento;
|
|
use App\Models\ItemCarrinhoAdicionalDelivery;
|
|
use App\Models\ItemPizzaCarrinho;
|
|
use App\Models\Cliente;
|
|
use App\Models\BairroDelivery;
|
|
use App\Models\EnderecoDelivery;
|
|
use App\Models\FuncionamentoDelivery;
|
|
use App\Models\PedidoDelivery;
|
|
use App\Models\CupomDescontoCliente;
|
|
use App\Models\ItemPedidoDelivery;
|
|
use App\Models\ItemPizzaPedido;
|
|
use App\Models\CupomDesconto;
|
|
use App\Models\ConfiguracaoAgendamento;
|
|
use App\Models\Agendamento;
|
|
use App\Models\ItemPizzaPedidoDelivery;
|
|
use App\Models\ItemAdicionalDelivery;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
use App\Utils\WhatsAppUtil;
|
|
|
|
class PagamentoController extends Controller
|
|
{
|
|
protected $util;
|
|
|
|
public function __construct(WhatsAppUtil $util){
|
|
// Session managed by Laravel
|
|
$this->util = $util;
|
|
}
|
|
|
|
private function _getCarrinho(){
|
|
$data = [];
|
|
if(isset($_SESSION["session_cart_delivery"])){
|
|
$data = CarrinhoDelivery::where('session_cart_delivery', $_SESSION["session_cart_delivery"])
|
|
->first();
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
private function _getClienteLogado(){
|
|
|
|
if(isset($_SESSION['cliente_delivery'])){
|
|
return $_SESSION['cliente_delivery'];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function index(Request $request){
|
|
|
|
$carrinho = $this->_getCarrinho();
|
|
|
|
$config = MarketPlaceConfig::findOrfail($request->loja_id);
|
|
if($carrinho == []){
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
if($config->pedido_minimo > $carrinho->valor_total){
|
|
session()->flash('flash_error', 'Valor mínimo para o pedido R$' . __moeda($config->pedido_minimo));
|
|
return redirect()->back();
|
|
}
|
|
$clienteLogado = $this->_getClienteLogado();
|
|
|
|
if($clienteLogado == null){
|
|
// dd($carrinho);
|
|
if($carrinho->fone != null){
|
|
$cliente = Cliente::where('empresa_id', $carrinho->empresa_id)
|
|
->where('telefone', $carrinho->fone)
|
|
->first();
|
|
|
|
if($cliente != null){
|
|
if(!$cliente->uid){
|
|
$cliente->uid = Str::random(30);
|
|
$cliente->save();
|
|
}
|
|
$_SESSION['cliente_delivery'] = $cliente->uid;
|
|
}else{
|
|
return redirect()->route('food.auth', 'link='.$config->loja_id);
|
|
}
|
|
}else{
|
|
return redirect()->route('food.auth', 'link='.$config->loja_id);
|
|
}
|
|
}
|
|
|
|
$cliente = Cliente::where('uid', $this->_getClienteLogado())
|
|
->first();
|
|
|
|
if($cliente == null){
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
|
|
$categorias = CategoriaProduto::where('delivery', 1)
|
|
->orderBy('nome', 'asc')->where('status', 1)
|
|
->where('empresa_id', $config->empresa_id)->get();
|
|
$notSearch = true;
|
|
|
|
$carrinho->save();
|
|
$config->tipo_entrega = json_decode($config->tipo_entrega);
|
|
if(sizeof($config->tipo_entrega) == 0){
|
|
session()->flash('flash_error', 'Nenhum tipo de entrega definido!');
|
|
return redirect()->back();
|
|
}
|
|
$tiposPagamento = [];
|
|
$tipos_pagamento = $config->tipos_pagamento ? json_decode($config->tipos_pagamento) : [];
|
|
|
|
foreach($tipos_pagamento as $tp){
|
|
array_push($tiposPagamento, $tp);
|
|
}
|
|
$config->tipos_pagamento = $tiposPagamento;
|
|
|
|
if(sizeof($config->tipos_pagamento) == 0){
|
|
session()->flash('flash_error', 'Nenhum tipo de pagamento definido!');
|
|
return redirect()->back();
|
|
}
|
|
|
|
$bairros = BairroDelivery::where('empresa_id', $config->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
if($carrinho->endereco_id == null){
|
|
// dd($cliente->enderecoPrincipal);
|
|
|
|
$carrinho->endereco_id = $cliente->enderecoPrincipal ? $cliente->enderecoPrincipal->id : null;
|
|
if($cliente->enderecoPrincipal && $cliente->enderecoPrincipal->bairro){
|
|
$carrinho->valor_frete = $cliente->enderecoPrincipal->bairro->valor_entrega;
|
|
}
|
|
|
|
$carrinho->valor_total = $carrinho->itens->sum('sub_total') + $carrinho->valor_frete - $carrinho->valor_desconto;
|
|
$carrinho->save();
|
|
}
|
|
|
|
$enderecos = $cliente->enderecosDelivery;
|
|
|
|
$entregaGratis = false;
|
|
//atualiza valor carrinho
|
|
|
|
if(isset($request->balcao)){
|
|
$carrinho->tipo_entrega = 'retirada';
|
|
$carrinho->endereco_id = null;
|
|
$carrinho->valor_frete = 0;
|
|
$carrinho->valor_total = $carrinho->itens->sum('sub_total') + $carrinho->valor_frete - $carrinho->valor_desconto;
|
|
$carrinho->save();
|
|
}else{
|
|
$carrinho->tipo_entrega = 'delivery';
|
|
}
|
|
|
|
$carrinho->valor_frete = 0;
|
|
if($carrinho->endereco && $carrinho->endereco->bairro){
|
|
|
|
$carrinho->valor_frete = $carrinho->endereco->bairro->valor_entrega;
|
|
$carrinho->valor_total = $carrinho->itens->sum('sub_total') + $carrinho->valor_frete - $carrinho->valor_desconto;
|
|
$carrinho->save();
|
|
}
|
|
|
|
if($carrinho->valor_total >= $config->valor_entrega_gratis && $config->valor_entrega_gratis > 0){
|
|
|
|
$carrinho->valor_frete = 0;
|
|
$carrinho->valor_total = $carrinho->itens->sum('sub_total') + $carrinho->valor_frete - $carrinho->valor_desconto;
|
|
$carrinho->save();
|
|
$entregaGratis = true;
|
|
}
|
|
$funcionamento = $this->getFuncionamento($config);
|
|
$notInfoHeader = 1;
|
|
|
|
$pedidoHoje = PedidoDelivery::where('empresa_id', $config->empresa_id)
|
|
->whereDate('created_at', date('Y-m-d'))
|
|
->where('cliente_id', $cliente->id)->first();
|
|
|
|
//atualiza valor carrinho
|
|
|
|
return view('food.pagamento', compact('carrinho', 'config', 'categorias', 'notSearch', 'bairros',
|
|
'cliente', 'entregaGratis', 'funcionamento', 'notInfoHeader', 'enderecos', 'pedidoHoje'));
|
|
}
|
|
|
|
public function setaAgendamento(Request $request){
|
|
$carrinho = $this->_getCarrinho();
|
|
$carrinho->funcionario_id_agendamento = $request->funcionario_id;
|
|
$carrinho->inicio_agendamento = $request->inicio;
|
|
$carrinho->fim_agendamento = $request->fim;
|
|
$carrinho->data_agendamento = $request->data;
|
|
|
|
$carrinho->tipo_entrega = 'retirada';
|
|
$carrinho->endereco_id = null;
|
|
$carrinho->valor_frete = 0;
|
|
$carrinho->valor_total = $carrinho->itens->sum('sub_total') + $carrinho->valor_frete - $carrinho->valor_desconto;
|
|
|
|
$carrinho->save();
|
|
|
|
$config = MarketPlaceConfig::where('empresa_id', $carrinho->empresa_id)->first();
|
|
return redirect()->route('food.pagamento', ['link' => $config->loja_id, 'balcao' => 1]);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private function getLastNumero($empresa_id){
|
|
$last = PedidoDelivery::where('empresa_id', $empresa_id)
|
|
->orderBy('numero_sequencial', 'desc')
|
|
->where('numero_sequencial', '>', 0)->first();
|
|
$numero = $last != null ? $last->numero_sequencial : 0;
|
|
$numero++;
|
|
return $numero;
|
|
}
|
|
|
|
public function finalizar(Request $request){
|
|
|
|
$carrinho = $this->_getCarrinho();
|
|
$config = MarketPlaceConfig::findOrfail($request->loja_id);
|
|
// dd($request->all());
|
|
try{
|
|
$pedido = DB::transaction(function () use ($request, $config, $carrinho) {
|
|
$cliente = Cliente::where('uid', $this->_getClienteLogado())
|
|
->first();
|
|
|
|
$cupom = CupomDesconto::where('codigo', $carrinho->cupom)->first();
|
|
$troco = __convert_value_bd($carrinho->troco_para);
|
|
$pedido = PedidoDelivery::create([
|
|
'empresa_id' => $config->empresa_id,
|
|
'cliente_id' => $cliente->id,
|
|
'valor_total' => $carrinho->valor_total,
|
|
'troco_para' => $troco,
|
|
'tipo_pagamento' => $carrinho->tipo_pagamento,
|
|
'observacao' => $carrinho->observacao,
|
|
'telefone' => $cliente->telefone,
|
|
'estado' => 'novo',
|
|
'endereco_id' => $carrinho->endereco_id,
|
|
'cupom_id' => $cupom ? $cupom->id : null,
|
|
'desconto' => $carrinho->valor_desconto,
|
|
'valor_entrega' => $carrinho->valor_frete,
|
|
'horario_cricao' => date('H:i'),
|
|
|
|
'funcionario_id_agendamento' => $carrinho->funcionario_id_agendamento,
|
|
'inicio_agendamento' => $carrinho->inicio_agendamento,
|
|
'fim_agendamento' => $carrinho->fim_agendamento,
|
|
'data_agendamento' => $carrinho->data_agendamento,
|
|
'numero_sequencial' => $this->getLastNumero($config->empresa_id)
|
|
]);
|
|
|
|
if($cupom){
|
|
CupomDescontoCliente::create([
|
|
'cliente_id' => $cliente->id,
|
|
'empresa_id' => $pedido->empresa_id,
|
|
'cupom_id' => $cupom->id,
|
|
'pedido_id' => $pedido->id
|
|
]);
|
|
}
|
|
foreach($carrinho->itens as $i){
|
|
$itemPedido = ItemPedidoDelivery::create([
|
|
'pedido_id' => $pedido->id,
|
|
'produto_id' => $i->produto_id,
|
|
'servico_id' => $i->servico_id,
|
|
'quantidade' => $i->quantidade,
|
|
'observacao' => $i->observacao,
|
|
'tamanho_id' => $i->tamanho_id,
|
|
'valor_unitario' => $i->valor_unitario,
|
|
'sub_total' => $i->sub_total
|
|
]);
|
|
foreach($i->adicionais as $a){
|
|
ItemAdicionalDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'adicional_id' => $a->adicional_id
|
|
]);
|
|
}
|
|
|
|
foreach($i->pizzas as $pizza){
|
|
ItemPizzaPedidoDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'produto_id' => $pizza->produto_id
|
|
]);
|
|
}
|
|
|
|
}
|
|
|
|
if($pedido->funcionario_id_agendamento){
|
|
$dataAgendamento = [
|
|
'funcionario_id' => $pedido->funcionario_id_agendamento,
|
|
'cliente_id' => $pedido->cliente_id,
|
|
'data' => $pedido->data_agendamento,
|
|
'inicio' => $pedido->inicio_agendamento,
|
|
'termino' => $pedido->fim_agendamento,
|
|
|
|
'observacao' => $pedido->observacao,
|
|
'total' => $pedido->valor_total,
|
|
'desconto' => $pedido->desconto,
|
|
'acrescimo' => 0,
|
|
'empresa_id' => $pedido->empresa_id,
|
|
'pedido_delivery_id' => $pedido->id,
|
|
];
|
|
$agendamento = Agendamento::create($dataAgendamento);
|
|
|
|
foreach($pedido->itens as $i){
|
|
if($i->servico){
|
|
$dataItem = [
|
|
'agendamento_id' => $agendamento->id,
|
|
'servico_id' => $i->servico_id,
|
|
'quantidade' => 1,
|
|
'valor' => $i->sub_total
|
|
];
|
|
ItemAgendamento::create($dataItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $pedido;
|
|
});
|
|
|
|
|
|
|
|
$this->enviarMensagemWpp($pedido->id);
|
|
$_SESSION["session_cart_delivery"] = null;
|
|
if($config->confirmacao_pedido_cliente == 1){
|
|
session()->flash("flash_warning", "Pedido realizado aguardando confirmação");
|
|
return redirect()->route('food.aguardando-confirmar', 'link='.$config->loja_id);
|
|
}else{
|
|
session()->flash("flash_success", "Pedido realizado com sucesso");
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
|
|
}catch(\Exception $e){
|
|
// echo $e->getMessage();
|
|
// die;
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
public function enviarMensagemWpp($id){
|
|
$pedido = PedidoDelivery::findOrfail($id);
|
|
|
|
if($pedido->funcionario_id_agendamento){
|
|
$config = ConfiguracaoAgendamento::where('empresa_id', $pedido->empresa_id)
|
|
->first();
|
|
if($config && $config->token_whatsapp){
|
|
$texto = $this->montaTextoPedido($pedido);
|
|
$telefone = "55".preg_replace('/[^0-9]/', '', $pedido->cliente->telefone);
|
|
$retorno = $this->util->sendMessageWithToken($telefone, $texto, $pedido->empresa_id, $config->token_whatsapp);
|
|
}
|
|
|
|
}else{
|
|
$texto = $this->montaTextoPedido($pedido);
|
|
$telefone = "55".preg_replace('/[^0-9]/', '', $pedido->cliente->telefone);
|
|
// $retorno = $this->util->sendMessage($telefone, $texto, $pedido->empresa_id);
|
|
|
|
$config = MarketPlaceConfig::where('empresa_id', $pedido->empresa_id)
|
|
->first();
|
|
if($config->token_whatsapp != null && strlen($config->token_whatsapp) > 1){
|
|
$retorno = $this->util->sendMessageWithToken($telefone, $texto, $pedido->empresa_id, $config->token_whatsapp);
|
|
}else{
|
|
$retorno = $this->util->sendMessage($telefone, $texto, $pedido->empresa_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function montaTextoPedido($pedido){
|
|
$texto = "Olá, ". $pedido->cliente->razao_social . ", já recebemos seu pedido, muito obrigado!\n\n";
|
|
|
|
$texto .= "PEDIDO #$pedido->numero_sequencial\n\n";
|
|
if(sizeof($pedido->itensProdutos) > 0){
|
|
$texto .= "PRODUTOS\n";
|
|
foreach($pedido->itens as $i){
|
|
if($i->produto){
|
|
$texto .= number_format($i->quantidade, 0) . "X ";
|
|
if($i->produto->referencia){
|
|
$texto .= "#REF-" . $i->produto->referencia;
|
|
}
|
|
if($i->tamanho){
|
|
foreach($i->pizzas as $pizza){
|
|
$texto .= " 1/" . sizeof($i->pizzas) . " " . $pizza->sabor->nome;
|
|
}
|
|
$texto .= " - tamanho" . $i->tamanho->nome;
|
|
|
|
}else{
|
|
$texto .= " " . $i->produto->nome;
|
|
}
|
|
|
|
if(sizeof($i->adicionais) > 0){
|
|
$texto .= "\n adicionais: ";
|
|
foreach($i->adicionais as $key => $a){
|
|
$texto .= $a->adicional->nome . ($key+1 < sizeof($i->adicionais) ? ", " : "");
|
|
}
|
|
}
|
|
|
|
$texto .= " R$ " . __moeda($i->valor_unitario);
|
|
$texto .= " = R$ " . __moeda($i->sub_total);
|
|
$texto .= "\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
if(sizeof($pedido->itensServico) > 0){
|
|
$texto .= "SERVIÇOS\n";
|
|
foreach($pedido->itens as $i){
|
|
if($i->servico){
|
|
$texto .= number_format($i->quantidade, 0) . "X ";
|
|
|
|
$texto .= " " . $i->servico->nome;
|
|
$texto .= " R$ " . __moeda($i->valor_unitario);
|
|
$texto .= " = R$ " . __moeda($i->sub_total);
|
|
$texto .= "\n";
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if($pedido->endereco){
|
|
$texto .= "\nEndereço de entrega: " . $pedido->endereco->info;
|
|
}else{
|
|
$texto .= "\nRETIRADA EM BALCÃO";
|
|
}
|
|
|
|
$texto .= "\n\nForma de pagamento: " . $pedido->tipo_pagamento;
|
|
if($pedido->troco_para > 0){
|
|
$texto .= " - troco para: " . __moeda($pedido->troco_para);
|
|
}
|
|
|
|
$texto .= "\nSubtotal: " . __moeda($pedido->itens->sum('sub_total'));
|
|
$texto .= "\nDesconto: " . __moeda($pedido->valor_desconto);
|
|
$texto .= "\nValor entraga: " . __moeda($pedido->valor_entrega);
|
|
$texto .= "\nTotal: " . __moeda($pedido->valor_total);
|
|
|
|
return $texto;
|
|
}
|
|
|
|
public function pedirNovamente($id){
|
|
$pedido = PedidoDelivery::findOrfail($id);
|
|
$config = MarketPlaceConfig::findOrfail(request()->loja_id);
|
|
|
|
try{
|
|
$pedido = DB::transaction(function () use ($pedido, $config) {
|
|
$session_cart_delivery = Str::random(30);
|
|
$_SESSION['session_cart_delivery'] = $session_cart_delivery;
|
|
$carrinho = CarrinhoDelivery::create([
|
|
'cliente_id' => $pedido->cliente_id,
|
|
'empresa_id' => $pedido->empresa_id,
|
|
'estado' => 'pendente',
|
|
'valor_total' => $pedido->valor_total,
|
|
'endereco_id' => null,
|
|
'valor_frete' => 0,
|
|
'session_cart_delivery' => $session_cart_delivery
|
|
]);
|
|
|
|
foreach($pedido->itens as $i){
|
|
$itemCarrinho = ItemCarrinhoDelivery::create([
|
|
'carrinho_id' => $carrinho->id,
|
|
'produto_id' => $i->produto_id,
|
|
'quantidade' => $i->quantidade,
|
|
'valor_unitario' => $i->valor_unitario,
|
|
'sub_total' => $i->sub_total,
|
|
'observacao' => $i->observacao,
|
|
'tamanho_id' => $i->tamanho_id
|
|
]);
|
|
|
|
foreach($i->adicionais as $a){
|
|
ItemCarrinhoAdicionalDelivery::create([
|
|
'item_carrinho_id' => $itemCarrinho->id,
|
|
'adicional_id' => $a->adicional_id
|
|
]);
|
|
}
|
|
|
|
foreach($i->pizzas as $a){
|
|
ItemPizzaCarrinho::create([
|
|
'item_carrinho_id' => $itemCarrinho->id,
|
|
'produto_id' => $a->produto_id
|
|
]);
|
|
}
|
|
}
|
|
});
|
|
session()->flash("flash_success", "Itens adicionados as carrinho!");
|
|
return redirect()->route('food.carrinho', 'link='.$config->loja_id);
|
|
}catch(\Exception $e){
|
|
echo $e->getMessage();
|
|
die;
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
public function pagamentoPix(Request $request){
|
|
$carrinho = $this->_getCarrinho();
|
|
$config = MarketPlaceConfig::findOrfail($request->loja_id);
|
|
// dd($request->all());
|
|
try{
|
|
$pedido = DB::transaction(function () use ($request, $config, $carrinho) {
|
|
$cliente = Cliente::where('uid', $this->_getClienteLogado())
|
|
->first();
|
|
|
|
$cupom = CupomDesconto::where('codigo', $carrinho->cupom)->first();
|
|
$troco = 0;
|
|
$pedido = PedidoDelivery::create([
|
|
'empresa_id' => $config->empresa_id,
|
|
'cliente_id' => $cliente->id,
|
|
'valor_total' => $carrinho->valor_total,
|
|
'troco_para' => $troco != $carrinho->valor_total ? $troco : null,
|
|
'tipo_pagamento' => $request->tipo_pagamento,
|
|
'observacao' => $request->observacao ?? '',
|
|
'telefone' => $cliente->telefone,
|
|
'estado' => 'novo',
|
|
'endereco_id' => $carrinho->endereco_id,
|
|
'cupom_id' => $cupom ? $cupom->id : null,
|
|
'desconto' => $carrinho->valor_desconto,
|
|
'valor_entrega' => $carrinho->valor_frete,
|
|
'horario_cricao' => date('H:i'),
|
|
'numero_sequencial' => $this->getLastNumero($config->empresa_id)
|
|
]);
|
|
if($cupom){
|
|
CupomDescontoCliente::create([
|
|
'cliente_id' => $cliente->id,
|
|
'empresa_id' => $pedido->empresa_id,
|
|
'cupom_id' => $cupom->id,
|
|
'pedido_id' => $pedido->id
|
|
]);
|
|
}
|
|
foreach($carrinho->itens as $i){
|
|
$itemPedido = ItemPedidoDelivery::create([
|
|
'pedido_id' => $pedido->id,
|
|
'produto_id' => $i->produto_id,
|
|
'quantidade' => $i->quantidade,
|
|
'observacao' => $i->observacao,
|
|
'tamanho_id' => $i->tamanho_id,
|
|
'valor_unitario' => $i->valor_unitario,
|
|
'sub_total' => $i->sub_total
|
|
]);
|
|
foreach($i->adicionais as $a){
|
|
ItemAdicionalDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'adicional_id' => $a->adicional_id
|
|
]);
|
|
}
|
|
|
|
foreach($i->pizzas as $pizza){
|
|
ItemPizzaPedidoDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'produto_id' => $pizza->produto_id
|
|
]);
|
|
}
|
|
|
|
}
|
|
return $pedido;
|
|
});
|
|
$p = $pedido;
|
|
$pedido = $this->createQrCode($pedido, $request->cpf);
|
|
|
|
if(isset($pedido['erro'])){
|
|
|
|
foreach($p->itens as $item){
|
|
$item->adicionais()->delete();
|
|
$item->pizzas()->delete();
|
|
$item->delete();
|
|
|
|
if($item->agendamento){
|
|
$item->agendamento()->delete();
|
|
}
|
|
}
|
|
$p->delete();
|
|
session()->flash("flash_error", "Erro ao gerar qrCode de pagamento, revise o seu cpf");
|
|
return redirect()->back();
|
|
}
|
|
|
|
$_SESSION["session_cart_delivery"] = null;
|
|
|
|
session()->flash("flash_success", "Pedido realizado com sucesso");
|
|
return redirect()->route('food.qr_code', [$pedido->transacao_id, 'link='.$config->loja_id]);
|
|
|
|
}catch(\Exception $e){
|
|
// echo $e->getMessage();
|
|
// die;
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
private function createQrCode($pedido, $cpf){
|
|
$config = MarketPlaceConfig::where('empresa_id', $pedido->empresa_id)->first();
|
|
$cliente = $pedido->cliente;
|
|
|
|
$cpf = preg_replace('/[^0-9]/', '', $cpf);
|
|
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
|
|
|
|
$payment = new \MercadoPago\Payment();
|
|
|
|
$payment->transaction_amount = (float) number_format($pedido->valor_total,2);
|
|
$payment->description = "pagamento do pedido #" . $pedido->id;
|
|
$payment->payment_method_id = "pix";
|
|
|
|
$cep = str_replace("-", "", $config->cep);
|
|
$payment->payer = array(
|
|
"email" => $config->email,
|
|
// "first_name" => $cliente->nome,
|
|
// "last_name" => $cliente->sobre_nome,
|
|
"identification" => array(
|
|
"type" => 'CPF',
|
|
"number" => $cpf
|
|
),
|
|
"address"=> array(
|
|
"zip_code" => $cep,
|
|
"street_name" => $config->rua,
|
|
"street_number" => $config->numero,
|
|
"neighborhood" => $config->bairro,
|
|
"city" => $config->cidade->nome,
|
|
"federal_unit" => $config->cidade->uf
|
|
)
|
|
);
|
|
|
|
$payment->save();
|
|
if($payment->transaction_details){
|
|
|
|
$pedido->transacao_id = $payment->id;
|
|
$pedido->status_pagamento = $payment->status;
|
|
$pedido->qr_code_base64 = $payment->point_of_interaction->transaction_data->qr_code_base64;
|
|
$pedido->qr_code = $payment->point_of_interaction->transaction_data->qr_code;
|
|
|
|
$pedido->save();
|
|
return $pedido;
|
|
|
|
}else{
|
|
return [
|
|
'erro' => $payment->error
|
|
];
|
|
}
|
|
}
|
|
|
|
public function qrCode($transacao_id){
|
|
$item = PedidoDelivery::where('transacao_id', $transacao_id)->first();
|
|
$config = MarketPlaceConfig::where('empresa_id', $item->empresa_id)->first();
|
|
$carrinho = $this->_getCarrinho();
|
|
$categorias = CategoriaProduto::where('delivery', 1)
|
|
->orderBy('nome', 'asc')->where('status', 1)
|
|
->where('empresa_id', $config->empresa_id)->get();
|
|
|
|
$funcionamento = $this->getFuncionamento($config);
|
|
|
|
return view('food.qr_code', compact('item', 'config', 'carrinho', 'categorias', 'funcionamento'));
|
|
}
|
|
|
|
public function pagamentoCartao(Request $request){
|
|
$carrinho = $this->_getCarrinho();
|
|
$config = MarketPlaceConfig::findOrfail($request->loja_id);
|
|
try{
|
|
$pedido = DB::transaction(function () use ($request, $config, $carrinho) {
|
|
$cliente = Cliente::where('uid', $this->_getClienteLogado())
|
|
->first();
|
|
|
|
$cupom = CupomDesconto::where('codigo', $carrinho->cupom)->first();
|
|
$troco = __convert_value_bd($request->troco_para);
|
|
$pedido = PedidoDelivery::create([
|
|
'empresa_id' => $config->empresa_id,
|
|
'cliente_id' => $cliente->id,
|
|
'valor_total' => $carrinho->valor_total,
|
|
'troco_para' => $troco != $carrinho->valor_total ? $troco : null,
|
|
'tipo_pagamento' => $request->tipo_pagamento,
|
|
'observacao' => $request->observacao ?? '',
|
|
'telefone' => $cliente->telefone,
|
|
'estado' => 'novo',
|
|
'endereco_id' => $carrinho->endereco_id,
|
|
'cupom_id' => $cupom ? $cupom->id : null,
|
|
'desconto' => $carrinho->valor_desconto,
|
|
'valor_entrega' => $carrinho->valor_frete,
|
|
'horario_cricao' => date('H:i')
|
|
]);
|
|
if($cupom){
|
|
CupomDescontoCliente::create([
|
|
'cliente_id' => $cliente->id,
|
|
'empresa_id' => $pedido->empresa_id,
|
|
'cupom_id' => $cupom->id,
|
|
'pedido_id' => $pedido->id
|
|
]);
|
|
}
|
|
foreach($carrinho->itens as $i){
|
|
$itemPedido = ItemPedidoDelivery::create([
|
|
'pedido_id' => $pedido->id,
|
|
'produto_id' => $i->produto_id,
|
|
'quantidade' => $i->quantidade,
|
|
'observacao' => $i->observacao,
|
|
'tamanho_id' => $i->tamanho_id,
|
|
'valor_unitario' => $i->valor_unitario,
|
|
'sub_total' => $i->sub_total
|
|
]);
|
|
foreach($i->adicionais as $a){
|
|
ItemAdicionalDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'adicional_id' => $a->adicional_id
|
|
]);
|
|
}
|
|
|
|
foreach($i->pizzas as $pizza){
|
|
ItemPizzaPedidoDelivery::create([
|
|
'item_pedido_id' => $itemPedido->id,
|
|
'produto_id' => $pizza->produto_id
|
|
]);
|
|
}
|
|
|
|
}
|
|
|
|
return $pedido;
|
|
});
|
|
$pagamento = $this->pagarComCartao($pedido, $request);
|
|
|
|
if(isset($pagamento['erro'])){
|
|
session()->flash("flash_error", $pedido['erro']);
|
|
return redirect()->back();
|
|
}
|
|
|
|
$pedido->estado = 'aprovado';
|
|
$pedido->save();
|
|
|
|
$_SESSION["session_cart_delivery"] = null;
|
|
|
|
session()->flash("flash_success", "Pagamento realizado com sucesso");
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
|
|
}catch(\Exception $e){
|
|
// echo $e->getMessage();
|
|
// die;
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
private function pagarComCartao($pedido, $request){
|
|
$config = MarketPlaceConfig::where('empresa_id', $pedido->empresa_id)->first();
|
|
$cliente = $pedido->cliente;
|
|
|
|
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
|
|
|
|
$payment = new \MercadoPago\Payment();
|
|
$payment->transaction_amount = (float)$request->transactionAmount;
|
|
$payment->token = $request->token;
|
|
$payment->description = $request->description;
|
|
$payment->installments = (int)$request->installments;
|
|
$payment->payment_method_id = $request->paymentMethodId;
|
|
|
|
$payer = new \MercadoPago\Payer();
|
|
$payer->email = $request->email;
|
|
$payer->identification = array(
|
|
"type" => $request->docType,
|
|
"number" => $request->docNumber
|
|
);
|
|
$payment->payer = $payer;
|
|
|
|
if($payment->error){
|
|
session()->flash("flash_error", $payment->error);
|
|
return [
|
|
'erro' => $payment->error
|
|
];
|
|
}else{
|
|
$pedido->status_pagamento = $payment->status;
|
|
$pedido->transacao_id = (string)$payment->id;
|
|
$pedido->save();
|
|
|
|
return [
|
|
'sucesso' => 1,
|
|
'transacao_id' => $pedido->transacao_id
|
|
];
|
|
}
|
|
|
|
$payment->save();
|
|
}
|
|
|
|
public function aguardandoConfirmar(){
|
|
$cliente = Cliente::where('uid', $this->_getClienteLogado())
|
|
->first();
|
|
|
|
$config = MarketPlaceConfig::where('empresa_id', $cliente->empresa_id)->first();
|
|
|
|
if($cliente == null){
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
|
|
$pedido = PedidoDelivery::where('cliente_id', $cliente->id)
|
|
->where('estado', 'novo')
|
|
->orderBy('id', 'desc')->first();
|
|
|
|
if($pedido == null){
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
|
|
if($pedido->estado != 'novo'){
|
|
return redirect()->route('food.index', 'link='.$config->loja_id);
|
|
}
|
|
|
|
$carrinho = $this->_getCarrinho();
|
|
$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;
|
|
|
|
return view('food.aguardando_confirmar', compact('pedido', 'config', 'carrinho', 'categorias', 'notSearch', 'funcionamento', 'notInfoHeader'));
|
|
}
|
|
|
|
}
|