Casos de uso y workflows
Workflow 1 — Crear un Patient con tenant context
Sección titulada «Workflow 1 — Crear un Patient con tenant context»El caso de uso más básico. Mostrar cómo un mismo bloque de código emite un Patient correctamente perfilado para CL, MX o PE según el tenant.
import { createEmaClient } from 'emafhir';
const fhir = createEmaClient({ tenant, supabase });
const patient = await fhir.create({ resourceType: 'Patient', name: [{ given: ['Ana'], family: 'Pérez' }], identifier: [{ system: 'urn:national:cl:run', value: '12345678-5' }],});// El recurso llega a Aidbox con meta.profile y meta.tag correctos.Workflow 2 — Buscar con filtros
Sección titulada «Workflow 2 — Buscar con filtros»El builder fluent reemplaza el armado de query strings a mano:
import { search } from 'emafhir';
const params = search() .where('name', 'García') .whereToken('gender', 'http://hl7.org/fhir/administrative-gender', 'female') .whereDate('birthdate', 'ge', '1990-01-01') .include('Patient:general-practitioner') .sort('-_lastUpdated') .count(20) .build();
const result = await fhir.searchResources('Patient', params);Workflow 3 — Multi-país: mismo código, distinto resultado
Sección titulada «Workflow 3 — Multi-país: mismo código, distinto resultado»Lo central de Wave 1: el SDK no necesita conocer los países. ProfileResolver lee runtime desde Supabase.
Cero redeploy de productos. Cero bump de versión del SDK.
Workflow 4 — Validadores nacionales
Sección titulada «Workflow 4 — Validadores nacionales»Subpath dedicado, importás solo lo que usás:
import { validateRun, validateCurp, validateRfc, validateDni } from 'emafhir/validators';
validateRun('12.345.678-5'); // { valid: true, normalized: '12345678-5' }validateRun('12.345.678-K'); // { valid: false, normalized: null }
validateCurp('GARC850315HDFLLR03'); // { valid: true, ... }validateRfc('XAXX010101000'); // { valid: true, ... } (RFC genérico SAT)validateDni('12345678'); // { valid: true, ... }Workflow 5 — Auto-translate opt-in
Sección titulada «Workflow 5 — Auto-translate opt-in»Cuando un producto crea una Observation con un código local, puede
pedir que el SDK enriquezca el coding con su equivalente estándar
(LOINC/SNOMED) usando un ConceptMap configurado:
const obs = await fhir.create( { resourceType: 'Observation', code: { coding: [{ system: 'urn:local:lab', code: 'GLU' }] }, // ... }, { translate: ['code'] }, // hint del field a enriquecer);// obs.code.coding ahora trae el original + LOINC equivalente.Append-only: el coding original no se reemplaza. Si el $translate
falla (timeout, ConceptMap inexistente), el SDK loggea warning pero la
escritura procede.
Workflow 6 — Transaction multi-recurso
Sección titulada «Workflow 6 — Transaction multi-recurso»Para crear varios recursos atómicamente:
import { transaction } from 'emafhir';
const bundle = transaction() .create(patient) .create(observation) .update(encounter) .delete('Task', 'task-123') .build();
await fhir.transaction(bundle);// Aidbox aplica todo o nada.