From 358e2afc22b1756b32f8e09810dc75899297a2e7 Mon Sep 17 00:00:00 2001 From: gianella <146126967+GianellaDelMestre@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:58:35 -0300 Subject: [PATCH] Proveedores alta, baja, modif y armar pedido --- app/Http/Controllers/SupplierController.php | 101 ++++++++++ resources/views/suppliers/create.blade.php | 43 +++++ resources/views/suppliers/edit.blade.php | 45 +++++ resources/views/suppliers/index.blade.php | 114 +++++++++++ resources/views/suppliers/order.blade.php | 203 ++++++++++++++++++++ 5 files changed, 506 insertions(+) create mode 100644 app/Http/Controllers/SupplierController.php create mode 100644 resources/views/suppliers/create.blade.php create mode 100644 resources/views/suppliers/edit.blade.php create mode 100644 resources/views/suppliers/index.blade.php create mode 100644 resources/views/suppliers/order.blade.php diff --git a/app/Http/Controllers/SupplierController.php b/app/Http/Controllers/SupplierController.php new file mode 100644 index 0000000..f279594 --- /dev/null +++ b/app/Http/Controllers/SupplierController.php @@ -0,0 +1,101 @@ +input('search'); + + $suppliers = Supplier::query() + ->when($query, function ($q) use ($query) { + return $q->where('name', 'like', "%{$query}%"); + }) + ->orderBy('name', 'asc') + ->paginate(10) + ->withQueryString(); + + return view('suppliers.index', compact('suppliers')); + } + + /** + * para crear un proveedor + */ + public function create() + { + return view('suppliers.create'); + } + + + public function store(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'phone' => 'nullable|string|max:50', + 'email' => 'nullable|email|max:255|unique:suppliers,email', + 'address' => 'nullable|string|max:255', + ]); + + Supplier::create($validated); + + return redirect()->route('suppliers.index') + ->with('success', 'Proveedor creado correctamente.'); + } + + /** + * muestra un proveedor + */ + public function show(Supplier $supplier) + { + return view('suppliers.show', compact('supplier')); + } + + public function edit(Supplier $supplier) + { + return view('suppliers.edit', compact('supplier')); + } + + public function update(Request $request, Supplier $supplier) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'phone' => 'nullable|string|max:50', + 'email' => 'nullable|email|max:255|unique:suppliers,email,' . $supplier->id, + 'address' => 'nullable|string|max:255', + ]); + + $supplier->update($validated); + + return redirect()->route('suppliers.index') + ->with('success', 'Proveedor actualizado correctamente.'); + } + + /** + * elimina (solo si no tiene productos asociados) + */ + public function destroy(Supplier $supplier) + { + try { + $supplier->delete(); + return redirect()->route('suppliers.index') + ->with('success', 'Proveedor eliminado correctamente.'); + + } catch (\Illuminate\Database\QueryException $e) { + // Si el proveedor tiene productos asociados, va a tirar un error de llave foránea. + return back()->with('error', 'No se puede eliminar el proveedor porque tiene productos registrados en el inventario.'); + } + } + /** + * trae todos los productos de un proveedor + */ + public function order(Supplier $supplier) + { + $products = $supplier->products()->orderBy('name')->get(); + + return view('suppliers.order', compact('supplier', 'products')); + } +} \ No newline at end of file diff --git a/resources/views/suppliers/create.blade.php b/resources/views/suppliers/create.blade.php new file mode 100644 index 0000000..cb046c9 --- /dev/null +++ b/resources/views/suppliers/create.blade.php @@ -0,0 +1,43 @@ + + + +
+
+ @csrf + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + @error('address') + {{ $message }} + @enderror +
+
+ +
+ Cancelar + +
+ +
+
+
\ No newline at end of file diff --git a/resources/views/suppliers/edit.blade.php b/resources/views/suppliers/edit.blade.php new file mode 100644 index 0000000..1952dc8 --- /dev/null +++ b/resources/views/suppliers/edit.blade.php @@ -0,0 +1,45 @@ + + + +
+
+ @csrf + @method('PUT') + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + + @error('address') + {{ $message }} + @enderror +
+
+ +
+ Cancelar + +
+ +
+
+
\ No newline at end of file diff --git a/resources/views/suppliers/index.blade.php b/resources/views/suppliers/index.blade.php new file mode 100644 index 0000000..7fd2443 --- /dev/null +++ b/resources/views/suppliers/index.blade.php @@ -0,0 +1,114 @@ + + + + + + @if(session('success')) +
+ {{ session('success') }} +
+ @endif + + +
+ +
+
+
+ +
+ +
+
+ + + + Nuevo Proveedor + +
+ +
+ + + + + + + + + + + @forelse($suppliers as $supplier) + + + + + + + + @empty + + + + @endforelse + +
Proveedor / EmailTeléfono / WhatsAppDirecciónAcciones
+
{{ $supplier->name }}
+
+ {{ $supplier->email ?? 'Sin email registrado' }} +
+
+ @if($supplier->phone) +
+ {{ $supplier->phone }} + WA +
+ @else + No registrado + @endif +
+ + {{ $supplier->address ?? '-' }} + + + + + + + + +
+ @csrf + @method('DELETE') + +
+
+
+ + + +

No se encontraron proveedores.

+
+
+
+ +
+ {{ $suppliers->links() }} +
+ +
\ No newline at end of file diff --git a/resources/views/suppliers/order.blade.php b/resources/views/suppliers/order.blade.php new file mode 100644 index 0000000..34a5429 --- /dev/null +++ b/resources/views/suppliers/order.blade.php @@ -0,0 +1,203 @@ + + + +
+ +
+
+

Seleccioná los productos

+

Teléfono registrado: {{ $supplier->phone ?? 'Ninguno' }}

+
+ Volver al listado +
+ + @if($products->isEmpty()) +
+ Este proveedor todavía no tiene productos asociados en el sistema. +
+ @else +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + + + + + + + + + + @foreach($products as $product) + + + + + + + + @endforeach + +
PedirCantidadProductoStock Actual
+ + + + + {{ $product->name }} + + @if($product->stock_quantity <= $product->min_stock_alert) + + {{ $product->stock_quantity }} (¡Bajo!) + + @else + + {{ $product->stock_quantity }} + + @endif +
+
+ +
+ +
+ @endif + +
+ + + + +
\ No newline at end of file