true] + $data); exit; } function err(string $msg, int $code = 400): void { http_response_code($code); echo json_encode(['ok' => false, 'error' => $msg]); exit; } // ── Auth ───────────────────────────────────────────────────────────── if (!isUserLoggedIn()) { err('No autenticado', 401); } // ── Input ──────────────────────────────────────────────────────────── $body = json_decode(file_get_contents('php://input'), true); if (!$body) $body = $_POST; $envioId = (int)($body['envio_id'] ?? 0); $campoId = trim($body['campo_id'] ?? ''); $svg = $body['svg'] ?? ''; if (!$envioId) err('envio_id requerido'); if ($campoId === '') err('campo_id requerido'); if ($svg === '') err('svg requerido'); // Validar que el SVG sea data URI de imagen (evita inyección de contenido) if (!preg_match('/^data:image\/(svg\+xml|png|jpeg|webp);base64,/i', $svg)) { err('Formato de firma no válido'); } // ── Cargar envío ───────────────────────────────────────────────────── $db = Database::getInstance(); $envio = $db->fetch('SELECT id, datos_cliente, estado, formulario_id FROM lab_form_envios WHERE id = ?', [$envioId]); if (!$envio) err('Envío no encontrado', 404); // Enfermero: solo puede firmar sus propios envíos if (isEnfermero()) { $uid = (int)($_SESSION['admin_user']['id'] ?? 0); $propio = $db->fetch('SELECT id FROM lab_form_envios WHERE id = ? AND enviado_por = ?', [$envioId, $uid]); if (!$propio) err('Sin acceso', 403); } // ── Validar que campo_id corresponde a una firma_profesional ───────── $form = $db->fetch('SELECT esquema FROM lab_formularios WHERE id = ?', [$envio['formulario_id']]); if (!$form) err('Formulario no encontrado', 404); $esquema = json_decode($form['esquema'], true) ?? []; $campoDef = null; foreach ($esquema as $c) { if (($c['id'] ?? '') === $campoId) { $campoDef = $c; break; } } if (!$campoDef || ($campoDef['tipo'] ?? '') !== 'firma_profesional') { err('El campo no es una firma_profesional'); } // ── Actualizar datos_cliente: guardar solo en el campo firmado ── $datos = json_decode($envio['datos_cliente'] ?? '{}', true) ?? []; $datos[$campoId . '_svg'] = $svg; $nuevosDatos = json_encode($datos, JSON_UNESCAPED_UNICODE); $nuevoEstado = $envio['estado'] === 'firmado' ? 'firmado' : 'firmado'; $db->query( 'UPDATE lab_form_envios SET datos_cliente = ?, estado = ?, completado_en = COALESCE(completado_en, NOW()) WHERE id = ?', [$nuevosDatos, $nuevoEstado, $envioId] ); ok(['mensaje' => 'Firma del profesional guardada correctamente']);