Files
whatsapp/api/lab/create_enfermero_user.php
2026-03-10 18:42:51 -05:00

93 lines
3.4 KiB
PHP

<?php
/**
* POST /api/lab/create_enfermero_user.php
* Crea o actualiza el usuario de acceso al sistema para una enfermera.
* Solo administradores pueden llamar este endpoint.
*
* Body JSON:
* { enfermera_id, username, password?, full_name? }
* Si el usuario ya existe para esa enfermera_id, actualiza username/password.
* Si password viene vacío en actualización, no cambia la contraseña.
*
* Returns:
* { ok:true, message, user_id }
*/
require_once __DIR__ . '/_helpers.php';
requireAdmin();
requireMethod('POST');
try {
$datos = inputJson();
$enfermeraId = (int)($datos['enfermera_id'] ?? 0);
$username = trim($datos['username'] ?? '');
$password = $datos['password'] ?? '';
$fullName = trim($datos['full_name'] ?? '');
if (!$enfermeraId) jsonError('enfermera_id es obligatorio');
if (!$username) jsonError('username es obligatorio');
if (strlen($username) < 3) jsonError('El usuario debe tener al menos 3 caracteres');
$db = Database::getInstance();
// Verificar que la enfermera existe
$enf = $db->fetch('SELECT id, nombre_completo FROM lab_enfermeras WHERE id = ?', [$enfermeraId]);
if (!$enf) jsonError('Enfermera no encontrada', 404);
if (empty($fullName)) $fullName = $enf['nombre_completo'];
// ¿Ya existe un usuario vinculado a esta enfermera?
$existente = $db->fetch(
'SELECT id, username FROM admin_users WHERE enfermera_id = ? LIMIT 1',
[$enfermeraId]
);
if ($existente) {
// --- ACTUALIZAR ---
// Verificar que el nuevo username no esté en uso por OTRO usuario
$conflicto = $db->fetch(
'SELECT id FROM admin_users WHERE username = ? AND id != ?',
[$username, $existente['id']]
);
if ($conflicto) jsonError("El usuario '$username' ya está en uso por otra cuenta");
$sets = ['username = ?', 'full_name = ?', 'is_active = 1', 'updated_at = NOW()'];
$vals = [$username, $fullName];
if (!empty($password)) {
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
$sets[] = 'password_hash = ?';
$vals[] = password_hash($password, PASSWORD_DEFAULT);
}
$vals[] = $existente['id'];
$db->execute(
'UPDATE admin_users SET ' . implode(', ', $sets) . ' WHERE id = ?',
$vals
);
jsonOk(['user_id' => $existente['id']], 'Acceso actualizado correctamente');
} else {
// --- CREAR ---
if (empty($password)) jsonError('La contraseña es obligatoria para crear el acceso');
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
// Verificar username único
$conflicto = $db->fetch('SELECT id FROM admin_users WHERE username = ?', [$username]);
if ($conflicto) jsonError("El usuario '$username' ya está en uso");
$hash = password_hash($password, PASSWORD_DEFAULT);
$db->execute(
"INSERT INTO admin_users (username, password_hash, full_name, role, enfermera_id, is_active, created_at)
VALUES (?, ?, ?, 'enfermero', ?, 1, NOW())",
[$username, $hash, $fullName, $enfermeraId]
);
$userId = $db->lastInsertId();
jsonOk(['user_id' => $userId], 'Acceso creado correctamente');
}
} catch (Exception $e) {
jsonError($e->getMessage(), 500);
}