feat: sistema de notas clínicas para enfermero (ficha + notas libres) y fix lab_reportes métricas
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
<?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);
|
||||
}
|
||||
Reference in New Issue
Block a user