abm productos
This commit is contained in:
parent
05f350af9c
commit
2ac77a2af1
|
|
@ -8,40 +8,12 @@ use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
class LoginController extends Controller
|
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;
|
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)
|
public function login(Request $request)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
$credentials = $request->validate([
|
$credentials = $request->validate([
|
||||||
'email' => 'required|email',
|
'email' => 'required|email',
|
||||||
'password' => 'required',
|
'password' => 'required',
|
||||||
|
|
@ -61,7 +33,9 @@ class LoginController extends Controller
|
||||||
public function logout(Request $request)
|
public function logout(Request $request)
|
||||||
{
|
{
|
||||||
Auth::logout();
|
Auth::logout();
|
||||||
|
|
||||||
$request->session()->invalidate();
|
$request->session()->invalidate();
|
||||||
|
|
||||||
$request->session()->regenerateToken();
|
$request->session()->regenerateToken();
|
||||||
|
|
||||||
return redirect('/login');
|
return redirect('/login');
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,68 @@ namespace App\Http\Controllers;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Models\Producto;
|
use App\Models\Producto;
|
||||||
|
use App\Models\Categorias;
|
||||||
|
use App\Models\CodigoBarras;
|
||||||
class ProductoController extends Controller
|
class ProductoController extends Controller
|
||||||
{
|
{
|
||||||
public function index(Request $request){
|
public function index(Request $request){
|
||||||
$productos = Producto::with('categorias','codigo_barras')->get();
|
$productos = Producto::with('categorias','codigo_barras')->get();
|
||||||
return view('productos.index', ["productos"=>$productos]);
|
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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
68
resources/views/productos/edit.blade.php
Normal file
68
resources/views/productos/edit.blade.php
Normal 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
|
||||||
|
|
@ -1,15 +1,9 @@
|
||||||
@extends('layouts.admin')
|
@extends('layouts.admin')
|
||||||
@section('contenido')
|
@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">
|
<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">
|
<div class="col-12 col-md-11">
|
||||||
<h3>Listado de Productos</h3>
|
<h3>Listado de Productos</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -17,11 +11,8 @@
|
||||||
|
|
||||||
<div class="row justify-content-center align-items-center">
|
<div class="row justify-content-center align-items-center">
|
||||||
<div class="col-md-2">
|
<div class="col-md-2">
|
||||||
<!-- btn => estilo de botón Bootstrap
|
|
||||||
btn-success => verde (acción positiva)
|
<a href="{{ route('productos.create') }}"
|
||||||
btn-block => ocupa todo el ancho de la columna
|
|
||||||
btn-lg => tamaño grande -->
|
|
||||||
<a href="{{ route('categorias.create') }}"
|
|
||||||
class="btn btn-success btn-block btn-lg"
|
class="btn btn-success btn-block btn-lg"
|
||||||
title="Nueva Categoria">
|
title="Nueva Categoria">
|
||||||
Nuevo
|
Nuevo
|
||||||
|
|
@ -34,17 +25,14 @@
|
||||||
<div class="row justify-content-center align-items-center">
|
<div class="row justify-content-center align-items-center">
|
||||||
<div class="col-12 col-md-11">
|
<div class="col-12 col-md-11">
|
||||||
|
|
||||||
<!-- Includes de Blade para mensajes de éxito y errores -->
|
|
||||||
@include('compartido.mensajes')
|
@include('compartido.mensajes')
|
||||||
@include('compartido.errores')
|
@include('compartido.errores')
|
||||||
|
|
||||||
<!-- table-responsive => hace que la tabla sea "scrollable" en pantallas pequeñas -->
|
|
||||||
<div class="table-responsive">
|
<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">
|
<table class="table table-striped table-bordered table-hover" id="example">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -72,21 +60,21 @@
|
||||||
@csrf
|
@csrf
|
||||||
@method('DELETE')
|
@method('DELETE')
|
||||||
|
|
||||||
<!-- btn-info => azul claro (información) -->
|
|
||||||
<a class="btn btn-info"
|
<a class="btn btn-info"
|
||||||
href="{{ route('productos.show', $prod->id_producto) }}"
|
href="{{ route('productos.show', $prod->id_producto) }}"
|
||||||
title="Ver más">
|
title="Ver más">
|
||||||
<i class="fa fa-eye"></i>
|
<i class="fa fa-eye"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- btn-warning => amarillo (advertencia / editar) -->
|
|
||||||
<a class="btn btn-warning"
|
<a class="btn btn-warning"
|
||||||
href="{{ route('productos.edit', $prod->id_producto) }}"
|
href="{{ route('productos.edit', $prod->id_producto) }}"
|
||||||
title="Editar">
|
title="Editar">
|
||||||
<i class="fa fa-pencil"></i>
|
<i class="fa fa-pencil"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- btn-danger => rojo (acción destructiva como eliminar) -->
|
|
||||||
<button class="btn btn-danger"
|
<button class="btn btn-danger"
|
||||||
onclick="return confirm('¿Está seguro de eliminar la categoría?');"
|
onclick="return confirm('¿Está seguro de eliminar la categoría?');"
|
||||||
title="Eliminar">
|
title="Eliminar">
|
||||||
|
|
@ -110,7 +98,6 @@
|
||||||
@endpush
|
@endpush
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
// DataTables (plugin JS para mejorar tablas: búsqueda, paginación, exportación)
|
|
||||||
$('#example').DataTable({
|
$('#example').DataTable({
|
||||||
dom: 'Bfrtip',
|
dom: 'Bfrtip',
|
||||||
buttons: ['excel'],
|
buttons: ['excel'],
|
||||||
|
|
@ -118,3 +105,7 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
92
resources/views/productos/new.blade.php
Normal file
92
resources/views/productos/new.blade.php
Normal 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
|
||||||
46
resources/views/productos/show.blade.php
Normal file
46
resources/views/productos/show.blade.php
Normal 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
|
||||||
Loading…
Reference in New Issue
Block a user