@andes/fhir 1.12.0 → 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 (103) hide show
  1. package/{src → dist}/data/patient.json +192 -192
  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/{src/lib → lib}/patient.test.js +132 -113
  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 +53 -44
  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 -351
  35. package/coverage/clover.xml +0 -209
  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 -1318
  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 -425
  55. package/dist/index.js +0 -52
  56. package/dist/index.js.map +0 -1
  57. package/dist/src/data/patient.json +0 -192
  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 -397
  79. package/dist/src/lib/patient.js.map +0 -1
  80. package/dist/src/lib/patient.test.js.map +0 -1
  81. package/dist/src/lib/practitioner.js +0 -161
  82. package/dist/src/lib/practitioner.js.map +0 -1
  83. package/index.ts +0 -30
  84. package/jest.config.js +0 -12
  85. package/release.config.js +0 -74
  86. package/src/helpers/patientFactory.ts +0 -13
  87. package/src/lib/allergyIntolerance.ts +0 -36
  88. package/src/lib/bundle.ts +0 -19
  89. package/src/lib/composition.ts +0 -153
  90. package/src/lib/condition.ts +0 -80
  91. package/src/lib/config.test.ts +0 -13
  92. package/src/lib/config.ts +0 -17
  93. package/src/lib/device.test.ts +0 -9
  94. package/src/lib/device.ts +0 -36
  95. package/src/lib/document-reference.ts +0 -102
  96. package/src/lib/immunization.ts +0 -64
  97. package/src/lib/medicationStatement.ts +0 -52
  98. package/src/lib/organization.ts +0 -89
  99. package/src/lib/patient.test.ts +0 -101
  100. package/src/lib/patient.ts +0 -411
  101. package/src/lib/practitioner.ts +0 -157
  102. package/tsconfig.test.json +0 -18
  103. package/tslint.json +0 -139
@@ -1,113 +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
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- const patient = __importStar(require("../data/patient.json"));
23
- const patient_1 = require("./patient");
24
- const patientFactory_1 = require("../helpers/patientFactory");
25
- const pacienteFhir = patient_1.encode(patient);
26
- describe('encode patient from ANDES to FHIR R4', () => {
27
- test('Verify basic data', () => {
28
- expect(pacienteFhir.resourceType).toBe('Patient');
29
- const ident = pacienteFhir.identifier;
30
- const id = ident?.find(t => t.system === 'http://www.renaper.gob.ar/dni');
31
- expect(id?.value).toBe('42910660');
32
- expect(id?.system).toBe('http://www.renaper.gob.ar/dni');
33
- expect(pacienteFhir.active).toBe(true);
34
- expect(pacienteFhir.name[0].use).toBe('official');
35
- expect(pacienteFhir.name[0].resourceType).toBe('HumanName');
36
- expect(pacienteFhir.name[0].family).toContain('PERINGA');
37
- expect(pacienteFhir.name[0].family).toContain('PONCE');
38
- expect(pacienteFhir.name[0].given).toContain('AGUSTIN');
39
- expect(pacienteFhir.name[0].text).toBe('HUGO AGUSTIN PERINGA PONCE');
40
- expect(pacienteFhir.gender).toBe('male');
41
- expect(pacienteFhir.birthDate).toBe('1979-11-14');
42
- });
43
- test('Verify patient with contact information', () => {
44
- // Phone;
45
- expect(pacienteFhir.telecom[0].resourceType).toBe('ContactPoint');
46
- expect(pacienteFhir.telecom[0].value).toBe('4462221');
47
- expect(pacienteFhir.telecom[0].system).toBe('phone');
48
- // Address;
49
- expect(pacienteFhir.address[0].resourceType).toBe('Address');
50
- expect(pacienteFhir.address[0].postalCode).toBe('8300');
51
- expect(pacienteFhir.address[0].line).toContain('Enrique Santos Discepolo 1856');
52
- expect(pacienteFhir.address[0].city).toBe('NEUQUEN');
53
- expect(pacienteFhir.address[0].state).toBe('Neuquén');
54
- expect(pacienteFhir.address[0].country).toBe('Argentina');
55
- });
56
- test('Verify patient with relationships', () => {
57
- expect(pacienteFhir.contact[0].relationship[0].text).toBe('hijo/a');
58
- expect(pacienteFhir.contact[0].name.resourceType).toBe('HumanName');
59
- expect(pacienteFhir.contact[0].name.family).toContain('PERINGA');
60
- expect(pacienteFhir.contact[0].name.given).toContain('JOSEFINA');
61
- });
62
- test('Maneja paciente con estado validado', () => {
63
- const paciente = patientFactory_1.createPatient({ estado: 'validado' });
64
- const fhir = patient_1.encode(paciente);
65
- expect(fhir.extension?.some(t => t.valueCode === 'validado')).toBeTruthy();
66
- });
67
- test('Maneja paciente con estado temporal', () => {
68
- const paciente = patientFactory_1.createPatient({ estado: 'temporal' });
69
- const fhir = patient_1.encode(paciente);
70
- expect(fhir.extension?.some(t => t.valueCode === 'temporal')).toBeTruthy();
71
- });
72
- test('Maneja paciente con estado nulo', () => {
73
- const paciente = patientFactory_1.createPatient({ estado: null });
74
- const fhir = patient_1.encode(paciente);
75
- expect(fhir.extension?.some(t => t.valueCode === 'temporal')).toBeTruthy();
76
- });
77
- it('Verifica organización que crea paciente', () => {
78
- const fhir = pacienteFhir;
79
- expect(fhir.managingOrganization.display).toContain('LABORATORIO');
80
- });
81
- it('Verifica dni extranjero', () => {
82
- const paciente = patientFactory_1.createPatient({ tipoIdentificacion: 'dni extranjero', numeroIdentificacion: 'ABC123' });
83
- const fhir = patient_1.encode(paciente);
84
- const id = fhir.identifier?.find(t => t.system === 'andes.gob.ar/sid/foreign-id');
85
- expect(id?.value).toBe('ABC123');
86
- expect(id?.system).toBe('andes.gob.ar/sid/foreign-id');
87
- });
88
- it('Verifica pasaporte', () => {
89
- const paciente = patientFactory_1.createPatient({ tipoIdentificacion: 'pasaporte', numeroIdentificacion: 'ABC123CD' });
90
- const fhir = patient_1.encode(paciente);
91
- const id = fhir.identifier?.find(t => t.system === 'andes.gob.ar/sid/passport');
92
- expect(id?.value).toBe('ABC123CD');
93
- expect(id?.system).toBe('andes.gob.ar/sid/passport');
94
- });
95
- });
96
- describe('decode patient from FHIR R4 to ANDES', () => {
97
- it('Verifica dni extranjero', () => {
98
- const paciente = patientFactory_1.createPatient({ tipoIdentificacion: 'dni extranjero', numeroIdentificacion: 'ABC123' });
99
- const fhirEncode = patient_1.encode(paciente);
100
- const fhirDecode = patient_1.decode(fhirEncode);
101
- expect(fhirDecode?.tipoIdentificacion).toBe('dni extranjero');
102
- expect(fhirDecode?.numeroIdentificacion).toBe('ABC123');
103
- });
104
- it('Verifica pasaporte', () => {
105
- const paciente = patientFactory_1.createPatient({ tipoIdentificacion: 'pasaporte', numeroIdentificacion: 'ABC123CD' });
106
- const fhirEncode = patient_1.encode(paciente);
107
- const fhirDecode = patient_1.decode(fhirEncode);
108
- expect(fhirDecode?.tipoIdentificacion).toBe('pasaporte');
109
- expect(fhirDecode?.numeroIdentificacion).toBe('ABC123CD');
110
- expect(fhirDecode?.estado).toBe('temporal');
111
- });
112
- });
113
- //# sourceMappingURL=patient.test.js.map
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
+ });
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encode = void 0;
4
+ const config_1 = require("./config");
5
+ /**
6
+ * Encode a practitioner from ANDES to FHIR
7
+ */
8
+ function encode(practitioner) {
9
+ const data = practitioner;
10
+ if (!data) {
11
+ return null;
12
+ }
13
+ // -----------------------------
14
+ // Identificadores
15
+ // -----------------------------
16
+ const identificadores = [];
17
+ if (data.documento) {
18
+ identificadores.push({
19
+ system: 'http://www.renaper.gob.ar/dni',
20
+ value: data.documento
21
+ });
22
+ }
23
+ if (data.cuit) {
24
+ identificadores.push({
25
+ system: 'https://seti.afip.gob.ar/padron-puc-constancia-internet/ConsultaConstanciaAction.do',
26
+ value: data.cuit
27
+ });
28
+ }
29
+ identificadores.push({
30
+ system: (0, config_1.getDominio)(),
31
+ value: data._id
32
+ });
33
+ // -----------------------------
34
+ // Contactos → telecom
35
+ // -----------------------------
36
+ const contactos = (data.contacto ?? []).map((unContacto) => {
37
+ const cont = {
38
+ value: unContacto.valor,
39
+ rank: unContacto.ranking
40
+ };
41
+ switch (unContacto.tipo) {
42
+ case 'fijo':
43
+ case 'celular':
44
+ cont.system = 'phone';
45
+ break;
46
+ case 'email':
47
+ cont.system = 'email';
48
+ break;
49
+ }
50
+ return cont;
51
+ });
52
+ // -----------------------------
53
+ // Direcciones → address
54
+ // -----------------------------
55
+ const direcciones = (data.domicilios ?? []).map((unDomicilio) => {
56
+ return {
57
+ postalCode: unDomicilio.codigoPostal ?? '',
58
+ line: [unDomicilio.valor],
59
+ city: unDomicilio.ubicacion?.localidad?.nombre ?? '',
60
+ state: unDomicilio.ubicacion?.provincia?.nombre ?? '',
61
+ country: unDomicilio.ubicacion?.pais?.nombre ?? ''
62
+ };
63
+ });
64
+ // -----------------------------
65
+ // Relaciones (hoy no se usan en Practitioner)
66
+ // Si en algún momento van a Communication o a otro resource, ya está tipado.
67
+ // -----------------------------
68
+ const relaciones = data.relaciones ?? [];
69
+ // -----------------------------
70
+ // Matriculación de grado
71
+ // -----------------------------
72
+ const matriculas = (data.formacionGrado ?? []).map((datosGrado) => {
73
+ const cantMatriculaciones = datosGrado.matriculacion?.length ?? 0;
74
+ const ultima = cantMatriculaciones > 0
75
+ ? datosGrado.matriculacion[cantMatriculaciones - 1]
76
+ : undefined;
77
+ const unaMatricula = {
78
+ identifier: datosGrado.profesion.nombre
79
+ ? [{
80
+ system: 'https://www.saludneuquen.gob.ar/matriculacionGrado',
81
+ value: datosGrado.profesion.nombre
82
+ }]
83
+ : []
84
+ };
85
+ if (ultima) {
86
+ unaMatricula.code = {
87
+ coding: [{
88
+ system: 'http://www.saludneuquen.gob.ar/fiscalizacion.html',
89
+ code: datosGrado.profesion.codigo,
90
+ display: datosGrado.profesion.tipoDeFormacion
91
+ }],
92
+ text: ultima.matriculaNumero
93
+ };
94
+ unaMatricula.period = {
95
+ start: ultima.inicio ?? null,
96
+ end: ultima.fin ?? null
97
+ };
98
+ }
99
+ return unaMatricula;
100
+ });
101
+ // -----------------------------
102
+ // Matriculación de posgrado / especialidad
103
+ // -----------------------------
104
+ const matriculasEspecialidad = (data.formacionPosgrado ?? []).map((datosPosgrado) => {
105
+ const cantMatriculacionesEsp = datosPosgrado.matriculacion?.length ?? 0;
106
+ const ultima = cantMatriculacionesEsp > 0
107
+ ? datosPosgrado.matriculacion[cantMatriculacionesEsp - 1]
108
+ : undefined;
109
+ const unaMatricula = {
110
+ identifier: datosPosgrado.especialidad.nombre
111
+ ? [{
112
+ system: 'https://www.saludneuquen.gob.ar/matriculacionEspecialidad/',
113
+ value: datosPosgrado.especialidad.nombre
114
+ }]
115
+ : []
116
+ };
117
+ if (ultima) {
118
+ unaMatricula.code = {
119
+ coding: [{
120
+ system: 'http://www.saludneuquen.gob.ar/fiscalizacion.html',
121
+ code: datosPosgrado.especialidad.codigo,
122
+ display: datosPosgrado.especialidad.tipo
123
+ }],
124
+ text: ultima.matriculaNumero
125
+ };
126
+ unaMatricula.period = {
127
+ start: ultima.inicio ?? null,
128
+ end: ultima.fin ?? null
129
+ };
130
+ }
131
+ return unaMatricula;
132
+ });
133
+ // -----------------------------
134
+ // Género
135
+ // -----------------------------
136
+ let genero;
137
+ if (data.sexo) {
138
+ switch (data.sexo.toLowerCase()) {
139
+ case 'femenino':
140
+ genero = 'female';
141
+ break;
142
+ case 'masculino':
143
+ genero = 'male';
144
+ break;
145
+ case 'otro':
146
+ genero = 'other';
147
+ break;
148
+ default:
149
+ genero = undefined;
150
+ break;
151
+ }
152
+ }
153
+ // -----------------------------
154
+ // Practitioner FHIR
155
+ // -----------------------------
156
+ const profesionalFHIR = {
157
+ resourceType: 'Practitioner',
158
+ identifier: identificadores,
159
+ active: data.habilitado ?? undefined,
160
+ name: [{
161
+ family: data.apellido,
162
+ given: data.nombre?.split(' ') ?? []
163
+ }],
164
+ gender: genero,
165
+ birthDate: data.fechaNacimiento,
166
+ };
167
+ if (contactos.length > 0) {
168
+ profesionalFHIR.telecom = contactos;
169
+ }
170
+ if (direcciones.length > 0) {
171
+ profesionalFHIR.address = direcciones;
172
+ }
173
+ const todasLasMatriculas = [...matriculas, ...matriculasEspecialidad].filter(m => m);
174
+ if (todasLasMatriculas.length > 0) {
175
+ // usamos any porque la definición de qualification en fhir/r4
176
+ // es más estricta que lo que trae Andes (code requerido, etc.)
177
+ profesionalFHIR.qualification = todasLasMatriculas;
178
+ }
179
+ if (data.foto) {
180
+ profesionalFHIR.photo = [{
181
+ data: data.foto
182
+ }];
183
+ }
184
+ return profesionalFHIR;
185
+ }
186
+ exports.encode = encode;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // Tipos de apoyo para PRACTITIONER de ANDES
3
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,45 +1,54 @@
1
1
  {
2
- "name": "@andes/fhir",
3
- "version": "1.12.0",
4
- "repository": {
5
- "type": "git",
6
- "url": "https://github.com/andes/fhir.git"
7
- },
8
- "author": "Red TICs",
9
- "license": "GPL-3.0",
10
- "jest": {
11
- "verbose": true
12
- },
13
- "scripts": {
14
- "lint": "tslint --project .",
15
- "start": "node index.js",
16
- "tsc": "tsc",
17
- "test": "npx jest --coverage",
18
- "tsc:w": "tsc -w",
19
- "prepublishOnly": "rimraf dist && tsc -p ./ --outDir dist/",
20
- "semantic-release": "semantic-release"
21
- },
22
- "main": "./dist/index.js",
23
- "devDependencies": {
24
- "@semantic-release/changelog": "^6.0.3",
25
- "@semantic-release/git": "^10.0.1",
26
- "@types/jest": "^26.0.24",
27
- "@types/node": "^6.0.117",
28
- "conventional-changelog-conventionalcommits": "^9.1.0",
29
- "dotenv-cli": "^11.0.0",
30
- "jasmine-core": "~2.6.2",
31
- "jasmine-spec-reporter": "~4.1.0",
32
- "jest": "^26.6.3",
33
- "rimraf": "^6.1.0",
34
- "semantic-release": "^24.2.9",
35
- "ts-jest": "^26.5.4",
36
- "ts-node": "~3.0.4",
37
- "tslint": "^5.20.1",
38
- "tslint-eslint-rules": "^5.4.0",
39
- "typescript": "^3.9.9"
40
- },
41
- "dependencies": {
42
- "@jest/types": "^26.6.2",
43
- "moment": ">=2.29.4"
44
- }
45
- }
2
+ "name": "@andes/fhir",
3
+ "version": "1.12.1-beta.1",
4
+ "engines": {
5
+ "node": ">=18.0.0"
6
+ },
7
+ "engineStrict": true,
8
+ "scripts": {
9
+ "lint": "eslint \"src/**/*.ts\"",
10
+ "tsc": "tsc",
11
+ "tsc:w": "tsc -w",
12
+ "test": "jest --coverage",
13
+ "prepublishOnly": "rimraf dist && tsc -p ./ --outDir dist/",
14
+ "build": "tsc -p ./ --outDir dist",
15
+ "semantic-release": "semantic-release",
16
+ "release:beta": "dotenv -e .env -- semantic-release --branches develop",
17
+ "release:beta:dry": "dotenv -e .env -- semantic-release --no-ci --branches develop --dry-run",
18
+ "release:prod": "dotenv -e .env -- semantic-release --branches master",
19
+ "release:prod:dry": "dotenv -e .env -- semantic-release --no-ci --branches master --dry-run"
20
+ },
21
+ "devDependencies": {
22
+ "@types/jest": "29.5.14",
23
+ "@types/node": "^18.19.0",
24
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
25
+ "@typescript-eslint/parser": "^6.21.0",
26
+ "dotenv-cli": "^11.0.0",
27
+ "eslint": "^8.57.0",
28
+ "jest": "29.7.0",
29
+ "rimraf": "^5.0.7",
30
+ "semantic-release": "^20.1.0",
31
+ "ts-jest": "29.2.5",
32
+ "ts-node": "^10.9.2",
33
+ "typescript": "5.3.3"
34
+ },
35
+ "dependencies": {
36
+ "@types/fhir": "^0.0.41",
37
+ "moment": "2.29.4"
38
+ },
39
+ "files": [
40
+ "dist/**/*"
41
+ ],
42
+ "release": {
43
+ "branches": [
44
+ {
45
+ "name": "master"
46
+ },
47
+ {
48
+ "name": "develop",
49
+ "channel": "beta",
50
+ "prerelease": "beta"
51
+ }
52
+ ]
53
+ }
54
+ }
@@ -1,72 +0,0 @@
1
- version: 2
2
- jobs:
3
- install:
4
- working_directory: ~/fhir
5
- docker:
6
- - image: 'cimg/node:22.11'
7
- steps:
8
- - run:
9
- name: Use HTTPS for GitHub
10
- command: git config --global url."https://github.com/".insteadOf "git@github.com:"
11
- - checkout
12
- - restore_cache:
13
- keys:
14
- - v2-deps-{{ .Branch }}-{{ checksum "package-lock.json" }}
15
- - v2-deps-{{ .Branch }}-
16
- - v2-deps-
17
- - run:
18
- name: Install dependencies
19
- command: npm ci
20
- - save_cache:
21
- key: v2-deps-{{ .Branch }}-{{ checksum "package-lock.json" }}
22
- paths:
23
- - ~/.npm
24
- - ~/.cache
25
- - persist_to_workspace:
26
- root: ~/
27
- paths:
28
- - .cache
29
- - fhir
30
- build:
31
- working_directory: ~/fhir
32
- docker:
33
- - image: cimg/node:22.11
34
- steps:
35
- - attach_workspace:
36
- at: ~/
37
- - run:
38
- name: lint
39
- command: npm run lint
40
- - run:
41
- name: npm-install
42
- command: npm install
43
- deploy:
44
- working_directory: ~/fhir
45
- docker:
46
- - image: 'cimg/node:22.11'
47
- steps:
48
- - attach_workspace:
49
- at: ~/
50
- - run: npx semantic-release
51
-
52
- workflows:
53
- version: 2
54
- prepare_and_release:
55
- jobs:
56
- - install
57
- - build:
58
- requires:
59
- - install
60
- - request-deploy:
61
- type: approval
62
- requires:
63
- - build
64
- filters:
65
- branches:
66
- only: master
67
- - deploy:
68
- requires:
69
- - request-deploy
70
- filters:
71
- branches:
72
- only: master
package/.editorconfig DELETED
@@ -1,14 +0,0 @@
1
- # Editor configuration, see http://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 2
8
- end_of_line = lf
9
- insert_final_newline = true
10
- trim_trailing_whitespace = true
11
-
12
- [*.md]
13
- max_line_length = 0
14
- trim_trailing_whitespace = false
package/.env.example DELETED
@@ -1,2 +0,0 @@
1
- GITHUB_TOKEN=
2
- NPM_TOKEN=
package/.gitattributes DELETED
@@ -1 +0,0 @@
1
- *.js linguist-language=TypeScript