Files
Jobhero_back/app/Http/Controllers/TechnicianController.php
Carlos 0ed98c96ee feat: profile_photo en contratos activos, notificaciones bilingues en reportes y foto en panel usuarios
- API contratos activos (cliente y proveedor): agrega campo profile_photo (técnico asignado o supplier, null si no tiene)
- Notificaciones push bilingues en comentarios de reporte: "Nueva actividad en tu reporte" / "New activity on your report"
- Moderador en web panel notifica a cliente y proveedor al comentar, con prefijo Moderador/Moderator
- Panel usuarios: columna de foto de perfil entre ID y Nombre

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 17:17:14 -06:00

193 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Technician;
use App\Models\User;
use App\Models\CurrentContracts;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
class TechnicianController extends Controller
{
public function index(Request $request)
{
$user = Auth::user();
$supplier = $user->suppliers;
if (!$supplier) {
return response()->json(['message' => 'No tienes un perfil de proveedor'], 400);
}
$technicians = Technician::with('user')
->where('supplier_id', $supplier->id)
->get()
->map(fn($t) => [
'id' => $t->id,
'user_id' => $t->user_id,
'name' => $t->user->name ?? null,
'email' => $t->user->email ?? null,
'phone' => $t->user->phone ?? null,
]);
return response()->json($technicians);
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'user_id' => 'required|numeric|exists:users,id',
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}
$user = Auth::user();
$supplier = $user->suppliers;
if (!$supplier) {
return response()->json(['message' => 'No tienes un perfil de proveedor'], 400);
}
$targetUser = User::find($request->user_id);
if ($targetUser->id === $user->id) {
return response()->json(['message' => 'No puedes agregarte a ti mismo como técnico'], 422);
}
$exists = Technician::where('user_id', $request->user_id)
->where('supplier_id', $supplier->id)
->exists();
if ($exists) {
return response()->json(['message' => 'Este usuario ya es técnico de tu empresa'], 422);
}
$technician = Technician::create([
'user_id' => $request->user_id,
'supplier_id' => $supplier->id,
]);
$targetUser->role_id = 8;
$targetUser->save();
return response()->json([
'id' => $technician->id,
'user_id' => $technician->user_id,
'name' => $targetUser->name,
'email' => $targetUser->email,
'phone' => $targetUser->phone,
], 201);
}
public function destroy($id)
{
$user = Auth::user();
$supplier = $user->suppliers;
if (!$supplier) {
return response()->json(['message' => 'No tienes un perfil de proveedor'], 400);
}
$technician = Technician::where('id', $id)
->where('supplier_id', $supplier->id)
->first();
if (!$technician) {
return response()->json(['message' => 'Técnico no encontrado'], 404);
}
// Revertir role a "Usuario" solo si no pertenece a otro proveedor
$otherSuppliers = Technician::where('user_id', $technician->user_id)
->where('supplier_id', '!=', $supplier->id)
->exists();
if (!$otherSuppliers) {
$targetUser = User::find($technician->user_id);
if ($targetUser && $targetUser->role_id === 8) {
$targetUser->role_id = 1;
$targetUser->save();
}
}
$technician->delete();
return response()->json(['message' => 'Técnico eliminado exitosamente']);
}
public function find(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}
$user = Auth::user();
$supplier = $user->suppliers;
if (!$supplier) {
return response()->json(['message' => 'No tienes un perfil de proveedor'], 400);
}
$targetUser = User::where('email', $request->email)->first();
if (!$targetUser) {
return response()->json(['message' => 'Usuario no encontrado'], 404);
}
$alreadyInTeam = Technician::where('user_id', $targetUser->id)
->where('supplier_id', $supplier->id)
->exists();
return response()->json([
'id' => $targetUser->id,
'name' => $targetUser->name,
'email' => $targetUser->email,
'phone' => $targetUser->phone,
'already_in_team' => $alreadyInTeam,
]);
}
public function assign(Request $request)
{
$validator = Validator::make($request->all(), [
'contract_id' => 'required|numeric|exists:current_contracts,id',
'technician_id' => 'nullable|numeric|exists:technicians,id',
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}
$user = Auth::user();
$supplier = $user->suppliers;
if (!$supplier) {
return response()->json(['message' => 'No tienes un perfil de proveedor'], 400);
}
$contract = CurrentContracts::find($request->contract_id);
if ($contract->supplier_id !== $supplier->id) {
return response()->json(['message' => 'No autorizado'], 403);
}
if ($request->technician_id) {
$technician = Technician::where('id', $request->technician_id)
->where('supplier_id', $supplier->id)
->first();
if (!$technician) {
return response()->json(['message' => 'El técnico no pertenece a tu empresa'], 422);
}
}
$contract->technical_id = $request->technician_id ?? null;
$contract->save();
return response()->json(['message' => 'Técnico asignado exitosamente']);
}
}