Add empleado, borrado del seeder, cambios esteticos y middleware.

This commit is contained in:
2026-06-10 15:57:51 -03:00
parent d0d61f7985
commit 2454ee3a23
20 changed files with 1039 additions and 200 deletions
@@ -0,0 +1,88 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
class EmployeeController extends Controller
{
/**
* Listar empleados
*/
public function index()
{
$employees = User::where('role', 'employee')->orderBy('name')->get();
return view('admin.employees.index', compact('employees'));
}
/**
* Crear un nuevo empleado
*/
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
$user = new User();
$user->name = $request->name;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->role = 'employee';
$user->save();
return redirect()->route('admin.employees.index')->with('success', 'Empleado creado correctamente.');
}
/**
* Eliminar un empleado
*/
public function destroy(User $user)
{
// Evitar que se elimine a sí mismo o a otro administrador (seguridad adicional)
if ($user->role !== 'employee') {
return redirect()->route('admin.employees.index')->with('error', 'Solo se pueden eliminar empleados.');
}
if ($user->id === auth()->id()) {
return redirect()->route('admin.employees.index')->with('error', 'No puedes eliminar tu propia cuenta.');
}
$user->delete();
return redirect()->route('admin.employees.index')->with('success', 'Empleado eliminado correctamente.');
}
/**
* Actualizar datos de un empleado
*/
public function update(Request $request, User $user)
{
if ($user->role !== 'employee') {
return redirect()->route('admin.employees.index')->with('error', 'Solo se pueden editar empleados.');
}
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id],
'password' => ['nullable', 'string', 'min:8', 'confirmed'],
]);
$user->name = $request->name;
$user->email = $request->email;
if ($request->filled('password')) {
$user->password = Hash::make($request->password);
}
$user->save();
return redirect()->route('admin.employees.index')->with('success', 'Empleado actualizado correctamente.');
}
}
+8 -2
View File
@@ -19,8 +19,14 @@ class AgendaController extends Controller
'title' => $appointment->scheduled_at->format('H:i') . ' - ' . $appointment->client->name,
'start' => $appointment->scheduled_at->format('Y-m-d\TH:i:s'),
'extendedProps' => [
'description' => $appointment->problem_description,
'status' => $appointment->status,
'client_name' => $appointment->client->name,
'client_phone' => $appointment->contact_phone,
'bike_model' => $appointment->bike_model,
'description' => $appointment->problem_description,
'parts_needed' => $appointment->parts_needed,
'estimated_cost'=> $appointment->estimated_cost,
'status' => $appointment->status,
'notes' => $appointment->notes,
],
];
}
+14 -2
View File
@@ -7,6 +7,13 @@ use App\Models\Client;
class ClientController extends Controller
{
private function checkAdmin()
{
if (auth()->check() && auth()->user()->role !== 'admin') {
abort(403, 'Solo los administradores pueden realizar esta acción.');
}
}
/**
* Display a listing of the resource.
*/
@@ -31,6 +38,7 @@ class ClientController extends Controller
*/
public function create()
{
$this->checkAdmin();
return view('clients.create');
}
@@ -39,6 +47,7 @@ class ClientController extends Controller
*/
public function store(Request $request)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => ['required', 'string', 'max:255', 'not_regex:/[0-9]/'],
'phone' => 'nullable|string|max:50',
@@ -76,19 +85,21 @@ class ClientController extends Controller
/**
* Display the specified resource.
*/
public function show(string $id)
public function show(Client $client)
{
//
return view('clients.show', compact('client'));
}
public function edit(Client $client)
{
$this->checkAdmin();
// Reutilizamos la vista de create, o creamos una edit.blade.php similar
return view('clients.edit', compact('client'));
}
public function update(Request $request, Client $client)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => ['required', 'string', 'max:255', 'not_regex:/[0-9]/'],
'phone' => 'nullable|string|max:50',
@@ -109,6 +120,7 @@ class ClientController extends Controller
*/
public function destroy(Client $client)
{
$this->checkAdmin();
try {
$client->delete();
return redirect()->route('clients.index')->with('success', 'Cliente eliminado correctamente.');
@@ -8,6 +8,13 @@ use App\Models\Supplier;
class ExpenseController extends Controller
{
private function checkAdmin()
{
if (auth()->check() && auth()->user()->role !== 'admin') {
abort(403, 'Solo los administradores pueden realizar esta acción.');
}
}
public function index(Request $request)
{
$query = $request->input('search');
@@ -33,12 +40,14 @@ class ExpenseController extends Controller
public function create()
{
$this->checkAdmin();
$suppliers = Supplier::orderBy('name')->get();
return view('expenses.create', compact('suppliers'));
}
public function store(Request $request)
{
$this->checkAdmin();
$validated = $request->validate([
'supplier_id' => 'nullable|exists:suppliers,id',
'description' => 'required|string|max:255',
@@ -66,12 +75,14 @@ class ExpenseController extends Controller
public function edit(Expense $expense)
{
$this->checkAdmin();
$suppliers = Supplier::orderBy('name')->get();
return view('expenses.edit', compact('expense', 'suppliers'));
}
public function update(Request $request, Expense $expense)
{
$this->checkAdmin();
$validated = $request->validate([
'supplier_id' => 'nullable|exists:suppliers,id',
'description' => 'required|string|max:255',
@@ -90,6 +101,7 @@ class ExpenseController extends Controller
public function destroy(Expense $expense)
{
$this->checkAdmin();
$expense->delete();
return redirect()->route('expenses.index')->with('success', 'Gasto eliminado correctamente.');
}
@@ -11,6 +11,13 @@ use Illuminate\Support\Facades\Storage;
class ProductosController extends Controller
{
private function checkAdmin()
{
if (auth()->check() && auth()->user()->role !== 'admin') {
abort(403, 'Solo los administradores pueden realizar esta acción.');
}
}
/*public function index(Request $request)
{
$query = $request->input('search');
@@ -55,6 +62,7 @@ class ProductosController extends Controller
public function create()
{
$this->checkAdmin();
$suppliers = Supplier::orderBy('name')->get();
$tags = Tag::orderBy('name')->get();
return view('productos.create', compact('suppliers', 'tags'));
@@ -62,6 +70,7 @@ class ProductosController extends Controller
public function store(Request $request)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
@@ -124,6 +133,7 @@ class ProductosController extends Controller
public function edit(Product $product)
{
$this->checkAdmin();
$suppliers = Supplier::orderBy('name')->get();
$tags = Tag::orderBy('name')->get();
return view('productos.edit', compact('product', 'suppliers', 'tags'));
@@ -131,6 +141,7 @@ class ProductosController extends Controller
public function update(Request $request, Product $product)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => 'required|string|max:255',
'type' => 'required|in:bike,accessory,clothing,spare,service,children,skate,rollers,other',
@@ -194,6 +205,7 @@ class ProductosController extends Controller
public function destroy(Product $product)
{
$this->checkAdmin();
if ($product->image_path) {
Storage::disk('public')->delete($product->image_path);
}
@@ -4,6 +4,13 @@ use Illuminate\Http\Request;
use App\Models\Supplier;
class SupplierController extends Controller
{
private function checkAdmin()
{
if (auth()->check() && auth()->user()->role !== 'admin') {
abort(403, 'Solo los administradores pueden realizar esta acción.');
}
}
/**
* grilla de proveedores con buscador
*/
@@ -27,12 +34,14 @@ class SupplierController extends Controller
*/
public function create()
{
$this->checkAdmin();
return view('suppliers.create');
}
public function store(Request $request)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => 'required|string|max:255',
'phone' => 'nullable|string|max:50',
@@ -56,11 +65,13 @@ class SupplierController extends Controller
public function edit(Supplier $supplier)
{
$this->checkAdmin();
return view('suppliers.edit', compact('supplier'));
}
public function update(Request $request, Supplier $supplier)
{
$this->checkAdmin();
$validated = $request->validate([
'name' => 'required|string|max:255',
'phone' => 'nullable|string|max:50',
@@ -79,6 +90,7 @@ class SupplierController extends Controller
*/
public function destroy(Supplier $supplier)
{
$this->checkAdmin();
try {
$supplier->delete();
return redirect()->route('suppliers.index')