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

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');
}