Files
whatsapp/api/lab/save_nota_domicilio.php
T

145 lines
6.0 KiB
PHP

<?php
/**
* POST /api/lab/save_nota_domicilio.php
* Crea o actualiza una nota de domicilio.
*
* Body JSON:
* { domicilio_id, tipo } — campos comunes (para crear)
* { id, tipo, … } — actualizar por id
*
* Campos tipo='clinica':
* antecedentes, medicamentos, acudiente_nombre, acudiente_documento
*
* Campos tipo='libre':
* titulo (requerido), cuerpo, imagen_path
*
* Reglas:
* · Solo puede existir UNA nota tipo='clinica' por domicilio.
* Si ya existe y no viene `id`, se hace UPSERT automático.
* · Las notas 'libre' son ilimitadas.
* · Solo el enfermero dueño o un admin puede editar/crear.
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
// Tags HTML permitidos en el cuerpo de notas libres (desde contenteditable)
const ALLOWED_HTML_TAGS = '<b><i><u><strong><em><s><strike><ul><ol><li><br><p><div>';
try {
$datos = inputJson();
$db = Database::getInstance();
$tipo = $datos['tipo'] ?? '';
if (!in_array($tipo, ['clinica', 'libre'], true)) {
jsonError('tipo debe ser "clinica" o "libre"');
}
// ── Actualizar nota existente ─────────────────────────────────────────
if (!empty($datos['id'])) {
$id = (int)$datos['id'];
$nota = $db->fetch('SELECT * FROM lab_domicilio_notas WHERE id = ?', [$id]);
if (!$nota) jsonError('Nota no encontrada', 404);
// Verificar propiedad
if (userRole() === 'enfermero' && (int)$nota['enfermera_id'] !== enfermeraId()) {
jsonError('No puede editar esta nota', 403);
}
$campos = _extraerCampos($datos, $tipo);
$db->update('lab_domicilio_notas', $campos, 'id = ?', [$id]);
jsonOk(['id' => $id], 'Nota actualizada');
}
// ── Crear nota nueva (o upsert clínica) ───────────────────────────────
$domId = (int)($datos['domicilio_id'] ?? 0);
if (!$domId) jsonError('domicilio_id requerido');
// Verificar que el domicilio existe
$dom = $db->fetch('SELECT id FROM lab_domicilios WHERE id = ?', [$domId]);
if (!$dom) jsonError('Domicilio no encontrado', 404);
// Verificar acceso
if (userRole() === 'enfermero') {
$enfId = enfermeraId();
$asig = $db->fetch(
"SELECT id FROM lab_asignaciones WHERE domicilio_id = ? AND enfermera_id = ?",
[$domId, $enfId]
);
if (!$asig) jsonError('Sin acceso a este domicilio', 403);
}
$enfId = (userRole() === 'enfermero') ? enfermeraId() : (int)($datos['enfermera_id'] ?? 0);
// Para nota clínica: solo puede haber una por domicilio → UPDATE si ya existe
if ($tipo === 'clinica') {
$existente = $db->fetch(
'SELECT id FROM lab_domicilio_notas WHERE domicilio_id = ? AND tipo = "clinica"',
[$domId]
);
$campos = _extraerCampos($datos, 'clinica');
if ($existente) {
$db->update('lab_domicilio_notas', $campos, 'id = ?', [(int)$existente['id']]);
jsonOk(['id' => (int)$existente['id']], 'Ficha clínica actualizada');
} else {
$campos['domicilio_id'] = $domId;
$campos['enfermera_id'] = $enfId;
$campos['tipo'] = 'clinica';
$id = $db->insert('lab_domicilio_notas', $campos);
jsonOk(['id' => $id], 'Ficha clínica creada');
}
}
// Nota libre
if (empty(trim($datos['titulo'] ?? ''))) jsonError('El título es obligatorio');
$campos = _extraerCampos($datos, 'libre');
$campos['domicilio_id'] = $domId;
$campos['enfermera_id'] = $enfId;
$campos['tipo'] = 'libre';
$id = $db->insert('lab_domicilio_notas', $campos);
jsonOk(['id' => $id], 'Nota creada');
} catch (Exception $e) {
error_log('[save_nota_domicilio] ' . $e->getMessage());
jsonError($e->getMessage(), 500);
}
// ── Helper interno ────────────────────────────────────────────────────────
function _extraerCampos(array $datos, string $tipo): array {
if ($tipo === 'clinica') {
return array_filter([
'antecedentes' => isset($datos['antecedentes']) ? trim($datos['antecedentes']) : null,
'medicamentos' => isset($datos['medicamentos']) ? trim($datos['medicamentos']) : null,
'acudiente_nombre' => isset($datos['acudiente_nombre']) ? trim($datos['acudiente_nombre']) : null,
'acudiente_documento' => isset($datos['acudiente_documento']) ? trim($datos['acudiente_documento']) : null,
], fn($v) => $v !== null);
}
// libre
$cuerpo = isset($datos['cuerpo'])
? strip_tags((string)$datos['cuerpo'], ALLOWED_HTML_TAGS)
: null;
// Validar y limpiar archivos (array de {nombre,path,mime,size})
$archivos = null;
if (!empty($datos['archivos']) && is_array($datos['archivos'])) {
$limpios = [];
foreach ($datos['archivos'] as $a) {
$path = preg_replace('/[^a-zA-Z0-9._\-]/', '', (string)($a['path'] ?? ''));
if (!$path) continue;
$limpios[] = [
'nombre' => mb_substr(strip_tags((string)($a['nombre'] ?? $path)), 0, 100),
'path' => $path,
'mime' => preg_replace('/[^a-zA-Z0-9\/\-+.]/', '', (string)($a['mime'] ?? '')),
'size' => (int)($a['size'] ?? 0),
];
}
if ($limpios) $archivos = json_encode($limpios, JSON_UNESCAPED_UNICODE);
}
return array_filter([
'titulo' => isset($datos['titulo']) ? mb_substr(trim($datos['titulo']), 0, 200) : null,
'cuerpo' => $cuerpo ?: null,
'imagen_path' => isset($datos['imagen_path']) ? preg_replace('/[^a-zA-Z0-9._\-]/', '', (string)$datos['imagen_path']) : null,
'archivos' => $archivos,
], fn($v) => $v !== null);
}