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