Add empleado, borrado del seeder, cambios esteticos y middleware.
This commit is contained in:
@@ -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.');
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user