arcadiasuite/plus/app/Http/Controllers/MercadoLivreProdutoControll...

603 lines
24 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\MercadoLivreConfig;
use App\Models\Produto;
use App\Models\CategoriaMercadoLivre;
use App\Models\UnidadeMedida;
use App\Models\PadraoTributacaoProduto;
use App\Models\Empresa;
use App\Models\VariacaoMercadoLivre;
use Illuminate\Support\Facades\DB;
use App\Models\CategoriaProduto;
use App\Utils\EstoqueUtil;
use App\Utils\MercadoLivreUtil;
use App\Utils\UploadUtil;
use App\Models\ProdutoLocalizacao;
class MercadoLivreProdutoController extends Controller
{
protected $util;
protected $utilMercadoLivre;
protected $uploadUtil;
public function __construct(Request $request, EstoqueUtil $util,
MercadoLivreUtil $utilMercadoLivre, UploadUtil $uploadUtil)
{
$this->util = $util;
$this->utilMercadoLivre = $utilMercadoLivre;
$this->uploadUtil = $uploadUtil;
}
private function __validaToken(){
$retorno = $this->utilMercadoLivre->refreshToken(request()->empresa_id);
if($retorno != 'token valido!'){
if($retorno == 0){
return 0;
}
if(!isset($retorno->access_token)){
dd($retorno);
}
}
}
public function index(Request $request){
$token = $this->__validaToken();
if($token == 0){
return redirect()->route('mercado-livre-config.index');
}
$this->validaCategorias();
$data = Produto::where('empresa_id', request()->empresa_id)
->when(!empty($request->nome), function ($q) use ($request) {
return $q->where('nome', 'LIKE', "%$request->nome%");
})
->where('mercado_livre_id', '!=', null)
->paginate(__itensPagina());
return view('mercado_livre_produtos.index', compact('data'));
}
private function validaCategorias(){
$this->__validaToken();
$categorias = CategoriaMercadoLivre::count();
if($categorias == 0){
$config = MercadoLivreConfig::where('empresa_id', request()->empresa_id)
->first();
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/sites/MLB/categories/all");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
foreach($retorno as $r){
$cat = [
'_id' => $r->id,
'nome' => $r->name
];
CategoriaMercadoLivre::create($cat);
}
}
}
public function edit($id){
$item = Produto::findOrFail($id);
$configMercadoLivre = MercadoLivreConfig::where('empresa_id',request()->empresa_id)
->first();
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $configMercadoLivre->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$prodML = json_decode($res);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id/description");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $configMercadoLivre->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$descricaoML = json_decode($res);
return view('mercado_livre_produtos.edit', compact('item', 'prodML', 'descricaoML'));
}
public function update(Request $request, $id){
$item = Produto::findOrFail($id);
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
->first();
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $configMercadoLivre->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$prod = json_decode($res);
$dataMercadoLivre = [
'title' => $item->nome,
// 'category_id' => $request->mercado_livre_categoria,
// 'price' => __convert_value_bd($request->mercado_livre_valor),
// 'available_quantity' => __convert_value_bd($request->quantidade_mercado_livre),
'currency_id' => 'BRL',
// 'condition' => $request->condicao_mercado_livre,
// 'buying_mode' => 'buy_it_now',
'video_id' => $request->mercado_livre_youtube,
];
if(sizeof($prod->variations) > 0){
for($i=0; $i<sizeof($request->variacao_id); $i++){
$dataMercadoLivre['variations'][$i]['price'] = __convert_value_bd($request->variacao_valor[$i]);
$dataMercadoLivre['variations'][$i]['available_quantity'] = __convert_value_bd($request->variacao_quantidade[$i]);
$dataMercadoLivre['variations'][$i]['id'] = __convert_value_bd($request->variacao_id[$i]);
}
}else{
$dataMercadoLivre['price'] = __convert_value_bd($request->mercado_livre_valor);
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataMercadoLivre));
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $configMercadoLivre->access_token,
'Content-Type: application/json',
'Accept: application/json',
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
if($retorno->status == 400){
$msg = $this->trataErros($retorno);
session()->flash("flash_error", $msg);
return redirect()->back();
}
if($request->mercado_livre_descricao){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id/description");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(
['plain_text' => $request->mercado_livre_descricao]
));
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $configMercadoLivre->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
}
if(sizeof($prod->variations) > 0){
for($i=0; $i<sizeof($request->variacao_id); $i++){
$variacao = VariacaoMercadoLivre::where('_id', $request->variacao_id[$i])
->first();
$variacao->valor = __convert_value_bd($request->variacao_valor[$i]);
$variacao->quantidade = __convert_value_bd($request->variacao_quantidade[$i]);
$variacao->valor_nome = $request->variacao_valor_nome[$i];
$variacao->nome = $request->variacao_nome[$i];
$variacao->save();
}
}
session()->flash("flash_success", "Produto atualizado!");
return redirect()->route('mercado-livre-produtos.index');
}
private function trataErros($retorno){
$msg = "";
foreach($retorno->cause as $c){
$msg .= $c->message;
}
return $msg;
}
public function produtosNew(Request $request){
$token = $this->__validaToken();
if($token == 0){
return redirect()->route('mercado-livre-config.index');
}
$config = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
->first();
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/users/$config->user_id/items/search/?offset=0");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
if(!isset($retorno->results)){
session()->flash("flash_error", $retorno->message);
return redirect()->route('mercado-livre-config.index');
}
$results = $retorno->results;
$produtosIsert = [];
foreach($results as $rcode){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$rcode");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
$res = $this->validaProdutoCadastrado($retorno, $request->empresa_id);
if(is_array($res)){
$produtosIsert[] = $res;
}
}
// dd($produtosIsert);
if(sizeof($produtosIsert) > 0){
$empresa = Empresa::findOrFail(request()->empresa_id);
$listaCTSCSOSN = Produto::listaCSOSN();
if ($empresa->tributacao == 'Regime Normal') {
$listaCTSCSOSN = Produto::listaCST();
}
$padraoTributacao = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->where('padrao', 1)
->first();
$padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)->where('status', 1)
->where('categoria_id', null)
->get();
$unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
->where('status', 1)->get();
return view('mercado_livre_produtos.create_produtos',
compact('produtosIsert', 'padraoTributacao', 'listaCTSCSOSN', 'padroes', 'categorias', 'unidades'));
}else{
return redirect()->route('mercado-livre-produtos.index');
}
}
private function validaProdutoCadastrado($mlProduto, $empresa_id){
$produto = Produto::where('empresa_id', $empresa_id)
->where('mercado_livre_id', $mlProduto->id)
->first();
if($produto != null){
$this->atualizaProduto($mlProduto, $produto);
return true;
}
// dd($mlProduto);
$dataProduto = [
'empresa_id' => $empresa_id,
'nome' => $mlProduto->title,
'valor_venda' => $mlProduto->price,
'mercado_livre_id' => $mlProduto->id,
'mercado_livre_valor' => $mlProduto->price,
'mercado_livre_link' => $mlProduto->permalink,
'estoque' => $mlProduto->available_quantity,
'status' => $mlProduto->status,
'mercado_livre_categoria' => $mlProduto->category_id
];
if(sizeof($mlProduto->variations) > 0){
$variacoes = [];
foreach($mlProduto->variations as $v){
$dataVariacao = [
'_id' => $v->id,
'quantidade' => $v->available_quantity,
'valor' => $v->price,
'nome' => $v->attribute_combinations[0]->name,
'valor_nome' => $v->attribute_combinations[0]->value_name
];
array_push($variacoes, $dataVariacao);
}
$dataProduto['variacoes'] = $variacoes;
}
// dd($dataProduto);
return $dataProduto;
}
private function atualizaProduto($mlProduto, $produto){
$produto->mercado_livre_status = $mlProduto->status;
$produto->mercado_livre_valor = $mlProduto->price;
$produto->nome = $mlProduto->title;
$produto->save();
}
public function store(Request $request){
DB::transaction(function () use ($request) {
$contInserts = 0;
try{
for($i=0; $i<sizeof($request->mercado_livre_id); $i++){
$last = Produto::where('empresa_id', $request->empresa_id)
->orderBy('numero_sequencial', 'desc')
->where('numero_sequencial', '>', 0)->first();
$numeroSequencial = $last != null ? $last->numero_sequencial : 0;
$numeroSequencial++;
$data = [
'numero_sequencial' => $numeroSequencial,
'mercado_livre_id' => $request->mercado_livre_id[$i],
'nome' => $request->nome[$i],
'valor_unitario' => __convert_value_bd($request->valor_venda[$i]),
'mercado_livre_valor' => __convert_value_bd($request->mercado_livre_valor[$i]),
'valor_compra' => $request->valor_compra[$i] ? __convert_value_bd($request->valor_compra[$i]) : 0,
'codigo_barras' => $request->codigo_barras[$i],
'ncm' => $request->ncm[$i],
'unidade' => $request->unidade[$i],
'gerenciar_estoque' => $request->gerenciar_estoque[$i],
'categoria_id' => $request->categoria_id[$i],
'cest' => $request->cest[$i],
'cfop_estadual' => $request->cfop_estadual[$i],
'cfop_outro_estado' => $request->cfop_outro_estado[$i],
'perc_icms' => __convert_value_bd($request->perc_icms[$i]),
'perc_pis' => __convert_value_bd($request->perc_pis[$i]),
'perc_cofins' => __convert_value_bd($request->perc_cofins[$i]),
'perc_ipi' => __convert_value_bd($request->perc_ipi[$i]),
'perc_red_bc' => $request->perc_red_bc[$i] ? __convert_value_bd($request->perc_red_bc[$i]) : 0,
'cst_csosn' => $request->cst_csosn[$i],
'cst_pis' => $request->cst_pis[$i],
'cst_cofins' => $request->cst_cofins[$i],
'cst_ipi' => $request->cst_ipi[$i],
'cEnq' => $request->cEnq[$i],
'empresa_id' => $request->empresa_id,
'mercado_livre_status' => $request->mercado_livre_status[$i],
'mercado_livre_categoria' => $request->mercado_livre_categoria[$i],
'valor_prazo' => 0
];
$produto = Produto::create($data);
ProdutoLocalizacao::updateOrCreate([
'produto_id' => $produto->id,
'localizacao_id' => $request->local_id
]);
if($request->mercado_livre_id_row){
for($j=0; $j<sizeof($request->mercado_livre_id_row); $j++){
if($request->mercado_livre_id[$i] == $request->mercado_livre_id_row[$j]){
$dataVariacao = [
'produto_id' => $produto->id,
'_id' => $request->variacao_id[$j],
'quantidade' => __convert_value_bd($request->variacao_quantidade[$j]),
'valor' => __convert_value_bd($request->variacao_valor[$j]),
'nome' => $request->variacao_nome[$j],
'valor_nome' => $request->variacao_valor_nome[$j]
];
VariacaoMercadoLivre::create($dataVariacao);
}
}
}
if($request->estoque[$i]){
$this->util->incrementaEstoque($produto->id, $request->estoque[$i], null);
}
$contInserts++;
}
session()->flash("flash_success", "Total de produtos inseridos: $contInserts");
}catch(\Exception $e){
session()->flash("flash_error", $e->getMessage());
}
});
return redirect()->route('mercado-livre-produtos.index');
}
public function galery($id){
$this->__validaToken();
$item = Produto::findOrFail($id);
$curl = curl_init();
$config = MercadoLivreConfig::where('empresa_id', $item->empresa_id)
->first();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json'
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
return view('mercado_livre_produtos.galery', compact('item', 'retorno'));
}
public function galeryStore(Request $request){
$item = Produto::findOrFail($request->produto_id);
if ($request->hasFile('image')) {
$file_name = $this->uploadUtil->uploadImage($request, '/temp-ml');
}else{
session()->flash("flash_error", "Selecione uma imagem!");
return redirect()->back();
}
$config = MercadoLivreConfig::where('empresa_id', $item->empresa_id)
->first();
$urlImage = $config->url . "/uploads/temp-ml/$file_name";
$dataMercadoLivre = [];
$cont = 0;
for($i=0; $i<sizeof($request->picture); $i++){
$dataMercadoLivre['pictures'][$i]['source'] = $request->picture[$i];
$cont++;
}
$dataMercadoLivre['pictures'][$cont]['source'] = $urlImage;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataMercadoLivre));
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json',
'Accept: application/json',
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
if(isset($retorno->id)){
$files = glob('uploads/temp-ml/*');
foreach($files as $file){
if(is_file($file)) {
unlink($file);
}
}
session()->flash("flash_success", "Imagem adicionada!");
}else{
session()->flash("flash_error", $retorno->message);
}
return redirect()->back();
}
public function galeryDelete(Request $request){
$item = Produto::findOrFail($request->produto_id);
$config = MercadoLivreConfig::where('empresa_id', $item->empresa_id)
->first();
$dataMercadoLivre = [];
for($i=0; $i<sizeof($request->picture); $i++){
$dataMercadoLivre['pictures'][$i]['source'] = $request->picture[$i];
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$item->mercado_livre_id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataMercadoLivre));
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $config->access_token,
'Content-Type: application/json',
'Accept: application/json',
]);
$res = curl_exec($curl);
$retorno = json_decode($res);
if(isset($retorno->id)){
session()->flash("flash_success", "Imagem removida!");
}else{
session()->flash("flash_error", $retorno->message);
}
return redirect()->back();
}
}