arcadiasuite/plus/app/Http/Controllers/API/VendizapWebHookController.php

176 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\VendiZapConfig;
use App\Models\Notificacao;
use App\Models\Cliente;
use App\Models\PedidoVendiZap;
use App\Models\Produto;
use App\Models\ItemPedidoVendiZap;
use App\Models\Localizacao;
use App\Models\ProdutoLocalizacao;
class VendizapWebHookController extends Controller
{
public function index(Request $request){
$dados = json_encode($request->all(), JSON_PRETTY_PRINT);
$nomeArquivo = 'vendizapteste_' . date('Y-m-d H:i:s') . '.txt';
// file_put_contents($nomeArquivo, $dados);
if($request->objeto == 'pedidos' && $request->operacao == 'criado'){
$nomeArquivo = 'vendizap_' . date('Y-m-d H:i:s') . '.txt';
// file_put_contents($nomeArquivo, $dados);
$config = VendiZapConfig::where('auth_id', $request->client_id)->first();
if($config){
$id = $request->id;
$dataHoraOperacao = $request->dataHoraOperacao;
$pedido = $this->criaPedido($id, $config);
if($pedido){
$descricao = view('notificacao.partials.vendizap', compact('id', 'dataHoraOperacao'));
Notificacao::create([
'empresa_id' => $config->empresa_id,
'tabela' => 'pedido_vendi_zaps',
'descricao' => $descricao,
'descricao_curta' => 'Pedido criado #'.$request->id,
'referencia' => $request->id,
'status' => 1,
'por_sistema' => 1,
'prioridade' => 'baixa',
'visualizada' => 0,
'titulo' => 'Novo pedido vendizap'
]);
}
}
}
if($request->objeto == 'pedidos' && $request->operacao == 'cancelado'){
$nomeArquivo = 'vendizap_' . date('Y-m-d H:i:s') . '.txt';
// file_put_contents($nomeArquivo, $dados);
$config = VendiZapConfig::where('auth_id', $request->client_id)->first();
if($config){
$id = $request->id;
$dataHoraOperacao = $request->dataHoraOperacao;
$descricao = view('notificacao.partials.vendizap', compact('id', 'dataHoraOperacao'));
Notificacao::create([
'empresa_id' => $config->empresa_id,
'tabela' => 'pedido_vendi_zaps',
'descricao' => $descricao,
'descricao_curta' => 'Pedido cancelado #'.$request->id,
'referencia' => $request->id,
'status' => 1,
'por_sistema' => 1,
'prioridade' => 'baixa',
'visualizada' => 0,
'titulo' => 'Pedido cancelado vendizap'
]);
}
}
}
private function criaPedido($id, $config){
$ch = curl_init();
$headers = [
"X-Auth-Id: " . $config->auth_id,
"X-Auth-Secret: " . $config->auth_secret,
];
$urlFilter = $this->url . "/pedidos/".$id;
curl_setopt($ch, CURLOPT_URL, $urlFilter);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_ENCODING, '');
$item = json_decode(curl_exec($ch));
curl_close($ch);
$cliente = null;
if($item->cliente->documento){
$doc = $item->cliente->documento;
$cliente = Cliente::where('empresa_id', $config->empresa_id)
->where('cpf_cnpj', $doc)->first();
}
if($cliente == null){
$cliente = Cliente::where('empresa_id', $config->empresa_id)
->where('telefone', $item->cliente->telefone)->first();
}
$dataPedido = [
'empresa_id' => $config->empresa_id,
'cliente_id' => $cliente ? $cliente->id : null,
'data' => $item->data,
'numero_pedido' => $item->numero,
'nome' => $item->cliente->nome,
'documento' => $item->cliente->documento,
'telefone' => $item->cliente->telefone,
'email' => $item->email,
'cep' => $item->cliente->endereco ? $item->cliente->endereco->cep : '',
'rua' => $item->cliente->endereco ? $item->cliente->endereco->logradouro : '',
'numero' => $item->cliente->endereco ? $item->cliente->endereco->numero : '',
'bairro' => $item->cliente->endereco ? $item->cliente->endereco->bairro : '',
'cidade' => $item->cliente->endereco ? $item->cliente->endereco->cidade : '',
'uf' => $item->cliente->endereco ? $item->cliente->endereco->estado : '',
'complemento' => $item->cliente->endereco ? $item->cliente->endereco->complemento : '',
'total' => $item->valorPedido,
'observacao' => $item->observacao,
'entrega' => $item->entrega,
'taxa_entrega' => $item->taxaEntrega,
'taxa_retirada' => $item->taxaRetirada,
'_id' => $item->id,
'hash' => $item->hash,
'codigo_link_rastreio' => $item->codigoLinkRastreio,
'tipo_pagamento' => $item->pagamento ? $item->pagamento->descricao : ''
];
$pedido = PedidoVendiZap::create($dataPedido);
foreach($item->itens as $itemPedido){
$produto = Produto::where('vendizap_id', $itemPedido->id_produto)->first();
if($produto == null){
$produto = $this->cadastrarProduto($itemPedido, $config->empresa_id);
}
$dataItemPedido = [
'pedido_id' => $pedido->id,
'produto_id' => $produto ? $produto->id : null,
'vendizap_produto_id' => $itemPedido->id_produto,
'descricao' => $itemPedido->descricao,
'detalhes' => $itemPedido->detalhes,
'unidade' => $itemPedido->unidadeVenda,
'observacao' => $itemPedido->observacaoProduto,
'codigo' => $itemPedido->codigo,
'valor' => $itemPedido->preco,
'valor_promociconal' => $itemPedido->precoPromocional,
'quantidade' => $itemPedido->quantidade,
'sub_total' => $itemPedido->valorLiquido,
'valor_adicionais' => $itemPedido->valorAdicionais
];
ItemPedidoVendiZap::create($dataItemPedido);
}
return $pedido;
}
private function cadastrarProduto($p, $empresa_id){
$produto = Produto::create([
'vendizap_id' => $p->id,
'empresa_id' => $empresa_id,
'nome' => $p->descricao,
'valor_unitario' => isset($p->preco) ? $p->preco : 0,
]);
$locais = Localizacao::where('empresa_id', $empresa_id)->get();
foreach($locais as $l){
ProdutoLocalizacao::updateOrCreate([
'produto_id' => $produto->id,
'localizacao_id' => $l->id
]);
}
}
}