2824 lines
107 KiB
PHP
2824 lines
107 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Produto;
|
|
use App\Models\Empresa;
|
|
use App\Models\CategoriaProduto;
|
|
use App\Models\UnidadeMedida;
|
|
use App\Models\TamanhoPizza;
|
|
use App\Models\PadraoTributacaoProduto;
|
|
use App\Models\ProdutoPizzaValor;
|
|
use App\Models\ProdutoCombo;
|
|
use App\Models\IfoodConfig;
|
|
use App\Models\CategoriaWoocommerce;
|
|
use App\Models\MovimentacaoProduto;
|
|
use App\Models\ProdutoIbpt;
|
|
use Illuminate\Http\Request;
|
|
use App\Utils\UploadUtil;
|
|
use App\Utils\IfoodUtil;
|
|
use App\Imports\ProdutoImport;
|
|
use App\Models\Marca;
|
|
use App\Models\ModeloEtiqueta;
|
|
use App\Models\ConfigGeral;
|
|
use App\Models\ProdutoUnico;
|
|
use App\Models\Estoque;
|
|
use App\Models\ProdutoLocalizacao;
|
|
use App\Models\GaleriaProduto;
|
|
use App\Models\ProdutoVariacao;
|
|
use App\Models\VariacaoModelo;
|
|
use App\Models\VariacaoModeloItem;
|
|
use App\Models\CategoriaProdutoIfood;
|
|
use App\Models\ListaPreco;
|
|
use App\Models\VendiZapConfig;
|
|
use App\Models\ItemListaPreco;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Models\MercadoLivreConfig;
|
|
use App\Utils\MercadoLivreUtil;
|
|
use App\Utils\NuvemShopUtil;
|
|
use App\Utils\EstoqueUtil;
|
|
use App\Utils\WoocommerceUtil;
|
|
use App\Rules\ValidaReferenciaBalanca;
|
|
use App\Rules\ValidaCodigoBarrasUnico;
|
|
use App\Exports\ProdutoExport;
|
|
use App\Services\IbptService;
|
|
|
|
class ProdutoController extends Controller
|
|
{
|
|
|
|
protected $util;
|
|
protected $utilMercadoLivre;
|
|
protected $utilEstoque;
|
|
protected $utilNuvemShop;
|
|
protected $utilWocommerce;
|
|
protected $utilIfood;
|
|
|
|
public function __construct(UploadUtil $util, MercadoLivreUtil $utilMercadoLivre,
|
|
EstoqueUtil $utilEstoque, NuvemShopUtil $utilNuvemShop, WoocommerceUtil $utilWocommerce, IfoodUtil $utilIfood)
|
|
{
|
|
$this->util = $util;
|
|
$this->utilMercadoLivre = $utilMercadoLivre;
|
|
$this->utilEstoque = $utilEstoque;
|
|
$this->utilNuvemShop = $utilNuvemShop;
|
|
$this->utilWocommerce = $utilWocommerce;
|
|
$this->utilIfood = $utilIfood;
|
|
|
|
$this->middleware('permission:produtos_create', ['only' => ['create', 'store']]);
|
|
$this->middleware('permission:produtos_edit', ['only' => ['edit', 'update']]);
|
|
$this->middleware('permission:produtos_view', ['only' => ['show', 'index']]);
|
|
$this->middleware('permission:produtos_delete', ['only' => ['destroy']]);
|
|
}
|
|
|
|
private function insertUnidadesMedida($empresa_id){
|
|
$unidade = UnidadeMedida::where('empresa_id', $empresa_id)->first();
|
|
if($unidade == null){
|
|
foreach(UnidadeMedida::unidadesMedidaPadrao() as $u){
|
|
UnidadeMedida::create([
|
|
'empresa_id' => $empresa_id,
|
|
'status' => 1,
|
|
'nome' => $u
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function setNumeroSequencial(){
|
|
$produtos = Produto::where('empresa_id', request()->empresa_id)
|
|
->where('numero_sequencial', null)
|
|
->get();
|
|
|
|
$numero = __getUltimoNumeroSequencial(request()->empresa_id, 'produtos');
|
|
// $numero++;
|
|
|
|
foreach($produtos as $produto){
|
|
$numero++;
|
|
$produto->numero_sequencial = $numero;
|
|
$produto->save();
|
|
}
|
|
|
|
__setUltimoNumeroSequencial(request()->empresa_id, 'produtos', $numero);
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$this->setNumeroSequencial();
|
|
$this->insertUnidadesMedida($request->empresa_id);
|
|
$locais = __getLocaisAtivoUsuario();
|
|
$locais = $locais->pluck(['id']);
|
|
$tipo = $request->tipo;
|
|
$local_id = $request->get('local_id');
|
|
$start_date = $request->get('start_date');
|
|
$end_date = $request->get('end_date');
|
|
$com_variacao = $request->get('com_variacao');
|
|
$ordem = $request->get('ordem');
|
|
$com_imagem = $request->get('com_imagem');
|
|
$status = $request->get('status');
|
|
$gerenciar_estoque = $request->get('gerenciar_estoque');
|
|
$sem_custo = $request->get('sem_custo');
|
|
$parados_90 = $request->get('parados_90');
|
|
|
|
$produtosParados = null;
|
|
|
|
if($parados_90 == 1){
|
|
|
|
$dataLimite = now()->subDays(90);
|
|
|
|
$produtosParados = DB::table('produtos')
|
|
->leftJoin('estoques', 'estoques.produto_id', '=', 'produtos.id')
|
|
->select('produtos.id')
|
|
->leftJoin(DB::raw("
|
|
(
|
|
SELECT produto_id, MAX(created_at) AS ultima_venda
|
|
FROM (
|
|
SELECT produto_id, created_at FROM item_nves
|
|
UNION ALL
|
|
SELECT produto_id, created_at FROM item_nfces
|
|
) vendas
|
|
GROUP BY produto_id
|
|
) ultimas_vendas
|
|
"), 'ultimas_vendas.produto_id', '=', 'produtos.id')
|
|
|
|
->where('produtos.empresa_id', $request->empresa_id)
|
|
->where('produtos.status', 1)
|
|
->where('produtos.gerenciar_estoque', 1)
|
|
->where('estoques.quantidade', '>', 0)
|
|
|
|
->where(function ($q) use ($dataLimite) {
|
|
$q->whereNull('ultimas_vendas.ultima_venda')
|
|
->orWhere('ultimas_vendas.ultima_venda', '<', $dataLimite);
|
|
})
|
|
->get();
|
|
$produtosParados = $produtosParados->pluck('id')->toArray();
|
|
}
|
|
|
|
$data = Produto::where('empresa_id', request()->empresa_id)
|
|
->select('produtos.*')
|
|
->when(!empty($start_date), function ($query) use ($start_date) {
|
|
return $query->whereDate('produtos.created_at', '>=', $start_date);
|
|
})
|
|
->when(!empty($end_date), function ($query) use ($end_date) {
|
|
return $query->whereDate('produtos.created_at', '<=', $end_date);
|
|
})
|
|
->when(!empty($request->nome), function ($q) use ($request) {
|
|
return $q->where('nome', 'LIKE', "%$request->nome%");
|
|
})
|
|
->when(!empty($request->codigo_barras), function ($q) use ($request) {
|
|
return $q->where('codigo_barras', 'LIKE', "%$request->codigo_barras%");
|
|
})
|
|
->when(!empty($request->marca_id), function ($q) use ($request) {
|
|
return $q->where('marca_id', $request->marca_id);
|
|
})
|
|
->when(!empty($request->categoria_id), function ($q) use ($request) {
|
|
return $q->where(function($t) use ($request)
|
|
{
|
|
$t->where('categoria_id', $request->categoria_id)->orWhere('sub_categoria_id', $request->categoria_id);
|
|
});
|
|
})
|
|
->when(!empty($com_variacao), function ($q) use ($com_variacao) {
|
|
return $q->where('variacao_modelo_id', $com_variacao);
|
|
})
|
|
->when(!empty($status), function ($q) use ($status) {
|
|
return $q->where('status', $status);
|
|
})
|
|
->when(!empty($gerenciar_estoque), function ($q) use ($gerenciar_estoque) {
|
|
return $q->where('gerenciar_estoque', $gerenciar_estoque == 1 ? 1 : 0);
|
|
})
|
|
->when($com_imagem != '', function ($q) use ($com_imagem) {
|
|
if($com_imagem == 1){
|
|
return $q->where('imagem', '!=', '');
|
|
}else{
|
|
// return $q->where('imagem', '')->orWhere('imagem', null);
|
|
return $q->where(function($t)
|
|
{
|
|
$t->where('imagem', '')->orWhere('imagem', null);
|
|
});
|
|
}
|
|
})
|
|
->when(!empty($tipo), function ($q) use ($tipo) {
|
|
if($tipo == 'composto'){
|
|
return $q->where('composto', 1);
|
|
}
|
|
if($tipo == 'variavel'){
|
|
return $q->where('variacao_modelo_id', '!=', null);
|
|
}
|
|
if($tipo == 'combo'){
|
|
return $q->where('combo', 1);
|
|
}
|
|
})
|
|
->when($local_id, function ($query) use ($local_id) {
|
|
return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
|
|
->where('produto_localizacaos.localizacao_id', $local_id);
|
|
})
|
|
->when(!$local_id, function ($query) use ($locais) {
|
|
return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
|
|
->whereIn('produto_localizacaos.localizacao_id', $locais);
|
|
})
|
|
->when(!$ordem, function ($query) {
|
|
return $query->orderBy('nome');
|
|
})
|
|
->when($ordem, function ($query) use ($ordem) {
|
|
return $query->orderBy($ordem, $ordem == 'created_at' ? 'desc' : 'asc');
|
|
})
|
|
->when($sem_custo == 1, function ($q) use ($request) {
|
|
return $q->where('valor_compra', 0)->where('status', 1)
|
|
->where('gerenciar_estoque', 1);
|
|
})
|
|
->when($parados_90 == 1, function ($q) use ($produtosParados) {
|
|
return $q->whereIn('produto_id', $produtosParados);
|
|
})
|
|
->distinct('produtos.id')
|
|
->paginate(__itensPagina());
|
|
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->orderBy('nome')
|
|
->where('status', 1)->get();
|
|
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)
|
|
->orderBy('nome')->get();
|
|
|
|
$empresa = Empresa::findOrFail(request()->empresa_id);
|
|
|
|
$configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
$tipoExibe = $configGeral && $configGeral->produtos_exibe_tabela == 0
|
|
? 'card'
|
|
: 'tabela';
|
|
|
|
$usarDropdown = 0;
|
|
if($configGeral){
|
|
$usarDropdown = $configGeral->usar_dropdown_acoes;
|
|
}
|
|
|
|
return view('produtos.index', compact('data', 'categorias', 'empresa', 'tipoExibe', 'marcas', 'usarDropdown'));
|
|
}
|
|
|
|
public function create(Request $request)
|
|
{
|
|
$this->insertUnidadesMedida($request->empresa_id);
|
|
$empresa = Empresa::findOrFail(request()->empresa_id);
|
|
|
|
$listaCTSCSOSN = Produto::listaCSOSN();
|
|
if ($empresa->tributacao == 'Regime Normal') {
|
|
$listaCTSCSOSN = Produto::listaCST();
|
|
}
|
|
|
|
$padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->where('categoria_id', null)
|
|
->where('status', 1)->get();
|
|
$cardapio = 0;
|
|
if (isset($request->cardapio)) {
|
|
$cardapio = 1;
|
|
}
|
|
|
|
$delivery = 0;
|
|
if (isset($request->delivery)) {
|
|
$delivery = 1;
|
|
}
|
|
|
|
$ecommerce = 0;
|
|
if (isset($request->ecommerce)) {
|
|
$ecommerce = 1;
|
|
}
|
|
|
|
$mercadolivre = 0;
|
|
if (isset($request->mercadolivre)) {
|
|
$mercadolivre = 1;
|
|
}
|
|
|
|
$nuvemshop = 0;
|
|
if (isset($request->nuvemshop)) {
|
|
$nuvemshop = 1;
|
|
}
|
|
|
|
$reserva = 0;
|
|
if (isset($request->reserva)) {
|
|
$reserva = 1;
|
|
}
|
|
|
|
$woocommerce = 0;
|
|
if (isset($request->woocommerce)) {
|
|
$woocommerce = 1;
|
|
}
|
|
|
|
$ifood = 0;
|
|
if (isset($request->ifood)) {
|
|
$ifood = 1;
|
|
}
|
|
|
|
$vendizap = 0;
|
|
if (isset($request->vendizap)) {
|
|
$vendizap = 1;
|
|
}
|
|
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
$variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
$padraoTributacao = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->where('padrao', 1)
|
|
->first();
|
|
|
|
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();
|
|
$categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
$unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->get();
|
|
return view('produtos.create',
|
|
compact('listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes',
|
|
'padraoTributacao', 'ecommerce', 'configMercadoLivre', 'mercadolivre', 'configGeral', 'nuvemshop',
|
|
'reserva', 'woocommerce', 'categoriasWoocommerce', 'unidades', 'ifood', 'categoriasProdutoIfood', 'vendizap'));
|
|
}
|
|
|
|
public function edit(Request $request, $id)
|
|
{
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$empresa = Empresa::findOrFail(request()->empresa_id);
|
|
|
|
$listaCTSCSOSN = Produto::listaCSOSN();
|
|
if ($empresa->tributacao == 'Regime Normal') {
|
|
$listaCTSCSOSN = Produto::listaCST();
|
|
}
|
|
$padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->where('categoria_id', null)
|
|
->where('status', 1)->get();
|
|
$cardapio = 0;
|
|
if (isset($request->cardapio)) {
|
|
$cardapio = 1;
|
|
}
|
|
|
|
$delivery = 0;
|
|
if (isset($request->delivery)) {
|
|
$delivery = 1;
|
|
}
|
|
|
|
$ecommerce = 0;
|
|
if (isset($request->ecommerce)) {
|
|
$ecommerce = 1;
|
|
}
|
|
|
|
$mercadolivre = 0;
|
|
if (isset($request->mercadolivre)) {
|
|
$mercadolivre = 1;
|
|
}
|
|
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)->get();
|
|
$variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
$unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
$configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
$categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
return view('produtos.edit',
|
|
compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes',
|
|
'ecommerce', 'mercadolivre', 'configMercadoLivre', 'categoriasWoocommerce', 'unidades', 'configGeral',
|
|
'categoriasProdutoIfood'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$this->__validate($request);
|
|
$produto = null;
|
|
try {
|
|
$file_name = '';
|
|
if ($request->hasFile('image')) {
|
|
$file_name = $this->util->uploadImage($request, '/produtos');
|
|
}
|
|
$categorias_woocommerce = [];
|
|
if($request->categorias_woocommerce){
|
|
for($i=0; $i<sizeof($request->categorias_woocommerce); $i++){
|
|
array_push($categorias_woocommerce, $request->categorias_woocommerce[$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 = __getUltimoNumeroSequencial($request->empresa_id, 'produtos');
|
|
$numeroSequencial++;
|
|
$request->merge([
|
|
'woocommerce_valor' => $request->woocommerce_valor > 0 ? __convert_value_bd($request->woocommerce_valor) : __convert_value_bd($request->valor_unitario),
|
|
'valor_unitario' => __convert_value_bd($request->valor_unitario),
|
|
'valor_prazo' => __convert_value_bd($request->valor_prazo),
|
|
'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
|
|
'valor_minimo_venda' => $request->valor_minimo_venda ? __convert_value_bd($request->valor_minimo_venda) : 0,
|
|
'imagem' => $file_name,
|
|
'codigo_anp' => $request->codigo_anp ?? '',
|
|
'perc_glp' => $request->perc_glp ? __convert_value_bd($request->perc_glp) : 0,
|
|
'perc_gnn' => $request->perc_gnn ? __convert_value_bd($request->perc_gnn) : 0,
|
|
'perc_gni' => $request->perc_gni ? __convert_value_bd($request->perc_gni) : 0,
|
|
'valor_partida' => $request->valor_partida ? __convert_value_bd($request->valor_partida) : 0,
|
|
'unidade_tributavel' => $request->unidade_tributavel ?? '',
|
|
'quantidade_tributavel' => $request->quantidade_tributavel ? __convert_value_bd($request->quantidade_tributavel) : 0,
|
|
'adRemICMSRet' => $request->adRemICMSRet ? __convert_value_bd($request->adRemICMSRet) : 0,
|
|
'pBio' => $request->pBio ? __convert_value_bd($request->pBio) : 0,
|
|
'pOrig' => $request->pOrig ? __convert_value_bd($request->pOrig) : 0,
|
|
'estoque_inicial' => $request->estoque_inicial ? __convert_value_bd($request->estoque_inicial) : 0,
|
|
'indImport' => $request->indImport ?? '',
|
|
'cUFOrig' => $request->cUFOrig ?? '',
|
|
'cardapio' => $request->cardapio ? 1 : 0,
|
|
'delivery' => $request->delivery ? 1 : 0,
|
|
'ecommerce' => $request->ecommerce ? 1 : 0,
|
|
'reserva' => $request->reserva ? 1 : 0,
|
|
'texto_delivery' => $request->texto_delivery ?? '',
|
|
'texto_nuvem_shop' => $request->texto_nuvem_shop ?? '',
|
|
'mercado_livre_descricao' => $request->mercado_livre_descricao ?? '',
|
|
'estoque_minimo' => $request->estoque_minimo ? __convert_value_bd($request->estoque_minimo) : 0,
|
|
'mercado_livre_valor' => $request->mercado_livre_valor ? __convert_value_bd($request->mercado_livre_valor) : 0,
|
|
'perc_icms' => $request->perc_icms ?? 0,
|
|
'perc_pis' => $request->perc_pis ?? 0,
|
|
'perc_cofins' => $request->perc_cofins ?? 0,
|
|
'perc_ipi' => $request->perc_ipi ?? 0,
|
|
'perc_ibs_uf' => $request->perc_ibs_uf ?? 0,
|
|
'perc_ibs_mun' => $request->perc_ibs_mun ?? 0,
|
|
'perc_cbs' => $request->perc_cbs ?? 0,
|
|
'perc_dif' => $request->perc_dif ?? 0,
|
|
|
|
'cfop_estadual' => $request->cfop_estadual ?? '',
|
|
'cfop_outro_estado' => $request->cfop_outro_estado ?? '',
|
|
'sub_categoria_id' => $request->sub_categoria_id ?? null,
|
|
'valor_combo' => $request->valor_combo ? __convert_value_bd($request->valor_combo) : 0,
|
|
'margem_combo' => $request->margem_combo ? __convert_value_bd($request->margem_combo) : 0,
|
|
'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : 0,
|
|
'categorias_woocommerce' => json_encode($categorias_woocommerce),
|
|
|
|
'woocommerce_descricao' => $request->woocommerce_descricao ?? '',
|
|
'numero_sequencial' => $numeroSequencial
|
|
]);
|
|
|
|
__setUltimoNumeroSequencial($request->empresa_id, 'produtos', $numeroSequencial);
|
|
|
|
if ($request->cardapio) {
|
|
$request->merge([
|
|
'valor_cardapio' => $request->valor_cardapio ? __convert_value_bd($request->valor_cardapio) :
|
|
$request->valor_unitario
|
|
]);
|
|
}
|
|
|
|
if ($request->delivery) {
|
|
$request->merge([
|
|
'valor_delivery' => $request->valor_delivery ? __convert_value_bd($request->valor_delivery) :
|
|
$request->valor_unitario,
|
|
'hash_delivery' => Str::random(50),
|
|
]);
|
|
}
|
|
|
|
if ($request->ecommerce) {
|
|
$request->merge([
|
|
'valor_ecommerce' => $request->valor_ecommerce ? __convert_value_bd($request->valor_ecommerce) :
|
|
$request->valor_unitario,
|
|
'hash_ecommerce' => Str::random(50),
|
|
'texto_ecommerce' => $request->texto_ecommerce ?? ''
|
|
]);
|
|
// dd($request->all());
|
|
}else{
|
|
$request->merge([
|
|
'texto_ecommerce' => ''
|
|
]);
|
|
}
|
|
|
|
$locais = isset($request->locais) ? $request->locais : [];
|
|
|
|
$produto = DB::transaction(function () use ($request, $locais) {
|
|
$produto = Produto::create($request->all());
|
|
|
|
if($request->combo == 1 && $request->produto_combo_id){
|
|
for($i=0; $i<sizeof($request->produto_combo_id); $i++){
|
|
ProdutoCombo::create([
|
|
'produto_id' => $produto->id,
|
|
'item_id' => $request->produto_combo_id[$i],
|
|
'quantidade' => $request->quantidade_combo[$i],
|
|
'valor_compra' => __convert_value_bd($request->valor_compra_combo[$i]),
|
|
'sub_total' => __convert_value_bd($request->subtotal_combo[$i])
|
|
]);
|
|
}
|
|
}
|
|
// dd($request->all());
|
|
if($request->variavel){
|
|
for($i=0; $i<sizeof($request->valor_venda_variacao); $i++){
|
|
$file_name = '';
|
|
if(isset($request->imagem_variacao[$i])){
|
|
// requisição com imagem
|
|
$imagem = $request->imagem_variacao[$i];
|
|
$file_name = $this->util->uploadImageArray($imagem, '/produtos');
|
|
}
|
|
|
|
$dataVariacao = [
|
|
'produto_id' => $produto->id,
|
|
'descricao' => $request->descricao_variacao[$i],
|
|
'valor' => __convert_value_bd($request->valor_venda_variacao[$i]),
|
|
'codigo_barras' => $request->codigo_barras_variacao[$i],
|
|
'referencia' => $request->referencia_variacao[$i],
|
|
'imagem' => $file_name,
|
|
'variacao_modelo_item_id' => $request->variacao_modelo_item_id[$i]
|
|
];
|
|
$variacao = ProdutoVariacao::create($dataVariacao);
|
|
|
|
if($request->estoque_variacao[$i] && sizeof($locais) <= 1){
|
|
$qtd = __convert_value_bd($request->estoque_variacao[$i]);
|
|
$this->utilEstoque->incrementaEstoque($produto->id, $qtd, $variacao->id);
|
|
$transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($produto->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $variacao->id);
|
|
}
|
|
}
|
|
}else{
|
|
|
|
if($request->estoque_inicial && sizeof($locais) <= 1){
|
|
|
|
$this->utilEstoque->incrementaEstoque($produto->id, $request->estoque_inicial, null);
|
|
$transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
|
|
|
|
$tipo = 'incremento';
|
|
if($transacao != null){
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($produto->id, $request->estoque_inicial, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
|
|
}else{
|
|
// combo
|
|
foreach($produto->itensDoCombo as $c){
|
|
$transacao = Estoque::where('produto_id', $c->item_id)->orderBy('id', 'desc')->first();
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($c->item_id, $request->estoque_inicial, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->insereEmListaDePrecos($produto);
|
|
|
|
if($request->mercadolivre){
|
|
$resp = $this->criaAnuncio($request, $produto);
|
|
if(isset($resp['erro'])){
|
|
DB::rollBack();
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $resp['msg']
|
|
];
|
|
}else{
|
|
$resp = $resp['retorno'];
|
|
$produto->mercado_livre_link = $resp->permalink;
|
|
$produto->mercado_livre_id = $resp->id;
|
|
$produto->save();
|
|
}
|
|
}
|
|
|
|
if($request->woocommerce){
|
|
$resp = $this->criaProdutoWoocommerce($request, $produto);
|
|
if(isset($resp['erro'])){
|
|
DB::rollBack();
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $resp['msg']
|
|
];
|
|
}else{
|
|
$produto->woocommerce_id = $resp['product_id'];
|
|
$produto->save();
|
|
}
|
|
}
|
|
|
|
if($request->ifood){
|
|
$resp = $this->criaProdutoIfood($request, $produto);
|
|
if(isset($resp->id)){
|
|
session()->flash("flash_success", "Produto Ifood");
|
|
}
|
|
}
|
|
|
|
if($request->vendizap){
|
|
$resp = $this->criaProdutoVendiZap($request, $produto);
|
|
}
|
|
|
|
if($request->nuvemshop){
|
|
$resp = $this->utilNuvemShop->create($request, $produto);
|
|
}
|
|
|
|
|
|
return $produto;
|
|
});
|
|
|
|
|
|
|
|
if(isset($produto['erro'])){
|
|
session()->flash("flash_error", $produto['msg']);
|
|
return redirect()->back();
|
|
}
|
|
session()->flash("flash_success", "Produto cadastrado!");
|
|
|
|
if(sizeof($locais) >= 2){
|
|
for($i=0; $i<sizeof($locais); $i++){
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $produto->id,
|
|
'localizacao_id' => $locais[$i]
|
|
]);
|
|
}
|
|
session()->flash("flash_success", "Produto cadastrado, informe o estoque de cada localização!");
|
|
return redirect()->route('estoque-localizacao.define', [$produto->id]);
|
|
}else{
|
|
|
|
if(sizeof($locais) == 1){
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $produto->id,
|
|
'localizacao_id' => $locais[0]
|
|
]);
|
|
}else{
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $produto->id,
|
|
'localizacao_id' => $request->local_id
|
|
]);
|
|
}
|
|
}
|
|
|
|
__createLog($request->empresa_id, 'Produto', 'cadastrar', $produto->nome);
|
|
if ($request->composto == true) {
|
|
session()->flash("flash_success", "Produto cadastrado, informe a composição!");
|
|
return redirect()->route('produto-composto.create', [$produto->id]);
|
|
}
|
|
} catch (\Exception $e) {
|
|
// echo $e->getMessage() . "<br>";
|
|
// echo $e->getLine() . "<br>";
|
|
// die;
|
|
__createLog($request->empresa_id, 'Produto', 'erro', $e->getMessage());
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
|
|
if ($produto->categoria && $produto->categoria->tipo_pizza) {
|
|
return redirect()->route('produtos.tamanho-pizza', [$produto->id]);
|
|
}
|
|
|
|
if (isset($request->redirect_cardapio)) {
|
|
return redirect()->route('produtos-cardapio.index');
|
|
}
|
|
|
|
if (isset($request->redirect_delivery)) {
|
|
return redirect()->route('produtos-delivery.index');
|
|
}
|
|
if (isset($request->redirect_reserva)) {
|
|
return redirect()->route('produtos-reserva.index');
|
|
}
|
|
|
|
if (isset($request->redirect_nuvemshop)) {
|
|
return redirect()->route('nuvem-shop-produtos.index');
|
|
}
|
|
|
|
if (isset($request->redirect_ecommerce)) {
|
|
return redirect()->route('produtos-ecommerce.index');
|
|
}
|
|
if (isset($request->redirect_mercadolivre)) {
|
|
return redirect()->route('mercado-livre-produtos.index');
|
|
}
|
|
|
|
if (isset($request->redirect_mercadolivre)) {
|
|
return redirect()->route('mercado-livre-produtos.index');
|
|
}
|
|
|
|
if (isset($request->redirect_vendizap) && $produto->vendizap_id != null) {
|
|
session()->flash("swal_success", "Produto cadastrado na plataforma, você pode continuar preenchendo os campos restantes!");
|
|
|
|
return redirect()->route('vendizap-produtos.edit', [$produto->vendizap_id]);
|
|
}
|
|
|
|
if($request->adicionar_outro){
|
|
return redirect()->route('produtos.duplicar',[$produto->id]);
|
|
}
|
|
|
|
if($request->ifood){
|
|
return redirect()->route('ifood-produtos.index');
|
|
}
|
|
|
|
return redirect()->route('produtos.index', ['status=1']);
|
|
}
|
|
|
|
private function insereEmListaDePrecos($produto){
|
|
$listas = ListaPreco::where('empresa_id', $produto->empresa_id)
|
|
->get();
|
|
foreach($listas as $l){
|
|
$valor = 0;
|
|
if($l->ajuste_sobre == 'valor_venda'){
|
|
if($l->tipo == 'incremento'){
|
|
if($l->percentual_alteracao > 0){
|
|
$valor = $produto->valor_unitario + ($produto->valor_unitario*($l->percentual_alteracao/100));
|
|
}else{
|
|
$valor = $produto->valor_unitario + $l->valor_alteracao;
|
|
}
|
|
}else{
|
|
if($l->percentual_alteracao > 0){
|
|
$valor = $produto->valor_unitario - ($produto->valor_unitario*($l->percentual_alteracao/100));
|
|
}else{
|
|
$valor = $produto->valor_unitario - $l->valor_alteracao;
|
|
}
|
|
}
|
|
|
|
}else{
|
|
if($l->tipo == 'incremento'){
|
|
if($l->percentual_alteracao > 0){
|
|
$valor = $produto->valor_compra + ($produto->valor_compra*($l->percentual_alteracao/100));
|
|
}else{
|
|
$valor = $produto->valor_compra + $l->valor_alteracao;
|
|
}
|
|
}else{
|
|
if($l->percentual_alteracao > 0){
|
|
$valor = $produto->valor_compra - ($produto->valor_compra*($l->percentual_alteracao/100));
|
|
}else{
|
|
$valor = $produto->valor_compra - $l->valor_alteracao;
|
|
}
|
|
}
|
|
}
|
|
ItemListaPreco::create([
|
|
'lista_id' => $l->id,
|
|
'produto_id' => $produto->id,
|
|
'valor' => $valor,
|
|
'percentual_lucro' => $l->percentual_alteracao
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try {
|
|
$file_name = $item->imagem;
|
|
|
|
if ($request->hasFile('image')) {
|
|
$this->util->unlinkImage($item, '/produtos');
|
|
$file_name = $this->util->uploadImage($request, '/produtos');
|
|
}
|
|
|
|
$categorias_woocommerce = [];
|
|
if($request->categorias_woocommerce){
|
|
for($i=0; $i<sizeof($request->categorias_woocommerce); $i++){
|
|
array_push($categorias_woocommerce, $request->categorias_woocommerce[$i]);
|
|
}
|
|
}
|
|
$request->merge([
|
|
'valor_unitario' => __convert_value_bd($request->valor_unitario),
|
|
'valor_prazo' => __convert_value_bd($request->valor_prazo),
|
|
'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
|
|
'valor_minimo_venda' => $request->valor_minimo_venda ? __convert_value_bd($request->valor_minimo_venda) : 0,
|
|
'imagem' => $file_name,
|
|
'codigo_anp' => $request->codigo_anp ?? '',
|
|
'perc_glp' => $request->perc_glp ? __convert_value_bd($request->perc_glp) : 0,
|
|
'perc_gnn' => $request->perc_gnn ? __convert_value_bd($request->perc_gnn) : 0,
|
|
'perc_gni' => $request->perc_gni ? __convert_value_bd($request->perc_gni) : 0,
|
|
'valor_partida' => $request->valor_partida ? __convert_value_bd($request->valor_partida) : 0,
|
|
'unidade_tributavel' => $request->unidade_tributavel ?? '',
|
|
'quantidade_tributavel' => $request->quantidade_tributavel ? __convert_value_bd($request->quantidade_tributavel) : 0,
|
|
'adRemICMSRet' => $request->adRemICMSRet ? __convert_value_bd($request->adRemICMSRet) : 0,
|
|
'pBio' => $request->pBio ? __convert_value_bd($request->pBio) : 0,
|
|
'pOrig' => $request->pOrig ? __convert_value_bd($request->pOrig) : 0,
|
|
'indImport' => $request->indImport ?? '',
|
|
'cUFOrig' => $request->cUFOrig ?? '',
|
|
'cardapio' => $request->cardapio ? 1 : 0,
|
|
'delivery' => $request->delivery ? 1 : 0,
|
|
'ecommerce' => $request->ecommerce ? 1 : 0,
|
|
'reserva' => $request->reserva ? 1 : 0,
|
|
'texto_delivery' => $request->texto_delivery ?? '',
|
|
'texto_nuvem_shop' => $request->texto_nuvem_shop ?? '',
|
|
'mercado_livre_descricao' => $request->mercado_livre_descricao ?? '',
|
|
'estoque_minimo' => $request->estoque_minimo ? __convert_value_bd($request->estoque_minimo) : 0,
|
|
'mercado_livre_valor' => $request->mercado_livre_valor ? __convert_value_bd($request->mercado_livre_valor) : 0,
|
|
|
|
'perc_icms' => $request->perc_icms ?? 0,
|
|
'perc_pis' => $request->perc_pis ?? 0,
|
|
'perc_cofins' => $request->perc_cofins ?? 0,
|
|
'perc_ipi' => $request->perc_ipi ?? 0,
|
|
'cfop_estadual' => $request->cfop_estadual ?? '',
|
|
'cfop_outro_estado' => $request->cfop_outro_estado ?? '',
|
|
'valor_combo' => $request->valor_combo ? __convert_value_bd($request->valor_combo) : 0,
|
|
'margem_combo' => $request->margem_combo ? __convert_value_bd($request->margem_combo) : 0,
|
|
'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : 0,
|
|
'categorias_woocommerce' => json_encode($categorias_woocommerce),
|
|
'woocommerce_descricao' => $request->woocommerce_descricao ?? '',
|
|
|
|
]);
|
|
|
|
if ($request->cardapio) {
|
|
$request->merge([
|
|
'valor_cardapio' => $request->valor_cardapio ? __convert_value_bd($request->valor_cardapio) :
|
|
$request->valor_unitario,
|
|
]);
|
|
}
|
|
|
|
if ($request->delivery) {
|
|
$request->merge([
|
|
'valor_delivery' => $request->valor_delivery ? __convert_value_bd($request->valor_delivery) :
|
|
$request->valor_unitario,
|
|
'hash_delivery' => $item->hash_delivery != null ? $item->hash_delivery : Str::random(50),
|
|
]);
|
|
}
|
|
|
|
if ($request->ecommerce) {
|
|
$request->merge([
|
|
'valor_ecommerce' => $request->valor_ecommerce ? __convert_value_bd($request->valor_ecommerce) :
|
|
$request->valor_ecommerce,
|
|
'hash_ecommerce' => $item->hash_ecommerce != null ? $item->hash_ecommerce : Str::random(50),
|
|
'texto_ecommerce' => $request->texto_ecommerce ?? ''
|
|
]);
|
|
}
|
|
|
|
$item->fill($request->all())->save();
|
|
|
|
if($request->variavel){
|
|
|
|
// $item->variacoes()->delete();
|
|
$variacaoDelete = [];
|
|
$locais = isset($request->locais) ? $request->locais : [];
|
|
|
|
for($i=0; $i<sizeof($request->valor_venda_variacao); $i++){
|
|
$dataVariacao = [
|
|
'produto_id' => $item->id,
|
|
'descricao' => $request->descricao_variacao[$i],
|
|
'valor' => __convert_value_bd($request->valor_venda_variacao[$i]),
|
|
'codigo_barras' => $request->codigo_barras_variacao[$i],
|
|
'referencia' => $request->referencia_variacao[$i],
|
|
];
|
|
if(isset($request->variacao_id[$i])){
|
|
$variacao = ProdutoVariacao::findOrfail($request->variacao_id[$i]);
|
|
|
|
$file_name = $variacao->imagem;
|
|
|
|
if(isset($request->imagem_variacao[$i])){
|
|
|
|
if($file_name != null){
|
|
$this->util->unlinkImage($variacao, '/produtos');
|
|
}
|
|
// requisição com imagem
|
|
$imagem = $request->imagem_variacao[$i];
|
|
$file_name = $this->util->uploadImageArray($imagem, '/produtos');
|
|
|
|
}
|
|
$dataVariacao['imagem'] = $file_name;
|
|
|
|
$variacao->fill($dataVariacao)->save();
|
|
$variacaoDelete[] = $request->variacao_id[$i];
|
|
}else{
|
|
|
|
$file_name = '';
|
|
if(isset($request->imagem_variacao[$i])){
|
|
// requisição com imagem
|
|
$imagem = $request->imagem_variacao[$i];
|
|
$file_name = $this->util->uploadImageArray($imagem, '/produtos');
|
|
}
|
|
$dataVariacao['imagem'] = $file_name;
|
|
$variacao = ProdutoVariacao::create($dataVariacao);
|
|
|
|
if($request->estoque_variacao[$i] && sizeof($locais) <= 1){
|
|
$qtd = __convert_value_bd($request->estoque_variacao[$i]);
|
|
$this->utilEstoque->incrementaEstoque($item->id, $qtd, $variacao->id);
|
|
$transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($item->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $variacao->id);
|
|
}
|
|
$variacaoDelete[] = $variacao->id;
|
|
}
|
|
}
|
|
|
|
foreach($item->variacoes as $v){
|
|
if(!in_array($v->id, $variacaoDelete)){
|
|
//verifica
|
|
|
|
$itemNfce = \App\Models\ItemNfce::where('variacao_id', $v->id)
|
|
->first();
|
|
$itemNfe = \App\Models\ItemNfe::where('variacao_id', $v->id)
|
|
->first();
|
|
if($itemNfce == null && $itemNfe == null){
|
|
if($v->estoque){
|
|
$v->estoque->delete();
|
|
}
|
|
if($v->movimentacaoProduto){
|
|
$v->movimentacaoProduto->delete();
|
|
}
|
|
$v->delete();
|
|
}else{
|
|
session()->flash("flash_error", "Esta variação $v->descricao já possui vendas ou compras não é possivel remover");
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
}
|
|
// dd($variacaoDelete);
|
|
}else{
|
|
ProdutoVariacao::where('produto_id', $item->id)->delete();
|
|
}
|
|
|
|
if($request->combo == 1 && $request->produto_combo_id){
|
|
$item->itensDoCombo()->delete();
|
|
for($i=0; $i<sizeof($request->produto_combo_id); $i++){
|
|
ProdutoCombo::create([
|
|
'produto_id' => $item->id,
|
|
'item_id' => $request->produto_combo_id[$i],
|
|
'quantidade' => $request->quantidade_combo[$i],
|
|
'valor_compra' => __convert_value_bd($request->valor_compra_combo[$i]),
|
|
'sub_total' => __convert_value_bd($request->subtotal_combo[$i])
|
|
]);
|
|
}
|
|
}
|
|
|
|
if($request->mercadolivre){
|
|
if($item->mercado_livre_id == null){
|
|
$resp = $this->criaAnuncio($request, $item);
|
|
}else{
|
|
$resp = $this->atualizaAnuncio($request, $item);
|
|
}
|
|
if(isset($resp['erro'])){
|
|
session()->flash("flash_error", $resp['msg']);
|
|
|
|
}else{
|
|
$resp = $resp['retorno'];
|
|
$item->mercado_livre_link = $resp->permalink;
|
|
$item->mercado_livre_id = $resp->id;
|
|
$item->save();
|
|
session()->flash("flash_success", "Produto atualizado!");
|
|
}
|
|
}else{
|
|
session()->flash("flash_success", "Produto atualizado!");
|
|
}
|
|
|
|
if($request->woocommerce){
|
|
if($item->woocommerce_id == null){
|
|
$resp = $this->criaProdutoWoocommerce($request, $item);
|
|
}else{
|
|
$resp = $this->atualizaProdutoWoocommerce($request, $item);
|
|
}
|
|
if(isset($resp['erro'])){
|
|
session()->flash("flash_error", $resp['msg']);
|
|
|
|
}else{
|
|
$item->woocommerce_id = $resp['product_id'];
|
|
$item->save();
|
|
session()->flash("flash_success", "Produto atualizado!");
|
|
|
|
}
|
|
}else{
|
|
session()->flash("flash_success", "Produto atualizado!");
|
|
}
|
|
|
|
if(isset($request->locais)){
|
|
|
|
$locais = __getLocaisAtivoUsuario();
|
|
$locais = $locais->pluck(['id'])->toArray();
|
|
|
|
foreach($item->locais as $l){
|
|
if(in_array($l->localizacao_id, $locais)){
|
|
$l->delete();
|
|
}
|
|
}
|
|
for($i=0; $i<sizeof($request->locais); $i++){
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $item->id,
|
|
'localizacao_id' => $request->locais[$i]
|
|
]);
|
|
}
|
|
}
|
|
|
|
__createLog($request->empresa_id, 'Produto', 'editar', $item->nome);
|
|
if ($request->composto == true) {
|
|
session()->flash("flash_success", "Produto atualizado, informe a composição!");
|
|
return redirect()->route('produto-composto.create', [$item->id]);
|
|
}
|
|
} catch (\Exception $e) {
|
|
__createLog($request->empresa_id, 'Produto', 'erro', $e->getMessage());
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
}
|
|
|
|
if (isset($request->redirect_cardapio)) {
|
|
return redirect()->route('produtos-cardapio.index');
|
|
}
|
|
if (isset($request->redirect_delivery)) {
|
|
return redirect()->route('produtos-delivery.index');
|
|
}
|
|
if (isset($request->redirect_reserva) || $item->reserva) {
|
|
return redirect()->route('produtos-reserva.index');
|
|
}
|
|
if (isset($request->redirect_ecommerce)) {
|
|
return redirect()->route('produtos-ecommerce.index');
|
|
}
|
|
if (isset($request->redirect_mercadolivre)) {
|
|
return redirect()->route('mercado-livre-produtos.index');
|
|
}
|
|
return redirect()->route('produtos.index', ['status=1']);
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try {
|
|
$descricaoLog = $item->nome;
|
|
|
|
$itemNfe = \App\Models\ItemNfe::where('produto_id', $item->id)
|
|
->first();
|
|
|
|
if($itemNfe){
|
|
session()->flash("flash_warning", "Não é possivel remover produto que foi comprado ou vendido!");
|
|
return redirect()->back();
|
|
}
|
|
DB::transaction(function () use ($item) {
|
|
|
|
if($item->estoque){
|
|
$item->estoque->delete();
|
|
}
|
|
$item->movimentacoes()->delete();
|
|
$item->variacoes()->delete();
|
|
$item->variacoesMercadoLivre()->delete();
|
|
$item->itemLista()->delete();
|
|
$item->ibpt()->delete();
|
|
// $item->itemNfe()->delete();
|
|
// $item->estoque()->delete();
|
|
$item->galeria()->delete();
|
|
|
|
// $item->itemNfce()->delete();
|
|
$item->itemCarrinhos()->delete();
|
|
$item->composicao()->delete();
|
|
$item->itemPreVenda()->delete();
|
|
$item->itensDoCombo()->delete();
|
|
$item->fornecedores()->delete();
|
|
$item->locais()->delete();
|
|
|
|
\App\Models\EstoqueAtualProduto::where('produto_id', $item->id)->delete();
|
|
\App\Models\ImpressoraPedidoProduto::where('produto_id', $item->id)->delete();
|
|
|
|
if($item->woocommerce_id){
|
|
$woocommerceClient = $this->utilWocommerce->getConfig($item->empresa_id);
|
|
$woocommerceClient->delete("products/$item->woocommerce_id", ['force' => true]);
|
|
}
|
|
|
|
$item->delete();
|
|
});
|
|
|
|
$this->util->unlinkImage($item, '/produtos');
|
|
__createLog(request()->empresa_id, 'Produto', 'excluir', $descricaoLog);
|
|
session()->flash("flash_success", "Produto removido!");
|
|
} catch (\Exception $e) {
|
|
__createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
|
|
session()->flash("flash_error", "Algo deu Errado: " . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroySelecet(Request $request)
|
|
{
|
|
$removidos = 0;
|
|
for($i=0; $i<sizeof($request->item_delete); $i++){
|
|
$item = Produto::findOrFail($request->item_delete[$i]);
|
|
$woocommerceClient = $this->utilWocommerce->getConfig($item->empresa_id);
|
|
$descricaoLog = $item->nome;
|
|
|
|
try {
|
|
$item->variacoes()->delete();
|
|
$item->variacoesMercadoLivre()->delete();
|
|
$item->itemLista()->delete();
|
|
$item->itemNfe()->delete();
|
|
$item->itemNfce()->delete();
|
|
$item->movimentacoes()->delete();
|
|
$item->composicao()->delete();
|
|
$item->itemPreVenda()->delete();
|
|
$item->locais()->delete();
|
|
\App\Models\ImpressoraPedidoProduto::where('produto_id', $item->id)->delete();
|
|
\App\Models\EstoqueAtualProduto::where('produto_id', $item->id)->delete();
|
|
|
|
if($item->estoque){
|
|
$item->estoque->delete();
|
|
}
|
|
|
|
if($item->woocommerce_id){
|
|
$woocommerceClient->delete("products/$item->woocommerce_id", ['force' => true]);
|
|
}
|
|
$item->delete();
|
|
$this->util->unlinkImage($item, '/produtos');
|
|
|
|
$removidos++;
|
|
__createLog(request()->empresa_id, 'Produto', 'excluir', $descricaoLog);
|
|
|
|
} catch (\Exception $e) {
|
|
__createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
return redirect()->route('produtos.index');
|
|
}
|
|
}
|
|
|
|
session()->flash("flash_success", "Total de itens removidos: $removidos!");
|
|
return redirect()->route('produtos.index');
|
|
}
|
|
|
|
public function desactiveSelecet(Request $request)
|
|
{
|
|
$alterados = 0;
|
|
for($i=0; $i<sizeof($request->item_delete); $i++){
|
|
$item = Produto::findOrFail($request->item_delete[$i]);
|
|
$descricaoLog = $item->nome;
|
|
|
|
try {
|
|
$item->status = 0;
|
|
$item->save();
|
|
$alterados++;
|
|
__createLog(request()->empresa_id, 'Produto', 'editar', $descricaoLog);
|
|
|
|
} catch (\Exception $e) {
|
|
__createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
}
|
|
|
|
session()->flash("flash_success", "Total de itens alterados: $alterados");
|
|
return redirect()->back();
|
|
}
|
|
|
|
private function __validate(Request $request)
|
|
{
|
|
$rules = [
|
|
'nome' => 'required',
|
|
// 'codigo_barras' => 'required',
|
|
// 'ncm' => 'required',
|
|
'descricao' => 'max:255',
|
|
'descricao_en' => 'max:255',
|
|
'descricao_es' => 'max:255',
|
|
'unidade' => 'required',
|
|
'cst_csosn' => 'required',
|
|
'cst_pis' => 'required',
|
|
'cst_cofins' => 'required',
|
|
'cst_ipi' => 'required',
|
|
'valor_unitario' => 'required',
|
|
'codigo_barras' => [new ValidaCodigoBarrasUnico($request->empresa_id)],
|
|
'referencia_balanca' => [new ValidaReferenciaBalanca($request->empresa_id)],
|
|
|
|
];
|
|
|
|
$messages = [
|
|
'nome.required' => 'Campo Obrigatório',
|
|
'codigo_barras.required' => 'Campo Obrigatório',
|
|
'ncm.required' => 'Campo Obrigatório',
|
|
'cest.required' => 'Campo Obrigatório',
|
|
'unidade.required' => 'Campo Obrigatório',
|
|
'perc_icms.required' => 'Campo Obrigatório',
|
|
'perc_pis.required' => 'Campo Obrigatório',
|
|
'perc_cofins.required' => 'Campo Obrigatório',
|
|
'perc_ipi.required' => 'Campo Obrigatório',
|
|
'cst_csosn.required' => 'Campo Obrigatório',
|
|
'cst_pis.required' => 'Campo Obrigatório',
|
|
'cst_cofins.required' => 'Campo Obrigatório',
|
|
'cst_ipi.required' => 'Campo Obrigatório',
|
|
'valor_unitario.required' => 'Campo Obrigatório',
|
|
'descricao.max' => 'Máximo de 255 caracteres',
|
|
'descricao_es.max' => 'Máximo de 255 caracteres',
|
|
'descricao_en.max' => 'Máximo de 255 caracteres',
|
|
];
|
|
$this->validate($request, $rules, $messages);
|
|
}
|
|
|
|
public function import()
|
|
{
|
|
return view('produtos.import');
|
|
}
|
|
|
|
public function export(){
|
|
$data = Produto::where('empresa_id', request()->empresa_id)
|
|
->orderBy('nome')
|
|
->get();
|
|
|
|
$file = new ProdutoExport($data);
|
|
return Excel::download($file, 'produtos.xlsx');
|
|
|
|
}
|
|
|
|
public function downloadModelo()
|
|
{
|
|
return response()->download(public_path('files/') . 'import_products_csv_template.xlsx');
|
|
}
|
|
|
|
public function storeModelo(Request $request)
|
|
{
|
|
if ($request->hasFile('file')) {
|
|
ini_set('max_execution_time', 0);
|
|
ini_set('memory_limit', -1);
|
|
|
|
$rows = Excel::toArray(new ProdutoImport, $request->file);
|
|
$retornoErro = $this->validaArquivo($rows);
|
|
$cont = 0;
|
|
$contDuplicados = 0;
|
|
if(isset($request->locais)){
|
|
$locais = isset($request->locais) ? $request->locais : [];
|
|
}
|
|
|
|
if ($retornoErro == "") {
|
|
foreach ($rows as $row) {
|
|
foreach ($row as $key => $r) {
|
|
|
|
if ($r[0] != 'NOME' && isset($r[0])) {
|
|
|
|
try {
|
|
$data = $this->preparaObjeto($r, $request->empresa_id);
|
|
|
|
$produtoDuplicado = Produto::where('empresa_id', $request->empresa_id)
|
|
->where('nome', $data['nome'])->first();
|
|
|
|
if($produtoDuplicado == null){
|
|
$item = Produto::create($data);
|
|
|
|
if(isset($request->locais)){
|
|
foreach($locais as $l){
|
|
$local = ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $item->id,
|
|
'localizacao_id' => $l
|
|
]);
|
|
|
|
if($data['estoque']){
|
|
$this->utilEstoque->incrementaEstoque($item->id, $data['estoque'], null, $local->localizacao_id);
|
|
|
|
$transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($item->id, $data['estoque'], $tipo,
|
|
$codigo_transacao, $tipo_transacao, \Auth::user()->id);
|
|
}
|
|
}
|
|
}else{
|
|
$local = ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $item->id,
|
|
'localizacao_id' => $request->local_id
|
|
]);
|
|
|
|
if($data['estoque']){
|
|
$this->utilEstoque->incrementaEstoque($item->id, $data['estoque'], null, $local->localizacao_id);
|
|
|
|
$transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($item->id, $data['estoque'], $tipo,
|
|
$codigo_transacao, $tipo_transacao, \Auth::user()->id);
|
|
}
|
|
}
|
|
|
|
$cont++;
|
|
}else{
|
|
// dd($data);
|
|
$produtoDuplicado->codigo_barras = $data['codigo_barras'];
|
|
$produtoDuplicado->ncm = $data['ncm'];
|
|
$produtoDuplicado->unidade = $data['unidade'];
|
|
$produtoDuplicado->cest = $data['cest'];
|
|
$produtoDuplicado->perc_icms = $data['perc_icms'];
|
|
$produtoDuplicado->perc_pis = $data['perc_pis'];
|
|
$produtoDuplicado->perc_cofins = $data['perc_cofins'];
|
|
$produtoDuplicado->perc_ipi = $data['perc_ipi'];
|
|
$produtoDuplicado->perc_red_bc = $data['perc_red_bc'];
|
|
$produtoDuplicado->cst_csosn = $data['cst_csosn'];
|
|
$produtoDuplicado->cst_pis = $data['cst_pis'];
|
|
$produtoDuplicado->cst_cofins = $data['cst_cofins'];
|
|
$produtoDuplicado->cst_ipi = $data['cst_ipi'];
|
|
$produtoDuplicado->valor_unitario = $data['valor_unitario'];
|
|
$produtoDuplicado->cfop_estadual = $data['cfop_estadual'];
|
|
$produtoDuplicado->cfop_outro_estado = $data['cfop_outro_estado'];
|
|
$produtoDuplicado->cEnq = $data['cEnq'];
|
|
$produtoDuplicado->categoria_id = $data['categoria_id'];
|
|
$produtoDuplicado->gerenciar_estoque = $data['gerenciar_estoque'];
|
|
$produtoDuplicado->codigo_beneficio_fiscal = $data['codigo_beneficio_fiscal'];
|
|
$produtoDuplicado->valor_compra = $data['valor_compra'];
|
|
$produtoDuplicado->cfop_entrada_estadual = $data['cfop_entrada_estadual'];
|
|
$produtoDuplicado->cfop_entrada_outro_estado = $data['cfop_entrada_outro_estado'];
|
|
$produtoDuplicado->estoque_minimo = $data['estoque_minimo'];
|
|
|
|
$produtoDuplicado->save();
|
|
if(isset($request->locais)){
|
|
foreach($locais as $l){
|
|
$local = ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $produtoDuplicado->id,
|
|
'localizacao_id' => $l
|
|
]);
|
|
}
|
|
}
|
|
$contDuplicados++;
|
|
}
|
|
} catch (\Exception $e) {
|
|
session()->flash('flash_error', __getError($e));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
session()->flash('flash_success', 'Total de produtos importados: ' . $cont);
|
|
if($contDuplicados > 0){
|
|
session()->flash('flash_warning', 'Total de produtos duplicados: ' . $contDuplicados);
|
|
}
|
|
return redirect()->back();
|
|
} else {
|
|
session()->flash('flash_error', $retornoErro);
|
|
return redirect()->back();
|
|
}
|
|
} else {
|
|
session()->flash('flash_error', 'Selecione o arquivo modelo para importar!!');
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
private function mask($val, $mask)
|
|
{
|
|
$maskared = '';
|
|
$k = 0;
|
|
for ($i = 0; $i <= strlen($mask) - 1; ++$i) {
|
|
if ($mask[$i] == '#') {
|
|
if (isset($val[$k])) {
|
|
$maskared .= $val[$k++];
|
|
}
|
|
} else {
|
|
if (isset($mask[$i])) {
|
|
$maskared .= $mask[$i];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $maskared;
|
|
}
|
|
|
|
private function preparaObjeto($linha, $empresa_id)
|
|
{
|
|
$ncm = trim((string)$linha[4]);
|
|
|
|
if(!str_contains($ncm, ".")){
|
|
$ncm = __mask($ncm, '####.##.##');
|
|
}
|
|
// dd($ncm);
|
|
|
|
$categoria = CategoriaProduto::where('empresa_id', $empresa_id)
|
|
->where('status', 1)
|
|
->where('nome', $linha[1])->first();
|
|
|
|
$valorUnitario = str_replace("R$", "", $linha[2]);
|
|
$valorCompra = str_replace("R$", "", $linha[3]);
|
|
$valorUnitario = __convert_value_bd($valorUnitario);
|
|
$valorCompra = $valorCompra ? __convert_value_bd($valorCompra) : 1;
|
|
$percentualLucro = 0;
|
|
|
|
if($valorUnitario > 0 && $valorCompra > 0){
|
|
$percentualLucro = ($valorUnitario/$valorCompra)*100;
|
|
}
|
|
|
|
$data = [
|
|
'empresa_id' => $empresa_id,
|
|
'nome' => $linha[0],
|
|
'codigo_barras' => $linha[5],
|
|
'ncm' => $ncm,
|
|
'cest' => $linha[6],
|
|
'unidade' => $linha[17] != '' ? $linha[17] : 'UN',
|
|
'perc_icms' => $linha[20] != '' ? __convert_value_bd($linha[20]) : 0,
|
|
'perc_pis' => $linha[21] != '' ? __convert_value_bd($linha[21]) : 0,
|
|
|
|
'perc_cofins' => $linha[22] != '' ? __convert_value_bd($linha[22]) : 0,
|
|
'perc_ipi' => $linha[23] != '' ? __convert_value_bd($linha[23]) : 0,
|
|
'cst_csosn' => $linha[7],
|
|
'cst_pis' => $linha[8],
|
|
'cst_cofins' => $linha[9],
|
|
'cst_ipi' => $linha[10],
|
|
'valor_unitario' => $valorUnitario,
|
|
'origem' => $linha[12] != '' ? $linha[12] : 1,
|
|
'perc_red_bc' => $linha[11] != '' ? __convert_value_bd($linha[11]) : 0,
|
|
'cfop_estadual' => $linha[14],
|
|
'cfop_outro_estado' => $linha[15],
|
|
'cEnq' => $linha[13],
|
|
'categoria_id' => $categoria != null ? $categoria->id : null,
|
|
'gerenciar_estoque' => $linha[19] != '' ? $linha[19] : 0,
|
|
'codigo_beneficio_fiscal' => $linha[16],
|
|
'valor_compra' => $valorCompra,
|
|
|
|
'cfop_entrada_estadual' => $linha[24],
|
|
'cfop_entrada_outro_estado' => $linha[25],
|
|
'estoque' => $linha[26],
|
|
'estoque_minimo' => $linha[27] ?? 0,
|
|
'referencia' => $linha[28] ?? '',
|
|
'percentual_lucro' => $percentualLucro,
|
|
'valor_prazo' => 0
|
|
];
|
|
return $data;
|
|
}
|
|
|
|
private function validaArquivo($rows)
|
|
{
|
|
$cont = 1;
|
|
$msgErro = "";
|
|
foreach ($rows as $row) {
|
|
foreach ($row as $key => $r) {
|
|
if(isset($r[0])){
|
|
|
|
$nome = $r[0];
|
|
$valorVenda = $r[2];
|
|
$ncm = $r[4];
|
|
$cstCsosn = $r[7];
|
|
$cstPis = $r[8];
|
|
$cstCofins = $r[9];
|
|
$cstIpi = $r[10];
|
|
$cfopEstado = $r[14];
|
|
$cfopOutroEstado = $r[15];
|
|
|
|
// dd($r);
|
|
|
|
if ($r[27] == null && $key == 0) {
|
|
$msgErro .= "O arquivo deve conter 28 colunas";
|
|
}
|
|
|
|
if (strlen($nome) == 0) {
|
|
$msgErro .= "Coluna nome em branco na linha: $cont | ";
|
|
}
|
|
|
|
if (strlen($valorVenda) == 0) {
|
|
$msgErro .= "Coluna valor venda em branco na linha: $cont | ";
|
|
}
|
|
|
|
if (strlen($ncm) == 0) {
|
|
$msgErro .= "Coluna NCM em branco na linha: $cont | ";
|
|
}
|
|
|
|
if (strlen($ncm) < 8 && $key > 0) {
|
|
$msgErro .= "Coluna NCM deve conter 8 caracteres linha: $cont | ";
|
|
}
|
|
|
|
if (strlen($cstCsosn) == 0) {
|
|
$msgErro .= "Coluna CST/CSOSN em branco na linha: $cont | ";
|
|
}
|
|
if (strlen($cstPis) == 0) {
|
|
$msgErro .= "Coluna CST/PIS em branco na linha: $cont | ";
|
|
}
|
|
if (strlen($cstCofins) == 0) {
|
|
$msgErro .= "Coluna CST/COFINS em branco na linha: $cont | ";
|
|
}
|
|
if (strlen($cstIpi) == 0) {
|
|
$msgErro .= "Coluna CST/IPI em branco na linha: $cont | ";
|
|
}
|
|
|
|
if (strlen($cfopEstado) == 0) {
|
|
$msgErro .= "Coluna CFOP estado em branco na linha: $cont | ";
|
|
}
|
|
if (strlen($cfopOutroEstado) == 0) {
|
|
$msgErro .= "Coluna CFOP outro estado em branco na linha: $cont | ";
|
|
}
|
|
|
|
if ($msgErro != "") {
|
|
return $msgErro;
|
|
}
|
|
$cont++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return $msgErro;
|
|
}
|
|
|
|
public function gerarCodigoEan()
|
|
{
|
|
try {
|
|
$rand = rand(11111, 99999);
|
|
$code = $this->incluiDigito('7891000' . $rand);
|
|
return response()->json($code, 200);
|
|
} catch (\Exception $e) {
|
|
return response()->json($e->getMessage(), 401);
|
|
}
|
|
}
|
|
|
|
private function incluiDigito($code)
|
|
{
|
|
$weightflag = true;
|
|
$sum = 0;
|
|
for ($i = strlen($code) - 1; $i >= 0; $i--) {
|
|
$sum += (int)$code[$i] * ($weightflag ? 3 : 1);
|
|
$weightflag = !$weightflag;
|
|
}
|
|
return $code . (10 - ($sum % 10)) % 10;
|
|
}
|
|
|
|
|
|
public function show($id){
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$data = MovimentacaoProduto::where('produto_id', $id)
|
|
->orderBy('id', 'desc')
|
|
->get();
|
|
|
|
$produtoUnico = ProdutoUnico::where('produto_id', $id)
|
|
->get();
|
|
return view('produtos.show', compact('item', 'data', 'produtoUnico'));
|
|
}
|
|
|
|
public function movimentacao($id){
|
|
$item = MovimentacaoProduto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
if($item->tipo_transacao == 'venda_nfe'){
|
|
return redirect()->route('nfe.show', [$item->codigo_transacao]);
|
|
}
|
|
if($item->tipo_transacao == 'venda_nfce'){
|
|
return redirect()->route('nfce.show', [$item->codigo_transacao]);
|
|
}
|
|
if($item->tipo_transacao == 'alteracao_estoque'){
|
|
return redirect()->route('estoque.index', ['produto='.$item->produto->nome]);
|
|
}
|
|
if($item->tipo_transacao == 'compra'){
|
|
return redirect()->route('compras.show', [$item->codigo_transacao]);
|
|
}
|
|
}
|
|
|
|
public function removeImagem($id){
|
|
$item = Produto::findOrFail($id);
|
|
try{
|
|
$this->util->unlinkImage($item, '/produtos');
|
|
$item->imagem = '';
|
|
$item->save();
|
|
session()->flash("flash_success", "Imagem removida");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function galeria($id){
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
return view('produtos.galeria', compact('item'));
|
|
}
|
|
|
|
public function storeImage(Request $request, $id){
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
if ($request->hasFile('image')) {
|
|
|
|
$file_name = $this->util->uploadImage($request, '/produtos');
|
|
GaleriaProduto::create([
|
|
'produto_id' => $id,
|
|
'imagem' => $file_name
|
|
]);
|
|
session()->flash("flash_success", "Imagem cadastrada!");
|
|
}else{
|
|
session()->flash("flash_error", "Selecione o arquivo!");
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroyImage($id){
|
|
$item = GaleriaProduto::findOrFail($id);
|
|
try {
|
|
$item->delete();
|
|
|
|
$this->util->unlinkImage($item, '/produtos');
|
|
|
|
session()->flash("flash_success", "Imagem removida!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", "Algo deu Errado: " . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function duplicar(Request $request, $id)
|
|
{
|
|
$item = Produto::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$empresa = Empresa::findOrFail(request()->empresa_id);
|
|
|
|
$listaCTSCSOSN = Produto::listaCSOSN();
|
|
if ($empresa->tributacao == 'Regime Normal') {
|
|
$listaCTSCSOSN = Produto::listaCST();
|
|
}
|
|
$padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->get();
|
|
$cardapio = 0;
|
|
if (isset($request->cardapio)) {
|
|
$cardapio = 1;
|
|
}
|
|
|
|
$delivery = 0;
|
|
if (isset($request->delivery)) {
|
|
$delivery = 1;
|
|
}
|
|
|
|
$ecommerce = 0;
|
|
if (isset($request->ecommerce)) {
|
|
$ecommerce = 1;
|
|
}
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)->get();
|
|
$variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();
|
|
$unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->get();
|
|
|
|
$configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
$categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
return view('produtos.duplicar',
|
|
compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes',
|
|
'ecommerce', 'configMercadoLivre', 'categoriasWoocommerce', 'unidades', 'configGeral', 'categoriasProdutoIfood'));
|
|
}
|
|
|
|
private function __validaToken(){
|
|
$retorno = $this->utilMercadoLivre->refreshToken(request()->empresa_id);
|
|
if($retorno != 'token valido!'){
|
|
if(!isset($retorno->access_token)){
|
|
dd($retorno);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function criaProdutoIfood($request, $produto){
|
|
|
|
$data = [
|
|
'name' => $request->nome,
|
|
'serving' => 'SERVES_1',
|
|
];
|
|
|
|
if($request->ifood_descricao){
|
|
$data['description'] = $request->ifood_descricao;
|
|
}
|
|
if($request->codigo_barras){
|
|
$data['ean'] = $request->codigo_barras;
|
|
}
|
|
if($produto->imagem){
|
|
$pathImage = public_path('uploads/produtos/'.$produto->imagem);
|
|
if(file_exists($pathImage)){
|
|
$mimeType = explode(".", $produto->imagem);
|
|
$image = "data:image/$mimeType[1];base64,".base64_encode(file_get_contents($pathImage));
|
|
$data['image'] = $image;
|
|
}
|
|
}
|
|
|
|
// dd($data);
|
|
$config = IfoodConfig::
|
|
where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$productIfood = $this->utilIfood->storeProduct($config, $data);
|
|
|
|
if(isset($productIfood->id)){
|
|
$produto->ifood_id = $productIfood->id;
|
|
$produto->save();
|
|
}
|
|
|
|
if(isset($productIfood->error)){
|
|
session()->flash("flash_error", $productIfood->error->details[0]->message);
|
|
return redirect()->back();
|
|
}
|
|
|
|
$categoria = CategoriaProdutoIfood::findOrFail($request->ifood_categoria_id);
|
|
|
|
$dataAssociation = [
|
|
'status' => 'AVAILABLE',
|
|
'price' => [
|
|
'value' => $request->ifood_valor ? __convert_value_bd($request->ifood_valor) : __convert_value_bd($request->valor_unitario)
|
|
]
|
|
];
|
|
|
|
if($request->estoque_inicial){
|
|
$dataEstoque = [
|
|
"productId" => $productIfood->id,
|
|
'amount' => (float)$request->estoque_inicial
|
|
];
|
|
|
|
$stock = $this->utilIfood->addStockProduct($config, $dataEstoque);
|
|
}
|
|
|
|
$association = $this->utilIfood->associationProductCategory($config, $categoria->ifood_id, $productIfood->id, $dataAssociation);
|
|
return $productIfood;
|
|
}
|
|
|
|
private function criaProdutoVendiZap($request, $produto){
|
|
$config = VendiZapConfig::where('empresa_id', $request->empresa_id)->first();
|
|
$url = "https://app.vendizap.com/api";
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
'Content-Type: application/json'
|
|
];
|
|
|
|
$data = [
|
|
'descricao' => $request->nome,
|
|
'preco' => $request->vendizap_valor ? __convert_value_bd($request->vendizap_valor) : __convert_value_bd($request->valor_unitario)
|
|
];
|
|
|
|
if(sizeof($produto->variacoes) > 0){
|
|
if($data['preco'] <= 0){
|
|
$data['preco'] = $produto->variacoes[0]->valor;
|
|
}
|
|
|
|
$variacoes = $this->montaVariaveisVendiZap($produto, $data['preco']);
|
|
$data['variacoes'] = $variacoes;
|
|
}
|
|
|
|
if($produto->imagem){
|
|
$image = env('APP_URL') . '/uploads/produtos/'.$produto->imagem;
|
|
$data['imagens'] = [$image];
|
|
}
|
|
|
|
// dd($data);
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url . '/produtos');
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
|
|
|
|
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
// dd($data);
|
|
if(!isset($data->erros)){
|
|
$produto->vendizap_id = $data->id;
|
|
$produto->save();
|
|
|
|
$this->setarEstoqueVendiZap($produto, $config);
|
|
}else{
|
|
session()->flash('flash_error', $data->erros[0]);
|
|
}
|
|
|
|
}
|
|
|
|
private function setarEstoqueVendiZap($produto, $config){
|
|
|
|
if($produto->gerenciar_estoque){
|
|
if($produto->sub_variacao_modelo_id){
|
|
$key1 = [];
|
|
$key2 = [];
|
|
foreach($produto->variacoes as $v){
|
|
if($v->estoque){
|
|
$nome = explode(" ", $v->descricao);
|
|
|
|
// dd($nome);
|
|
|
|
$variacao_id = null;
|
|
$variacao_id2 = null;
|
|
$variavel_id = null;
|
|
$variavel_id2 = null;
|
|
$quantidade = 0;
|
|
foreach($nome as $key => $k){
|
|
$varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
|
|
->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
|
|
->where('variacao_modelo_items.nome', $k)->first();
|
|
|
|
|
|
if($key == 0){
|
|
$variacao_id = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
$variavel_id = $varicaoModeloItem->vendizap_id;
|
|
}else{
|
|
$variacao_id2 = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
$variavel_id2 = $varicaoModeloItem->vendizap_id;
|
|
}
|
|
}
|
|
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
'Content-Type: application/json'
|
|
];
|
|
|
|
$data = [
|
|
'quantidade' => $v->estoque->quantidade,
|
|
'combinacao' => [
|
|
$variacao_id => $variavel_id,
|
|
$variacao_id2 => $variavel_id2,
|
|
]
|
|
];
|
|
|
|
$url = "https://app.vendizap.com/api";
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url . '/estoque/'.$produto->vendizap_id);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
|
|
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
// dd($data);
|
|
}
|
|
}
|
|
}else{
|
|
// estoque variacão simples
|
|
foreach($produto->variacoes as $v){
|
|
if($v->estoque){
|
|
|
|
$varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
|
|
->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
|
|
->where('variacao_modelo_items.nome', $v->descricao)->first();
|
|
|
|
$variacao_id = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
$variavel_id = $varicaoModeloItem->vendizap_id;
|
|
|
|
$ch = curl_init();
|
|
$headers = [
|
|
"X-Auth-Id: " . $config->auth_id,
|
|
"X-Auth-Secret: " . $config->auth_secret,
|
|
'Content-Type: application/json'
|
|
];
|
|
|
|
$data = [
|
|
'quantidade' => $v->estoque->quantidade,
|
|
'combinacao' => [
|
|
$variacao_id => $variavel_id,
|
|
]
|
|
];
|
|
// dd($data);
|
|
|
|
$url = "https://app.vendizap.com/api";
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url . '/estoque/'.$produto->vendizap_id);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
|
|
|
|
$data = json_decode(curl_exec($ch));
|
|
curl_close($ch);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function montaVariaveisVendiZap($produto, $preco){
|
|
|
|
$variacoes = [];
|
|
$v = $produto->variacoes[0]->variacao_modelo_item_id;
|
|
$varicaoModeloItem = VariacaoModeloItem::findOrFail($v);
|
|
$vTemp = [];
|
|
$indice = 0;
|
|
if($varicaoModeloItem->variacaoModelo && $varicaoModeloItem->variacaoModelo->vendizap_id){
|
|
$v = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
if(!$produto->sub_variacao_modelo_id){
|
|
|
|
for($i=0; $i<sizeof($produto->variacoes); $i++){
|
|
if($i == 0){
|
|
$variacoes[$indice]['id'] = $v;
|
|
}
|
|
|
|
if(isset($produto->variacoes[$i])){
|
|
|
|
$v = $produto->variacoes[$i]->variacao_modelo_item_id;
|
|
$varicaoModeloItem1 = VariacaoModeloItem::findOrFail($v)->variacaoModelo;
|
|
$v2 = isset($produto->variacoes[$i+1]) ? $produto->variacoes[$i+1]->variacao_modelo_item_id : null;
|
|
if($v2){
|
|
$varicaoModeloItem2 = VariacaoModeloItem::findOrFail($v2)->variacaoModelo;
|
|
}
|
|
|
|
// dd($varicaoModeloItem1);
|
|
// die;
|
|
if($varicaoModeloItem2 && $varicaoModeloItem1->vendizap_id != $varicaoModeloItem2->vendizap_id){
|
|
$variacoes[$indice]['variaveis'] = $vTemp;
|
|
$indice++;
|
|
}else{
|
|
|
|
$valor = $produto->variacoes[$i]->valor;
|
|
if($produto->variacoes[$i]->valor > 0){
|
|
$valor = $produto->variacoes[$i]->valor - $preco;
|
|
}
|
|
|
|
$v = $produto->variacoes[$i]->variacao_modelo_item_id;
|
|
$varicaoModeloItem = VariacaoModeloItem::findOrFail($v);
|
|
$vTemp[] = [
|
|
'id' => $varicaoModeloItem->vendizap_id,
|
|
'preco' => $valor
|
|
];
|
|
}
|
|
|
|
if(!isset($produto->variacoes[$i+1])){
|
|
$variacoes[$indice]['variaveis'] = $vTemp;
|
|
$vTemp = [];
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
// multi variação
|
|
$variacoes = $this->preparaVariacoesMulti($produto, $preco);
|
|
}
|
|
}
|
|
|
|
return $variacoes;
|
|
}
|
|
|
|
private function preparaVariacoesMulti($produto, $preco){
|
|
$key1 = [];
|
|
$key2 = [];
|
|
// $request = request();
|
|
// for($i=0; $i<sizeof($request->variacao_modelo_item_id); $i++){
|
|
// echo $request->variacao_modelo_item_id[$i] . "<br>";
|
|
// }
|
|
foreach($produto->variacoes as $v){
|
|
$nome = explode(" ", $v->descricao);
|
|
// echo $nome[0];
|
|
if(!in_array($nome[0], $key1)){
|
|
$key1[] = $nome[0];
|
|
}
|
|
|
|
if(!in_array($nome[1], $key2)){
|
|
$key2[] = $nome[1];
|
|
}
|
|
}
|
|
|
|
$variacoes = [];
|
|
$indice = 0;
|
|
$cont = 0;
|
|
|
|
$vTemp = [];
|
|
foreach($key1 as $k){
|
|
$varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
|
|
->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
|
|
->where('variacao_modelo_items.nome', $k)->first();
|
|
// dd($varicaoModeloItem->variacaoModelo);
|
|
$vTemp[] = [
|
|
'id' => $varicaoModeloItem->vendizap_id,
|
|
'preco' => $produto->variacoes[$cont]->valor - $preco
|
|
];
|
|
$cont++;
|
|
}
|
|
$variacoes[$indice]['id'] = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
$variacoes[$indice]['variaveis'] = $vTemp;
|
|
|
|
$vTemp = [];
|
|
$indice++;
|
|
foreach($key2 as $k){
|
|
$varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
|
|
->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
|
|
->where('variacao_modelo_items.nome', $k)->first();
|
|
// dd($varicaoModeloItem->variacaoModelo);
|
|
$vTemp[] = [
|
|
'id' => $varicaoModeloItem->vendizap_id,
|
|
'preco' => $produto->variacoes[$cont]->valor - $preco
|
|
];
|
|
$cont++;
|
|
}
|
|
|
|
$variacoes[$indice]['id'] = $varicaoModeloItem->variacaoModelo->vendizap_id;
|
|
$variacoes[$indice]['variaveis'] = $vTemp;
|
|
|
|
return $variacoes;
|
|
}
|
|
|
|
private function criaProdutoWoocommerce($request, $produto){
|
|
$woocommerceClient = $this->utilWocommerce->getConfig($request->empresa_id);
|
|
$categorias_woocommerce = json_decode($produto->categorias_woocommerce);
|
|
$categorias = [];
|
|
|
|
try{
|
|
$type = 'simple';
|
|
foreach($categorias_woocommerce as $id){
|
|
$c = CategoriaWoocommerce::findOrFail($id);
|
|
$categorias[] = ['id'=> $c->_id];
|
|
}
|
|
|
|
if(sizeof($produto->variacoes) > 0){
|
|
$type = 'variable';
|
|
}
|
|
$data = [
|
|
'name' => $request->nome,
|
|
'type' => $type,
|
|
'slug' => $request->woocommerce_slug,
|
|
'status' => $request->woocommerce_status,
|
|
'stock_status' => $request->woocommerce_stock_status,
|
|
'price' => __convert_value_bd($request->woocommerce_valor),
|
|
'description' => $request->woocommerce_descricao,
|
|
'categories' => $categorias,
|
|
'weight' => $request->peso
|
|
];
|
|
|
|
if($request->comprimento){
|
|
$data['dimensions']['length'] = $request->comprimento;
|
|
}
|
|
if($request->largura){
|
|
$data['dimensions']['width'] = $request->largura;
|
|
}
|
|
if($request->altura){
|
|
$data['dimensions']['height'] = $request->altura;
|
|
}
|
|
|
|
if($produto->imagem){
|
|
$data['images'][] =
|
|
[
|
|
'src' => env('APP_URL') . '/uploads/produtos/'.$produto->imagem
|
|
];
|
|
}
|
|
|
|
if(sizeof($produto->variacoes) > 0){
|
|
$data['attributes'] = [
|
|
[
|
|
'name' => 'Variação',
|
|
'position' => 0,
|
|
'visible' => true,
|
|
'variation' => true,
|
|
]
|
|
];
|
|
foreach($produto->variacoes as $v){
|
|
$data['attributes'][0]['options'][] = $v->descricao;
|
|
}
|
|
// dd($data);
|
|
|
|
$data['default_attributes'] = [
|
|
|
|
[
|
|
'name' => 'Variação',
|
|
'option' => $produto->variacoes[0]->descricao
|
|
]
|
|
];
|
|
|
|
}
|
|
|
|
// dd($data);
|
|
|
|
$product = $woocommerceClient->post("products", $data);
|
|
// dd($product);
|
|
if(sizeof($produto->variacoes) > 0){
|
|
//salva variações
|
|
foreach($produto->variacoes as $v){
|
|
|
|
$dataVariacao = [
|
|
'regular_price' => $v->valor,
|
|
'attributes' => [[
|
|
'name' => 'Variação',
|
|
'option' => $v->descricao
|
|
]]
|
|
];
|
|
|
|
$product_id = $product->id;
|
|
$variation = $woocommerceClient->post("products/$product_id/variations", $dataVariacao);
|
|
}
|
|
}
|
|
// dd($variation);
|
|
|
|
// $product = $woocommerceClient->post("products", $data);
|
|
|
|
if($product){
|
|
return [
|
|
'sucesso' => 1,
|
|
'product_id' => $product->id
|
|
];
|
|
}
|
|
}catch(\Exception $e){
|
|
echo $e->getMessage();
|
|
die;
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $e->getMessage()
|
|
];
|
|
}
|
|
|
|
}
|
|
|
|
private function atualizaProdutoWoocommerce($request, $item){
|
|
$woocommerceClient = $this->utilWocommerce->getConfig($request->empresa_id);
|
|
try{
|
|
$data = [
|
|
'name' => $request->nome,
|
|
'slug' => $request->woocommerce_slug,
|
|
'stock_status' => $request->woocommerce_stock_status,
|
|
'status' => $request->woocommerce_status,
|
|
'price' => __convert_value_bd($request->woocommerce_valor),
|
|
'description' => $request->woocommerce_descricao,
|
|
'weight' => $request->peso
|
|
];
|
|
if($request->comprimento){
|
|
$data['dimensions']['length'] = $request->comprimento;
|
|
}
|
|
if($request->largura){
|
|
$data['dimensions']['width'] = $request->largura;
|
|
}
|
|
if($request->altura){
|
|
$data['dimensions']['height'] = $request->altura;
|
|
}
|
|
|
|
$endPoint = 'products';
|
|
$product = $woocommerceClient->put($endPoint."/$item->woocommerce_id", $data);
|
|
// dd($product);
|
|
if($product){
|
|
return [
|
|
'sucesso' => 1,
|
|
'product_id' => $product->id
|
|
];
|
|
}
|
|
}catch(\Exception $e){
|
|
// echo $e->getMessage();
|
|
// die;
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
private function criaAnuncio($request, $produto){
|
|
$this->__validaToken();
|
|
|
|
$dataMercadoLivre = [
|
|
'title' => $produto->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',
|
|
'listing_type_id' => $request->mercado_livre_tipo_publicacao,
|
|
'video_id' => $request->mercado_livre_youtube,
|
|
];
|
|
|
|
if($request->quantidade_mercado_livre){
|
|
$qtd = __convert_value_bd($request->quantidade_mercado_livre);
|
|
$this->utilEstoque->incrementaEstoque($produto->id, $qtd, null);
|
|
|
|
$transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
|
|
$this->utilEstoque->movimentacaoProduto($produto->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
|
|
}
|
|
|
|
if($request->marca_id){
|
|
$marca = Marca::findOrFail($request->marca_id);
|
|
$dataMercadoLivre['attributes'][] = [
|
|
'id' => 'BRAND',
|
|
'value_name' => $marca->nome
|
|
];
|
|
}
|
|
|
|
if($request->mercado_livre_modelo){
|
|
$dataMercadoLivre['attributes'][] = [
|
|
'id' => 'MODEL',
|
|
'value_name' => $request->mercado_livre_modelo
|
|
];
|
|
}
|
|
// dd($dataMercadoLivre);
|
|
|
|
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
if($produto->img){
|
|
$dataMercadoLivre['pictures'][0]['source'] = $configMercadoLivre->url . $produto->img;
|
|
}
|
|
|
|
$curl = curl_init();
|
|
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items");
|
|
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($dataMercadoLivre));
|
|
|
|
curl_setopt($curl, CURLOPT_HTTPHEADER, [
|
|
'Authorization: Bearer ' . $configMercadoLivre->access_token,
|
|
'Content-Type: application/json'
|
|
]);
|
|
|
|
$res = curl_exec($curl);
|
|
$retorno = json_decode($res);
|
|
if($retorno->status == 400){
|
|
$msg = $this->trataErros($retorno);
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $msg
|
|
];
|
|
}
|
|
// incluir descricao
|
|
|
|
if($request->mercado_livre_descricao){
|
|
$curl = curl_init();
|
|
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$retorno->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);
|
|
}
|
|
|
|
return [
|
|
'sucesso' => 1,
|
|
'retorno' => $retorno
|
|
];
|
|
|
|
}
|
|
|
|
private function trataErros($retorno){
|
|
$msg = "";
|
|
foreach($retorno->cause as $c){
|
|
$msg .= $c->message;
|
|
}
|
|
return $msg;
|
|
}
|
|
|
|
private function atualizaAnuncio($request, $produto){
|
|
|
|
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
|
|
->first();
|
|
|
|
$curl = curl_init();
|
|
|
|
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->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);
|
|
// dd($prod);
|
|
|
|
$dataMercadoLivre = [
|
|
'title' => $produto->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){
|
|
$dataMercadoLivre['variations'][0]['price'] = __convert_value_bd($request->mercado_livre_valor);
|
|
}else{
|
|
$dataMercadoLivre['price'] = __convert_value_bd($request->mercado_livre_valor);
|
|
}
|
|
|
|
// dd($dataMercadoLivre);
|
|
$curl = curl_init();
|
|
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->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);
|
|
return [
|
|
'erro' => 1,
|
|
'msg' => $msg
|
|
];
|
|
}
|
|
|
|
if($request->mercado_livre_descricao){
|
|
$curl = curl_init();
|
|
curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->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);
|
|
}
|
|
|
|
return [
|
|
'sucesso' => 1,
|
|
'retorno' => $retorno
|
|
];
|
|
}
|
|
|
|
public function etiqueta(Request $request, $id)
|
|
{
|
|
$item = Produto::findOrFail($id);
|
|
|
|
if(!$item->codigo_barras){
|
|
session()->flash('flash_error', 'Produto sem código de barras definido');
|
|
return redirect()->route('produtos.index');
|
|
}
|
|
$modelos = ModeloEtiqueta::where('empresa_id', $item->empresa_id)->get();
|
|
return view('produtos.etiqueta', compact('item', 'modelos'));
|
|
}
|
|
|
|
public function etiquetaStore(Request $request, $id){
|
|
if (!is_dir(public_path('barcode'))) {
|
|
mkdir(public_path('barcode'), 0777, true);
|
|
}
|
|
$files = glob(public_path("barcode/*"));
|
|
|
|
foreach($files as $file){
|
|
if(is_file($file)) {
|
|
unlink($file);
|
|
}
|
|
}
|
|
|
|
$item = Produto::findOrFail($id);
|
|
|
|
$nome = $item->nome;
|
|
$codigo = $item->codigo_barras;
|
|
$valor = $item->valor_unitario;
|
|
$unidade = $item->unidade;
|
|
|
|
if($codigo == "" || $codigo == "SEM GTIN" || $codigo == "sem gtin"){
|
|
session()->flash('flash_error', 'Produto sem código de barras definido');
|
|
return redirect()->back();
|
|
}
|
|
|
|
$data = [
|
|
'nome_empresa' => $request->nome_empresa ? true : false,
|
|
'nome_produto' => $request->nome_produto ? true : false,
|
|
'valor_produto' => $request->valor_produto ? true : false,
|
|
'cod_produto' => $request->codigo_produto ? true : false,
|
|
'tipo' => $request->tipo,
|
|
'codigo_barras_numerico' => $request->codigo_barras_numerico ? true : false,
|
|
'nome' => $nome,
|
|
'codigo' => $item->numero_sequencial,
|
|
'valor' => $valor,
|
|
'unidade' => $unidade,
|
|
'valor_atacado' => $item->valor_atacado,
|
|
'referencia' => $item->referencia,
|
|
'empresa' => $item->empresa->nome
|
|
];
|
|
$generatorPNG = new \Picqer\Barcode\BarcodeGeneratorPNG();
|
|
|
|
$adds = [];
|
|
if($request->produto_add_id){
|
|
for($i=0; $i<sizeof($request->produto_add_id); $i++){
|
|
if($request->produto_add_id[$i] && $request->quantidade_add[$i]){
|
|
$prod = Produto::findOrFail($request->produto_add_id[$i]);
|
|
$adds[] = [
|
|
'nome_empresa' => $request->nome_empresa ? true : false,
|
|
'nome_produto' => $request->nome_produto ? true : false,
|
|
'valor_produto' => $request->valor_produto ? true : false,
|
|
'cod_produto' => $request->codigo_produto ? true : false,
|
|
'tipo' => $request->tipo,
|
|
'codigo_barras_numerico' => $request->codigo_barras_numerico ? true : false,
|
|
'nome' => $prod->nome,
|
|
'codigo' => $prod->numero_sequencial,
|
|
'valor' => $prod->valor_unitario,
|
|
'unidade' => $prod->unidade,
|
|
'valor_atacado' => $prod->valor_atacado,
|
|
'referencia' => $prod->referencia,
|
|
'empresa' => $item->empresa->nome,
|
|
'quantidade' => $request->quantidade_add[$i],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
$bar_code = $generatorPNG->getBarcode($codigo, $generatorPNG::TYPE_EAN_13);
|
|
|
|
$rand = rand(1000, 9999);
|
|
file_put_contents(public_path("barcode")."/$rand.png", $bar_code);
|
|
$quantidade_por_linhas = $request->etiquestas_por_linha;
|
|
$quantidade = $request->quantidade_etiquetas;
|
|
$altura = $request->altura;
|
|
$largura = $request->largura;
|
|
$distancia_topo = $request->distancia_etiquetas_topo;
|
|
$distancia_lateral = $request->distancia_etiquetas_lateral;
|
|
$tamanho_fonte = $request->tamanho_fonte;
|
|
$distancia_entre_linhas = $request->distancia_entre_linhas;
|
|
$referencia = $request->referencia;
|
|
$valor_atacado = $request->valor_atacado;
|
|
|
|
$tamanho_codigo = $request->tamanho_codigo_barras;
|
|
|
|
return view('produtos.etiqueta_print', compact('altura', 'largura', 'rand', 'codigo', 'quantidade', 'distancia_topo',
|
|
'distancia_lateral', 'quantidade_por_linhas', 'tamanho_fonte', 'tamanho_codigo', 'data', 'distancia_entre_linhas', 'referencia',
|
|
'valor_atacado', 'adds'));
|
|
|
|
}
|
|
|
|
public function reajuste(Request $request){
|
|
$nome = $request->nome;
|
|
$categoria_id = $request->categoria_id;
|
|
$marca_id = $request->marca_id;
|
|
$cst_csosn = $request->cst_csosn;
|
|
$local_id = $request->local_id;
|
|
$pendentes = $request->pendentes;
|
|
|
|
$data = [];
|
|
$locais = __getLocaisAtivoUsuario();
|
|
$locais = $locais->pluck(['id']);
|
|
|
|
if($nome || $categoria_id || $cst_csosn || $marca_id || $local_id || $pendentes){
|
|
$data = Produto::where('empresa_id', $request->empresa_id)
|
|
->select('produtos.*')
|
|
->when($nome, function ($query) use ($nome) {
|
|
$query->where('nome', 'like', "%$nome%");
|
|
})
|
|
->when($cst_csosn, function ($query) use ($cst_csosn) {
|
|
$query->where('cst_csosn', $cst_csosn);
|
|
})
|
|
->when($marca_id, function ($query) use ($marca_id) {
|
|
$query->where('marca_id', $marca_id);
|
|
})
|
|
->when($categoria_id, function ($query) use ($categoria_id) {
|
|
return $query->where(function($q) use ($categoria_id)
|
|
{
|
|
$q->where('categoria_id', $categoria_id)
|
|
->orWhere('sub_categoria_id', $categoria_id);
|
|
});
|
|
})
|
|
->when($local_id, function ($query) use ($local_id) {
|
|
return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
|
|
->where('produto_localizacaos.localizacao_id', $local_id);
|
|
})
|
|
->when(!$local_id, function ($query) use ($locais) {
|
|
return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
|
|
->whereIn('produto_localizacaos.localizacao_id', $locais);
|
|
})
|
|
->when($pendentes, function ($query) {
|
|
return $query->where(function($q)
|
|
{
|
|
$q->where('cst_csosn', null)
|
|
->orWhere('cst_csosn', '')
|
|
->orWhere('cst_pis', null)
|
|
->orWhere('cst_pis', '')
|
|
->orWhere('cst_cofins', null)
|
|
->orWhere('cst_cofins', '')
|
|
->orWhere('cst_ipi', null)
|
|
->orWhere('cst_ipi', '')
|
|
->orWhere('cfop_estadual', null)
|
|
->orWhere('cfop_estadual', '')
|
|
->orWhere('cfop_outro_estado', null)
|
|
->orWhere('cfop_outro_estado', '')
|
|
->orWhere('cfop_entrada_estadual', null)
|
|
->orWhere('cfop_entrada_estadual', '')
|
|
->orWhere('cfop_entrada_outro_estado', null)
|
|
->orWhere('cfop_entrada_outro_estado', '');
|
|
});
|
|
})
|
|
->get();
|
|
}
|
|
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->get();
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)->get();
|
|
$padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
return view('produtos.reajuste', compact('data', 'categorias', 'marcas', 'padroes'));
|
|
}
|
|
|
|
public function reajusteUpdate(Request $request){
|
|
try{
|
|
for($i=0; $i<sizeof($request->produto_id); $i++){
|
|
$item = Produto::findOrFail($request->produto_id[$i]);
|
|
|
|
if(isset($request->locais)){
|
|
$item->locais()->delete();
|
|
for($j=0; $j<sizeof($request->locais); $j++){
|
|
ProdutoLocalizacao::updateOrCreate([
|
|
'produto_id' => $item->id,
|
|
'localizacao_id' => $request->locais[$j]
|
|
]);
|
|
}
|
|
}
|
|
|
|
$item->padrao_id = $request->padrao_id;
|
|
|
|
$item->valor_unitario = __convert_value_bd($request->valor_unitario[$i]);
|
|
$item->valor_compra = __convert_value_bd($request->valor_compra[$i]);
|
|
$item->cst_csosn = $request->cst_csosn[$i];
|
|
$item->cst_pis = $request->cst_pis[$i];
|
|
$item->cst_cofins = $request->cst_cofins[$i];
|
|
$item->cst_ipi = $request->cst_ipi[$i];
|
|
|
|
$item->perc_icms = $request->perc_icms[$i];
|
|
$item->perc_pis = $request->perc_pis[$i];
|
|
$item->perc_cofins = $request->perc_cofins[$i];
|
|
$item->perc_ipi = $request->perc_ipi[$i];
|
|
$item->perc_red_bc = $request->perc_red_bc[$i] ?? '';
|
|
$item->cfop_estadual = $request->cfop_estadual[$i];
|
|
$item->cfop_outro_estado = $request->cfop_outro_estado[$i];
|
|
|
|
$item->cfop_entrada_estadual = $request->cfop_entrada_estadual[$i];
|
|
$item->cfop_entrada_outro_estado = $request->cfop_entrada_outro_estado[$i];
|
|
$item->status = $request->status[$i];
|
|
|
|
$item->cst_ibscbs = $request->cst_ibscbs[$i];
|
|
$item->cclass_trib = $request->cclass_trib[$i];
|
|
$item->perc_ibs_uf = $request->perc_ibs_uf[$i];
|
|
$item->perc_ibs_mun = $request->perc_ibs_mun[$i];
|
|
$item->perc_cbs = $request->perc_cbs[$i];
|
|
$item->perc_dif = $request->perc_dif[$i];
|
|
|
|
$item->codigo_beneficio_fiscal = $request->codigo_beneficio_fiscal[$i];
|
|
$item->modBCST = $request->modBCST[$i];
|
|
$item->pICMSST = $request->pICMSST[$i];
|
|
$item->pMVAST = $request->pMVAST[$i];
|
|
$item->redBCST = $request->redBCST[$i];
|
|
$item->pICMSEfet = $request->pICMSEfet[$i];
|
|
$item->pRedBCEfet = $request->pRedBCEfet[$i];
|
|
|
|
$item->save();
|
|
}
|
|
|
|
session()->flash("flash_success", "Produtos alterados!");
|
|
return redirect()->route('produtos.index');
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
public function uploadImagens(){
|
|
return view('produtos.seleciona_imagens');
|
|
}
|
|
|
|
public function uploadMultiple(Request $request){
|
|
if (!is_dir(public_path('upload_temp'))) {
|
|
mkdir(public_path('upload_temp'), 0777, true);
|
|
}
|
|
$this->clearFolder(public_path('upload_temp'));
|
|
|
|
if ($request->hasfile('imagens')) {
|
|
foreach ($request->file('imagens') as $file) {
|
|
$ext = $file->getClientOriginalExtension();
|
|
$filename = Str::random(20) .'.'. $ext;
|
|
$file->move(public_path('upload_temp/'), $filename);
|
|
}
|
|
}
|
|
|
|
return redirect()->route('produtos.vincula-imagens');
|
|
}
|
|
|
|
public function vinculaImagens(){
|
|
$files = glob(public_path('upload_temp/*'));
|
|
$data = [];
|
|
|
|
foreach($files as $file){
|
|
$img = explode("upload_temp", $file);
|
|
$item = [
|
|
'diretorio' => $file,
|
|
'img' => "/upload_temp".$img[1]
|
|
];
|
|
$data[] = $item;
|
|
}
|
|
return view('produtos.vincula_imagens', compact('data'));
|
|
|
|
}
|
|
|
|
public function vincularImagens(Request $request){
|
|
try{
|
|
for($i=0; $i<sizeof($request->produto_id); $i++){
|
|
$produto = Produto::findOrFail($request->produto_id[$i]);
|
|
$img = explode("upload_temp", $request->diretorio[$i]);
|
|
$filename = str_replace("/", "", $img[1]);
|
|
$produto->imagem = $filename;
|
|
$produto->save();
|
|
copy($request->diretorio[$i], public_path("/uploads/produtos/").$filename);
|
|
}
|
|
|
|
$this->clearFolder(public_path('upload_temp'));
|
|
session()->flash("flash_success", "Imagens cadastradas!");
|
|
return redirect()->route('produtos.index');
|
|
}catch(\Exception $e){
|
|
session()->flash("flash_error", $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
|
|
}
|
|
|
|
private function clearFolder($destino){
|
|
$files = glob($destino."/*");
|
|
foreach($files as $file){
|
|
if(is_file($file)) unlink($file);
|
|
}
|
|
}
|
|
|
|
public function ibpt(Request $request){
|
|
$empresa = Empresa::findOrFail($request->empresa_id);
|
|
$ibptService = new IbptService($empresa->token_ibpt, preg_replace('/[^0-9]/', '', $empresa->cpf_cnpj));
|
|
$produtos = Produto::where('empresa_id', $request->empresa_id)
|
|
->limit(10)
|
|
->get();
|
|
|
|
$contIbpt = 0;
|
|
$totalDeProdutos = sizeof($produtos);
|
|
foreach($produtos as $p){
|
|
if($p->ncm){
|
|
$data = [
|
|
'ncm' => preg_replace('/[^0-9]/', '', $p->ncm),
|
|
'uf' => $empresa->cidade->uf,
|
|
'extarif' => 0,
|
|
'descricao' => $p->nome,
|
|
'unidadeMedida' => $p->unidade,
|
|
'valor' => number_format(0, 2),
|
|
'gtin' => $p->codBarras,
|
|
'codigoInterno' => 0
|
|
];
|
|
$resp = $ibptService->consulta($data);
|
|
|
|
try{
|
|
if($p->ibpt){
|
|
$ibpt = $p->ibpt;
|
|
$ibpt->codigo = $resp->Codigo;
|
|
$ibpt->uf = $resp->UF;
|
|
$ibpt->descricao = $resp->Descricao;
|
|
$ibpt->nacional = $resp->Nacional;
|
|
$ibpt->estadual = $resp->Estadual;
|
|
$ibpt->importado = $resp->Importado;
|
|
$ibpt->municipal = $resp->Municipal;
|
|
$ibpt->vigencia_inicio = $resp->VigenciaInicio;
|
|
$ibpt->vigencia_fim = $resp->VigenciaFim;
|
|
$ibpt->chave = $resp->Chave;
|
|
$ibpt->versao = $resp->Versao;
|
|
$ibpt->fonte = $resp->Fonte;
|
|
$ibpt->save();
|
|
}else{
|
|
$dataIbpt = [
|
|
'produto_id' => $p->id,
|
|
'codigo' => $resp->Codigo,
|
|
'uf' => $resp->UF,
|
|
'descricao' => $resp->Descricao,
|
|
'nacional' => $resp->Nacional,
|
|
'estadual' => $resp->Estadual,
|
|
'importado' => $resp->Importado,
|
|
'municipal' => $resp->Municipal,
|
|
'vigencia_inicio' => $resp->VigenciaInicio,
|
|
'vigencia_fim' => $resp->VigenciaFim,
|
|
'chave' => $resp->Chave,
|
|
'versao' => $resp->Versao,
|
|
'fonte' => $resp->Fonte
|
|
];
|
|
|
|
ProdutoIbpt::create($dataIbpt);
|
|
}
|
|
$contIbpt++;
|
|
}catch(\Exception $e){
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
$msg = "Total de produtos cadastrados: $totalDeProdutos, total de produtos com IBPT: $contIbpt";
|
|
session()->flash("flash_success", $msg);
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function alterarValorEstoque(){
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
|
|
->orderBy('nome')
|
|
->where('status', 1)->get();
|
|
|
|
$marcas = Marca::where('empresa_id', request()->empresa_id)
|
|
->orderBy('nome')->get();
|
|
|
|
return view('produtos.alterar_valor_estoque', compact('categorias', 'marcas'));
|
|
}
|
|
|
|
public function buscarAjuste(Request $request){
|
|
|
|
$local_id = $request->local_id;
|
|
$query = Produto::query();
|
|
|
|
if ($request->nome) {
|
|
$query->where('nome', 'like', "%{$request->nome}%");
|
|
}
|
|
|
|
if ($request->codigo_barras) {
|
|
$query->where('codigo_barras', $request->codigo_barras);
|
|
}
|
|
|
|
if ($request->categoria_id) {
|
|
$query->where('categoria_id', $request->categoria_id);
|
|
}
|
|
|
|
if ($request->marca_id) {
|
|
$query->where('marca_id', $request->marca_id);
|
|
}
|
|
|
|
if ($request->local_id) {
|
|
$query->join('estoques', 'estoques.produto_id', '=', 'produtos.id')
|
|
->where('local_id', $request->local_id);
|
|
}
|
|
|
|
$produtos = $query->select('produtos.*')->where('empresa_id', $request->empresa_id)->take(50)->get();
|
|
|
|
return view('produtos.partials.tabela_ajuste', compact('produtos', 'local_id'));
|
|
}
|
|
|
|
public function alterarCampo(Request $request)
|
|
{
|
|
$produto = Produto::find($request->id);
|
|
|
|
if (!$produto) {
|
|
return response()->json(['erro' => 'Produto não encontrado'], 404);
|
|
}
|
|
|
|
$campo = $request->campo;
|
|
$valor = $request->valor;
|
|
$local_id = $request->local_id;
|
|
|
|
// atualizar
|
|
if($campo == 'valor_venda'){
|
|
$produto->valor_unitario = __convert_value_bd($valor);
|
|
}
|
|
|
|
if($campo == 'valor_compra'){
|
|
$produto->valor_compra = __convert_value_bd($valor);
|
|
}
|
|
|
|
if($produto->valor_compra > 0 && $produto->valor_unitario > 0){
|
|
$produto->percentual_lucro = ($produto->valor_unitario / $produto->valor_compra)*100;
|
|
}else{
|
|
$produto->percentual_lucro = 100;
|
|
}
|
|
$produto->save();
|
|
|
|
if($campo == 'quantidade_estoque'){
|
|
$estoque = $produto->estoque;
|
|
if($estoque == null){
|
|
|
|
$this->utilEstoque->incrementaEstoque($produto->id, $valor, null, $local_id);
|
|
$transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
|
|
$tipo = 'incremento';
|
|
$codigo_transacao = $transacao->id;
|
|
$tipo_transacao = 'alteracao_estoque';
|
|
$this->utilEstoque->movimentacaoProduto($produto->id, $valor, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $local_id);
|
|
}else{
|
|
if($local_id){
|
|
$estoque = Estoque::where('produto_id', $produto->id)->where('local_id', $local_id)->first();
|
|
}
|
|
|
|
if($estoque){
|
|
// return response()->json($estoque, 401);
|
|
|
|
$estoque->quantidade = $valor;
|
|
$estoque->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return response()->json(['sucesso' => true]);
|
|
}
|
|
|
|
}
|