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

511 lines
20 KiB
PHP

<?php
namespace App\Http\Controllers\Ecommerce;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Carrinho;
use App\Models\Cliente;
use App\Models\PedidoEcommerce;
use App\Models\ItemPedidoEcommerce;
use App\Models\EcommerceConfig;
use App\Models\CategoriaProduto;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use App\Utils\UploadUtil;
class PagamentoController extends Controller
{
protected $util;
public function __construct(UploadUtil $util)
{
$this->util = $util;
// Session managed by Laravel
}
public function index(Request $request){
$carrinho = $this->_getCarrinho();
$config = EcommerceConfig::findOrfail($request->loja_id);
if($carrinho == []){
return redirect()->route('loja.index', 'link='.$config->loja_id);
}
$categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
$clienteLogado = $this->_getClienteLogado();
if(!$clienteLogado){
session()->flash("flash_error", "Cliente não localizado!");
return redirect()->route('loja.login', 'link='.$config->loja_id);
}
$tiposPagamento = json_decode($config->tipos_pagamento);
if(sizeof($tiposPagamento) == 0){
session()->flash("flash_error", "Nenhum tipo de pagamento!");
return redirect()->back();
}
return view('loja.pagamento', compact('carrinho', 'config', 'categorias', 'tiposPagamento'));
}
public function novaChavePix(Request $request){
$item = PedidoEcommerce::where('hash_pedido',$request->hash)->first();
$clienteLogado = $this->_getClienteLogado();
if($item == null){
session()->flash("flash_error", "Algo deu errado");
return redirect()->back();
}
if($item->cliente_id != $clienteLogado){
session()->flash("flash_error", "Algo deu errado");
return redirect()->back();
}
$config = EcommerceConfig::findOrfail($request->loja_id);
$categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
return view('loja.pagamento_pix', compact('config', 'categorias', 'item'));
}
private function _getClienteLogado(){
if(isset($_SESSION['cliente_ecommerce'])){
return $_SESSION['cliente_ecommerce'];
}
return null;
}
private function _getCarrinho(){
$data = [];
if(isset($_SESSION["session_cart"])){
$data = Carrinho::where('session_cart', $_SESSION["session_cart"])
->first();
}
return $data;
}
public function pagamentoNovoPix(Request $request){
try{
$config = EcommerceConfig::findOrfail($request->loja_id);
$pedido = PedidoEcommerce::findOrfail($request->pedido_id);
$result = DB::transaction(function () use ($request, $config, $pedido) {
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
$payment = new \MercadoPago\Payment();
$payment->transaction_amount = $pedido->valor_total;
$payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
$payment->payment_method_id = "pix";
$cep = str_replace("-", "", $config->cep);
$payment->payer = array(
"email" => $request->payerEmail,
"first_name" => $request->payerFirstName,
"last_name" => $request->payerLastName,
"identification" => array(
"type" => $request->docType,
"number" => preg_replace('/[^0-9]/', '', $request->docNumber)
),
"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->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->transacao_id = (string)$payment->id;
$pedido->tipo_pagamento = 'pix';
$pedido->save();
session()->flash("flash_success", "PIX gerado!");
return [
'sucesso' => 1,
'transacao_id' => $pedido->transacao_id
];
}else{
session()->flash("flash_error", $payment->error);
return [
'erro' => $payment->error
];
}
});
if(isset($result['sucesso'])){
return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$pedido->hash_pedido);
}else{
return redirect()->back();
}
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
return redirect()->back();
}
}
public function pagamentoPix(Request $request){
try{
$config = EcommerceConfig::findOrfail($request->loja_id);
$result = DB::transaction(function () use ($request, $config) {
$pedido = $this->createPedido($request);
$carrinho = $this->_getCarrinho();
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
$payment = new \MercadoPago\Payment();
$payment->transaction_amount = $pedido->valor_total;
$payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
$payment->payment_method_id = "pix";
$cep = str_replace("-", "", $config->cep);
$payment->payer = array(
"email" => $request->payerEmail,
"first_name" => $request->payerFirstName,
"last_name" => $request->payerLastName,
"identification" => array(
"type" => $request->docType,
"number" => preg_replace('/[^0-9]/', '', $request->docNumber)
),
"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->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->transacao_id = (string)$payment->id;
$pedido->tipo_pagamento = 'pix';
$pedido->save();
session()->flash("flash_success", "PIX gerado!");
return [
'sucesso' => 1,
'transacao_id' => $pedido->transacao_id,
'hash_pedido' => $pedido->hash_pedido
];
}else{
session()->flash("flash_error", $payment->error);
return [
'erro' => $payment->error
];
}
});
if(isset($result['sucesso'])){
return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$result['hash_pedido']);
}else{
return redirect()->back();
}
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
return redirect()->back();
}
}
public function pagamentoBoleto(Request $request){
try{
$config = EcommerceConfig::findOrfail($request->loja_id);
$result = DB::transaction(function () use ($request, $config) {
$pedido = $this->createPedido($request);
$carrinho = $this->_getCarrinho();
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
$payment = new \MercadoPago\Payment();
$payment->transaction_amount = $pedido->valor_total;
$payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
$payment->payment_method_id = "bolbradesco";
$cep = str_replace("-", "", $config->cep);
$payment->payer = array(
"email" => $request->payerEmail,
"first_name" => $request->payerFirstName,
"last_name" => $request->payerLastName,
"identification" => array(
"type" => $request->docType,
"number" => preg_replace('/[^0-9]/', '', $request->docNumber)
),
"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->status_pagamento = $payment->status;
$pedido->transacao_id = (string)$payment->id;
$pedido->link_boleto = $payment->transaction_details->external_resource_url;
$pedido->tipo_pagamento = 'boleto';
$pedido->save();
session()->flash("flash_success", "Boleto gerado!");
return [
'sucesso' => 1,
'transacao_id' => $pedido->transacao_id,
'hash_pedido' => $pedido->hash_pedido
];
}else{
session()->flash("flash_error", $payment->error);
return [
'erro' => $payment->error
];
}
});
if(isset($result['sucesso'])){
return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$result['hash_pedido']);
}else{
session()->flash("flash_error", $result['erro']);
return redirect()->back();
}
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
return redirect()->back();
}
}
public function pagamentoDeposito(Request $request){
try{
$config = EcommerceConfig::findOrfail($request->loja_id);
$pedido = DB::transaction(function () use ($request, $config) {
$pedido = $this->createPedido($request);
$carrinho = $this->_getCarrinho();
$pedido->tipo_pagamento = 'deposito';
$pedido->save();
session()->flash("flash_success", "Pedido gerado!");
return $pedido;
});
return redirect()->route('loja.finalizar-deposito', 'link='.$config->loja_id.'&hash='.$pedido->hash_pedido);
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
return redirect()->back();
}
}
// private function trataErros($arr){
// $cause = $arr->causes[0];
// $errorCode = $cause->code;
// $arrCode = $this->arrayErros($arr);
// return $arrCode[$errorCode];
// }
// private function arrayErros($arr){
// return [
// '2067' => 'Número documento inválido!',
// '13253' => 'Ative o QR code do cadastro!'
// ];
// }
private function createPedido($request){
$carrinho = $this->_getCarrinho();
$config = EcommerceConfig::findOrfail($request->loja_id);
$clienteLogado = $this->_getClienteLogado();
$cliente = Cliente::findOrFail($clienteLogado);
// $cliente->email = $request->payerEmail;
$cliente->cpf_cnpj = $request->docNumber;
// $cliente->rua = $request->rua;
// $cliente->numero = $request->numero;
// $cliente->bairro = $request->bairro;
// $cliente->cep = $request->cep;
$cliente->save();
$pedido = PedidoEcommerce::create([
'cliente_id' => $clienteLogado,
'empresa_id' => $config->empresa_id,
'endereco_id' => $carrinho->endereco_id,
'estado' => 'novo',
'observacao' => $request->observacao ?? '',
'hash_pedido' => Str::random(12),
'valor_total' => $carrinho->valor_total,
'valor_frete' => $carrinho->valor_frete,
'desconto' => 0,
'link_boleto' => '',
'qr_code_base64' => '',
'qr_code' => '',
'tipo_frete' => $carrinho->tipo_frete,
'rua_entrega' => $carrinho->endereco ? $carrinho->endereco->rua : '',
'cidade_entrega' => $carrinho->endereco ? $carrinho->endereco->cidade->info : '',
'numero_entrega' => $carrinho->endereco ? $carrinho->endereco->numero : '',
'referencia_entrega' => $carrinho->endereco ? $carrinho->endereco->referencia : '',
'bairro_entrega' => $carrinho->endereco ? $carrinho->endereco->bairro : '',
'cep_entrega' => $carrinho->endereco ? $carrinho->endereco->cep : '',
'nome' => $request->payerFirstName ?? '',
'sobre_nome' => $request->payerLastName ?? '',
'email' => $request->payerEmail ?? '',
'tipo_documento' => $request->docType ?? '',
'numero_documento' => $request->docNumber ?? ''
]);
foreach($carrinho->itens as $item){
$item = ItemPedidoEcommerce::create([
'pedido_id' => $pedido->id,
'produto_id' => $item->produto_id,
'variacao_id' => $item->variacao_id,
'quantidade' => $item->quantidade,
'valor_unitario' => $item->valor_unitario,
'sub_total' => $item->sub_total
]);
}
return $pedido;
}
public function finalizar(Request $request){
$pedido = PedidoEcommerce::where('hash_pedido', $request->hash_pedido)
->first();
$_SESSION["session_cart"] = null;
$config = EcommerceConfig::where('empresa_id', $pedido->empresa_id)->first();
if($pedido == null){
session()->flash("flash_error", "Algo deu errado!");
return redirect()->route('loja.index', ['link='.$config->loja_id]);
}
$categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
return view('loja.finalizar', compact('pedido', 'config', 'categorias'));
}
public function finalizarDeposito(Request $request){
$pedido = PedidoEcommerce::where('hash_pedido', $request->hash)
->first();
$_SESSION["session_cart"] = null;
if($pedido == null){
session()->flash("flash_error", "Algo deu errado!");
return redirect()->back();
}
$config = EcommerceConfig::findOrfail($request->loja_id);
$categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
->where('empresa_id', $config->empresa_id)->get();
return view('loja.finalizar', compact('pedido', 'config', 'categorias'));
}
public function pagamentoCartao(Request $request){
try{
$config = EcommerceConfig::findOrfail($request->loja_id);
$result = DB::transaction(function () use ($request, $config) {
$pedido = $this->createPedido($request);
$carrinho = $this->_getCarrinho();
//teste
// $pedido->status_pagamento = 'approved';
// $pedido->transacao_id = "123";
// $pedido->tipo_pagamento = 'cartao';
// $pedido->save();
// session()->flash("flash_success", "Pagamento concluído com sucesso!");
// return [
// 'sucesso' => 1,
// 'hash_pedido' => $pedido->hash_pedido
// ];
//teste
\MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
$payment = new \MercadoPago\Payment();
$payment->transaction_amount = (float)$request->transactionAmount;
$payment->token = $request->token;
$payment->description = "Pagamento do pedido #" . $pedido->hash_pedido;
$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;
// dd($payment);
$payment->save();
// dd($request->all());
if($payment->error){
// dd($payment);
session()->flash("flash_error", $payment->error);
return [
'erro' => $payment->error
];
}else{
$pedido->status_pagamento = $payment->status;
$pedido->transacao_id = (string)$payment->id;
$pedido->tipo_pagamento = 'cartao';
$pedido->save();
// dd($payment);
session()->flash("flash_success", "Pagamento concluído com sucesso!");
return [
'sucesso' => 1,
'hash_pedido' => $pedido->hash_pedido
];
}
});
if(isset($result['sucesso'])){
return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&hash_pedido='.$result['hash_pedido']);
}else{
return redirect()->back();
}
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
return redirect()->back();
}
}
public function enviarComprovante(Request $request){
$pedido = PedidoEcommerce::findOrfail($request->pedido_id);
if ($request->hasFile('file')) {
$config = EcommerceConfig::where('empresa_id', $pedido->empresa_id)->first();
$file_name = $this->util->uploadImage($request, '/comprovantes', 'file');
session()->flash("flash_success", "Comprovante enviado com sucesso!");
$pedido->comprovante = $file_name;
$pedido->save();
return redirect()->route('loja.index', 'link='.$config->loja_id);
}else{
session()->flash("flash_error", "Selecione o arquivo!");
return redirect()->back();
}
}
}