abm productos

This commit is contained in:
cmoreno 2026-09-29 21:23:01 -03:00
parent 05f350af9c
commit 2ac77a2af1
6 changed files with 281 additions and 52 deletions

View File

@ -8,39 +8,11 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/categorias';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
$this->middleware('auth')->only('logout');
}
public function login(Request $request)
{
{
$credentials = $request->validate([
'email' => 'required|email',
@ -61,7 +33,9 @@ class LoginController extends Controller
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login');

View File

@ -4,10 +4,68 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Producto;
use App\Models\Categorias;
use App\Models\CodigoBarras;
class ProductoController extends Controller
{
public function index(Request $request){
$productos = Producto::with('categorias','codigo_barras')->get();
return view('productos.index', ["productos"=>$productos]);
}
public function show($id){
$producto = Producto::with('categorias','codigo_barras')->findOrfail($id);
return view('productos.show', ["prod"=>$producto]);
}
public function destroy(Request $request, $id){
$producto = Producto::findOrfail($id);
$producto->delete();
$request->session()->flash('mensaje-success', 'El producto fue eliminado.');
return redirect('/productos');
}
public function create(){
$categorias= Categorias::get();
return view('productos.new',["categorias"=>$categorias]);
}
public function store(Request $request){
$codigo_barras= new CodigoBarras();
$codigo_barras->fill([
'codigo' => $request->input('codigo_barras'),
]);
$codigo_barras->save();
$producto = new Producto();
$producto->fill([
'nombre' => $request->input('nombre'),
'descripcion' => $request->input('descripcion'),
'precio' => $request->input('precio'),
'categoria_id' => $request->input('categoria'),
'codigo_barras_id' => $codigo_barras->id_codigo_barras,
]);
$producto->save();
$request->session()->flash('mensaje-success', 'El producto fue agregado.');
return redirect('/productos');
}
public function edit($id){
$producto = Producto::findOrfail($id);
return view('productos.edit', ["prod"=>$producto]);
}
public function update(Request $request, $id){
$producto = Producto::findOrfail($id);
$producto->fill([
'nombre' => $request->input('nombre'),
'descripcion' => $request->input('descripcion'),
'precio' => $request->input('precio'),
]);
$producto->update();
$request->session()->flash('mensaje-success', 'El producto fue modificado.');
return redirect('/productos');
}
}

View File

@ -0,0 +1,68 @@
@extends('layouts.admin')
@section('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
<h3>Editar Producto</h3>
</div>
</div>
<div class="row">
<div class="col-md-10">
@include('compartido.mensajes')
@include('compartido.errores')
</div>
</div>
<br>
<form method="POST"
action="{{ route('productos.update', $prod->id_producto) }}"
enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="row">
<div class="form-group col-md-3">
<label for="nombre" class="form-check-label">Nombre (*)</label>
<input type="text" name="nombre" id="nombre" class="form-control"
value="{{ old('nombre', $prod->nombre) }}" >
</div>
<div class="form-group col-md-3">
<label for="descripcion" class="form-check-label">Descripcion (*)</label>
<input type="text" name="descripcion" id="descripcion" class="form-control"
value="{{ old('descripcion', $prod->descripcion) }}" >
</div>
<div class="form-group col-md-3">
<label for="precio" class="form-check-label">Precio (*)</label>
<input type="number" name="precio" id="precio" class="form-control"
value="{{ old('precio', $prod->precio) }}" >
</div>
</div>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<button class="btn btn-success btn-block btn-lg">Guardar</button>
</div>
<div class="col-md-2">
<a href="{{ route('productos.index') }}" class="btn btn-primary btn-block btn-lg" title="Salir">Salir</a>
</div>
</div>
</form>
@endsection
@push('scripts')
<script>
</script>
@endpush

View File

@ -1,15 +1,9 @@
@extends('layouts.admin')
@section('contenido')
<!-- row => fila del sistema de grillas Bootstrap
justify-content-center => centra horizontalmente los contenidos
align-items-center => centra verticalmente
no centran el texto, centran las columnas dentro de la fila
-->
<div class="row justify-content-center align-items-center">
<!-- col-12 => ocupa todo el ancho en pantallas pequeñas
col-md-11 => ocupa 11/12 del ancho en pantallas medianas o mayores -->
<div class="col-12 col-md-11">
<h3>Listado de Productos</h3>
</div>
@ -17,11 +11,8 @@
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<!-- btn => estilo de botón Bootstrap
btn-success => verde (acción positiva)
btn-block => ocupa todo el ancho de la columna
btn-lg => tamaño grande -->
<a href="{{ route('categorias.create') }}"
<a href="{{ route('productos.create') }}"
class="btn btn-success btn-block btn-lg"
title="Nueva Categoria">
Nuevo
@ -34,17 +25,14 @@
<div class="row justify-content-center align-items-center">
<div class="col-12 col-md-11">
<!-- Includes de Blade para mensajes de éxito y errores -->
@include('compartido.mensajes')
@include('compartido.errores')
<!-- table-responsive => hace que la tabla sea "scrollable" en pantallas pequeñas -->
<div class="table-responsive">
<!-- table => tabla con estilos básicos
table-striped => filas alternadas con fondo gris
table-bordered => agrega bordes a todas las celdas
table-hover => resalta la fila al pasar el mouse -->
<table class="table table-striped table-bordered table-hover" id="example">
<thead>
<tr>
@ -72,21 +60,21 @@
@csrf
@method('DELETE')
<!-- btn-info => azul claro (información) -->
<a class="btn btn-info"
href="{{ route('productos.show', $prod->id_producto) }}"
title="Ver más">
<i class="fa fa-eye"></i>
</a>
<!-- btn-warning => amarillo (advertencia / editar) -->
<a class="btn btn-warning"
href="{{ route('productos.edit', $prod->id_producto) }}"
title="Editar">
<i class="fa fa-pencil"></i>
</a>
<!-- btn-danger => rojo (acción destructiva como eliminar) -->
<button class="btn btn-danger"
onclick="return confirm('¿Está seguro de eliminar la categoría?');"
title="Eliminar">
@ -110,7 +98,6 @@
@endpush
@push('scripts')
<script>
// DataTables (plugin JS para mejorar tablas: búsqueda, paginación, exportación)
$('#example').DataTable({
dom: 'Bfrtip',
buttons: ['excel'],
@ -118,3 +105,7 @@
});
</script>
@endpush

View File

@ -0,0 +1,92 @@
@extends('layouts.admin')
@section ('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
<h3>Nuevo Producto</h3>
</div>
</div>
<div class="row">
<div class="col-md-10">
@include('compartido.mensajes')
@include('compartido.errores')
</div>
</div>
</br>
<form method="post" action="{{ route('productos.store') }}" enctype=multipart/form-data>
@csrf
<div class="row">
<div class="form-group col-md-3">
<label for="nombre" class="form-check-label">Nombre (*)</label>
<input type="text" name="nombre" id="nombre" value="{{ old('nombre') }}" class="form-control">
</div>
<div class="form-group col-md-3">
<label for="descripcion" class="form-check-label">Descripcion (*)</label>
<input type="text" name="descripcion" id="descripcion" value="{{old('descripcion')}}" class="form-control">
</div>
<div class="form-group col-md-3">
<label for="precio" class="form-check-label">Precio (*)</label>
<input type="number" name="precio" id="precio" value="{{old('precio')}}" class="form-control">
</div>
</div>
<br>
<div class="row">
<div class="col-md-8">
<label for="categoria" >Categoria (*)</label>
<select name="categoria" id="categoria" style="width:100%" required>
@foreach($categorias as $cat)
<option></option>
<option value="{{$cat->id_categoria}}"
{{old('categoria') == $cat->id_categoria ? 'selected': ''}}>
{{$cat->nombre}}</option>
@endforeach
</select>
</div>
<div class="form-group col-md-4">
<label for="nombre" class="form-check-label">Codigo Barras (*)</label>
<input type="text" name="codigo_barras" id="codigo_barras" value="{{ old('codigo_barras') }}" class="form-control">
</div>
</div>
</br>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<button class="btn btn-success btn-block btn-lg">Guardar</button>
</div>
<div class="col-md-2">
<a href="{{ route('productos.index') }}" class="btn btn-primary btn-block btn-lg" title="Salir">Salir</a>
</div>
</div>
</form>
@endsection
@push('styles')
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css">
@endpush
@push('scripts')
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
$('#categoria').select2({
placeholder:"Seleccione un categoria"
});
</script>
@endpush

View File

@ -0,0 +1,46 @@
@extends('layouts.admin')
@section ('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
<h3>Ver Producto</h3>
<div class="progress" style="height: 2px;"></div>
</div>
</div>
</br>
<div class="row">
<div class="form-group col-md-3">
<label for="nombre" class="form-check-label">Nombre (*)</label>
<input type="text" name="nombre" id="nombre" class="form-control" value="{{$prod->nombre}}" readonly>
</div>
<div class="form-group col-md-3">
<label for="descripcion" class="form-check-label">Descripción (*)</label>
<input type="text" name="descripcion" id="descripcion" class="form-control" value="{{$prod->descripcion}}" readonly>
</div>
<div class="form-group col-md-3">
<label for="precio" class="form-check-label">Precio (*)</label>
<input type="text" name="precio" id="descripcion" class="form-control" value="{{$prod->precio}}" readonly>
</div>
</div>
<div class="row">
<div class="form-group col-md-5">
<label for="categoria" class="form-check-label"> Categoria (*)</label>
<input type="text" name="categoria" id="categoria" class="form-control" value="{{$prod->categorias->nombre}}" readonly>
</div>
<div class="form-group col-md-3">
<label for="categoria" class="form-check-label"> Codigo Barras (*)</label>
<input type="text" name="categoria" id="categoria" class="form-control" value="{{$prod->codigo_barras->codigo}}" readonly>
</div>
</div>
<legend></legend>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<a href="{{ route('productos.index') }}" class="btn btn-primary btn-block btn-lg" title="Salir">Salir</a>
</div>
</div>
@endsection