| Server IP : 54.233.248.239 / Your IP : 172.28.1.13 Web Server : Apache System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/vinumday2_0/app/Modules/Produto/Controllers/Admin/ |
Upload File : |
<?php
namespace App\Modules\Produto\Controllers\Admin;
set_time_limit(0);
use Illuminate\Http\Request;
use DB;
use Mail;
use Exception;
use App\Http\Requests;
use App\Http\Controllers\BaseController;
use App\Modules\Produto\Models\Produto;
use App\Modules\UnidadeNegocio\Models\UnidadeNegocio;
use App\Modules\TipoDeProduto\Models\TipoDeProduto;
use App\Modules\ProdutoCaracteristica\Models\ProdutoCaracteristica;
use App\Modules\PerfilHarmonizacao\Models\PerfilHarmonizacao;
use App\Modules\Produtor\Models\Produtor;
use App\Modules\Fornecedor\Models\Fornecedor;
use App\Modules\Oferta\Models\Oferta;
use App\Modules\Empresa\Models\Empresa;
use App\Modules\ProdutoErp\Models\ProdutoErp;
use App\Modules\ProdutoRegiao\Models\ProdutoRegiao;
use App\Modules\ProdutoSubregiao\Models\ProdutoSubregiao;
use App\Modules\PedidoVendaHasProduto\Models\PedidoVendaHasProduto;
use App\Modules\CanalHasOferta\Models\CanalHasOferta;
use App\Modules\ProdutoVariacao\Models\ProdutoVariacao;
use App\Modules\ProdutoHasVariacaoAtributo\Models\ProdutoHasVariacaoAtributo;
use App\Modules\ProdutoVariacaoAtributo\Models\ProdutoVariacaoAtributo;
use App\Modules\Tag\Models\Tag;
use App\Modules\Safra\Models\Safra;
use App\Modules\Castas\Models\Castas;
use App\Modules\ProdutoHasSafra\Models\ProdutoHasSafra;
use App\Modules\ProdutoHasCastas\Models\ProdutoHasCastas;
use App\Modules\Atributo\Models\Atributo;
use App\Modules\Pais\Models\Pais;
use App\Services\GeralService;
use App\Services\ErpService;
use Illuminate\Support\Facades\Log;
class AdminProdutoController extends BaseController
{
private $modulo;
private $moduloCaracteristica;
private $fields;
private $fks;
private $lastInsertId;
private $atributos = [
'S' => 'safra',
'C' => 'castas',
'TA' => 'teor_alcoolico',
'TS' => 'temperatura_de_servico',
'G' => 'guarda',
'V' => 'vedante',
'D' => 'decanter',
'M' => 'maturacao',
'R' => 'regiao',
];
public function __construct(){
parent::__construct();
$this->middleware('auth');
$this->modulo = \App\Gerador::where('nome', 'Produto')->with('campos', 'fks')->first();
$this->fields = $this->modulo->campos;
$this->fks = $this->modulo->fks;
$this->moduloCaracteristica = \App\Gerador::where('nome', 'ProdutoCaracteristica')->with('campos', 'fks')->first();
$this->fieldsCaracteristica = $this->moduloCaracteristica->campos;
$this->fksCaracteristica = $this->moduloCaracteristica->fks;
$this->produto_m = new Produto();
$this->produto_caracteristica_m = new ProdutoCaracteristica();
}
public function index(Request $request){
$query = Produto::select('produto.*');
$query->orderBy('id', 'DESC');
if ($request->input('term'))
{
$query->where(function($qr) use ($request){
$qr->where('produto.nome', 'like', '%'.$request->input('term').'%');
//$qr->orWhere('produto.subtitulo', 'like', '%'.$request->input('term').'%');
$qr->orWhere('produto.sku', 'like', '%'.$request->input('term').'%');
$qr->orWhere('produto.localizador', '=', $request->input('term'));
});
}
if ($request->input('tag'))
{
$query->join('produto_has_tag', 'produto_has_tag.produto_id', '=', 'produto.id')
->join('tag', 'tag.id', '=', 'produto_has_tag.tag_id')
->where('tag.nome', 'like', '%'.$request->input('tag').'%');
}
if ($request->input('id_estoque'))
{
$query->where('produto.id_estoque', $request->input('id_estoque'));
}
$data['produtos'] = $query->groupBy('produto.id')->with('fornecedor')->paginate(20);
$data['produtos']->getCollection()->transform(function ($produto) {
$produto->estoqueerp = GeralService::getEstoqueProduto($produto);
return $produto;
});
return view('Produto::admin/produto',$data);
}
public function geradorVariacao(Request $request){
$data = [];
$data['listaProdutos'] = Produto::select('id','nome')->whereRaw("nome LIKE '%Camiseta%'")->orderBy('id', 'ASC')->get();
$data['listaOfertas'] = Oferta::select('id','titulo','sub_titulo')->whereRaw("titulo LIKE '%Camiseta%'")->orderBy('id', 'ASC')->get();
return view('Produto::admin/gerador-variacao',$data);
}
public function geradorListaProdutosVariacao(Request $request){
$data = $request->input();
$data['listaTamanhos'] = ProdutoVariacaoAtributo::where('produto_variacao_id', 1)->orderBy('id', 'ASC')->get();
$data['listaModelos'] = ProdutoVariacaoAtributo::where('produto_variacao_id', 2)->orderBy('id', 'ASC')->get();
$data['oferta'] = Oferta::select('id','titulo','sub_titulo')->where("id", $request->input('oferta_id'))->first();
$sequenceSKU = [];
for($s=1;$s<=$request->input('quantidade');$s++){
$sequenceSKU[] = GeralService::sequenceSKU($s);
}
$data['sequenceSKU'] = $sequenceSKU;
$html = view('Produto::admin/produtos-lista-variacao', $data)->render();
$json = [
'status' => true,
'html' => $html
];
return response()->json($json);
}
public function geradorProdutosVariacao(Request $request){
$produtos = $request->input('produtos');
$errors = [];
$produto = Produto::where('id', $request->input('produto_id'))->first();
$produto->load('caracteristicas');
$Oferta = Oferta::where('id', $request->input('oferta_id'))->first();
foreach ($produtos as $item) {
try {
$produtoClone = $produto->replicate();
$produtoClone->sku = $item['sku'];
$produtoClone->nome = $item['nome'];
$produtoClone->data_inclusao = date('Y-m-d H:i:s');
$produtoClone->id_estoque = GeralService::sequenceEstoque();
$produtoClone->sincronizar_tiny = 0;
$produtoClone->disponibilidade = $item['disponibilidade'];
$produtoClone->reserva = 0;
$produtoClone->qtd_adega = 0;
$produtoClone->qtd_em_processamento = 0;
$produtoClone->bkp_apresentacao_vinumday = NULL;
$produtoClone->listar_compras = 0;
$produtoClone->origem_preco = 'produto';
$produtoClone->save();
//imagens
$imagens = $produto->getImagens($produto->id);
foreach($imagens as $objImagem)
{
$novaImagem = array();
$novaImagem['id_produto'] = $produtoClone->id;
$novaImagem['thumbnail_principal'] = $objImagem->thumbnail_principal;
$this->produto_m->criar_imagem($novaImagem);
}
//atributos
if(isset($produto->caracteristicas)){
$caracteristicas = $produto->caracteristicas;
$caracteristicasClone = $caracteristicas->replicate();
$caracteristicasClone->id_produto = $produtoClone->id;
$caracteristicasClone->save();
}
$Produto = $produtoClone;
//Atributos
$Tamanho = new ProdutoHasVariacaoAtributo;
$Tamanho->produto_id = $Produto->id;
$Tamanho->produto_variacao_id = 1;
$Tamanho->produto_variacao_atributo_id = $item['tamanho'];
$Tamanho->save();
$Modelo = new ProdutoHasVariacaoAtributo;
$Modelo->produto_id = $Produto->id;
$Modelo->produto_variacao_id = 2;
$Modelo->produto_variacao_atributo_id = $item['modelo'];
$Modelo->save();
//ERP & Estoque
$Empresa = Empresa::where('sigla', 'SWC')->first();
$sqlEstoque = "UPDATE estoque SET quantidade = {$item['disponibilidade']} WHERE produto_id = {$Produto->id} AND empresa_id = {$Empresa->id}";
DB::update($sqlEstoque);
//Oferta x Produto
$sql = "INSERT INTO oferta_has_produto (quantidade, id_produto, id_oferta, valor_unitario, valor_total, preco_custo, preco_mercado) VALUES (1, {$Produto->id}, {$Oferta->id}, {$Produto->preco_de_venda}, {$Produto->preco_de_venda}, {$Produto->preco_custo}, {$Produto->preco_mercado})";
DB::insert($sql);
} catch (Exception $e) {
$errors[] = "Erro Produto: {$item['nome']} " . $e->getMessage();
Log::info('Erro ao Gerar Produto: ' . $e->getMessage());
}
}
$json = ['status' => true, 'message' => "Produtos gravados com sucesso!", 'errors' => $errors];
return response()->json($json);
}
public function gerador(Request $request){
$data = [];
$data['listaFornecedores'] = Fornecedor::orderBy('nome', 'ASC')->get();
$data['listaTipos'] = TipoDeProduto::orderBy('nome', 'ASC')->get();
$data['ordenacao'] = '';
return view('Produto::admin/gerador',$data);
}
public function geradorListaProdutos(Request $request){
$data = $request->input();
$data['listaTipos'] = TipoDeProduto::orderBy('nome', 'ASC')->get();
$data['lastProduto'] = Produto::select('sku')->where('situacao', 'A')->orderBy('id', 'DESC')->first();
$sequenceSKU = [];
for($s=1;$s<=$request->input('quantidade');$s++){
$sequenceSKU[] = GeralService::sequenceSKU($s);
}
$data['sequenceSKU'] = $sequenceSKU;
$html = view('Produto::admin/produtos-lista', $data)->render();
$json = [
'status' => true,
'html' => $html
];
return response()->json($json);
}
public function geradorProdutos(Request $request){
$produtos = $request->input('produtos');
$errors = [];
foreach ($produtos as $produto) {
try {
$preco_venda = number_format($produto['preco_venda'], 0, '.', '');
$Produto = new Produto();
$Produto->sku = $produto['sku'];
$Produto->nome = $produto['nome'];
$Produto->localizador = 'RECEBIMENTO';
$Produto->unidade_de_medida = 'Gr';
$Produto->ncm = '2204.21.00';
$Produto->peso_bruto = 1.18;
$Produto->peso_liquido = 0.75;
$Produto->id_tipo_produto = $produto['tipo'];
$Produto->id_fornecedor = $produto['fornecedor'];
$Produto->preco_custo = $produto['preco_custo'];
$Produto->custo_efetivo = $produto['custo_efetivo'];
$Produto->preco_de_venda = !empty($preco_venda) && $preco_venda > 0 ? $produto['preco_venda'] : ($produto['preco_custo'] * 2);
$Produto->preco_mercado = $produto['preco_mercado'];
$Produto->situacao = 'A';
$Produto->id_estoque = GeralService::sequenceEstoque();
$Produto->origem = 0;
$Produto->save();
} catch (Exception $e) {
$errors[] = "Erro Produto: {$produto['nome']} " . $e->getMessage();
Log::info('Erro ao Gerar Produto: ' . $e->getMessage());
}
}
$json = ['status' => true, 'message' => "Produtos gravados com sucesso!", 'errors' => $errors];
return response()->json($json);
}
public function add(){
$data = array();
$data['modulo'] = $this->modulo;
$data['fields'] = [];
foreach ($this->fields as $field) {
$data['fields'][] = $field;
}
foreach ($this->fks as $fk) {
$data['fields'][] = $fk;
}
usort($data['fields'], function($a, $b) {
return $a->ordem - $b->ordem;
});
foreach ($this->fks as $fk) {
$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
$data['array_'.$fk->nome] = $classPath::orderBy('nome','ASC')->get();
}
$data['array_perfil_harmonizacao_id'] = PerfilHarmonizacao::orderBy('nome','ASC')->get();
$data['unidades'] = UnidadeNegocio::orderBy('id','ASC')->get();
/* Produto Caracteristica*/
$data['moduloCaracteristica'] = $this->moduloCaracteristica;
$data['fieldsCaracteristica'] = [];
foreach ($this->fieldsCaracteristica as $field) {
if ($field->nome != 'id_produto') {
$data['fieldsCaracteristica'][] = $field;
}
}
foreach ($this->fksCaracteristica as $fk) {
$data['fieldsCaracteristica'][] = $fk;
}
usort($data['fieldsCaracteristica'], function($a, $b) {
return $a->ordem - $b->ordem;
});
foreach ($this->fksCaracteristica as $fk) {
$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
$data['array_'.$fk->nome] = $classPath::get();
}
$produto = new Produto();
$produto->id_estoque = GeralService::sequenceEstoque();
$produto->sku = GeralService::sequenceSKU();
$data['produto'] = $produto;
$data['paises'] = Pais::orderBy('nome', 'ASC')->get();
$data['produtores'] = Produtor::orderBy('nome', 'ASC')->get();
$tags = Tag::select('tag.id', 'tag.nome', 'tag_tipo.nome as nomeTipo')
->join('tag_tipo', 'tag_tipo.id', 'tag.tag_tipo_id')
->get();
$arr_tags = [];
foreach($tags as $tag){
$arr_tags[$tag['nomeTipo']][] = $tag;
}
$data['tags'] = $arr_tags;
$data['safra'] = Safra::all();
$data['castas'] = Castas::all();
$data['nextId'] = $this->produto_m->getNextAutoIncrement();
return view('Produto::admin/form-produto', $data);
}
public function buscarVariacoes(Request $request){
$variacoes = ProdutoVariacao::where('tipo_produto_id', $request->input('id_tipo_produto'))->get();
if(count($variacoes) == 0){
return response()->json(['status' => true, 'html' => '']);
}
$data['variacoes'] = $variacoes;
if($request->input('id_produto')){
$produto = Produto::find($request->input('id_produto'));
if($produto){
$produto_variacao = [];
foreach ($produto->atributosVariacao as $atributo) {
$produto_variacao[$atributo->produto_variacao_id] = $atributo->produto_variacao_atributo_id;
}
$data['produto_variacao'] = $produto_variacao;
}
}
$html = view('Produto::admin/_variacoes-produto', $data)->render();
$json = ['status' => true, 'html' => $html];
return response()->json($json);
}
public function edit($slug){
$id = Produto::where('slug', $slug)->value('id');
$data['modulo'] = $this->modulo;
$data['fields'] = [];
foreach ($this->fields as $field) {
$data['fields'][] = $field;
}
foreach ($this->fks as $fk) {
$data['fields'][] = $fk;
}
usort($data['fields'], function($a, $b) {
return $a->ordem - $b->ordem;
});
foreach ($this->fks as $fk) {
$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
$data['array_'.$fk->nome] = $classPath::orderBy('nome','ASC')->get();
}
$data['produto'] = $this->produto_m->find($id);
$data['array_perfil_harmonizacao_id'] = PerfilHarmonizacao::orderBy('nome','ASC')->get();
$data['unidades'] = UnidadeNegocio::orderBy('id','ASC')->get();
/* Produto Caracteristica*/
$data['moduloCaracteristica'] = $this->moduloCaracteristica;
$data['fieldsCaracteristica'] = [];
foreach ($this->fieldsCaracteristica as $field) {
if ($field->nome != 'id_produto') {
$data['fieldsCaracteristica'][] = $field;
}
}
foreach ($this->fksCaracteristica as $fk) {
$data['fieldsCaracteristica'][] = $fk;
}
usort($data['fieldsCaracteristica'], function($a, $b) {
return $a->ordem - $b->ordem;
});
foreach ($this->fksCaracteristica as $fk) {
$classPath = '\App\Modules\\'.$fk->moduloRelacionado->nome.'\Models\\'.$fk->moduloRelacionado->nome;
$data['array_'.$fk->nome] = $classPath::get();
}
$data['produto'] = $this->produto_m->find($id);
$data['produto_caracteristica'] = $this->produto_caracteristica_m->findByProduto($id);
if($this->modulo->galeria){
$data['produto']->listaImagens = $this->produto_m->getImagens($id);
}
$data['paises'] = Pais::orderBy('nome', 'ASC')->get();
$data['produtores'] = Produtor::orderBy('nome', 'ASC')->get();
$tags = Tag::select('tag.id', 'tag.nome', 'tag_tipo.nome as nomeTipo')
->join('tag_tipo', 'tag_tipo.id', 'tag.tag_tipo_id')
->get();
$arr_tags = [];
foreach($tags as $tag){
$arr_tags[$tag['nomeTipo']][] = $tag;
}
$data['tags'] = $arr_tags;
$data['safra'] = Safra::all();
$data['castas'] = Castas::all();
$data['produto_tags'] = DB::table('produto_has_tag')->where('produto_id', $id)->pluck('tag_id')->toArray();
//Regiões Produto x País Origem
if(!empty($data['produto']->id_pais_origem)):
$data['regioes'] = ProdutoRegiao::where('pais_id', $data['produto']->id_pais_origem)->orderBy('nome', 'ASC')->get();
if(isset($data['produto_caracteristica']) && !empty($data['produto_caracteristica']->produto_regiao_id)):
$data['subregioes'] = ProdutoSubregiao::where('produto_regiao_id', $data['produto_caracteristica']->produto_regiao_id)->orderBy('nome', 'ASC')->get();
endif;
endif;
$data['estoqueerp'] = GeralService::getEstoqueProduto($data['produto']);
$data['variacoes'] = ProdutoVariacao::where('tipo_produto_id', $data['produto']->id_tipo_produto)->get();
$produto_variacao = [];
foreach ($data['produto']->atributosVariacao as $atributo) {
$produto_variacao[$atributo->produto_variacao_id] = $atributo->produto_variacao_atributo_id;
}
$data['produto_variacao'] = $produto_variacao;
foreach ($data['produto']->ofertas as $oferta){
if(isset($oferta->oferta) && $oferta->oferta->tipo == 'C'){
$CanalHasOferta = CanalHasOferta::where('id_oferta', $oferta->id_oferta)->orderBy('id', 'desc')->first();
if($CanalHasOferta){
$oferta->oferta->canal = $CanalHasOferta->canal;
}
}
$PedidoVendaHasProduto = PedidoVendaHasProduto::select(DB::raw("SUM(quantidade) AS 'quantidade'"))
->where('id_oferta', $oferta->id_oferta)
->where('id_produto', $data['produto']->id)
->whereRaw(DB::raw("EXISTS (SELECT 1 FROM pedido_venda pv WHERE pv.id = pedido_venda_has_produto.id_pedido_venda AND pv.id_status_pedido_venda IN (1,2,7))"))
->groupBy('id_oferta')
->first();
$oferta->quantidade = ($PedidoVendaHasProduto ? $PedidoVendaHasProduto->quantidade : 0);
}
$data['produto_safra'] = ProdutoHasSafra::where('produto_id', $data['produto']->id)->pluck('safra_id');
$data['produto_castas'] = ProdutoHasCastas::where('produto_id', $data['produto']->id)->pluck('casta_id');
return view('Produto::admin/form-produto',$data);
}
public function buscarRegioes(Request $request){
$pais_id = $request->input('pais_id');
$regioes = ProdutoRegiao::where('pais_id', $pais_id)->orderBy('nome', 'ASC')->get();
return response()->json($regioes);
}
public function buscarSubregioes(Request $request){
$produto_regiao_id = $request->input('produto_regiao_id');
$subregioes = ProdutoSubregiao::where('produto_regiao_id', $produto_regiao_id)->orderBy('nome', 'ASC')->get();
return response()->json($subregioes);
}
public function movimentacao($produto){
$produto = $this->produto_m->find($produto);
$data = [];
$data['produto'] = $produto;
$data['movimentacao'] = $produto->estoquelocal;
return view('Produto::admin/movimentacao', $data);
}
public function logEstoque($produto){
$produto = $this->produto_m->find($produto);
$data = [];
$data['produto'] = $produto;
$data['estoquelog'] = $produto->estoquelog;
$data['statusErro'] = ErpService::getStatusErro();
return view('Produto::admin/log-estoque', $data);
}
public function localizador($produto){
$produto = $this->produto_m->find($produto);
$json = array('localizador' => $produto->localizador);
return response()->json($json);
}
public function atualizarSaldos(Request $request){
$ids = $request->input('ids_produto');
$listaProdutos = Produto::whereIn('id', $ids)->get(); // Busca os produtos selecionados
$errors = [];
foreach ($listaProdutos as $produto) {
$data_ultima_atualizacao = date('Y-m-d H:i:s');
$saldoProduto = GeralService::atualizarSaldoProduto($produto, $data_ultima_atualizacao);
if(count($saldoProduto->estoque['errors']) > 0){
foreach ($saldoProduto->estoque['errors'] as $error) {
$errors[] = $error;
}
}
}
if(count($errors) > 0){
return response()->json(array(
'status' => false,
'message' => 'Ocorreram falhas durante a atualização!',
'errors' => $errors
));
}
return response()->json(['status' => true, 'message' => "Saldos Atualizados com sucesso!"]);
}
public function atualizarSaldoProduto(Request $request){
$post = $request->input();
$produto = $this->produto_m->find($post['produto_id']);
$data_ultima_atualizacao = date('Y-m-d H:i:s');
$saldoProduto = GeralService::atualizarSaldoProduto($produto, $data_ultima_atualizacao);
$atualizacao_produto = GeralService::getEstoqueProduto($produto);
$atualizacao_produto['ultima_atualizacao'] = date('d/m/Y H:i', strtotime($atualizacao_produto['ultima_atualizacao']));
if(count($saldoProduto->estoque['errors']) > 0){
return response()->json(array(
'status' => false,
'message' => 'Ocorreram falhas durante a atualização!',
'errors' => $saldoProduto->estoque['errors'],
'produto' => $atualizacao_produto
));
}
$json = [
'status' => true,
'message' => "Saldos Atualizados com sucesso!",
'produto' => $atualizacao_produto
];
return response()->json($json);
}
public function clone($slug) {
Log::info('produtoClone->save()');
$produto = Produto::where('slug', $slug)->first();
$produto->load('caracteristicas');
$produtoClone = $produto->replicate();
$produtoClone->sku = "CLONE_{$produtoClone->sku}";
$produtoClone->nome = "CLONE {$produtoClone->nome}";
$produtoClone->data_inclusao = date('Y-m-d H:i:s');
$produtoClone->id_estoque = GeralService::sequenceEstoque();
$produtoClone->sincronizar_tiny = 0;
$produtoClone->disponibilidade = 0;
$produtoClone->reserva = 0;
$produtoClone->qtd_adega = 0;
$produtoClone->qtd_em_processamento = 0;
$produtoClone->listar_compras = 0;
$produtoClone->origem_preco = 'produto';
$produtoClone->save();
Log::info('produtoClone->save()');
Log::info('produtoSaveImages');
//imagens
$imagens = $produto->getImagens($produto->id);
foreach($imagens as $objImagem)
{
$novaImagem = array();
$novaImagem['id_produto'] = $produtoClone->id;
$novaImagem['thumbnail_principal'] = $objImagem->thumbnail_principal;
$this->produto_m->criar_imagem($novaImagem);
}
Log::info('produtoSaveImages');
Log::info('produtoSaveCaracteristicas');
//atributos
if(isset($produto->caracteristicas)){
$caracteristicas = $produto->caracteristicas;
$caracteristicasClone = $caracteristicas->replicate();
$caracteristicasClone->id_produto = $produtoClone->id;
$caracteristicasClone->save();
}
Log::info('produtoSaveCaracteristicas');
\Session::flash('type', 'success');
\Session::flash('message', "Produto " . $produtoClone->nome . " duplicado com sucesso!");
return redirect('admin/produto');
}
public function validar(Request $request){
$post = $request->input();
$status = true;
$message = 'Produto OK';
if(empty($request->input('sku'))){
$status = false;
$message = "SKU deve ser preenchido!";
}else{
//validação SKU
if($request->input('id')){
$produto = Produto::where('id', '<>', $request->input('id'))->where('sku', '=', $request->input('sku'))->first();
}else{
$produto = Produto::where('sku', '=', $request->input('sku'))->first();
}
if($produto){
$status = false;
$message = "SKU já utilizado!";
}
}
$json = array(
'status' => $status,
'message' => $message
);
return response()->json($json);
}
public function save(Request $request){
$post = $request->input();
$post['meta_keywords'] = (isset($post['meta_keywords'])) ? implode(',',$post['meta_keywords']) : null;
foreach ($this->fields as $field) {
$arrayFields[] = $field->nome;
}
foreach ($this->fks as $fk) {
$arrayFields[] = $fk->nome;
}
if($this->modulo->imagem){
$arrayFields[] = 'thumbnail_principal';
}
$arrayFields[] = 'unidade_negocio_id';
$arrayFields[] = 'id_pais_origem';
$arrayFields[] = 'id_estoque';
$arrayFields[] = 'id_tiny';
$arrayFields[] = 'localizador';
$arrayFields[] = 'origem_preco';
$arrayFields[] = 'capacidade_caixa';
$arrayFields[] = 'url_aula_master_class';
$carnes = isset($post['carnes']) ? implode(',',$post['carnes']) : '';
$post['carnes'] = $carnes;
$queijos = isset($post['queijos']) ? implode(',',$post['queijos']) : '';
$post['queijos'] = $queijos;
$da_terra = isset($post['da_terra']) ? implode(',',$post['da_terra']) : '';
$post['da_terra'] = $da_terra;
$amidos = isset($post['amidos']) ? implode(',',$post['amidos']) : '';
$post['amidos'] = $amidos;
$temperos = isset($post['temperos']) ? implode(',',$post['temperos']) : '';
$post['temperos'] = $temperos;
$doces = isset($post['doces']) ? implode(',',$post['doces']) : '';
$post['doces'] = $doces;
if(isset($post['id_produtor']) && !is_numeric($post['id_produtor'])){
$produtor = $this->salvarProdutor($post['id_produtor']);
$post['id_produtor'] = $produtor->id;
}
if(isset($post['id_fornecedor']) && !is_numeric($post['id_fornecedor'])){
$fornecedor = $this->salvarFornecedor($post['id_fornecedor']);
$post['id_fornecedor'] = $fornecedor->id;
}
$tipoProduto = DB::table('tipo_de_produto')->where('id', $post['id_tipo_produto'])->first();
if(isset($tipoProduto) && $tipoProduto->slug == 'masterclass'){
$paisPadraoMasterclass = DB::table('pais')->where('slug', 'brasil')->value('id');
$post['id_pais_origem'] = $paisPadraoMasterclass;
}
if($request->input('id')){
$id_produto = $this->produto_m->editar($arrayFields, $post, $request->input('id'));
}else{
$id_produto = $this->produto_m->criar($arrayFields, $post);
}
DB::table('produto_has_tag')->where('produto_id', $id_produto)->delete();
if(isset($post['tags']) && empty($post['tags'] == false)){
foreach($post['tags'] as $tag){
DB::table('produto_has_tag')->insert([
'produto_id' => $id_produto,
'tag_id' => $tag,
]);
}
}
if(isset($post['castas'])){
DB::table('produto_has_castas')
->updateOrInsert(
['produto_id' => $id_produto],
['casta_id' => $post['castas']]
);
}
if(isset($post['safra'])){
DB::table('produto_has_safra')
->updateOrInsert(
['produto_id' => $id_produto],
['safra_id' => $post['safra']]
);
}
$post['id_produto'] = $id_produto;
$produto = Produto::find($id_produto);
foreach ($this->fieldsCaracteristica as $field) {
$arrayFieldsCaracteristica[] = $field->nome;
}
foreach ($this->fksCaracteristica as $fk) {
$arrayFieldsCaracteristica[] = $fk->nome;
}
foreach ($this->atributos as $tipo => $atributo) {
if(isset($post[$atributo]) && $this->buscarAtributo($post[$atributo], $tipo) == 0){
$this->salvarAtributo($post[$atributo], $tipo);
}
}
//Variações Produto x Atributos
$variacoes = ProdutoVariacao::where('tipo_produto_id', $produto->id_tipo_produto)->get();
foreach ($variacoes as $variacao) {
$key = "produto_variacao_atributo_{$variacao->slug}";
$ProdutoHasVariacaoAtributo = ProdutoHasVariacaoAtributo::where('produto_id', $produto->id)->where('produto_variacao_id', $variacao->id)->first();
if(isset($post[$key]) && !empty($post[$key])){
if(!$ProdutoHasVariacaoAtributo){
$ProdutoHasVariacaoAtributo = new ProdutoHasVariacaoAtributo;
$ProdutoHasVariacaoAtributo->produto_id = $produto->id;
$ProdutoHasVariacaoAtributo->produto_variacao_id = $variacao->id;
}
$ProdutoHasVariacaoAtributo->produto_variacao_atributo_id = $post[$key];
$ProdutoHasVariacaoAtributo->save();
}else{
$ProdutoHasVariacaoAtributo = ProdutoHasVariacaoAtributo::where('produto_id', $produto->id)->where('produto_variacao_id', $variacao->id)->first();
if($ProdutoHasVariacaoAtributo){
$ProdutoHasVariacaoAtributo->delete();
}
}
}
$castas = false;
if(isset($post['castas'])){
$castas = Castas::where('id', $post['castas'])->first();
}
$post['castas'] = ($castas ? $castas->nome : '');
$safra = false;
if(isset($post['safra'])){
$safra = Safra::where('id', $post['safra'])->first();
}
$post['safra'] = ($safra ? $safra->nome : '');
if($request->input('produto_caracteristica_id')){
$id_produto_caracteristica = $this->produto_caracteristica_m->editar($arrayFieldsCaracteristica, $post, $request->input('produto_caracteristica_id'));
}else{
$id_produto_caracteristica = $this->produto_caracteristica_m->criar($arrayFieldsCaracteristica, $post);
}
\Session::flash('type', 'success');
\Session::flash('message', "Alteracoes salvas com sucesso!");
return redirect('admin/produto/edit/'.$produto->slug);
}
public function criarRapido(Request $request){
$post = $request->input();
$produto = new Produto();
$produto->fill($post);
$produto->save();
return response()->json(array(
'status' => true,
'message' => 'Produto adicionado com sucesso!',
'produto' => $produto
));
}
public function importacaoProdutoErp(Request $request){
$post = $request->input();
$data = [];
if(empty($post)){
}else{
$data = $post;
if($request->hasFile('file')){
$file = $request->file('file');
$tmpFileName = $file->getClientOriginalName();
$file = $file->move(public_path(), $tmpFileName);
$row = 0;
$continued = [];
$imports = [];
$lancamentos = [];
$lancamentosCount = 0;
$produtos = ProdutoErp::select('id_tiny', 'produto_id')->where('unidade_negocio_id', $post['unidade_negocio_id'])->where('empresa_id', $post['empresa_id'])->get();
$listaProdutos = [];
foreach ($produtos as $produto) {
$listaProdutos["{$produto->id_tiny}_{$produto->produto_id}"] = $produto->produto_id;
}
if (($handle = fopen($tmpFileName, "r")) !== FALSE) {
while (($dados = fgetcsv($handle, 0, ";")) !== FALSE) {
$row++;
if($row == 1){
continue;
}
$id_tiny = $dados[0];
$sku = $dados[1];
$produto_id = $dados[2];
$descricao = utf8_encode($dados[3]);
//Código Inválido
if(!is_numeric($produto_id)){
$continued[] = ['line' => $row, 'dados' => $dados, 'message' => 'ID Produto Inválido'];
continue;
}elseif(isset($listaProdutos["{$id_tiny}_{$produto_id}"])){
continue;
}
$lancamento = [
'empresa_id' => $post['empresa_id'],
'unidade_negocio_id' => $post['unidade_negocio_id'],
'produto_id' => $produto_id,
'id_tiny' => $id_tiny,
'log_tiny' => '',
'data_sincronizacao_tiny' => date('Y-m-d H:i:s')
];
DB::table('estoque')->insert([
'empresa_id' => $post['empresa_id'],
'unidade_negocio_id' => $post['unidade_negocio_id'],
'produto_id' => $produto_id,
'data_ultima_atualizacao' => date('Y-m-d H:i:s'),
'quantidade' => 0
]);
$lancamentos[] = $lancamento;
$imports[] = ['line' => $row, 'dados' => $dados, 'message' => 'Produto importado com sucesso!'];
if(count($lancamentos) >= 100){
ProdutoErp::insert($lancamentos);
$lancamentosCount += count($lancamentos);
$lancamentos = [];
}
}
}
ProdutoErp::insert($lancamentos);
$lancamentosCount += count($lancamentos);
$data['inseridos'] = $lancamentosCount;
$data['falhas'] = $continued;
@unlink($tmpFileName);
}
}
$data['empresas'] = GeralService::buscarEmpresasIntegracao();
$data['unidades'] = UnidadeNegocio::orderBy('id','ASC')->get();
return view('Produto::admin/importacao-produto-erp', $data);
}
public function upload_image(Request $request) {
if($request->hasFile('file')) {
//upload an image to the /img/tmp directory and return the filepath.
$file = $request->file('file');
$tmpFilePath = '/uploads/produto/';
$tmpFileName = time() . '-' . $file->getClientOriginalName();
$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
$path = $tmpFilePath . $tmpFileName;
return response()->json(array('path'=> $path, 'file_name'=> $tmpFileName), 200);
} else {
return response()->json(false, 200);
}
}
public function upload_galeria($id, Request $request) {
if($request->hasFile('file')) {
//upload an image to the /img/tmp directory and return the filepath.
$file = $request->file('file');
$tmpFilePath = '/uploads/produto/';
$tmpFileName = time() . '-' . $file->getClientOriginalName();
$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
$path = $tmpFilePath . $tmpFileName;
$info = pathinfo($tmpFilePath.$tmpFileName);
$ext = $info['extension'];
$imageMerged = GeralService::mergeImages($path, $ext);
$nome = 'quadrado-'.$tmpFileName;
$pathToMergedImage = "uploads/produto/".$nome;
imagepng($imageMerged,$pathToMergedImage);
$s3 = \Storage::disk('s3');
$filePath = '/images/produtos/' . $nome;
$s3->put($filePath, file_get_contents(public_path() . $tmpFilePath . '/' . $nome), 'public');
//$s3->put($filePath, file_get_contents('https://s3-sa-east-1.amazonaws.com/vinumdays3/images/VD_A01_P277/VD_A01_P277_0.png'), 'public');
$urlMiniatura = config('filesystems.disks.s3.url').$filePath;
$filePathPrincipal = '/images/produtos/' . $tmpFileName;
$s3->put($filePathPrincipal, file_get_contents(public_path() . $tmpFilePath . '/' . $tmpFileName), 'public');
$urlThumb = config('filesystems.disks.s3.url').$filePathPrincipal;
@unlink($file);
$this->produto_m->criar_imagem(array('id_produto' => $id, 'miniatura' => $urlMiniatura,'thumbnail_principal' => $urlThumb));
return response()->json(array('path'=> $path, 'file_name'=>$nome), 200);
} else {
return response()->json(false, 200);
}
}
public function crop_image(Request $request) {
$img = \Image::make('uploads/produto/'.$request->input('file_name'));
$dataCrop = json_decode($request->input('data_crop'));
if($img->crop(intval($dataCrop->width), intval($dataCrop->height), intval($dataCrop->x), intval($dataCrop->y))->save('uploads/produto/thumb_'.$request->input('file_name'))){
$tmpFilePath = '/uploads/produto';
$s3 = \Storage::disk('s3');
$filePath = '/images/produtos/' . 'thumb_'.$request->input('file_name');
$s3->put($filePath, file_get_contents(public_path() . $tmpFilePath . '/thumb_'.$request->input('file_name')), 'public');
//$s3->put($filePath, file_get_contents('https://s3-sa-east-1.amazonaws.com/vinumdays3/images/VD_A01_P277/VD_A01_P277_0.png'), 'public');
$url = config('filesystems.disks.s3.url').$filePath;
@unlink('uploads/produto/'.$request->input('file_name'));
@unlink('uploads/produto/'.'thumb_'.$request->input('file_name'));
echo json_encode(array(
'status' => true,
'path' => $url,
'file_name' => $url,
));
}else{
echo json_encode(array(
'status' => false,
'message' => 'Não foi possível alterar a imagem.'
));
}
}
public function delete($slug){
$produto = Produto::where('slug', $slug)->first();
$pedidos = PedidoVendaHasProduto::where('id_produto', $produto->id)->get();
if(count($pedidos) == 0){
DB::table('estoque_log')
->where('produto_id', $produto->id)
->delete();
$this->produto_m->deletar($produto->id);
$type = 'success';
$message = 'Registro removido com sucesso';
}else{
$type = 'danger';
$message = 'Produto já utilizado em Pedidos!';
}
\Session::flash('type', $type);
\Session::flash('message', $message);
return redirect('admin/produto');
}
public function delete_imagem($id){
try{
$imagem = $this->produto_m->getImagem($id);
$this->produto_m->deletar_imagem($id);
// unlink('uploads/produto/'.$imagem->thumbnail_principal);
GeralService::deleteFileImages($imagem->thumbnail_principal, 'produto');
return response()->json(array('status' => true, 'message' => 'Registro removido com sucesso!'));
}catch(Exception $e){
return response()->json(array('status' => false, 'message' => $e->getMessage()));
}
}
private function slugify($string)
{
return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}
public function buscar(Request $request){
$post = $request->input();
$query = Produto::where('situacao', 'A');
if($request->input('term')){
$query = $query->where('nome', 'like', '%'.$post['term']['term'].'%');
}
if($request->input('produto_id')){
$query = $query->where('id', $request->input('produto_id'));
}
if($request->input('origem') && $request->input('origem') == 'oferta'){
$query = $query->where('indisponibilizar_ofertas', '<>', 1);
}
$listaProdutos = $query->get();
return response()->json(array('items' => $listaProdutos));
}
public function passouAqui(){
$data = [];
$data['tiposProduto'] = TipoDeProduto::orderBy('nome', 'ASC')->get();
$data['produtos'] = Produto::orderBy('nome', 'ASC')->where('situacao', 'A')->get();
//$data['ofertas'] = Oferta::orderBy('titulo', 'ASC')->orderBy('sub_titulo', 'ASC')->get();
$resultProdutos = GeralService::buscarHtmlProdutosPassouAquiAdmin();
if($resultProdutos['status']){
$data['htmlProdutos'] = $resultProdutos['html'];
}else{
$data['htmlProdutos'] = '';
}
$resultTipos = GeralService::buscarHtmlTiposProdutoPassouAquiAdmin();
if($resultTipos['status']){
$data['htmlTiposProduto'] = $resultTipos['html'];
}else{
$data['htmlTiposProduto'] = '';
}
return view('Produto::admin/passou-aqui',$data);
}
public function changeTipoProdutoPassouAqui(Request $request){
$post = $request->input();
$tipoProduto = TipoDeProduto::find($post['id_tipo_produto']);
$tipoProduto->destaque = $post['destaque'];
$tipoProduto->save();
return response()->json(GeralService::buscarHtmlTiposProdutoPassouAquiAdmin());
}
public function changeProdutoPassouAqui(Request $request){
$post = $request->input();
$produto = Produto::find($post['id_produto']);
$produto->destaque = $post['destaque'];
$produto->save();
return response()->json(GeralService::buscarHtmlProdutosPassouAquiAdmin());
}
public function buscarAtributos(Request $request){
$post = $request->input();
$query = Atributo::select('descricao');
if($request->input('descricao')){
$query->where('descricao', 'like', '%'.$request->input('descricao').'%');
}
$atributos = $query->where('tipo', $post['tipo'])->orderBy('descricao', 'ASC')->get();
$returnArray = [];
foreach ($atributos as $atributo) {
if(!isset($atributo->descricao)){
continue;
}
$returnArray[] = [
'id' => $atributo->descricao,
'text' => $atributo->descricao,
];
}
return response()->json(['items' => $returnArray]);
}
private function buscarAtributo($descricao, $tipo){
return Atributo::where('descricao', $descricao)->where('tipo', $tipo)->count();
}
public function buscarFornecedor($id){
try {
$fornecedor = Fornecedor::find($id);
if(!$fornecedor)
return response()->json(['status' => false, 'message' => 'Erro ao Carregar Fornecedor!']);
return response()->json(['status' => true, 'fornecedor' => $fornecedor, 'sigla' => isset($fornecedor->estado) ? $fornecedor->estado->sigla : '']);
} catch (Exception $e) {
return response()->json(['status' => false, 'message' => 'Erro durante carregamento Fornecedor!']);
}
}
public function buscarPerfil($id){
try {
$perfil = PerfilHarmonizacao::find($id);
if(!$perfil)
return response()->json(['status' => false, 'message' => 'Erro ao Carregar Perfil!']);
if(!isset($perfil->caracteristicas))
return response()->json(['status' => false, 'message' => 'Caracteristicas não cadastradas para este Perfil!']);
return response()->json(['status' => true, 'perfil' => $perfil, 'caracteristicas' => $perfil->caracteristicas]);
} catch (Exception $e) {
return response()->json(['status' => false, 'message' => 'Erro durante carregamento Perfil!']);
}
}
private function salvarFornecedor($nome){
$Fornecedor = new Fornecedor();
$Fornecedor->nome = $nome;
$Fornecedor->save();
return $Fornecedor;
}
private function salvarProdutor($nome){
$Produtor = new Produtor();
$Produtor->nome = $nome;
$Produtor->save();
return $Produtor;
}
private function salvarAtributo($descricao, $tipo){
$atributo = new Atributo();
$atributo->descricao = $descricao;
$atributo->tipo = $tipo;
$atributo->save();
return $atributo;
}
public function getTinyConflito($id_produto){
$Produto = $this->produto_m->find($id_produto);
$data = [];
$data['produto'] = $Produto;
$data['empresa'] = $_GET['empresa'];
$ProdutoErp = ProdutoErp::where('produto_id', $id_produto)->where('empresa_id', $_GET['empresa'])->first();
$registros = json_decode($ProdutoErp['log_tiny']);
$data['registros'] = [];
$data['log_error'] = '';
if(isset($registros->retorno->produtos)){
$data['registros'] = $registros->retorno->produtos;
}else{
$data['log_error'] = $ProdutoErp['log_tiny'];
}
return view('Produto::admin/sync-tiny-conflict', $data);
}
public function sincronizarTinyProduto(Request $request){
$idTiny = (int) $request->input('id_tiny');
$idProduto = $request->input('id_produto');
$idEmpresa = $request->input('id_empresa');
$action = $request->input('action');
$sync = ErpService::sincronizarProduto($idProduto, $action, $idEmpresa, $idTiny);
return response()->json(['status' => $sync->status, 'message' => $sync->message]);
}
public function sincronizarTiny(Request $request){
$ids = $request->input('ids_produto');
$produtosPorVez = 20;
$empresas = Empresa::all();
$status = true;
$message = "Registros sincronizados com sucesso!";
foreach ($empresas as $empresa) {
$query = ProdutoErp::whereRaw("(id_tiny IS NULL OR id_tiny = '') AND (log_tiny IS NULL OR log_tiny = '')");
$query = $query->whereIn('produto_id', $ids)->where('empresa_id', '=', $empresa->id);
$query = $query->whereRaw('EXISTS (SELECT 1 FROM produto WHERE produto.id = produto_erp.produto_id AND produto.sincronizar_tiny = 1)');
$listaProdutos = $query->limit($produtosPorVez)->get();
if(count($listaProdutos) > 0){
$sync = ErpService::sincronizarProdutos($listaProdutos, $empresa->id);
if($sync->status == false){
$status = $sync->status;
$message = $sync->message;
}
}
}
return response()->json(['status' => $status, 'message' => $message]);
}
public function verificarProdutosSemelhantes(Request $request){
$data['produtos'] = Produto::where('produto.nome', 'like', '%'.$request->input('keyword').'%')->get();
if(count($data['produtos']))
return response()->json(['status' => true, 'html' => view('Produto::admin/produtos-semelhantes-lista', $data)->render()]);
else
return response()->json(['status' => false, 'html' => '']);
}
public function salvarTextoApresentacao(Request $request){
$post['texto'] = $request->input('texto');
$post['produto_id'] = $request->input('produto_id');
DB::table('produto')
->where('id', $post['produto_id'])
->update([
'apresentacao_vinumday' => $post['texto'],
]);
return response()->json(['status' => true]);
}
}