446 lines
15 KiB
PHP
446 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Inventario;
|
|
use App\Models\User;
|
|
use App\Models\Produto;
|
|
use App\Models\CategoriaProduto;
|
|
use App\Models\Empresa;
|
|
use App\Models\ItemInventario;
|
|
use App\Models\ItemInventarioImpressao;
|
|
use App\Utils\EstoqueUtil;
|
|
use Dompdf\Dompdf;
|
|
|
|
class InventarioController extends Controller
|
|
{
|
|
|
|
protected $util;
|
|
|
|
public function __construct(EstoqueUtil $util)
|
|
{
|
|
$this->util = $util;
|
|
|
|
$this->middleware('permission:inventario_create', ['only' => ['create', 'store']]);
|
|
$this->middleware('permission:inventario_edit', ['only' => ['edit', 'update']]);
|
|
$this->middleware('permission:inventario_view', ['only' => ['show', 'index']]);
|
|
$this->middleware('permission:inventario_delete', ['only' => ['destroy']]);
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
|
|
$status = $request->status;
|
|
$usuario_id = $request->usuario_id;
|
|
$data = Inventario::where('empresa_id', $request->empresa_id)
|
|
->when($status != '', function ($q) use ($status) {
|
|
return $q->where('status', $status);
|
|
})
|
|
->when($usuario_id != '', function ($q) use ($usuario_id) {
|
|
return $q->where('usuario_id', $usuario_id);
|
|
})
|
|
->orderBy('id', 'desc')
|
|
->paginate(__itensPagina());
|
|
|
|
$usuarios = User::where('usuario_empresas.empresa_id', request()->empresa_id)
|
|
->join('usuario_empresas', 'users.id', '=', 'usuario_empresas.usuario_id')
|
|
->select('users.*')
|
|
->get();
|
|
|
|
return view('inventarios.index', compact('data', 'usuarios'));
|
|
}
|
|
|
|
public function create(Request $request)
|
|
{
|
|
$usuarios = User::where('usuario_empresas.empresa_id', request()->empresa_id)
|
|
->join('usuario_empresas', 'users.id', '=', 'usuario_empresas.usuario_id')
|
|
->select('users.*')
|
|
->get();
|
|
|
|
return view('inventarios.create', compact('usuarios'));
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$item = Inventario::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$usuarios = User::where('usuario_empresas.empresa_id', request()->empresa_id)
|
|
->join('usuario_empresas', 'users.id', '=', 'usuario_empresas.usuario_id')
|
|
->select('users.*')
|
|
->get();
|
|
|
|
return view('inventarios.edit', compact('item', 'usuarios'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
|
|
try {
|
|
|
|
$last = Inventario::where('empresa_id', $request->empresa_id)
|
|
->orderBy('numero_sequencial', 'desc')
|
|
->where('numero_sequencial', '>', 0)->first();
|
|
|
|
$numero = $last != null ? $last->numero_sequencial : 0;
|
|
$numero++;
|
|
|
|
$request->merge([
|
|
'numero_sequencial' => $numero,
|
|
'usuario_id' => get_id_user()
|
|
]);
|
|
|
|
Inventario::create($request->all());
|
|
__createLog($request->empresa_id, 'Inventário', 'cadastrar', $request->referencia);
|
|
session()->flash('flash_success', 'Inventário cadastrado com sucesso!');
|
|
} catch (\Exception $e) {
|
|
__createLog($request->empresa_id, 'Inventário', 'erro', $e->getMessage());
|
|
session()->flash('flash_error', 'Não foi possível concluir o cadastro' . $e->getMessage());
|
|
}
|
|
|
|
return redirect()->route('inventarios.index');
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
|
|
try {
|
|
$item = Inventario::findOrFail($id);
|
|
$item->fill($request->all())->save();
|
|
__createLog($request->empresa_id, 'Inventário', 'editar', $request->referencia);
|
|
session()->flash('flash_success', 'Inventário alterado com sucesso!');
|
|
} catch (\Exception $e) {
|
|
__createLog($request->empresa_id, 'Inventário', 'erro', $e->getMessage());
|
|
session()->flash('flash_error', 'Não foi possível concluir o cadastro' . $e->getMessage());
|
|
}
|
|
|
|
return redirect()->route('inventarios.index');
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$item = Inventario::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try {
|
|
$descricaoLog = $item->referencia;
|
|
$item->itens()->delete();
|
|
$item->itensImpresso()->delete();
|
|
$item->delete();
|
|
__createLog(request()->empresa_id, 'Inventário', 'excluir', $descricaoLog);
|
|
session()->flash('flash_success', 'Removido com sucesso!');
|
|
} catch (\Exception $e) {
|
|
__createLog(request()->empresa_id, 'Inventário', 'erro', $e->getMessage());
|
|
session()->flash('flash_error', 'Não foi possível deletar' . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroyItem($id)
|
|
{
|
|
$item = ItemInventario::findOrFail($id);
|
|
try {
|
|
$item->delete();
|
|
session()->flash('flash_success', 'Item removido com sucesso!');
|
|
} catch (\Exception $e) {
|
|
session()->flash('flash_error', 'Não foi possível deletar' . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function apontar($id){
|
|
$item = Inventario::findOrFail($id);
|
|
if(sizeof($item->itensImpresso) > 0){
|
|
return redirect()->route('inventarios.apontar-impresso', [$id]);
|
|
}
|
|
__validaObjetoEmpresa($item);
|
|
return view('inventarios.apontar', compact('item'));
|
|
}
|
|
|
|
public function storeItem(Request $request, $id){
|
|
$item = Inventario::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try {
|
|
ItemInventario::create([
|
|
'inventario_id' => $id,
|
|
'produto_id' => $request->produto_id,
|
|
'quantidade' => __convert_value_bd($request->quantidade),
|
|
'observacao' => $request->observacao ?? '',
|
|
'estado' => $request->estado,
|
|
'usuario_id' => get_id_user()
|
|
]);
|
|
session()->flash('flash_success', 'Item adicionado com sucesso!');
|
|
} catch (\Exception $e) {
|
|
session()->flash('flash_error', 'Algo deu errado: ' . $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function itens($id){
|
|
$item = Inventario::findOrFail($id);
|
|
return view('inventarios.itens', compact('item'));
|
|
}
|
|
|
|
public function compararEstoque($id){
|
|
$item = Inventario::findOrFail($id);
|
|
|
|
$data = [];
|
|
$itensDiferentes = 0;
|
|
foreach($item->itens as $key => $i){
|
|
$data[$key]['id'] = $i->id;
|
|
$data[$key]['nome'] = $i->produto->nome;
|
|
$data[$key]['quantidade'] = $i->quantidade;
|
|
$data[$key]['estado'] = $i->estado;
|
|
$data[$key]['estoque'] = $i->produto->estoque ? number_format($i->produto->estoque->quantidade, 0) : '--';
|
|
if($i->produto->estoque){
|
|
|
|
$v = $i->quantidade-$i->produto->estoque->quantidade;
|
|
if($i->produto->unidade == 'UN' || $i->produto->unidade == 'UNID'){
|
|
$data[$key]['diferenca'] = number_format($v, 0);
|
|
}else{
|
|
$data[$key]['diferenca'] = number_format($v, 2);
|
|
}
|
|
|
|
if($i->quantidade != $i->produto->estoque->quantidade){
|
|
$itensDiferentes++;
|
|
}
|
|
|
|
}else{
|
|
$itensDiferentes++;
|
|
if($i->produto->unidade == 'UN' || $i->produto->unidade == 'UNID'){
|
|
$data[$key]['diferenca'] = number_format($i->quantidade, 0);
|
|
}else{
|
|
$data[$key]['diferenca'] = number_format($i->quantidade, 2);
|
|
}
|
|
}
|
|
}
|
|
|
|
// dd($data);
|
|
return view('inventarios.comparar', compact('item', 'data', 'itensDiferentes'));
|
|
}
|
|
|
|
public function definirEstoque($id){
|
|
$item = Inventario::findOrFail($id);
|
|
foreach($item->itens as $key => $i){
|
|
if($i->produto->estoque){
|
|
|
|
$estoque = $i->produto->estoque;
|
|
$estoque->quantidade = $i->quantidade;
|
|
$estoque->save();
|
|
}else{
|
|
$this->util->incrementaEstoque($i->produto_id, $i->quantidade, null);
|
|
}
|
|
}
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function renderizar($id)
|
|
{
|
|
$item = Inventario::findOrFail($id);
|
|
|
|
|
|
$config = Empresa::where('id', request()->empresa_id)->first();
|
|
|
|
$p = view('inventarios.imprimir', compact(
|
|
'item',
|
|
'config',
|
|
));
|
|
|
|
$domPdf = new Dompdf(["enable_remote" => true]);
|
|
$domPdf->loadHtml($p);
|
|
$pdf = ob_get_clean();
|
|
$domPdf->setPaper("A4");
|
|
$domPdf->render();
|
|
$domPdf->stream("Inventário.pdf", array("Attachment" => false));
|
|
|
|
}
|
|
|
|
public function imprimir($id)
|
|
{
|
|
$item = Inventario::findOrFail($id);
|
|
$countProdutos = Produto::where('empresa_id', request()->empresa_id)
|
|
->where('status', 1)->count();
|
|
|
|
$categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)->orderBy('nome')
|
|
->where('status', 1)->get();
|
|
return view('inventarios.gerar_impressao', compact('item', 'countProdutos', 'categorias'));
|
|
}
|
|
|
|
public function addProduto(Request $request)
|
|
{
|
|
if($request->produto_id){
|
|
$produto = Produto::find($request->produto_id);
|
|
$existe = ItemInventarioImpressao::where('inventario_id', $request->inventario_id)
|
|
->where('produto_id', $produto->id)
|
|
->exists();
|
|
|
|
if (!$existe) {
|
|
ItemInventarioImpressao::create([
|
|
'inventario_id' => $request->inventario_id,
|
|
'produto_id' => $produto->id,
|
|
'quantidade' => null,
|
|
'observacao' => '',
|
|
'estado' => null,
|
|
]);
|
|
}
|
|
}
|
|
|
|
if($request->categoria_id){
|
|
$categoria = CategoriaProduto::find($request->categoria_id);
|
|
foreach($categoria->produtos as $p){
|
|
$existe = ItemInventarioImpressao::where('inventario_id', $request->inventario_id)
|
|
->where('produto_id', $p->id)
|
|
->exists();
|
|
|
|
if (!$existe) {
|
|
ItemInventarioImpressao::create([
|
|
'inventario_id' => $request->inventario_id,
|
|
'produto_id' => $p->id,
|
|
'quantidade' => null,
|
|
'observacao' => '',
|
|
'estado' => null,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
$item = Inventario::findOrFail($request->inventario_id);
|
|
return view('inventarios.partials.linha_impressa', compact('item'));
|
|
}
|
|
|
|
public function deleteItem(Request $request)
|
|
{
|
|
$item = ItemInventarioImpressao::find($request->id);
|
|
|
|
if (!$item) {
|
|
return response()->json(['status' => false, 'msg' => 'Item não encontrado']);
|
|
}
|
|
|
|
$item->delete();
|
|
|
|
return response()->json(['status' => true]);
|
|
}
|
|
|
|
public function apontarImpresso($id){
|
|
$item = Inventario::findOrFail($id);
|
|
|
|
return view('inventarios.apontar_impresso', compact('item'));
|
|
}
|
|
|
|
public function atualizarItem(Request $request)
|
|
{
|
|
|
|
$item = ItemInventarioImpressao::findOrFail($request->id);
|
|
$campo = $request->campo;
|
|
$valor = $request->valor;
|
|
|
|
if ($campo === 'quantidade') {
|
|
// converte "1.234,567" para 1234.567
|
|
$valor = __convert_value_bd($valor);
|
|
}
|
|
|
|
$item->$campo = $valor;
|
|
$item->save();
|
|
|
|
return response()->json([
|
|
'status' => true,
|
|
'message' => 'Atualizado com sucesso',
|
|
'campo' => $campo,
|
|
'valor' => $item->$campo,
|
|
]);
|
|
}
|
|
|
|
public function acerto(Request $request){
|
|
$item = Inventario::findOrFail($request->inventario_id);
|
|
try{
|
|
foreach($item->itensImpresso as $i){
|
|
$produto = $i->produto;
|
|
if($produto->estoque){
|
|
$estoque = $produto->estoque;
|
|
$estoque->quantidade = $i->quantidade;
|
|
$estoque->save();
|
|
}else{
|
|
$this->util->incrementaEstoque($i->produto_id, $i->quantidade, null);
|
|
}
|
|
|
|
ItemInventario::create([
|
|
'inventario_id' => $i->inventario_id,
|
|
'produto_id' => $i->produto_id,
|
|
'quantidade' => $i->quantidade,
|
|
'observacao' => $i->observacao,
|
|
'estado' => $i->estado,
|
|
'usuario_id' => get_id_user()
|
|
]);
|
|
}
|
|
|
|
$item->status = 0;
|
|
$item->save();
|
|
session()->flash('flash_success', 'Inventário acertado com sucesso!');
|
|
return redirect()->route('inventarios.index');
|
|
} catch (\Exception $e) {
|
|
session()->flash('flash_error', 'Não foi possível concluir a ação: ' . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
|
|
}
|
|
|
|
public function duplicar($id)
|
|
{
|
|
$item = Inventario::findOrFail($id);
|
|
try{
|
|
$last = Inventario::where('empresa_id', request()->empresa_id)
|
|
->orderBy('numero_sequencial', 'desc')
|
|
->where('numero_sequencial', '>', 0)->first();
|
|
|
|
$numero = $last != null ? $last->numero_sequencial : 0;
|
|
$numero++;
|
|
|
|
$inventario = Inventario::create([
|
|
'inicio' => $item->inicio,
|
|
'fim' => $item->fim,
|
|
'observacao' => $item->observacao,
|
|
'tipo' => $item->tipo,
|
|
'status' => 1,
|
|
'empresa_id' => $item->empresa_id,
|
|
'referencia' => $item->referencia,
|
|
'usuario_id' => $item->usuario_id,
|
|
'numero_sequencial' => $numero
|
|
]);
|
|
|
|
// if(sizeof($item->itens) > 0){
|
|
|
|
// foreach ($item->itens as $i) {
|
|
// ItemInventarioImpressao::create([
|
|
// 'inventario_id' => $inventario->id,
|
|
// 'produto_id' => $i->produto_id,
|
|
// 'quantidade' => null,
|
|
// 'observacao' => '',
|
|
// 'estado' => null,
|
|
// ]);
|
|
// }
|
|
// }else{
|
|
// $produtos = Produto::where('empresa_id', $item->empresa_id)
|
|
// ->orderBy('nome')
|
|
// ->select('nome', 'codigo_barras', 'id')
|
|
// ->where('status', 1)->get();
|
|
|
|
// foreach($produtos as $produto){
|
|
// ItemInventarioImpressao::create([
|
|
// 'inventario_id' => $inventario->id,
|
|
// 'produto_id' => $produto->id,
|
|
// 'quantidade' => null,
|
|
// 'observacao' => '',
|
|
// 'estado' => null,
|
|
// ]);
|
|
// }
|
|
// }
|
|
session()->flash('flash_success', 'Inventário dulpicado com sucesso!');
|
|
return redirect()->route('inventarios.index');
|
|
} catch (\Exception $e) {
|
|
session()->flash('flash_error', 'Não foi possível concluir a ação: ' . $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
}
|