88 lines
3.9 KiB
PHP
88 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* POST /api/lab/save_lab_user.php
|
|
* Crea o actualiza un usuario del sistema.
|
|
* Solo admins.
|
|
*
|
|
* Body JSON:
|
|
* { id?, username, full_name, email?, password?, role_id, is_active?, enfermera_id? }
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
requireMethod('POST');
|
|
requireAdmin();
|
|
|
|
$body = inputJson();
|
|
$id = isset($body['id']) ? (int)$body['id'] : null;
|
|
$username = trim($body['username'] ?? '');
|
|
$fullName = trim($body['full_name'] ?? '');
|
|
$email = trim($body['email'] ?? '');
|
|
$password = $body['password'] ?? '';
|
|
$roleId = isset($body['role_id']) ? (int)$body['role_id'] : null;
|
|
$isActive = isset($body['is_active']) ? (int)(bool)$body['is_active'] : 1;
|
|
$enfermeraId = isset($body['enfermera_id']) && $body['enfermera_id'] !== '' && $body['enfermera_id'] !== null
|
|
? (int)$body['enfermera_id'] : null;
|
|
|
|
if (!$username) jsonError('El nombre de usuario es obligatorio');
|
|
if (!$fullName) jsonError('El nombre completo es obligatorio');
|
|
if (!$roleId) jsonError('Debes seleccionar un rol');
|
|
|
|
// Validar username (solo alfanumérico + guión bajo)
|
|
if (!preg_match('/^[a-zA-Z0-9_\.]{3,50}$/', $username)) {
|
|
jsonError('El username solo puede tener letras, números, puntos y guiones bajos (3-50 caracteres)');
|
|
}
|
|
|
|
$db = Database::getInstance();
|
|
|
|
// Obtener slug del rol
|
|
$role = $db->fetch("SELECT id, slug FROM roles WHERE id = ?", [$roleId]);
|
|
if (!$role) jsonError('Rol no encontrado', 404);
|
|
$roleSlug = $role['slug'];
|
|
|
|
// Si el rol es enfermero y no hay enfermera_id, buscar si tiene ya uno vinculado
|
|
// (se puede crear sin vincular y vincularlo después desde la pantalla de Enfermeras)
|
|
|
|
if ($id) {
|
|
// ── Actualizar ──────────────────────────────────────────
|
|
$existing = $db->fetch("SELECT id, username FROM admin_users WHERE id = ?", [$id]);
|
|
if (!$existing) jsonError('Usuario no encontrado', 404);
|
|
|
|
// Verificar duplicado de username (excluir el propio)
|
|
$dup = $db->fetch("SELECT id FROM admin_users WHERE username = ? AND id != ?", [$username, $id]);
|
|
if ($dup) jsonError('Ese nombre de usuario ya está en uso');
|
|
|
|
$params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $id];
|
|
$sql = "UPDATE admin_users
|
|
SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, updated_at=NOW()
|
|
WHERE id=?";
|
|
|
|
if ($password) {
|
|
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
|
|
$hash = password_hash($password, PASSWORD_BCRYPT);
|
|
$sql = "UPDATE admin_users
|
|
SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, password_hash=?, updated_at=NOW()
|
|
WHERE id=?";
|
|
$params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $hash, $id];
|
|
}
|
|
|
|
$db->query($sql, $params);
|
|
jsonOk(['id' => $id], 'Usuario actualizado correctamente');
|
|
|
|
} else {
|
|
// ── Crear ────────────────────────────────────────────────
|
|
if (!$password) jsonError('La contraseña es obligatoria al crear un usuario');
|
|
if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
|
|
|
|
$dup = $db->fetch("SELECT id FROM admin_users WHERE username = ?", [$username]);
|
|
if ($dup) jsonError('Ese nombre de usuario ya está en uso');
|
|
|
|
$hash = password_hash($password, PASSWORD_BCRYPT);
|
|
|
|
$db->query(
|
|
"INSERT INTO admin_users (username, full_name, email, password_hash, role_id, role, is_active, enfermera_id)
|
|
VALUES (?,?,?,?,?,?,?,?)",
|
|
[$username, $fullName, $email ?: null, $hash, $roleId, $roleSlug, $isActive, $enfermeraId]
|
|
);
|
|
$newId = $db->lastInsertId();
|
|
jsonOk(['id' => $newId], 'Usuario creado correctamente');
|
|
}
|