126 lines
5.2 KiB
PHP
126 lines
5.2 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;
|
|
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,
|
|
], fn($v) => $v !== null);
|
|
}
|