utilEstoque = $utilEstoque; $this->middleware('permission:transferencia_estoque_create', ['only' => ['create', 'store']]); $this->middleware('permission:transferencia_estoque_view', ['only' => ['show', 'index']]); $this->middleware('permission:transferencia_estoque_delete', ['only' => ['destroy']]); } public function index(Request $request){ $locaisCount = Localizacao::where('empresa_id', $request->empresa_id) ->where('status',1)->count(); if($locaisCount == 0){ session()->flash('flash_error', 'É necessário ter ao menos 2 localizações ativas na empresa!'); return redirect()->back(); } $start_date = $request->get('start_date'); $end_date = $request->get('end_date'); $produto = $request->get('produto'); $data = TransferenciaEstoque::where('transferencia_estoques.empresa_id', $request->empresa_id) ->orderBy('transferencia_estoques.id', 'desc') ->select('transferencia_estoques.*') ->when(!empty($start_date), function ($query) use ($start_date) { return $query->whereDate('transferencia_estoques.created_at', '>=', $start_date); }) ->when(!empty($end_date), function ($query) use ($end_date) { return $query->whereDate('transferencia_estoques.created_at', '<=', $end_date); }) ->when(!empty($produto), function ($query) use ($produto) { return $query->join('item_transferencia_estoques', 'item_transferencia_estoques.transferencia_id', '=', 'transferencia_estoques.id') ->join('produtos', 'produtos.id', '=', 'item_transferencia_estoques.produto_id') ->where('produtos.nome', 'like', "%$produto%"); }) ->paginate(__itensPagina()); return view('transferencia_estoque.index', compact('data')); } public function create(){ return view('transferencia_estoque.create'); } public function store(Request $request){ try{ $item = TransferenciaEstoque::create([ 'empresa_id' => $request->empresa_id, 'local_saida_id' => $request->local_saida_id, 'local_entrada_id' => $request->local_entrada_id, 'usuario_id' => Auth::user()->id, 'observacao' => $request->observacao ?? '', 'codigo_transacao' => Str::random(10) ]); $localSaida = Localizacao::findOrFail($request->local_saida_id); $localEntrada = Localizacao::findOrFail($request->local_entrada_id); for($i=0; $iproduto_id); $i++){ //valida estoque $produto = Produto::findOrFail($request->produto_id[$i]); $estoque = Estoque::where('produto_id', $request->produto_id[$i]) ->where('local_id', $request->local_saida_id)->first(); if($estoque == null){ session()->flash("flash_error", "$produto->nome sem estoque!"); return redirect()->back(); } if($estoque->quantidade < __convert_value_bd($request->quantidade[$i])){ session()->flash("flash_error", "$produto->nome com estoque insuficiente!"); return redirect()->back(); } } for($i=0; $iproduto_id); $i++){ $qtd = __convert_value_bd($request->quantidade[$i]); $itemTransferencia = ItemTransferenciaEstoque::create([ 'transferencia_id' => $item->id, 'produto_id' => $request->produto_id[$i], 'quantidade' => $qtd, 'observacao' => $request->observacao_item[$i] ?? '' ]); ProdutoLocalizacao::updateOrCreate([ 'produto_id' => $request->produto_id[$i], 'localizacao_id' => $request->local_entrada_id ]); ProdutoLocalizacao::updateOrCreate([ 'produto_id' => $request->produto_id[$i], 'localizacao_id' => $request->local_saida_id ]); $this->utilEstoque->incrementaEstoque($request->produto_id[$i], $qtd, null, $request->local_entrada_id); $this->utilEstoque->reduzEstoque($request->produto_id[$i], $qtd, null, $request->local_saida_id); $tipo = 'incremento'; $codigo_transacao = $itemTransferencia->id; $tipo_transacao = 'alteracao_estoque'; $this->utilEstoque->movimentacaoProduto($request->produto_id[$i], $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id); } $descricaoLog = "Saída de $localSaida->nome para $localEntrada->nome"; __createLog($request->empresa_id, 'Transferência de Estoque', 'cadastrar', $descricaoLog); session()->flash("flash_success", "Transferência salva!"); }catch(\Exception $e){ __createLog(request()->empresa_id, 'Transferência de Estoque', 'erro', $e->getMessage()); session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage()); } return redirect()->route('transferencia-estoque.index'); } public function destroy($id) { $item = TransferenciaEstoque::findOrFail($id); __validaObjetoEmpresa($item); try { foreach($item->itens as $p){ $this->utilEstoque->incrementaEstoque($p->produto_id, $p->quantidade, null, $item->local_saida_id); $this->utilEstoque->reduzEstoque($p->produto_id, $p->quantidade, null, $item->local_entrada_id); } $item->itens()->delete(); $item->delete(); $descricaoLog = "Saída de " . $item->local_saida->nome . " para " . $item->local_entrada->nome; __createLog($item->empresa_id, 'Transferência de Estoque', 'excluir', $descricaoLog); session()->flash("flash_success", "Transferência removida com sucesso!"); } catch (\Exception $e) { __createLog(request()->empresa_id, 'Transferência de Estoque', 'erro', $e->getMessage()); session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage()); } return redirect()->route('transferencia-estoque.index'); } public function imprimir($id) { $item = TransferenciaEstoque::findOrFail($id); __validaObjetoEmpresa($item); $empresa = Empresa::findOrFail($item->empresa_id); $p = view('transferencia_estoque.print', compact('empresa', 'item')) ->with('title', 'Transferência de estoque'); $domPdf = new Dompdf(["enable_remote" => true]); $domPdf->loadHtml($p); $domPdf->setPaper("A4"); $domPdf->render(); $domPdf->stream("Transferência de estoque $id.pdf", array("Attachment" => false)); } }