301 lines
11 KiB
PHP
301 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Utils\IfoodUtil;
|
|
use App\Models\IfoodConfig;
|
|
use App\Models\Produto;
|
|
use App\Models\ProdutoIfood;
|
|
use App\Models\CategoriaProdutoIfood;
|
|
use App\Models\Localizacao;
|
|
use App\Models\ProdutoLocalizacao;
|
|
use App\Models\PadraoTributacaoProduto;
|
|
use App\Utils\UploadUtil;
|
|
use Illuminate\Support\Str;
|
|
|
|
class IfoodProdutoController extends Controller
|
|
{
|
|
|
|
protected $util;
|
|
protected $uploadUtil;
|
|
|
|
public function __construct(IfoodUtil $util, UploadUtil $uploadUtil)
|
|
{
|
|
$this->util = $util;
|
|
$this->uploadUtil = $uploadUtil;
|
|
}
|
|
|
|
public function index(Request $request){
|
|
$config = IfoodConfig::
|
|
where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
if($config == null){
|
|
session()->flash("flash_error", "Configure o App");
|
|
return redirect()->route('ifood-config.index');
|
|
}
|
|
|
|
if($config->catalogId == ""){
|
|
session()->flash("flash_error", "Defina o catalogo!");
|
|
return redirect()->route('ifood-catalogos.index');
|
|
}
|
|
|
|
$this->getProdutosIfood($config);
|
|
|
|
$data = ProdutoIfood::where('empresa_id', $request->empresa_id)
|
|
->where('ifood_id', '!=', null)
|
|
->paginate(__itensPagina());
|
|
|
|
return view('ifood_produtos.index', compact('data'));
|
|
}
|
|
|
|
private function getProdutosIfood($config){
|
|
|
|
$result = $this->util->getCategoriesV2($config);
|
|
// dd($result);
|
|
if(isset($result->message)){
|
|
if($result->message == "token expired"){
|
|
$result = $this->util->oAuthToken($config);
|
|
if(isset($result['success']) && $result['success'] == 1){
|
|
return redirect()->route('ifood-produtos.index');
|
|
}else{
|
|
return redirect()->route('ifood-config.index');
|
|
}
|
|
}
|
|
}
|
|
|
|
$idsIfood = [];
|
|
|
|
foreach($result as $categoria){
|
|
$idsIfood[] = $categoria['id'];
|
|
|
|
$categoryItemsResult = $this->util->getCategoryItemsV2($config, $categoria['id']);
|
|
// dd($categoryItemsResult);
|
|
$categoria = CategoriaProdutoIfood::updateOrCreate([
|
|
'empresa_id' => $config->empresa_id,
|
|
'ifood_id' => $categoria['id'],
|
|
'nome' => $categoria['name'],
|
|
'status' => $categoria['status']
|
|
]);
|
|
if(isset($categoryItemsResult['products'])){
|
|
$items = $categoryItemsResult['items'];
|
|
foreach($categoryItemsResult['products'] as $key => $product){
|
|
$estoque = $this->util->getStock($config, $product['id']);
|
|
|
|
$dataProduto = [
|
|
'empresa_id' => $config->empresa_id,
|
|
'ifood_id' => $product['id'],
|
|
'ifood_id_aux' => $items[$key]['id'],
|
|
'nome' => $product['name'],
|
|
'imagem' => $product['imagePath'],
|
|
'serving' => $product['serving'],
|
|
'status' => $items[$key]['status'],
|
|
'estoque' => isset($estoque['amount']) ? $estoque['amount'] : 0,
|
|
'descricao' => $product['description'] ?? '',
|
|
'valor' => $items[$key]['price']['value'],
|
|
'categoria_produto_ifood_id' => $categoria->id
|
|
];
|
|
|
|
$item = ProdutoIfood::where('empresa_id', $config->empresa_id)
|
|
->where('ifood_id', $product['id'])->first();
|
|
|
|
if($item == null){
|
|
$this->cadastrarProduto($dataProduto);
|
|
}else{
|
|
$item->ifood_id_aux = $items[$key]['id'];
|
|
$item->imagem = $product['imagePath'];
|
|
$item->status = $items[$key]['status'];
|
|
$item->save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
CategoriaProdutoIfood::where('empresa_id', $config->empresa_id)
|
|
->whereNotIn('ifood_id', $idsIfood)
|
|
->update([
|
|
'status' => 0
|
|
]);
|
|
}
|
|
|
|
public function destroy($id){
|
|
$item = ProdutoIfood::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$config = IfoodConfig::
|
|
where('empresa_id', request()->empresa_id)
|
|
->first();
|
|
|
|
$result = $this->util->destroyProduct($config, $item->ifood_id);
|
|
if($result == null){
|
|
$item->delete();
|
|
session()->flash("flash_success", "Produto removido!");
|
|
}else{
|
|
session()->flash("flash_error", "Algo deu errado: " . $result->error->message);
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
private function cadastrarProduto($data){
|
|
$padraoTributacaoProduto = PadraoTributacaoProduto::where('padrao', 1)
|
|
->where('empresa_id', $data['empresa_id'])->first();
|
|
$dataProduto = [
|
|
'ifood_id' => $data['ifood_id'],
|
|
'empresa_id' => $data['empresa_id'],
|
|
'nome' => $data['nome'],
|
|
'valor_unitario' => $data['valor'],
|
|
];
|
|
|
|
if($padraoTributacaoProduto){
|
|
$dataProduto['perc_icms'] = $padraoTributacaoProduto->perc_icms;
|
|
$dataProduto['perc_pis'] = $padraoTributacaoProduto->perc_pis;
|
|
$dataProduto['perc_cofins'] = $padraoTributacaoProduto->perc_cofins;
|
|
$dataProduto['perc_ipi'] = $padraoTributacaoProduto->perc_ipi;
|
|
$dataProduto['cst_csosn'] = $padraoTributacaoProduto->cst_csosn;
|
|
$dataProduto['cst_pis'] = $padraoTributacaoProduto->cst_pis;
|
|
$dataProduto['cst_cofins'] = $padraoTributacaoProduto->cst_cofins;
|
|
$dataProduto['cst_ipi'] = $padraoTributacaoProduto->cst_ipi;
|
|
$dataProduto['perc_red_bc'] = $padraoTributacaoProduto->perc_red_bc;
|
|
$dataProduto['cEnq'] = $padraoTributacaoProduto->cEnq;
|
|
$dataProduto['pST'] = $padraoTributacaoProduto->pST;
|
|
$dataProduto['cfop_estadual'] = $padraoTributacaoProduto->cfop_estadual;
|
|
$dataProduto['cfop_outro_estado'] = $padraoTributacaoProduto->cfop_outro_estado;
|
|
$dataProduto['cest'] = $padraoTributacaoProduto->cest;
|
|
$dataProduto['ncm'] = $padraoTributacaoProduto->ncm;
|
|
$dataProduto['cfop_entrada_estadual'] = $padraoTributacaoProduto->cfop_entrada_estadual;
|
|
$dataProduto['cfop_entrada_outro_estado'] = $padraoTributacaoProduto->cfop_entrada_outro_estado;
|
|
}
|
|
|
|
$produto = Produto::create($dataProduto);
|
|
|
|
$locais = Localizacao::where('empresa_id', $data['empresa_id'])->get();
|
|
foreach($locais as $l){
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $produto->id,
|
|
'localizacao_id' => $l->id
|
|
]);
|
|
}
|
|
|
|
$data['produto_id'] = $produto->id;
|
|
ProdutoIfood::create($data);
|
|
}
|
|
|
|
public function edit($id){
|
|
$item = ProdutoIfood::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$config = IfoodConfig::where('empresa_id', request()->empresa_id)->first();
|
|
if(empty($config->catalogId)){
|
|
session()->flash("flash_error", "Nenhum catálogo definido para esta empresa. Por favor, defina um catálogo na tela de configurações do iFood.");
|
|
return redirect()->route('ifood-config.index');
|
|
}
|
|
$categorias = CategoriaProdutoIfood::where('empresa_id', $item->empresa_id)->get();
|
|
return view('ifood_produtos.edit', compact('item', 'config', 'categorias'));
|
|
}
|
|
|
|
public function update(Request $request, $id){
|
|
|
|
$item = ProdutoIfood::findOrFail($id);
|
|
$data = [
|
|
'name' => $request->nome,
|
|
'description' => $request->descricao ?? '',
|
|
'ean' => $request->codigo_barras ?? '',
|
|
'serving' => $item->serving,
|
|
// 'image' => $item->imagem
|
|
];
|
|
try{
|
|
|
|
if ($request->hasFile('image')) {
|
|
$file = $request->file('image');
|
|
|
|
$ext = $file->getClientOriginalExtension();
|
|
$file_name = Str::random(20) . '.' . $ext;
|
|
|
|
$path = public_path('uploads/produtos');
|
|
$file->move($path, $file_name);
|
|
|
|
$produto = $item->produto;
|
|
$produto->imagem = $file_name;
|
|
$produto->save();
|
|
|
|
$imagePath = $path . '/' . $file_name;
|
|
|
|
$pathImage = public_path('uploads/produtos/'.$produto->imagem);
|
|
|
|
$mimeType = explode(".", $produto->imagem);
|
|
$image = "data:image/$mimeType[1];base64,".base64_encode(file_get_contents($pathImage));
|
|
$data['image'] = $image;
|
|
}else{
|
|
$produto = $item->produto;
|
|
$pathImage = public_path('uploads/produtos/'.$produto->imagem);
|
|
if(file_exists($pathImage) && $produto->imagem){
|
|
$mimeType = explode(".", $produto->imagem);
|
|
$image = "data:image/$mimeType[1];base64,".base64_encode(file_get_contents($pathImage));
|
|
$data['image'] = $image;
|
|
}
|
|
}
|
|
$config = IfoodConfig::where('empresa_id', request()->empresa_id)->first();
|
|
$result = $this->util->updateProduct($config, $data, $item->ifood_id);
|
|
|
|
if(isset($result->error)){
|
|
session()->flash("flash_error", $result->error->details[0]->message);
|
|
return redirect()->back();
|
|
}
|
|
|
|
if(isset($result->name)){
|
|
$item->nome = $result->name;
|
|
$item->descricao = $result->description;
|
|
$item->status = $request->status;
|
|
$produto = $item->produto;
|
|
$produto->nome = $result->name;
|
|
$produto->codigo_barras = $result->ean;
|
|
$item->save();
|
|
$produto->save();
|
|
}
|
|
$data = [
|
|
'status' => $request->status,
|
|
];
|
|
|
|
$result = $this->util->updateStatusProduct($config, $data, $item->ifood_id_aux);
|
|
session()->flash("flash_success", "Produto cadastrado com sucesso!");
|
|
}catch(\Exception $e){
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
}
|
|
return redirect()->route('ifood-produtos.index');
|
|
}
|
|
|
|
public function active($id){
|
|
$item = ProdutoIfood::findOrFail($id);
|
|
$data = [
|
|
'status' => 'AVAILABLE',
|
|
];
|
|
$config = IfoodConfig::where('empresa_id', request()->empresa_id)->first();
|
|
|
|
$result = $this->util->updateStatusProduct($config, $data, $item->ifood_id_aux);
|
|
|
|
if($result['http_code'] == 200){
|
|
$item->status = 'AVAILABLE';
|
|
$item->save();
|
|
}
|
|
session()->flash("flash_success", "Produto ativado com sucesso!");
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function desactive($id){
|
|
$item = ProdutoIfood::findOrFail($id);
|
|
$data = [
|
|
'status' => 'UNAVAILABLE',
|
|
];
|
|
$config = IfoodConfig::where('empresa_id', request()->empresa_id)->first();
|
|
|
|
$result = $this->util->updateStatusProduct($config, $data, $item->ifood_id_aux);
|
|
|
|
if($result['http_code'] == 200){
|
|
$item->status = 'UNAVAILABLE';
|
|
$item->save();
|
|
}
|
|
session()->flash("flash_success", "Produto desativado!");
|
|
return redirect()->back();
|
|
}
|
|
|
|
}
|