@andes/fhir 1.12.0-beta.4 → 1.12.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/{src → dist}/data/patient.json +192 -191
  2. package/dist/{src/helpers → helpers}/patientFactory.js +35 -31
  3. package/dist/{src/lib → lib}/allergyIntolerance.js +39 -40
  4. package/dist/{src/lib → lib}/bundle.js +25 -26
  5. package/dist/{src/lib → lib}/composition.js +152 -152
  6. package/dist/{src/lib → lib}/condition.js +79 -80
  7. package/dist/{src/lib → lib}/config.js +27 -21
  8. package/dist/lib/config.test.js +19 -0
  9. package/dist/{src/lib → lib}/device.js +38 -39
  10. package/dist/lib/device.test.js +9 -0
  11. package/dist/{src/lib → lib}/document-reference.js +106 -107
  12. package/dist/{src/lib → lib}/immunization.js +67 -68
  13. package/{src/lib/medication.ts → dist/lib/medication.js} +64 -61
  14. package/{src/lib/medicationRequest.ts → dist/lib/medicationRequest.js} +103 -100
  15. package/dist/{src/lib → lib}/medicationStatement.js +55 -56
  16. package/dist/lib/organization.js +93 -0
  17. package/dist/lib/patient.js +465 -0
  18. package/dist/lib/patient.test.js +132 -0
  19. package/dist/lib/practitioner.js +186 -0
  20. package/dist/types/andes/organization.types.js +2 -0
  21. package/dist/types/andes/patient.types.js +2 -0
  22. package/dist/types/andes/practitioner.types.js +3 -0
  23. package/package.json +52 -43
  24. package/.circleci/config.yml +0 -72
  25. package/.editorconfig +0 -14
  26. package/.env.example +0 -2
  27. package/.gitattributes +0 -1
  28. package/.github/CODEOWNERS +0 -1
  29. package/.github/labeler.yml +0 -11
  30. package/.github/pull_request_template.md +0 -28
  31. package/.github/workflows/build_test.yml +0 -14
  32. package/.github/workflows/has_conflicts.yml +0 -13
  33. package/.vscode/settings.json +0 -2
  34. package/CHANGELOG.md +0 -335
  35. package/coverage/clover.xml +0 -198
  36. package/coverage/coverage-final.json +0 -5
  37. package/coverage/lcov-report/base.css +0 -224
  38. package/coverage/lcov-report/block-navigation.js +0 -87
  39. package/coverage/lcov-report/config.ts.html +0 -136
  40. package/coverage/lcov-report/device.ts.html +0 -193
  41. package/coverage/lcov-report/favicon.png +0 -0
  42. package/coverage/lcov-report/helpers/index.html +0 -116
  43. package/coverage/lcov-report/helpers/patientFactory.ts.html +0 -124
  44. package/coverage/lcov-report/index.html +0 -131
  45. package/coverage/lcov-report/lib/config.ts.html +0 -136
  46. package/coverage/lcov-report/lib/device.ts.html +0 -193
  47. package/coverage/lcov-report/lib/index.html +0 -146
  48. package/coverage/lcov-report/lib/patient.ts.html +0 -1240
  49. package/coverage/lcov-report/patient.ts.html +0 -1207
  50. package/coverage/lcov-report/prettify.css +0 -1
  51. package/coverage/lcov-report/prettify.js +0 -2
  52. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  53. package/coverage/lcov-report/sorter.js +0 -210
  54. package/coverage/lcov.info +0 -410
  55. package/dist/index.js +0 -52
  56. package/dist/index.js.map +0 -1
  57. package/dist/src/data/patient.json +0 -191
  58. package/dist/src/helpers/patientFactory.js.map +0 -1
  59. package/dist/src/lib/allergyIntolerance.js.map +0 -1
  60. package/dist/src/lib/bundle.js.map +0 -1
  61. package/dist/src/lib/composition.js.map +0 -1
  62. package/dist/src/lib/condition.js.map +0 -1
  63. package/dist/src/lib/config.js.map +0 -1
  64. package/dist/src/lib/config.test.js +0 -13
  65. package/dist/src/lib/config.test.js.map +0 -1
  66. package/dist/src/lib/device.js.map +0 -1
  67. package/dist/src/lib/device.test.js +0 -10
  68. package/dist/src/lib/device.test.js.map +0 -1
  69. package/dist/src/lib/document-reference.js.map +0 -1
  70. package/dist/src/lib/immunization.js.map +0 -1
  71. package/dist/src/lib/medication.js +0 -65
  72. package/dist/src/lib/medication.js.map +0 -1
  73. package/dist/src/lib/medicationRequest.js +0 -103
  74. package/dist/src/lib/medicationRequest.js.map +0 -1
  75. package/dist/src/lib/medicationStatement.js.map +0 -1
  76. package/dist/src/lib/organization.js +0 -91
  77. package/dist/src/lib/organization.js.map +0 -1
  78. package/dist/src/lib/patient.js +0 -371
  79. package/dist/src/lib/patient.js.map +0 -1
  80. package/dist/src/lib/patient.test.js +0 -79
  81. package/dist/src/lib/patient.test.js.map +0 -1
  82. package/dist/src/lib/practitioner.js +0 -161
  83. package/dist/src/lib/practitioner.js.map +0 -1
  84. package/index.ts +0 -30
  85. package/jest.config.js +0 -12
  86. package/release.config.js +0 -74
  87. package/src/helpers/patientFactory.ts +0 -13
  88. package/src/lib/allergyIntolerance.ts +0 -36
  89. package/src/lib/bundle.ts +0 -19
  90. package/src/lib/composition.ts +0 -153
  91. package/src/lib/condition.ts +0 -80
  92. package/src/lib/config.test.ts +0 -13
  93. package/src/lib/config.ts +0 -17
  94. package/src/lib/device.test.ts +0 -9
  95. package/src/lib/device.ts +0 -36
  96. package/src/lib/document-reference.ts +0 -102
  97. package/src/lib/immunization.ts +0 -64
  98. package/src/lib/medicationStatement.ts +0 -52
  99. package/src/lib/organization.ts +0 -89
  100. package/src/lib/patient.test.ts +0 -62
  101. package/src/lib/patient.ts +0 -385
  102. package/src/lib/practitioner.ts +0 -157
  103. package/tsconfig.test.json +0 -18
  104. package/tslint.json +0 -139
@@ -0,0 +1,465 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verify = exports.decode = exports.encode = void 0;
4
+ const config_1 = require("./config");
5
+ /**
6
+ * Helpers
7
+ */
8
+ function formatDateOnly(value) {
9
+ if (!value)
10
+ return undefined;
11
+ const d = typeof value === 'string' ? new Date(value) : value;
12
+ if (isNaN(d.getTime()))
13
+ return undefined;
14
+ return d.toISOString().slice(0, 10);
15
+ }
16
+ function formatDateTime(value) {
17
+ if (!value)
18
+ return undefined;
19
+ const d = typeof value === 'string' ? new Date(value) : value;
20
+ if (isNaN(d.getTime()))
21
+ return undefined;
22
+ return d.toISOString();
23
+ }
24
+ function mapGeneroFHIRToAndes(gender) {
25
+ switch (gender) {
26
+ case 'female':
27
+ return 'femenino';
28
+ case 'male':
29
+ return 'masculino';
30
+ case 'other':
31
+ return 'otro';
32
+ default:
33
+ return undefined;
34
+ }
35
+ }
36
+ function mapSexoAndesToGenderFHIR(sexo) {
37
+ switch (sexo) {
38
+ case 'femenino':
39
+ return 'female';
40
+ case 'masculino':
41
+ return 'male';
42
+ case 'otro':
43
+ return 'other';
44
+ default:
45
+ return undefined; // unknown
46
+ }
47
+ }
48
+ function buildGenderIdentityExtension(genero) {
49
+ if (!genero) {
50
+ return [];
51
+ }
52
+ return [{
53
+ url: 'http://hl7.org/fhir/StructureDefinition/individual-genderIdentity',
54
+ valueCode: genero
55
+ }];
56
+ }
57
+ function buildStatusExtension(estado) {
58
+ const value = estado ?? 'temporal';
59
+ return [{
60
+ url: 'andes.gob.ar/fhir/StructureDefinition/patient-status',
61
+ valueCode: value
62
+ }];
63
+ }
64
+ function mapEstadoCivilAndesToFHIR(estadoCivil) {
65
+ switch (estadoCivil) {
66
+ case 'casado':
67
+ return 'Married';
68
+ case 'divorciado':
69
+ return 'Divorced';
70
+ case 'viudo':
71
+ return 'Widowed';
72
+ case 'soltero':
73
+ return 'unmarried';
74
+ default:
75
+ return 'unknown';
76
+ }
77
+ }
78
+ function mapEstadoCivilFHIRToAndes(estadoCivil) {
79
+ switch (estadoCivil) {
80
+ case 'Married':
81
+ return 'casado';
82
+ case 'Divorced':
83
+ return 'divorciado';
84
+ case 'Widowed':
85
+ return 'viudo';
86
+ case 'unmarried':
87
+ return 'soltero';
88
+ default:
89
+ return 'otro';
90
+ }
91
+ }
92
+ /**
93
+ * Encode a patient from ANDES to FHIR
94
+ */
95
+ function encode(patient) {
96
+ if (!patient) {
97
+ return null;
98
+ }
99
+ // Identificadores
100
+ const identificadores = [];
101
+ // Dominio local (id de ANDES o equivalente)
102
+ identificadores.push({
103
+ system: (0, config_1.getDominio)(),
104
+ value: patient._id ?? patient.id
105
+ });
106
+ if (patient.documento) {
107
+ identificadores.push({
108
+ system: 'http://www.renaper.gob.ar/dni',
109
+ value: patient.documento
110
+ });
111
+ }
112
+ if (patient.cuil) {
113
+ identificadores.push({
114
+ system: 'http://www.renaper.gob.ar/cuil',
115
+ value: patient.cuil
116
+ });
117
+ }
118
+ if (patient.numeroIdentificacion) {
119
+ if (patient.tipoIdentificacion === 'dni extranjero') {
120
+ identificadores.push({
121
+ system: 'andes.gob.ar/sid/foreign-id',
122
+ value: patient.numeroIdentificacion
123
+ });
124
+ }
125
+ if (patient.tipoIdentificacion === 'pasaporte') {
126
+ identificadores.push({
127
+ system: 'andes.gob.ar/sid/passport',
128
+ value: patient.numeroIdentificacion
129
+ });
130
+ }
131
+ }
132
+ // Contactos → telecom
133
+ const contactos = (patient.contacto ?? [])
134
+ .filter((c) => !!c.valor)
135
+ .map((unContacto) => {
136
+ const cont = {
137
+ value: unContacto.valor,
138
+ rank: unContacto.ranking
139
+ };
140
+ switch (unContacto.tipo) {
141
+ case 'fijo':
142
+ case 'celular':
143
+ cont.system = 'phone';
144
+ break;
145
+ case 'email':
146
+ cont.system = 'email';
147
+ break;
148
+ }
149
+ return cont;
150
+ });
151
+ // Direcciones → address
152
+ const direcciones = (patient.direccion ?? [])
153
+ .filter((dir) => !!dir.ubicacion?.localidad)
154
+ .map((unaDireccion) => {
155
+ const city = typeof unaDireccion.ubicacion.localidad === 'object'
156
+ ? unaDireccion.ubicacion.localidad?.nombre
157
+ : unaDireccion.ubicacion.localidad;
158
+ const state = typeof unaDireccion.ubicacion.provincia === 'object'
159
+ ? unaDireccion.ubicacion.provincia?.nombre
160
+ : unaDireccion.ubicacion.provincia;
161
+ const country = typeof unaDireccion.ubicacion.pais === 'object'
162
+ ? unaDireccion.ubicacion.pais?.nombre
163
+ : unaDireccion.ubicacion.pais;
164
+ return {
165
+ postalCode: unaDireccion.codigoPostal ?? '',
166
+ line: [unaDireccion.valor],
167
+ city: city ?? '',
168
+ state: state ?? '',
169
+ country: country ?? ''
170
+ };
171
+ });
172
+ // Relaciones → contact
173
+ const relacionesFHIR = (patient.relaciones ?? [])
174
+ .filter((r) => !!r.relacion)
175
+ .map((unaRelacion) => {
176
+ return {
177
+ relationship: [{
178
+ text: unaRelacion.relacion.nombre
179
+ }],
180
+ name: {
181
+ family: unaRelacion.apellido,
182
+ given: unaRelacion.nombre.split(' ')
183
+ }
184
+ };
185
+ });
186
+ // Género
187
+ // const generoFHIR = mapGeneroAndesToFHIR(patient.genero ?? patient.sexo);
188
+ const generoFHIR = mapSexoAndesToGenderFHIR(patient.sexo ?? patient.genero);
189
+ const genderIdentityExtensions = buildGenderIdentityExtension(patient.genero);
190
+ const statusExtensions = buildStatusExtension(patient.estado);
191
+ const birthDate = formatDateOnly(patient.fechaNacimiento);
192
+ const extensions = [...statusExtensions, ...genderIdentityExtensions];
193
+ const pacienteFHIR = {
194
+ resourceType: 'Patient',
195
+ id: patient._id ?? patient.id,
196
+ identifier: identificadores,
197
+ active: patient.activo ?? undefined,
198
+ name: [{
199
+ use: 'official',
200
+ family: patient.apellido,
201
+ given: patient.nombre.split(' '),
202
+ text: `${patient.nombre} ${patient.apellido}`
203
+ }],
204
+ gender: generoFHIR,
205
+ birthDate,
206
+ ...(extensions.length > 0 && { extension: extensions })
207
+ };
208
+ if (patient.fechaFallecimiento) {
209
+ const deceased = formatDateTime(patient.fechaFallecimiento);
210
+ if (deceased) {
211
+ pacienteFHIR.deceasedDateTime = deceased;
212
+ }
213
+ }
214
+ if (patient.estadoCivil) {
215
+ pacienteFHIR.maritalStatus = {
216
+ text: mapEstadoCivilAndesToFHIR(patient.estadoCivil)
217
+ };
218
+ }
219
+ if (patient.foto) {
220
+ pacienteFHIR.photo = [{ data: patient.foto }];
221
+ }
222
+ if (contactos.length > 0) {
223
+ pacienteFHIR.telecom = contactos;
224
+ }
225
+ if (direcciones.length > 0) {
226
+ pacienteFHIR.address = direcciones;
227
+ }
228
+ if (relacionesFHIR.length > 0) {
229
+ pacienteFHIR.contact = relacionesFHIR;
230
+ }
231
+ if (patient.createdBy?.organizacion) {
232
+ const managingOrganization = {
233
+ reference: patient.createdBy.organizacion.id,
234
+ display: patient.createdBy.organizacion.nombre
235
+ };
236
+ pacienteFHIR.managingOrganization = managingOrganization;
237
+ }
238
+ return pacienteFHIR;
239
+ }
240
+ exports.encode = encode;
241
+ /**
242
+ * Decode a patient from FHIR to ANDES
243
+ */
244
+ function decode(patient) {
245
+ let genero;
246
+ let sexo;
247
+ // Cuando el paciente viene por FHIR suponemos el valor del género
248
+ genero = mapGeneroFHIRToAndes(patient.gender);
249
+ sexo = genero;
250
+ function getValue(items, key) {
251
+ if (!items)
252
+ return undefined;
253
+ const element = items.find(el => el.system === key);
254
+ return element?.value;
255
+ }
256
+ const tiposIdentificacion = ['andes.gob.ar/sid/foreign-id', 'andes.gob.ar/sid/passport'];
257
+ const tipoAndes = ['dni extranjero', 'pasaporte'];
258
+ let tipoIdentificacion;
259
+ let numeroIdentificacion;
260
+ for (let i = 0; i < tiposIdentificacion.length; i++) {
261
+ const val = getValue(patient.identifier, tiposIdentificacion[i]);
262
+ if (val) {
263
+ tipoIdentificacion = tipoAndes[i];
264
+ numeroIdentificacion = val;
265
+ }
266
+ }
267
+ const firstName = patient.name?.[0];
268
+ const nombre = firstName
269
+ ? (firstName.given ?? []).join(' ').trim()
270
+ : '';
271
+ const apellido = firstName
272
+ ? (Array.isArray(firstName.family)
273
+ ? firstName.family.join(' ').trim()
274
+ : (firstName.family ?? ''))
275
+ : '';
276
+ const pacienteAndes = {
277
+ id: getValue(patient.identifier, (0, config_1.makeUrl)('Patient')) ?? patient.id,
278
+ documento: getValue(patient.identifier, 'http://www.renaper.gob.ar/dni'),
279
+ tipoIdentificacion,
280
+ numeroIdentificacion,
281
+ nombre,
282
+ apellido,
283
+ fechaNacimiento: patient.birthDate,
284
+ genero,
285
+ sexo,
286
+ estado: 'temporal'
287
+ };
288
+ const contactos = patient.telecom
289
+ ? patient.telecom.map((unContacto) => {
290
+ const cont = {
291
+ valor: unContacto.value,
292
+ ranking: unContacto.rank
293
+ };
294
+ switch (unContacto.system) {
295
+ case 'phone':
296
+ cont.tipo = 'celular';
297
+ break;
298
+ case 'email':
299
+ cont.tipo = 'email';
300
+ break;
301
+ }
302
+ return cont;
303
+ })
304
+ : [];
305
+ const relaciones = patient.contact
306
+ ? patient.contact.map((aContact) => {
307
+ const relText = aContact.relationship?.[0]?.text ?? '';
308
+ const givenName = (aContact.name?.given ?? []).join(' ').replace(',', ' ');
309
+ const familyName = Array.isArray(aContact.name?.family)
310
+ ? (aContact.name?.family).join(' ').replace(',', ' ')
311
+ : aContact.name?.family ?? '';
312
+ return {
313
+ relacion: { nombre: relText },
314
+ nombre: givenName,
315
+ apellido: familyName
316
+ };
317
+ })
318
+ : [];
319
+ if (patient.maritalStatus?.text) {
320
+ pacienteAndes.estadoCivil = mapEstadoCivilFHIRToAndes(patient.maritalStatus.text);
321
+ }
322
+ const direcciones = patient.address
323
+ ? patient.address.map((unaDireccion) => {
324
+ const valor = Array.isArray(unaDireccion.line)
325
+ ? (unaDireccion.line[0] ?? '')
326
+ : unaDireccion.line ?? '';
327
+ const dir = {
328
+ activo: true,
329
+ valor,
330
+ codigoPostal: unaDireccion.postalCode,
331
+ ubicacion: {
332
+ pais: unaDireccion.country,
333
+ provincia: unaDireccion.state,
334
+ localidad: unaDireccion.city
335
+ }
336
+ };
337
+ return dir;
338
+ })
339
+ : [];
340
+ pacienteAndes.direccion = direcciones;
341
+ if (patient.active !== undefined) {
342
+ pacienteAndes.activo = patient.active;
343
+ }
344
+ if (contactos.length > 0) {
345
+ pacienteAndes.contacto = contactos;
346
+ }
347
+ if (patient.photo && patient.photo.length > 0) {
348
+ pacienteAndes.foto = patient.photo[0].data;
349
+ }
350
+ if (relaciones.length > 0) {
351
+ pacienteAndes.relaciones = relaciones;
352
+ }
353
+ if (patient.managingOrganization) {
354
+ pacienteAndes.createdBy = {
355
+ organizacion: {
356
+ id: patient.managingOrganization.reference ?? '',
357
+ nombre: patient.managingOrganization.display ?? ''
358
+ }
359
+ };
360
+ }
361
+ return pacienteAndes;
362
+ }
363
+ exports.decode = decode;
364
+ /**
365
+ * Verify if a patient has a FHIR format
366
+ */
367
+ function verify(patient) {
368
+ let respuesta = true;
369
+ const fieldVerified = Object.keys(patient).every(pacienteFHIRFields);
370
+ if (fieldVerified) {
371
+ respuesta = ('resourceType' in patient) && patient.resourceType === 'Patient';
372
+ respuesta = respuesta && ('identifier' in patient);
373
+ if (patient.identifier?.length > 0) {
374
+ patient.identifier.forEach((anIdentifier) => {
375
+ respuesta = respuesta && Object.keys(anIdentifier).every(identifierFields);
376
+ });
377
+ }
378
+ patient.name?.forEach((aName) => {
379
+ respuesta = respuesta && validName(aName);
380
+ });
381
+ if (patient.active !== undefined) {
382
+ respuesta = respuesta && (typeof patient.active === 'boolean');
383
+ }
384
+ if (patient.telecom) {
385
+ patient.telecom.forEach((aTelecom) => {
386
+ respuesta = respuesta && Object.keys(aTelecom).every(telecomFields);
387
+ });
388
+ }
389
+ if (patient.gender) {
390
+ respuesta = respuesta && patient.gender.match('male|female|other|unknown') != null;
391
+ }
392
+ if (patient.birthDate) {
393
+ respuesta = respuesta && typeof patient.birthDate === 'string';
394
+ }
395
+ if (patient.deceasedDateTime) {
396
+ respuesta = respuesta && typeof patient.deceasedDateTime === 'string';
397
+ }
398
+ if (patient.address) {
399
+ patient.address.forEach((anAddress) => {
400
+ respuesta = respuesta && Object.keys(anAddress).every(addressFields);
401
+ });
402
+ }
403
+ if (patient.maritalStatus && patient.maritalStatus.text) {
404
+ respuesta = respuesta &&
405
+ Object.keys(patient.maritalStatus).every(codingFields) &&
406
+ typeof patient.maritalStatus.text === 'string' &&
407
+ patient.maritalStatus.text.match('Married|Divorced|Widowed|unmarried|unknown') != null;
408
+ }
409
+ if (patient.photo) {
410
+ patient.photo.forEach((aPhoto) => {
411
+ respuesta = respuesta && Object.keys(aPhoto).every(photoFields);
412
+ });
413
+ }
414
+ if (patient.contact) {
415
+ patient.contact.forEach((aContact) => {
416
+ if (aContact.relationship) {
417
+ aContact.relationship.forEach((aRelation) => {
418
+ respuesta = respuesta && Object.keys(aRelation).every(codingFields);
419
+ });
420
+ }
421
+ if (aContact.name) {
422
+ respuesta = respuesta && validName(aContact.name);
423
+ }
424
+ });
425
+ }
426
+ }
427
+ else {
428
+ respuesta = fieldVerified;
429
+ }
430
+ return respuesta;
431
+ }
432
+ exports.verify = verify;
433
+ /**
434
+ * Verify helpers
435
+ */
436
+ function pacienteFHIRFields(elem) {
437
+ return elem.match('resourceType|identifier|active|name|telecom|gender|birthDate|deceasedBoolean|deceasedDateTime|address|maritalStatus|photo|contact') != null;
438
+ }
439
+ function identifierFields(elem) {
440
+ return elem.match('use|type|system|value|period|assigner') != null;
441
+ }
442
+ function nameFields(elem) {
443
+ return elem.match('resourceType|family|given') != null;
444
+ }
445
+ function telecomFields(elem) {
446
+ return elem.match('resourceType|system|value|use|rank|period') != null;
447
+ }
448
+ function addressFields(elem) {
449
+ return elem.match('resourceType|use|type|text|line|city|district|state|postalCode|country|period') != null;
450
+ }
451
+ function codingFields(elem) {
452
+ return elem.match('coding|text') != null;
453
+ }
454
+ function photoFields(elem) {
455
+ return elem.match('contentType|language|data|url|size|hash|title|creation') != null;
456
+ }
457
+ function validName(aName) {
458
+ return Object.keys(aName).every(nameFields) &&
459
+ ('resourceType' in aName) && aName.resourceType === 'HumanName' &&
460
+ ('family' in aName) && Array.isArray(aName.family) && aName.family.every(areStrings) &&
461
+ ('given' in aName) && Array.isArray(aName.given) && aName.given.every(areStrings);
462
+ }
463
+ function areStrings(elem) {
464
+ return typeof elem === 'string';
465
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const patient = __importStar(require("../data/patient.json"));
27
+ const patient_1 = require("./patient");
28
+ const patientFactory_1 = require("../helpers/patientFactory");
29
+ const pacienteFhir = (0, patient_1.encode)(patient);
30
+ describe('encode patient from ANDES to FHIR R4', () => {
31
+ test('Verify basic data', () => {
32
+ expect(pacienteFhir.resourceType).toBe('Patient');
33
+ const ident = pacienteFhir.identifier;
34
+ const id = ident?.find(t => t.system === 'http://www.renaper.gob.ar/dni');
35
+ expect(id?.value).toBe('42910660');
36
+ expect(id?.system).toBe('http://www.renaper.gob.ar/dni');
37
+ expect(pacienteFhir.active).toBe(true);
38
+ expect(pacienteFhir.name).toBeDefined();
39
+ expect(pacienteFhir.name[0].use).toBe('official');
40
+ expect(pacienteFhir.name[0].family).toContain('PERINGA');
41
+ expect(pacienteFhir.name[0].family).toContain('PONCE');
42
+ expect(pacienteFhir.name[0].given).toContain('AGUSTIN');
43
+ expect(pacienteFhir.name[0].text).toBe('HUGO AGUSTIN PERINGA PONCE');
44
+ expect(pacienteFhir.gender).toBe('male');
45
+ expect(pacienteFhir.birthDate).toBe('1979-11-14');
46
+ });
47
+ test('Verify patient with contact information', () => {
48
+ // Phone;
49
+ expect(pacienteFhir.telecom).toBeDefined();
50
+ expect(pacienteFhir.telecom[0].value).toBe('4462221');
51
+ expect(pacienteFhir.telecom[0].system).toBe('phone');
52
+ // Address;
53
+ expect(pacienteFhir.address).toBeDefined();
54
+ expect(pacienteFhir.address[0].postalCode).toBe('8300');
55
+ expect(pacienteFhir.address[0].line).toContain('Enrique Santos Discepolo 1856');
56
+ expect(pacienteFhir.address[0].city).toBe('NEUQUEN');
57
+ expect(pacienteFhir.address[0].state).toBe('Neuquén');
58
+ expect(pacienteFhir.address[0].country).toBe('Argentina');
59
+ });
60
+ test('Verify patient with relationships', () => {
61
+ // Validar que exista contact y al menos un elemento
62
+ expect(pacienteFhir.contact).toBeDefined();
63
+ expect(pacienteFhir.contact.length).toBeGreaterThan(0);
64
+ const contacto0 = pacienteFhir.contact[0];
65
+ // Validar que tenga relationship y name estructurados
66
+ expect(contacto0.relationship).toBeDefined();
67
+ expect(contacto0.relationship.length).toBeGreaterThan(0);
68
+ expect(contacto0.name).toBeDefined();
69
+ // Ahora sí: acceder sin que TS marque error
70
+ expect(contacto0.relationship[0].text).toBe('hijo/a');
71
+ expect(contacto0.name.family).toContain('PERINGA');
72
+ expect(contacto0.name.given).toContain('JOSEFINA');
73
+ });
74
+ test('Maneja paciente con estado validado', () => {
75
+ const paciente = (0, patientFactory_1.createPatient)({ estado: 'validado' });
76
+ const fhir = (0, patient_1.encode)(paciente);
77
+ expect(fhir).not.toBeNull();
78
+ expect(fhir.extension?.some(t => t.valueCode === 'validado')).toBeTruthy();
79
+ });
80
+ test('Maneja paciente con estado temporal', () => {
81
+ const paciente = (0, patientFactory_1.createPatient)({ estado: 'temporal' });
82
+ const fhir = (0, patient_1.encode)(paciente);
83
+ expect(fhir).not.toBeNull();
84
+ expect(fhir.extension?.some(t => t.valueCode === 'temporal')).toBeTruthy();
85
+ });
86
+ test('Maneja paciente con estado nulo', () => {
87
+ const paciente = (0, patientFactory_1.createPatient)({ estado: null });
88
+ const fhir = (0, patient_1.encode)(paciente);
89
+ expect(fhir).not.toBeNull();
90
+ expect(fhir.extension?.some(t => t.valueCode === 'temporal')).toBeTruthy();
91
+ });
92
+ it('Verifica organización que crea paciente', () => {
93
+ const fhir = pacienteFhir;
94
+ expect(fhir.managingOrganization).toBeDefined();
95
+ expect(fhir.managingOrganization.display).toContain('LABORATORIO');
96
+ });
97
+ it('Verifica dni extranjero', () => {
98
+ const paciente = (0, patientFactory_1.createPatient)({ tipoIdentificacion: 'dni extranjero', numeroIdentificacion: 'ABC123' });
99
+ const fhir = (0, patient_1.encode)(paciente);
100
+ expect(fhir).not.toBeNull();
101
+ const id = fhir.identifier?.find(t => t.system === 'andes.gob.ar/sid/foreign-id');
102
+ expect(id?.value).toBe('ABC123');
103
+ expect(id?.system).toBe('andes.gob.ar/sid/foreign-id');
104
+ });
105
+ it('Verifica pasaporte', () => {
106
+ const paciente = (0, patientFactory_1.createPatient)({ tipoIdentificacion: 'pasaporte', numeroIdentificacion: 'ABC123CD' });
107
+ const fhir = (0, patient_1.encode)(paciente);
108
+ expect(fhir).not.toBeNull();
109
+ const id = fhir.identifier?.find(t => t.system === 'andes.gob.ar/sid/passport');
110
+ expect(id?.value).toBe('ABC123CD');
111
+ expect(id?.system).toBe('andes.gob.ar/sid/passport');
112
+ });
113
+ });
114
+ describe('decode patient from FHIR R4 to ANDES', () => {
115
+ it('Verifica dni extranjero', () => {
116
+ const paciente = (0, patientFactory_1.createPatient)({ tipoIdentificacion: 'dni extranjero', numeroIdentificacion: 'ABC123' });
117
+ const fhirEncode = (0, patient_1.encode)(paciente);
118
+ expect(fhirEncode).not.toBeNull();
119
+ const fhirDecode = (0, patient_1.decode)(fhirEncode);
120
+ expect(fhirDecode?.tipoIdentificacion).toBe('dni extranjero');
121
+ expect(fhirDecode?.numeroIdentificacion).toBe('ABC123');
122
+ });
123
+ it('Verifica pasaporte', () => {
124
+ const paciente = (0, patientFactory_1.createPatient)({ tipoIdentificacion: 'pasaporte', numeroIdentificacion: 'ABC123CD' });
125
+ const fhirEncode = (0, patient_1.encode)(paciente);
126
+ expect(fhirEncode).not.toBeNull();
127
+ const fhirDecode = (0, patient_1.decode)(fhirEncode);
128
+ expect(fhirDecode?.tipoIdentificacion).toBe('pasaporte');
129
+ expect(fhirDecode?.numeroIdentificacion).toBe('ABC123CD');
130
+ expect(fhirDecode?.estado).toBe('temporal');
131
+ });
132
+ });