beginTransaction(); try { $sesionId = obtenerOCrearSesionHoy(); $numero = siguienteNumero($sesionId); // Buscar prioridad_id $stmt = $pdo->prepare( 'SELECT id FROM turnero_prioridades WHERE codigo = ? AND activo = 1 LIMIT 1' ); $stmt->execute([$prioCodigo]); $prioridad = $stmt->fetch(PDO::FETCH_ASSOC); if (!$prioridad) { $pdo->rollBack(); jsonError("La prioridad '$prioCodigo' no existe o no está activa.", 422); } $prioridadId = (int) $prioridad['id']; // Código visual: "A001", "E042", etc. $codigo = $prioCodigo . str_pad($numero, 3, '0', STR_PAD_LEFT); $stmt = $pdo->prepare( 'INSERT INTO turnero_turnos (sesion_id, numero, codigo, prioridad_id, paciente_nombre, paciente_cel, estado, creado_at) VALUES (?, ?, ?, ?, ?, ?, "espera", NOW())' ); $stmt->execute([ $sesionId, $numero, $codigo, $prioridadId, $pacienteNombre ?: null, $pacienteCel ?: null, ]); $turnoId = (int) $pdo->lastInsertId(); $pdo->commit(); notificarSSE($sesionId); // Contar posición en la cola $stmt = $pdo->prepare( ' SELECT COUNT(*) AS posicion FROM turnero_turnos t JOIN turnero_prioridades p ON p.id = t.prioridad_id WHERE t.estado = "espera" AND t.sesion_id = ? AND ( p.orden_peso < (SELECT orden_peso FROM turnero_prioridades WHERE id = ?) OR ( p.orden_peso = (SELECT orden_peso FROM turnero_prioridades WHERE id = ?) AND t.creado_at < (SELECT creado_at FROM turnero_turnos WHERE id = ?) ) ) ' ); $stmt->execute([$sesionId, $prioridadId, $prioridadId, $turnoId]); $posicion = (int) $stmt->fetchColumn() + 1; jsonOk([ 'turno' => [ 'id' => $turnoId, 'codigo' => $codigo, 'numero' => $numero, 'prioridad_codigo' => $prioCodigo, 'posicion_cola' => $posicion, 'sesion_id' => $sesionId, ], ], "Turno $codigo asignado correctamente"); } catch (\Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } jsonError('Error al crear el turno: ' . $e->getMessage(), 500); }