Ir al contenido

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.

CL

MX

PE

fhir.create patient

injectMeta

ProfileResolver

tenant.country

meta.profile = .../cl/.../Patient

meta.profile = .../mx/.../Patient

meta.profile = .../pe/.../Patient

meta.tag urn:ema:tenant

+ urn:ema:ig-version

POST a Aidbox

scoped por Organization

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.

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.

SDKVaultemaclinic
Hoy
Hoy
emaclinic
SDK 0.6.0 deployado
SDK 0.6.0 deployado
Vault
7 países activos en Supabase
7 países activos en Supabase
Vault publica país 8
Vault publica país 8
Vault
INSERT en emashared.countries
INSERT en emashared.countries
Vault
invalidate cache (opcional)
invalidate cache (opcional)
≤ 5 minutos después
≤ 5 minutos después
SDK
Cache TTL expira
Cache TTL expira
SDK
Lazy refresh on miss
Lazy refresh on miss
emaclinic
Productos funcionan con el país nuevo
Productos funcionan con el país nuevo
Cuando Vault publica un país nuevo (Wave 4)

Cero redeploy de productos. Cero bump de versión del SDK.

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, ... }

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:

terminado

error

fhir.create observation

options.translate code

Auto-meta inject

applyAutoTranslate

Por cada field

$translate vía Aidbox

append target coding

al array existente

POST a Aidbox

logger.warn

append vacío

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.

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.