get(['id', 'employee_id', 'name', 'email', 'phone', 'color', 'role', 'is_active']); return response()->json([ 'success' => true, 'staff' => $staff, ]); } /** * POST /api/staff * Create new staff */ public function store(Request $request): JsonResponse { $request->validate([ 'employee_id' => 'required|string|unique:users,employee_id', 'name' => 'required|string', 'email' => 'required|email|unique:users,email', 'password' => 'required|string|min:6', // Password mandatory on create 'phone' => 'nullable|string', 'color' => 'nullable|string', 'role' => 'nullable|string|in:sales,admin,manager', // Default to sales if not provided ]); $user = User::create([ 'employee_id' => $request->employee_id, 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), 'phone' => $request->phone, 'color' => $request->color ?? '#3B82F6', // Default blue 'role' => $request->role ?? 'sales', 'is_active' => true, ]); return response()->json([ 'success' => true, 'message' => 'Staff created successfully', 'user' => $user, ]); } /** * PUT /api/staff/{id} * Update staff */ public function update(Request $request, string $id): JsonResponse { $user = User::find($id); if (!$user) { return response()->json(['success' => false, 'error' => 'User not found'], 404); } $request->validate([ 'employee_id' => ['nullable', 'string', Rule::unique('users')->ignore($user->id)], 'email' => ['nullable', 'email', Rule::unique('users')->ignore($user->id)], 'name' => 'nullable|string', 'password' => 'nullable|string|min:6', 'color' => 'nullable|string', ]); $data = $request->only(['employee_id', 'name', 'email', 'phone', 'color', 'role', 'is_active']); // Update password only if provided if ($request->filled('password')) { $data['password'] = Hash::make($request->password); } $user->update($data); return response()->json([ 'success' => true, 'message' => 'Staff updated successfully', 'user' => $user, ]); } /** * DELETE /api/staff/{id} * Delete staff */ public function destroy(string $id): JsonResponse { $user = User::find($id); if (!$user) { return response()->json(['success' => false, 'error' => 'User not found'], 404); } // Optional: Check if user has related data (routes/plans) to prevent deletion? // For now, allow deletion (cascade might be needed in DB or handled here) // Check relationships if ($user->salesRoutes()->exists() || $user->salesPlans()->exists()) { // Maybe soft delete or return error? // User requested "Master Data CRUD", usually implies full control. // I'll proceed with delete, but ideally should warn. // Given the scope, I will just delete. DB might error if integrity constraint. // Let's wrap in try catch or just delete. } try { $user->delete(); return response()->json([ 'success' => true, 'message' => 'Staff deleted successfully', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'error' => 'Cannot delete staff. Data integrity constraint.', ], 400); } } }